@@ -88,127 +88,128 @@ exports.try_auth_proxy = function (connection, hosts, user, passwd, cb) {
88
88
response = [ ] ;
89
89
} ;
90
90
socket . on ( 'line' , function ( line ) {
91
- var matches ;
92
91
connection . logprotocol ( self , "S: " + line ) ;
93
- if ( matches = smtp_regexp . exec ( line ) ) {
94
- var code = matches [ 1 ] ;
95
- var cont = matches [ 2 ] ;
96
- var rest = matches [ 3 ] ;
97
- response . push ( rest ) ;
98
- if ( cont === ' ' ) {
99
- connection . logdebug ( self , 'command state: ' + command ) ;
100
- if ( command === 'ehlo' ) {
101
- if ( code . match ( / ^ 5 / ) ) {
102
- // EHLO command rejected; we have to abort
103
- socket . send_command ( 'QUIT' ) ;
92
+ var matches = smtp_regexp . exec ( line ) ;
93
+ if ( ! matches ) return ;
94
+
95
+ var code = matches [ 1 ] ;
96
+ var cont = matches [ 2 ] ;
97
+ var rest = matches [ 3 ] ;
98
+ response . push ( rest ) ;
99
+
100
+ if ( cont !== ' ' ) {
101
+ // Unrecognised response.
102
+ connection . logerror ( self , "unrecognised response: " + line ) ;
103
+ socket . end ( ) ;
104
+ return ;
105
+ }
106
+
107
+ connection . logdebug ( self , 'command state: ' + command ) ;
108
+ if ( command === 'ehlo' ) {
109
+ if ( code [ 0 ] === '5' ) {
110
+ // EHLO command rejected; abort
111
+ socket . send_command ( 'QUIT' ) ;
112
+ return ;
113
+ }
114
+ // Parse CAPABILITIES
115
+ var i ;
116
+ for ( i in response ) {
117
+ if ( / ^ S T A R T T L S / . test ( response [ i ] ) ) {
118
+ if ( secure ) continue ; // silly remote, we've already upgraded
119
+ var key = self . config . get ( 'tls_key.pem' , 'binary' ) ;
120
+ var cert = self . config . get ( 'tls_cert.pem' , 'binary' ) ;
121
+ // Use TLS opportunistically if we found the key and certificate
122
+ if ( key && cert ) {
123
+ this . on ( 'secure' , function ( ) {
124
+ secure = true ;
125
+ socket . send_command ( 'EHLO' , self . config . get ( 'me' ) ) ;
126
+ } ) ;
127
+ socket . send_command ( 'STARTTLS' ) ;
104
128
return ;
105
129
}
106
- // Parse CAPABILITIES
107
- var i ;
108
- for ( i in response ) {
109
- if ( ! secure && response [ i ] . match ( / ^ S T A R T T L S / ) ) {
110
- var key = self . config . get ( 'tls_key.pem' , 'binary' ) ;
111
- var cert = self . config . get ( 'tls_cert.pem' , 'binary' ) ;
112
- // Use TLS opportunistically if we found the key and certificate
113
- if ( key && cert ) {
114
- this . on ( 'secure' , function ( ) {
115
- secure = true ;
116
- socket . send_command ( 'EHLO' , self . config . get ( 'me' ) ) ;
117
- } ) ;
118
- socket . send_command ( 'STARTTLS' ) ;
119
- return ;
120
- }
121
- }
122
- else if ( response [ i ] . match ( / ^ A U T H / ) ) {
123
- // Parse supported AUTH methods
124
- var parse = / ^ A U T H ( .+ ) $ / . exec ( response [ i ] ) ;
125
- methods = parse [ 1 ] . split ( / \s + / ) ;
126
- connection . logdebug ( self , 'found supported AUTH methods: ' + methods ) ;
127
- // Prefer PLAIN as it's easiest
128
- if ( methods . indexOf ( 'PLAIN' ) !== - 1 ) {
129
- socket . send_command ( 'AUTH' , 'PLAIN ' + utils . base64 ( "\0" + user + "\0" + passwd ) ) ;
130
- return ;
131
- }
132
- else if ( methods . indexOf ( 'LOGIN' ) !== - 1 ) {
133
- socket . send_command ( 'AUTH' , 'LOGIN' ) ;
134
- return ;
135
- }
136
- else {
137
- // No compatible methods; abort...
138
- connection . logdebug ( self , 'no compatible AUTH methods' ) ;
139
- socket . send_command ( 'QUIT' ) ;
140
- return ;
141
- }
142
- }
143
- }
144
130
}
145
- if ( command === 'auth' ) {
146
- // Handle LOGIN
147
- if ( code [ 0 ] === '3' && response [ 0 ] === 'VXNlcm5hbWU6' ) {
148
- // Write to the socket directly to keep the state at 'auth'
149
- this . write ( utils . base64 ( user ) + "\r\n" ) ;
150
- response = [ ] ;
131
+ else if ( / ^ A U T H / . test ( response [ i ] ) ) {
132
+ // Parse supported AUTH methods
133
+ var parse = / ^ A U T H ( .+ ) $ / . exec ( response [ i ] ) ;
134
+ methods = parse [ 1 ] . split ( / \s + / ) ;
135
+ connection . logdebug ( self , 'found supported AUTH methods: ' + methods ) ;
136
+ // Prefer PLAIN as it's easiest
137
+ if ( methods . indexOf ( 'PLAIN' ) !== - 1 ) {
138
+ socket . send_command ( 'AUTH' , 'PLAIN ' + utils . base64 ( "\0" + user + "\0" + passwd ) ) ;
151
139
return ;
152
140
}
153
- else if ( code [ 0 ] === '3' && response [ 0 ] === 'UGFzc3dvcmQ6' ) {
154
- this . write ( utils . base64 ( passwd ) + "\r\n" ) ;
155
- response = [ ] ;
141
+ else if ( methods . indexOf ( 'LOGIN' ) !== - 1 ) {
142
+ socket . send_command ( 'AUTH' , 'LOGIN' ) ;
156
143
return ;
157
144
}
158
- if ( code [ 0 ] === '5' ) {
159
- // Initial attempt failed; strip domain and retry.
160
- var u ;
161
- if ( ( u = / ^ ( [ ^ @ ] + ) @ .+ $ / . exec ( user ) ) ) {
162
- user = u [ 1 ] ;
163
- if ( methods . indexOf ( 'PLAIN' ) !== - 1 ) {
164
- socket . send_command ( 'AUTH' , 'PLAIN ' + utils . base64 ( "\0" + user + "\0" + passwd ) ) ;
165
- }
166
- else if ( methods . indexOf ( 'LOGIN' ) !== - 1 ) {
167
- socket . send_command ( 'AUTH' , 'LOGIN' ) ;
168
- }
169
- return ;
170
- }
171
- else {
172
- // Don't attempt any other hosts
173
- auth_complete = true ;
174
- }
145
+ else {
146
+ // No compatible methods; abort...
147
+ connection . logdebug ( self , 'no compatible AUTH methods' ) ;
148
+ socket . send_command ( 'QUIT' ) ;
149
+ return ;
175
150
}
176
151
}
177
- if ( / ^ [ 3 4 5 ] / . test ( code ) ) {
178
- // Got an unhandled error
179
- connection . logdebug ( self , 'error: ' + line ) ;
180
- socket . send_command ( 'QUIT' ) ;
152
+ }
153
+ }
154
+ if ( command === 'auth' ) {
155
+ // Handle LOGIN
156
+ if ( code [ 0 ] === '3' && response [ 0 ] === 'VXNlcm5hbWU6' ) {
157
+ // Write to the socket directly to keep the state at 'auth'
158
+ this . write ( utils . base64 ( user ) + "\r\n" ) ;
159
+ response = [ ] ;
160
+ return ;
161
+ }
162
+ else if ( code [ 0 ] === '3' && response [ 0 ] === 'UGFzc3dvcmQ6' ) {
163
+ this . write ( utils . base64 ( passwd ) + "\r\n" ) ;
164
+ response = [ ] ;
165
+ return ;
166
+ }
167
+ if ( code [ 0 ] === '5' ) {
168
+ // Initial attempt failed; strip domain and retry.
169
+ var u ;
170
+ if ( ( u = / ^ ( [ ^ @ ] + ) @ .+ $ / . exec ( user ) ) ) {
171
+ user = u [ 1 ] ;
172
+ if ( methods . indexOf ( 'PLAIN' ) !== - 1 ) {
173
+ socket . send_command ( 'AUTH' , 'PLAIN ' + utils . base64 ( "\0" + user + "\0" + passwd ) ) ;
174
+ }
175
+ else if ( methods . indexOf ( 'LOGIN' ) !== - 1 ) {
176
+ socket . send_command ( 'AUTH' , 'LOGIN' ) ;
177
+ }
181
178
return ;
182
179
}
183
- switch ( command ) {
184
- case 'starttls' :
185
- var tls_options = { key : key , cert : cert } ;
186
- this . upgrade ( tls_options ) ;
187
- break ;
188
- case 'connect' :
189
- socket . send_command ( 'EHLO' , self . config . get ( 'me' ) ) ;
190
- break ;
191
- case 'auth' :
192
- // AUTH was successful
193
- auth_complete = true ;
194
- auth_success = true ;
195
- socket . send_command ( 'QUIT' ) ;
196
- break ;
197
- case 'ehlo' :
198
- case 'helo' :
199
- case 'quit' :
200
- socket . end ( ) ;
201
- break ;
202
- default :
203
- throw new Error ( "[auth/auth_proxy] unknown command: " + command ) ;
180
+ else {
181
+ // Don't attempt any other hosts
182
+ auth_complete = true ;
204
183
}
205
184
}
206
185
}
207
- else {
208
- // Unrecognised response.
209
- connection . logerror ( self , "unrecognised response: " + line ) ;
210
- socket . end ( ) ;
186
+ if ( / ^ [ 3 4 5 ] / . test ( code ) ) {
187
+ // Got an unhandled error
188
+ connection . logdebug ( self , 'error: ' + line ) ;
189
+ socket . send_command ( 'QUIT' ) ;
211
190
return ;
212
191
}
192
+ switch ( command ) {
193
+ case 'starttls' :
194
+ var tls_options = { key : key , cert : cert } ;
195
+ this . upgrade ( tls_options ) ;
196
+ break ;
197
+ case 'connect' :
198
+ socket . send_command ( 'EHLO' , self . config . get ( 'me' ) ) ;
199
+ break ;
200
+ case 'auth' :
201
+ // AUTH was successful
202
+ auth_complete = true ;
203
+ auth_success = true ;
204
+ socket . send_command ( 'QUIT' ) ;
205
+ break ;
206
+ case 'ehlo' :
207
+ case 'helo' :
208
+ case 'quit' :
209
+ socket . end ( ) ;
210
+ break ;
211
+ default :
212
+ throw new Error ( "[auth/auth_proxy] unknown command: " + command ) ;
213
+ }
213
214
} ) ;
214
215
} ;
0 commit comments