diff --git a/src/js/app.js b/src/js/app.js index 4623896..edeb0ec 100644 --- a/src/js/app.js +++ b/src/js/app.js @@ -17,7 +17,7 @@ require([ ], function(angular, AccountCtrl, LoginCtrl, LoginInitialCtrl, LoginNewDeviceCtrl, LoginExistingCtrl, MailListCtrl, ReadCtrl, WriteCtrl, NavigationCtrl) { 'use strict'; - var app = angular.module('mail', ['ngRoute', 'ngTouch', 'navigation', 'mail-list', 'write', 'read']); + var app = angular.module('mail', ['ngRoute', 'ngTouch', 'navigation', 'mail-list', 'write', 'read', 'login-new-device']); // set router paths app.config(function($routeProvider) { diff --git a/src/js/controller/account.js b/src/js/controller/account.js index d155ad2..ca2d2d3 100644 --- a/src/js/controller/account.js +++ b/src/js/controller/account.js @@ -37,13 +37,19 @@ define(function(require) { function download(content, filename, contentType) { contentType = contentType || 'application/octet-stream'; - var a = document.createElement('a'); - var blob = new Blob([content], { - 'type': contentType + chrome.fileSystem.chooseEntry({ + type: 'saveFile', + suggestedName: filename + }, function(file) { + if (!file) { + return; + } + file.createWriter(function(writer) { + writer.onerror = console.error; + writer.onwriteend = function() {}; + writer.write(new Blob([content], { type: contentType })); + }, console.error); }); - a.href = window.URL.createObjectURL(blob); - a.download = filename; - a.click(); } }; diff --git a/src/js/controller/login-new-device.js b/src/js/controller/login-new-device.js index 783b06c..cb4f6ce 100644 --- a/src/js/controller/login-new-device.js +++ b/src/js/controller/login-new-device.js @@ -1,13 +1,87 @@ -define(function() { +define(function(require) { 'use strict'; - var LoginExistingCtrl = function($scope) { - + var angular = require('angular'), + appController = require('js/app-controller'); + + var LoginExistingCtrl = function($scope, $location) { $scope.confirmPassphrase = function() { - window.alert('Not implemented yet!'); + var passphrase = $scope.passphrase, + emailDao = appController._emailDao; + + if (!passphrase) { + return; + } + + unlockCrypto(imapLogin); + + function unlockCrypto(callback) { + var userId = emailDao._account.emailAddress; + emailDao._keychain.getUserKeyPair(userId, function(err, keypair) { + if (err) { + callback(err); + return; + } + + keypair.privateKey = { + _id: keypair.publicKey._id, + userId: userId, + encryptedKey: $scope.key + }; + emailDao.unlock(keypair, passphrase, function(err) { + if (err) { + callback(err); + return; + } + + emailDao._keychain.putUserKeyPair(keypair, callback); + }); + }); + } + + function imapLogin(err) { + if (err) { + console.error(err); + return; + } + + // login to imap backend + appController._emailDao.imapLogin(function(err) { + if (err) { + console.error(err); + return; + } + onLogin(); + }); + } }; + function onLogin() { + $location.path('/desktop'); + $scope.$apply(); + } }; + var ngModule = angular.module('login-new-device', []); + ngModule.directive('fileReader', function() { + return function(scope, elm) { + elm.bind('change', function(e) { + var files = e.target.files, + reader = new FileReader(); + + if (files.length === 0) { + return; + } + + reader.onload = (function(scope) { + return function(e) { + scope.key = e.target.result; + }; + })(scope); + reader.readAsText(files[0]); + }); + }; + }); + return LoginExistingCtrl; }); \ No newline at end of file diff --git a/src/js/controller/login.js b/src/js/controller/login.js index 0e0efb0..9ed17da 100644 --- a/src/js/controller/login.js +++ b/src/js/controller/login.js @@ -40,7 +40,7 @@ define(function(require) { function redirect(availableKeys) { // redirect if needed - if (!availableKeys.publicKey) { + if (typeof availableKeys === 'undefined') { // no public key available, start onboarding process $location.path('/login-initial'); } else if (!availableKeys.privateKey) { diff --git a/src/js/dao/cloudstorage-dao.js b/src/js/dao/cloudstorage-dao.js index a265d31..7ce4ed7 100644 --- a/src/js/dao/cloudstorage-dao.js +++ b/src/js/dao/cloudstorage-dao.js @@ -19,6 +19,9 @@ define(['jquery', 'js/app-config'], function($, app) { url: uri, type: 'GET', dataType: 'json', + headers: { + 'Accept': 'application/json', + }, success: function(res) { callback(null, res); }, diff --git a/src/manifest.json b/src/manifest.json index 0a39aa8..829b3ad 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -7,7 +7,9 @@ "icons": { "128": "img/icon.png" }, - "permissions": [ + "permissions": [{ + "fileSystem": ["write"] + }, "https://keys.whiteout.io/", "identity", { "socket": [ diff --git a/src/tpl/login-new-device.html b/src/tpl/login-new-device.html index 9b5ebcc..292f10c 100644 --- a/src/tpl/login-new-device.html +++ b/src/tpl/login-new-device.html @@ -1 +1,18 @@ -

not implemented yet...

+
+ +
+ +
+ +
+

Import keyfile

+ +

You are already registered on another device. To access your communication on this device, please import the encrypted key file.

+ +
+
+
+
+ +
+
\ No newline at end of file