VulpesOS/assets/webapps/email.gaiamobile.org/js/ext/pop3/probe.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

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;
};
});