Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
99 lines
No EOL
3.8 KiB
JavaScript
99 lines
No EOL
3.8 KiB
JavaScript
define([
|
|
'./pop3',
|
|
'../syncbase',
|
|
'logic',
|
|
'../errorutils',
|
|
'exports'
|
|
], function (pop3, syncbase, logic, errorutils, exports) {
|
|
var scope = logic.scope('Pop3Prober');
|
|
exports.probeAccount = function (credentials, connInfo) {
|
|
var opts = {
|
|
host: connInfo.hostname,
|
|
port: connInfo.port,
|
|
crypto: connInfo.crypto,
|
|
username: credentials.username,
|
|
password: credentials.password,
|
|
connTimeout: syncbase.CONNECT_TIMEOUT_MS
|
|
};
|
|
logic(scope, 'connecting', { connInfo: connInfo });
|
|
var resolve, reject;
|
|
var promise = new Promise(function (_resolve, _reject) {
|
|
resolve = _resolve;
|
|
reject = _reject;
|
|
});
|
|
var conn = new pop3.Pop3Client(opts, function (err) {
|
|
if (err) {
|
|
reject(err);
|
|
return;
|
|
}
|
|
conn.protocol.sendRequest('UIDL', ['1'], false, function (err, rsp) {
|
|
if (rsp) {
|
|
conn.protocol.sendRequest('TOP', [
|
|
'1',
|
|
'0'
|
|
], true, function (err, rsp) {
|
|
if (rsp) {
|
|
resolve(conn);
|
|
} else if (err.err) {
|
|
logic(scope, 'server-not-great', { why: 'no TOP' });
|
|
reject('pop-server-not-great');
|
|
} else {
|
|
reject(rsp.err);
|
|
}
|
|
});
|
|
} else {
|
|
conn.protocol.sendRequest('UIDL', [], true, function (err, rsp) {
|
|
if (rsp) {
|
|
resolve(conn);
|
|
} else if (err.err) {
|
|
logic(scope, 'server-not-great', { why: 'no UIDL' });
|
|
reject('pop-server-not-great');
|
|
} else {
|
|
reject(rsp.err);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
});
|
|
return promise.then(function (conn) {
|
|
logic(scope, 'success');
|
|
return {
|
|
conn: conn,
|
|
timezoneOffset: null
|
|
};
|
|
}).catch(function (err) {
|
|
err = normalizePop3Error(err);
|
|
logic(scope, 'error', { error: err });
|
|
if (conn) {
|
|
conn.close();
|
|
}
|
|
return Promise.reject(err);
|
|
});
|
|
};
|
|
var GMAIL_POP_DISABLED_RE = /\[SYS\/PERM\] Your account is not enabled for POP/;
|
|
var GMAIL_DOMAIN_DISABLED_RE = /\[SYS\/PERM\] POP access is disabled for your domain\./;
|
|
function analyzePop3LibraryError(err) {
|
|
if (!err || !err.name) {
|
|
return null;
|
|
}
|
|
if (err.name === 'bad-user-or-pass' && err.message && GMAIL_POP_DISABLED_RE.test(err.message)) {
|
|
return 'pop3-disabled';
|
|
} else if (err.name === 'bad-user-or-pass' && err.message && GMAIL_DOMAIN_DISABLED_RE.test(err.message)) {
|
|
return 'pop3-disabled';
|
|
} else if (err.name === 'unresponsive-server' && err.exception && err.exception.name && /security/i.test(err.exception.name)) {
|
|
return 'bad-security';
|
|
} else if ((err.name === 'unresponsive-server' || err.name === 'bad-user-or-pass') && err.message && /\[(LOGIN-DELAY|SYS|IN-USE)/i.test(err.message)) {
|
|
return 'server-maintenance';
|
|
} else {
|
|
return err.name;
|
|
}
|
|
}
|
|
var normalizePop3Error = exports.normalizePop3Error = function (err) {
|
|
var reportAs = analyzePop3LibraryError(err) || errorutils.analyzeException(err) || 'unknown';
|
|
logic(scope, 'normalized-error', {
|
|
error: err,
|
|
reportAs: reportAs
|
|
});
|
|
return reportAs;
|
|
};
|
|
}); |