diff --git a/src/background.html b/src/background.html
index f4ce8c23988..a95f36bb47f 100644
--- a/src/background.html
+++ b/src/background.html
@@ -6,7 +6,6 @@
-
diff --git a/src/background.js b/src/background.js
index 6c68addde53..91bae6e395d 100644
--- a/src/background.js
+++ b/src/background.js
@@ -5,6 +5,7 @@ import CryptoService from './services/crypto.service';
import i18nService from './services/i18nService.js';
import LockService from './services/lockService.js';
import PasswordGenerationService from './services/passwordGeneration.service';
+import TokenService from './services/token.service';
import UtilsService from './services/utils.service';
// Model imports
@@ -75,7 +76,7 @@ var bg_isBackground = true,
window.bg_i18nService = bg_i18nService = new i18nService(bg_utilsService);
window.bg_constantsService = bg_constantsService = new ConstantsService(bg_i18nService);
window.bg_cryptoService = bg_cryptoService = new CryptoService();
- window.bg_tokenService = bg_tokenService = new TokenService(bg_utilsService);
+ window.bg_tokenService = bg_tokenService = new TokenService();
window.bg_appIdService = bg_appIdService = new AppIdService();
window.bg_apiService = bg_apiService = new ApiService(bg_tokenService, bg_appIdService, bg_utilsService, bg_constantsService, logout);
window.bg_environmentService = bg_environmentService = new EnvironmentService(bg_constantsService, bg_apiService);
diff --git a/src/popup/app/services/authService.js b/src/popup/app/services/authService.js
index 52b9ba50532..2758f6c66ee 100644
--- a/src/popup/app/services/authService.js
+++ b/src/popup/app/services/authService.js
@@ -40,26 +40,26 @@ angular
}
if (response.twoFactorToken) {
- tokenService.setTwoFactorToken(response.twoFactorToken, email, function () { });
+ tokenService.setTwoFactorToken(response.twoFactorToken, email);
}
- tokenService.setTokens(response.accessToken, response.refreshToken, function () {
- cryptoService.setKey(key).then(function () {
- return cryptoService.setKeyHash(hashedPassword);
- }).then(function () {
- userService.setUserIdAndEmail(tokenService.getUserId(), tokenService.getEmail(),
- function () {
- cryptoService.setEncKey(response.key).then(function () {
- return cryptoService.setEncPrivateKey(response.privateKey);
- }).then(function () {
- chrome.runtime.sendMessage({ command: 'loggedIn' });
- deferred.resolve({
- twoFactor: false,
- twoFactorProviders: null
- });
+ tokenService.setTokens(response.accessToken, response.refreshToken).then(function () {
+ return cryptoService.setKey(key);
+ }).then(function () {
+ return cryptoService.setKeyHash(hashedPassword);
+ }).then(function () {
+ userService.setUserIdAndEmail(tokenService.getUserId(), tokenService.getEmail(),
+ function () {
+ cryptoService.setEncKey(response.key).then(function () {
+ return cryptoService.setEncPrivateKey(response.privateKey);
+ }).then(function () {
+ chrome.runtime.sendMessage({ command: 'loggedIn' });
+ deferred.resolve({
+ twoFactor: false,
+ twoFactorProviders: null
});
});
- });
+ });
});
}, function (providers) {
// two factor required
diff --git a/src/services/apiService.js b/src/services/apiService.js
index 689aaa45073..f1b3feec790 100644
--- a/src/services/apiService.js
+++ b/src/services/apiService.js
@@ -71,7 +71,7 @@ function initApiService() {
error: function (jqXHR, textStatus, errorThrown) {
if (jqXHR.responseJSON && jqXHR.responseJSON.TwoFactorProviders2 &&
Object.keys(jqXHR.responseJSON.TwoFactorProviders2).length) {
- self.tokenService.clearTwoFactorToken(tokenRequest.email, function () {
+ self.tokenService.clearTwoFactorToken(tokenRequest.email).then(function () {
successWithTwoFactor(jqXHR.responseJSON.TwoFactorProviders2);
});
}
@@ -439,7 +439,7 @@ function initApiService() {
function handleTokenState(self) {
var deferred = Q.defer();
- self.tokenService.getToken(function (accessToken) {
+ self.tokenService.getToken().then(function (accessToken) {
if (!self.tokenService.tokenNeedsRefresh()) {
resolveTokenQs(accessToken, deferred);
return;
@@ -447,7 +447,7 @@ function initApiService() {
doRefreshToken(self, function (response) {
var tokenResponse = new IdentityTokenResponse(response);
- self.tokenService.setTokens(tokenResponse.accessToken, tokenResponse.refreshToken, function () {
+ self.tokenService.setTokens(tokenResponse.accessToken, tokenResponse.refreshToken).then(function () {
resolveTokenQs(tokenResponse.accessToken, deferred);
});
}, function (jqXHR) {
@@ -459,7 +459,7 @@ function initApiService() {
}
function doRefreshToken(self, success, error) {
- self.tokenService.getRefreshToken(function (refreshToken) {
+ self.tokenService.getRefreshToken().then(function (refreshToken) {
if (!refreshToken || refreshToken === '') {
error();
return;
diff --git a/src/services/token.service.ts b/src/services/token.service.ts
index e90f2fdb6f9..3ebaa239be5 100644
--- a/src/services/token.service.ts
+++ b/src/services/token.service.ts
@@ -12,7 +12,6 @@ export default class TokenService {
decodedToken: any;
refreshToken: string;
- // TODO: fix callbacks
setTokens(accessToken: string, refreshToken: string): Promise {
return Promise.all([
this.setToken(accessToken),
@@ -20,14 +19,12 @@ export default class TokenService {
]);
}
- // TODO: fix callback implementations
setToken(token: string): Promise {
this.token = token;
this.decodedToken = null;
return UtilsService.saveObjToStorage(Keys.accessToken, token);
}
- // TODO: fix callback implementations
async getToken(): Promise {
if (this.token != null) {
return this.token;
@@ -37,13 +34,11 @@ export default class TokenService {
return this.token;
}
- // TODO: fix callback implementations
setRefreshToken(refreshToken: string): Promise {
this.refreshToken = refreshToken;
return UtilsService.saveObjToStorage(Keys.refreshToken, refreshToken);
}
- // TODO: fix callback implementations
async getRefreshToken(): Promise {
if (this.refreshToken != null) {
return this.refreshToken;
@@ -53,7 +48,6 @@ export default class TokenService {
return this.refreshToken;
}
- // TODO: fix callback implementations
setTwoFactorToken(token: string, email: string): Promise {
return UtilsService.saveObjToStorage(Keys.twoFactorTokenPrefix + email, token);
}
@@ -62,7 +56,6 @@ export default class TokenService {
return UtilsService.getObjFromStorage(Keys.twoFactorTokenPrefix + email);
}
- // TODO: fix callback implementations
clearTwoFactorToken(email: string): Promise {
return UtilsService.removeFromStorage(Keys.twoFactorTokenPrefix + email);
}
diff --git a/src/services/tokenService.js b/src/services/tokenService.js
deleted file mode 100644
index 6dedb9b5ea4..00000000000
--- a/src/services/tokenService.js
+++ /dev/null
@@ -1,247 +0,0 @@
-function TokenService(utilsService) {
- this.utilsService = utilsService;
-
- initTokenService();
-}
-
-function initTokenService() {
- var _token,
- _decodedToken,
- _refreshToken;
-
- TokenService.prototype.setTokens = function (accessToken, refreshToken, callback) {
- if (!callback || typeof callback !== 'function') {
- throw 'callback function required';
- }
-
- var self = this;
- self.setToken(accessToken, function () {
- self.setRefreshToken(refreshToken, function () {
- callback();
- });
- });
- };
-
- TokenService.prototype.setToken = function (token, callback) {
- if (!callback || typeof callback !== 'function') {
- throw 'callback function required';
- }
-
- _token = token;
- _decodedToken = null;
- chrome.storage.local.set({
- 'accessToken': token
- }, function () {
- callback();
- });
- };
-
- TokenService.prototype.getToken = function (callback) {
- if (!callback || typeof callback !== 'function') {
- throw 'callback function required';
- }
-
- if (_token) {
- return callback(_token);
- }
-
- chrome.storage.local.get('accessToken', function (obj) {
- if (obj && obj.accessToken) {
- _token = obj.accessToken;
- }
-
- return callback(_token);
- });
- };
-
- TokenService.prototype.setRefreshToken = function (refreshToken, callback) {
- if (!callback || typeof callback !== 'function') {
- throw 'callback function required';
- }
-
- _refreshToken = refreshToken;
- chrome.storage.local.set({
- 'refreshToken': refreshToken
- }, function () {
- callback();
- });
- };
-
- TokenService.prototype.getRefreshToken = function (callback) {
- if (!callback || typeof callback !== 'function') {
- throw 'callback function required';
- }
-
- if (_refreshToken) {
- return callback(_refreshToken);
- }
-
- chrome.storage.local.get('refreshToken', function (obj) {
- if (obj && obj.refreshToken) {
- _refreshToken = obj.refreshToken;
- }
-
- return callback(_refreshToken);
- });
- };
-
- TokenService.prototype.setTwoFactorToken = function (token, email, callback) {
- if (!callback || typeof callback !== 'function') {
- throw 'callback function required';
- }
-
- var obj = {};
- obj['twoFactorToken_' + email] = token;
-
- chrome.storage.local.set(obj, function () {
- callback();
- });
- };
-
- TokenService.prototype.getTwoFactorToken = function (email) {
- return this.utilsService.getObjFromStorage('twoFactorToken_' + email).then(function (token) {
- return token;
- });
- };
-
- TokenService.prototype.clearTwoFactorToken = function (email, callback) {
- if (!callback || typeof callback !== 'function') {
- throw 'callback function required';
- }
-
- chrome.storage.local.remove('twoFactorToken_' + email, function () {
- callback();
- });
- };
-
- TokenService.prototype.clearToken = function () {
- var self = this;
- return Q.all([
- self.utilsService.removeFromStorage('accessToken'),
- self.utilsService.removeFromStorage('refreshToken')
- ]).then(function () {
- _token = _decodedToken = _refreshToken = null;
- });
- };
-
- // jwthelper methods
- // ref https://github.com/auth0/angular-jwt/blob/master/src/angularJwt/services/jwt.js
-
- TokenService.prototype.decodeToken = function () {
- if (_decodedToken) {
- return _decodedToken;
- }
-
- if (!_token) {
- throw 'Token not found.';
- }
-
- var parts = _token.split('.');
- if (parts.length !== 3) {
- throw 'JWT must have 3 parts';
- }
-
- var decoded = urlBase64Decode(parts[1]);
- if (!decoded) {
- throw 'Cannot decode the token';
- }
-
- _decodedToken = JSON.parse(decoded);
- return _decodedToken;
- };
-
- TokenService.prototype.getTokenExpirationDate = function () {
- var decoded = this.decodeToken();
-
- if (typeof decoded.exp === 'undefined') {
- return null;
- }
-
- var d = new Date(0); // The 0 here is the key, which sets the date to the epoch
- d.setUTCSeconds(decoded.exp);
-
- return d;
- };
-
- TokenService.prototype.tokenSecondsRemaining = function (offsetSeconds) {
- var d = this.getTokenExpirationDate();
- offsetSeconds = offsetSeconds || 0;
- if (d === null) {
- return 0;
- }
-
- var msRemaining = d.valueOf() - (new Date().valueOf() + (offsetSeconds * 1000));
- return Math.round(msRemaining / 1000);
- };
-
- TokenService.prototype.tokenNeedsRefresh = function (minutes) {
- minutes = minutes || 5; // default 5 minutes
- var sRemaining = this.tokenSecondsRemaining();
- return sRemaining < (60 * minutes);
- };
-
- TokenService.prototype.getUserId = function () {
- var decoded = this.decodeToken();
-
- if (typeof decoded.sub === 'undefined') {
- throw 'No user id found';
- }
-
- return decoded.sub;
- };
-
- TokenService.prototype.getEmail = function () {
- var decoded = this.decodeToken();
-
- if (typeof decoded.email === 'undefined') {
- throw 'No email found';
- }
-
- return decoded.email;
- };
-
- TokenService.prototype.getName = function () {
- var decoded = this.decodeToken();
-
- if (typeof decoded.name === 'undefined') {
- throw 'No name found';
- }
-
- return decoded.name;
- };
-
- TokenService.prototype.getPremium = function () {
- var decoded = this.decodeToken();
-
- if (typeof decoded.premium === 'undefined') {
- return false;
- }
-
- return !!decoded.premium;
- };
-
- TokenService.prototype.getIssuer = function () {
- var decoded = this.decodeToken();
-
- if (typeof decoded.iss === 'undefined') {
- throw 'No issuer found';
- }
-
- return decoded.iss;
- };
-
- function urlBase64Decode(str) {
- var output = str.replace(/-/g, '+').replace(/_/g, '/');
- switch (output.length % 4) {
- case 0: { break; }
- case 2: { output += '=='; break; }
- case 3: { output += '='; break; }
- default: {
- throw 'Illegal base64url string!';
- }
- }
-
- //polyfill https://github.com/davidchambers/Base64.js
- return window.decodeURIComponent(escape(window.atob(output)));
- }
-}
diff --git a/src/services/userService.js b/src/services/userService.js
index d4f4c519182..f0e54744df7 100644
--- a/src/services/userService.js
+++ b/src/services/userService.js
@@ -139,7 +139,7 @@ function initUserService() {
}
var self = this;
- self.tokenService.getToken(function (token) {
+ self.tokenService.getToken().then(function (token) {
if (!token) {
callback(false);
}