2014-07-01 13:49:19 -04:00
|
|
|
define(function(require) {
|
|
|
|
'use strict';
|
|
|
|
|
2014-09-05 13:02:02 -04:00
|
|
|
var ENCRYPTION_METHOD_NONE = 0;
|
|
|
|
var ENCRYPTION_METHOD_STARTTLS = 1;
|
|
|
|
var ENCRYPTION_METHOD_TLS = 2;
|
|
|
|
|
2014-07-01 13:49:19 -04:00
|
|
|
var appCtrl = require('js/app-controller'),
|
|
|
|
config = require('js/app-config').config,
|
|
|
|
ImapClient = require('imap-client'),
|
|
|
|
SmtpClient = require('smtpclient');
|
|
|
|
|
|
|
|
var SetCredentialsCtrl = function($scope, $location) {
|
|
|
|
var auth = appCtrl._auth;
|
|
|
|
|
|
|
|
var provider;
|
|
|
|
|
|
|
|
provider = $location.search().provider;
|
|
|
|
$scope.hasProviderPreset = !!config[provider];
|
|
|
|
$scope.useOAuth = !!auth.oauthToken;
|
|
|
|
$scope.showDetails = (provider === 'custom');
|
|
|
|
|
|
|
|
if ($scope.useOAuth) {
|
|
|
|
$scope.emailAddress = auth.emailAddress;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($scope.hasProviderPreset) {
|
|
|
|
// use non-editable smtp and imap presets for provider
|
|
|
|
$scope.smtpHost = config[provider].smtp.host;
|
|
|
|
$scope.smtpPort = config[provider].smtp.port;
|
|
|
|
$scope.smtpCert = config[provider].smtp.ca;
|
|
|
|
$scope.smtpPinned = config[provider].smtp.pinned;
|
2014-09-05 13:02:02 -04:00
|
|
|
|
|
|
|
if (config[provider].smtp.secure && !config[provider].smtp.ignoreTLS) {
|
|
|
|
$scope.smtpEncryption = ENCRYPTION_METHOD_TLS;
|
|
|
|
} else if (!config[provider].smtp.secure && !config[provider].smtp.ignoreTLS) {
|
|
|
|
$scope.smtpEncryption = ENCRYPTION_METHOD_STARTTLS;
|
|
|
|
} else {
|
|
|
|
$scope.smtpEncryption = ENCRYPTION_METHOD_NONE;
|
|
|
|
}
|
|
|
|
|
2014-07-01 13:49:19 -04:00
|
|
|
$scope.imapHost = config[provider].imap.host;
|
|
|
|
$scope.imapPort = config[provider].imap.port;
|
|
|
|
$scope.imapCert = config[provider].imap.ca;
|
|
|
|
$scope.imapPinned = config[provider].imap.pinned;
|
2014-09-05 13:02:02 -04:00
|
|
|
|
|
|
|
if (config[provider].imap.secure && !config[provider].imap.ignoreTLS) {
|
|
|
|
$scope.imapEncryption = ENCRYPTION_METHOD_TLS;
|
|
|
|
} else if (!config[provider].imap.secure && !config[provider].imap.ignoreTLS) {
|
|
|
|
$scope.imapEncryption = ENCRYPTION_METHOD_STARTTLS;
|
|
|
|
} else {
|
|
|
|
$scope.imapEncryption = ENCRYPTION_METHOD_NONE;
|
|
|
|
}
|
2014-07-01 13:49:19 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
$scope.test = function(imapClient, smtpClient) {
|
2014-09-05 13:02:02 -04:00
|
|
|
var imapEncryption = parseInt($scope.imapEncryption, 10);
|
|
|
|
var smtpEncryption = parseInt($scope.smtpEncryption, 10);
|
2014-07-01 13:49:19 -04:00
|
|
|
$scope.credentialsIncomplete = false;
|
|
|
|
$scope.connectionError = false;
|
|
|
|
$scope.smtpOk = undefined;
|
|
|
|
$scope.imapOk = undefined;
|
|
|
|
|
|
|
|
if (!(($scope.username || $scope.emailAddress) && ($scope.password || $scope.useOAuth))) {
|
|
|
|
$scope.credentialsIncomplete = true;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var imap = imapClient || new ImapClient({
|
|
|
|
host: $scope.imapHost.toLowerCase(),
|
|
|
|
port: $scope.imapPort,
|
2014-09-05 13:02:02 -04:00
|
|
|
secure: imapEncryption === ENCRYPTION_METHOD_TLS,
|
|
|
|
ignoreTLS: imapEncryption === ENCRYPTION_METHOD_NONE,
|
2014-07-01 13:49:19 -04:00
|
|
|
ca: $scope.imapCert,
|
|
|
|
auth: {
|
|
|
|
user: $scope.username || $scope.emailAddress,
|
|
|
|
pass: $scope.password,
|
|
|
|
xoauth2: auth.oauthToken
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
imap.onCert = function(pemEncodedCert) {
|
|
|
|
if (!$scope.imapPinned) {
|
|
|
|
$scope.imapCert = pemEncodedCert;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
imap.onError = function(err) {
|
|
|
|
$scope.imapOk = !err;
|
|
|
|
$scope.connectionError = err;
|
|
|
|
done();
|
|
|
|
};
|
|
|
|
|
|
|
|
var smtp = smtpClient || new SmtpClient($scope.smtpHost.toLowerCase(), $scope.smtpPort, {
|
2014-09-05 13:02:02 -04:00
|
|
|
useSecureTransport: smtpEncryption === ENCRYPTION_METHOD_TLS,
|
|
|
|
ignoreTLS: smtpEncryption === ENCRYPTION_METHOD_NONE,
|
2014-07-01 13:49:19 -04:00
|
|
|
ca: $scope.smtpCert,
|
|
|
|
auth: {
|
|
|
|
user: $scope.username || $scope.emailAddress,
|
|
|
|
pass: $scope.password,
|
|
|
|
xoauth2: auth.oauthToken
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
smtp.oncert = function(pemEncodedCert) {
|
|
|
|
if (!$scope.smtpPinned) {
|
|
|
|
$scope.smtpCert = pemEncodedCert;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
smtp.onerror = function(err) {
|
|
|
|
$scope.smtpOk = !err;
|
|
|
|
$scope.connectionError = $scope.connectionError || err;
|
|
|
|
done();
|
|
|
|
};
|
|
|
|
|
|
|
|
smtp.onidle = function() {
|
|
|
|
smtp.onerror = function() {}; // don't care about errors after discarding connection
|
|
|
|
$scope.smtpOk = true;
|
|
|
|
smtp.quit();
|
|
|
|
done();
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.busy = 2;
|
|
|
|
|
|
|
|
// fire away
|
|
|
|
imap.login(function(err) {
|
|
|
|
$scope.connectionError = $scope.connectionError || err;
|
|
|
|
$scope.imapOk = !err;
|
|
|
|
imap.logout(function() {}); // don't care about errors after discarding connection
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
|
|
|
|
smtp.connect();
|
|
|
|
};
|
|
|
|
|
|
|
|
function done() {
|
|
|
|
if ($scope.busy > 0) {
|
|
|
|
$scope.busy--;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($scope.smtpOk && $scope.imapOk) {
|
|
|
|
login();
|
|
|
|
}
|
|
|
|
|
|
|
|
$scope.$apply();
|
|
|
|
}
|
|
|
|
|
|
|
|
function login() {
|
2014-09-05 13:02:02 -04:00
|
|
|
var imapEncryption = parseInt($scope.imapEncryption, 10);
|
|
|
|
var smtpEncryption = parseInt($scope.smtpEncryption, 10);
|
|
|
|
|
2014-07-01 13:49:19 -04:00
|
|
|
auth.setCredentials({
|
|
|
|
provider: provider,
|
|
|
|
emailAddress: $scope.emailAddress,
|
|
|
|
username: $scope.username || $scope.emailAddress,
|
|
|
|
realname: $scope.realname,
|
|
|
|
password: $scope.password,
|
|
|
|
imap: {
|
|
|
|
host: $scope.imapHost.toLowerCase(),
|
|
|
|
port: $scope.imapPort,
|
2014-09-05 13:02:02 -04:00
|
|
|
secure: imapEncryption === ENCRYPTION_METHOD_TLS,
|
|
|
|
ignoreTLS: imapEncryption === ENCRYPTION_METHOD_NONE,
|
2014-07-01 13:49:19 -04:00
|
|
|
ca: $scope.imapCert,
|
|
|
|
pinned: !!$scope.imapPinned
|
|
|
|
},
|
|
|
|
smtp: {
|
|
|
|
host: $scope.smtpHost.toLowerCase(),
|
|
|
|
port: $scope.smtpPort,
|
2014-09-05 13:02:02 -04:00
|
|
|
secure: smtpEncryption === ENCRYPTION_METHOD_TLS,
|
|
|
|
ignoreTLS: smtpEncryption === ENCRYPTION_METHOD_NONE,
|
2014-07-01 13:49:19 -04:00
|
|
|
ca: $scope.smtpCert,
|
|
|
|
pinned: !!$scope.smtpPinned
|
|
|
|
}
|
|
|
|
});
|
|
|
|
redirect();
|
|
|
|
}
|
|
|
|
|
|
|
|
function redirect() {
|
|
|
|
$location.path('/login');
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return SetCredentialsCtrl;
|
|
|
|
});
|