Commit 08ef768a authored by Sascha Pfeiffer's avatar Sascha Pfeiffer

some more progress to files

Signed-off-by: default avatarSascha Pfeiffer <sascha.pfeiffer@psono.com>
parent 58612cae
......@@ -115,6 +115,7 @@ var build = function(build_path, type) {
"src/common/data/js/lib/chart.min.js",
"src/common/data/js/lib/jquery.min.js",
"src/common/data/js/lib/client.min.js",
"src/common/data/js/lib/FileSaver.min.js",
"src/common/data/js/lib/datatables.min.js",
"src/common/data/js/lib/snap.min.js",
"src/common/data/js/lib/jquery-ui.min.js",
......
......@@ -106,6 +106,7 @@
<script src="js/lib/uuid.js" type="text/javascript"></script>
<script src="js/lib/chart.min.js" type="text/javascript"></script>
<script src="js/lib/client.min.js" type="text/javascript"></script>
<script src="js/lib/FileSaver.min.js" type="text/javascript"></script>
<script src="js/lib/jquery.min.js" type="text/javascript"></script>
<script src="js/lib/datatables.min.js" type="text/javascript"></script>
<script src="js/lib/snap.min.js" type="text/javascript"></script>
......
......@@ -33,6 +33,7 @@
<script src="js/lib/uuid.js" type="text/javascript"></script>
<script src="js/lib/chart.min.js" type="text/javascript"></script>
<script src="js/lib/client.min.js" type="text/javascript"></script>
<script src="js/lib/FileSaver.min.js" type="text/javascript"></script>
<script src="js/lib/jquery.min.js" type="text/javascript"></script>
<script src="js/lib/datatables.min.js" type="text/javascript"></script>
<script src="js/lib/snap.min.js" type="text/javascript"></script>
......
......@@ -339,6 +339,7 @@
<script src="js/lib/uuid.js" type="text/javascript"></script>
<script src="js/lib/chart.min.js" type="text/javascript"></script>
<script src="js/lib/client.min.js" type="text/javascript"></script>
<script src="js/lib/FileSaver.min.js" type="text/javascript"></script>
<script src="js/lib/jquery.min.js" type="text/javascript"></script>
<script src="js/lib/datatables.min.js" type="text/javascript"></script>
<script src="js/lib/snap.min.js" type="text/javascript"></script>
......
This diff is collapsed.
......@@ -212,6 +212,7 @@
<script src="js/lib/uuid.js" type="text/javascript"></script>
<script src="js/lib/chart.min.js" type="text/javascript"></script>
<script src="js/lib/client.min.js" type="text/javascript"></script>
<script src="js/lib/FileSaver.min.js" type="text/javascript"></script>
<script src="js/lib/jquery.min.js" type="text/javascript"></script>
<script src="js/lib/datatables.min.js" type="text/javascript"></script>
<script src="js/lib/snap.min.js" type="text/javascript"></script>
......
......@@ -106,6 +106,7 @@
<script src="js/lib/uuid.js" type="text/javascript"></script>
<script src="js/lib/chart.min.js" type="text/javascript"></script>
<script src="js/lib/client.min.js" type="text/javascript"></script>
<script src="js/lib/FileSaver.min.js" type="text/javascript"></script>
<script src="js/lib/jquery.min.js" type="text/javascript"></script>
<script src="js/lib/datatables.min.js" type="text/javascript"></script>
<script src="js/lib/snap.min.js" type="text/javascript"></script>
......
......@@ -423,6 +423,7 @@
<script src="js/lib/uuid.js" type="text/javascript"></script>
<script src="js/lib/chart.min.js" type="text/javascript"></script>
<script src="js/lib/client.min.js" type="text/javascript"></script>
<script src="js/lib/FileSaver.min.js" type="text/javascript"></script>
<script src="js/lib/jquery.min.js" type="text/javascript"></script>
<script src="js/lib/datatables.min.js" type="text/javascript"></script>
<script src="js/lib/snap.min.js" type="text/javascript"></script>
......
......@@ -21,12 +21,12 @@
* @description
* Main Controller for the datastore widget
*/
angular.module('psonocli').controller('DatastoreCtrl', ["$q", "$rootScope", "$scope", "$uibModal", "$routeParams", "$timeout",
"manager", "managerDatastorePassword", 'managerDatastore', 'offlineCache',
"itemBlueprint", "managerWidget", "managerSecret", "dropDownMenuWatcher",
function($q, $rootScope, $scope, $uibModal, $routeParams, $timeout,
manager, managerDatastorePassword, managerDatastore, offlineCache,
itemBlueprint, managerWidget, managerSecret, dropDownMenuWatcher){
angular.module('psonocli').controller('DatastoreCtrl', ["$q", "$rootScope", "$scope", "$uibModal", "$routeParams",
"$timeout", "manager", "managerDatastorePassword", 'managerDatastore', 'offlineCache', "itemBlueprint",
"managerWidget", "managerSecret", "dropDownMenuWatcher", "managerFileTransfer",
function($q, $rootScope, $scope, $uibModal, $routeParams,
$timeout, manager, managerDatastorePassword, managerDatastore, offlineCache, itemBlueprint,
managerWidget, managerSecret, dropDownMenuWatcher, managerFileTransfer){
$scope.contextMenuOnShow = contextMenuOnShow;
$scope.contextMenuOnClose = contextMenuOnClose;
......@@ -83,14 +83,17 @@
/**
* Triggered once someone clicks on a node entry
* Forwards to the opener of the "open-secret.html" page
* Forwards to the opener of the "open-secret.html" page or the file download
*
* @param item The item in question
* @param path The path to the item
*/
on_item_click: function (item, path) {
if (item.type === 'file') {
return managerFileTransfer.on_item_click(item, path);
} else {
return managerSecret.on_item_click(item, path);
}
},
/**
......
......@@ -14,7 +14,6 @@
*/
angular.module('psonocli').controller('ModalEditEntryBigCtrl', ['$scope', '$rootScope', '$uibModal', 'itemBlueprint',
function ($scope, $rootScope, $uibModal, itemBlueprint) {
$scope.show_history = show_history;
$scope.reset = reset;
$scope.save = save;
......
......@@ -38,7 +38,7 @@
$scope.logout = managerDatastoreUser.logout;
$scope.go_offline = go_offline;
$scope.go_online = go_online;
$scope.on_item_click = managerSecret.on_item_click;
$scope.on_item_click = on_item_click;
$scope.on_datastore_switch_click = on_datastore_switch_click;
$scope.user_username = account.get_account_detail('user_username');
......@@ -214,6 +214,20 @@
return '';
}
}
/**
* @ngdoc
* @name psonocli.controller:MainCtrl#on_item_click
* @methodOf psonocli.controller:MainCtrl
*
* @description
* Triggered once someone clicks an item
*
* @param {object} item The item to open
*/
function on_item_click(item) {
managerSecret.on_item_click(item)
}
}]
);
}(angular, Raven));
\ No newline at end of file
......@@ -36,7 +36,7 @@
$scope.open_tab = browserClient.open_tab;
$scope.logout = managerDatastoreUser.logout;
$scope.filterBySearch = filterBySearch;
$scope.on_item_click = managerSecret.on_item_click;
$scope.on_item_click = on_item_click;
$scope.edit_item = edit_item;
$scope.generate_password = generate_password;
$scope.bookmark = bookmark;
......@@ -61,6 +61,11 @@
//console.log(ele);
});
manager.storage_on('datastore-file-leafs', 'update', function (ele) {
//console.log("main.js update");
//console.log(ele);
});
manager.storage_on('datastore-password-leafs', 'insert', function (ele) {
//console.log("main.js insert");
......@@ -68,6 +73,12 @@
});
manager.storage_on('datastore-file-leafs', 'insert', function (ele) {
//console.log("main.js insert");
$scope.searchArray.push(ele);
});
manager.storage_on('datastore-password-leafs', 'delete', function (ele) {
//console.log("main.js update");
//console.log(ele);
......@@ -78,6 +89,17 @@
}
});
manager.storage_on('datastore-file-leafs', 'delete', function (ele) {
//console.log("main.js update");
//console.log(ele);
for (var i = $scope.searchArray.length - 1; i >= 0; i--) {
if ($scope.searchArray[i].key === ele.key) {
$scope.searchArray.splice(i, 1);
}
}
});
if (offlineCache.is_active() && offlineCache.is_locked()) {
var modalInstance = $uibModal.open({
......@@ -186,6 +208,21 @@
return password_filter(datastore_entry);
}
/**
* @ngdoc
* @name psonocli.controller:PanelCtrl#on_item_click
* @methodOf psonocli.controller:MainCtrl
*
* @description
* Triggered once someone clicks an item
*
* @param {object} item The item to open
*/
function on_item_click(item) {
console.log(item);
managerSecret.on_item_click(item)
}
}]
);
}(angular));
\ No newline at end of file
......@@ -14,14 +14,17 @@
* @requires psonocli.shareBlueprint
* @requires psonocli.managerWidget
* @requires psonocli.cryptoLibrary
* @requires psonocli.managerFileTransfer
*
* @description
* Main Controller for the shareusers widget
*/
angular.module('psonocli').controller('ShareusersCtrl', ["$scope", "$interval", "managerSecret", "managerDatastoreUser",
"$uibModal", "shareBlueprint", "managerWidget", "$timeout", "dropDownMenuWatcher", 'cryptoLibrary', 'managerDatastorePassword',
function ($scope, $interval, managerSecret, managerDatastoreUser, $uibModal, shareBlueprint,
managerWidget, $timeout, dropDownMenuWatcher, cryptoLibrary, managerDatastorePassword) {
"$uibModal", "shareBlueprint", "managerWidget", "$timeout", "dropDownMenuWatcher", 'cryptoLibrary',
'managerDatastorePassword', 'managerFileTransfer',
function ($scope, $interval, managerSecret, managerDatastoreUser,
$uibModal, shareBlueprint, managerWidget, $timeout, dropDownMenuWatcher, cryptoLibrary,
managerDatastorePassword, managerFileTransfer) {
$scope.contextMenuOnShow = contextMenuOnShow;
$scope.contextMenuOnClose = contextMenuOnClose;
......@@ -88,7 +91,11 @@
* @param path The path to the item
*/
on_item_click: function (item, path) {
managerSecret.on_item_click(item, path);
if (item.type === 'file') {
return managerFileTransfer.on_item_click(item, path);
} else {
return managerSecret.on_item_click(item, path);
}
},
/**
......
......@@ -95,17 +95,17 @@
return;
}
if ($scope.bp.selected.hasOwnProperty('alternativeSave')) {
if ($scope.bp.selected.hasOwnProperty('preSave')) {
var onSuccess = function(){
// pass
$uibModalInstance.close($scope.bp.selected);
};
var onError = function(error) {
$scope.errors.push(error);
var onError = function(errors) {
for (var i = 0; i < errors.length; i++) {
$scope.errors.push(errors[i]);
}
};
$scope.bp.selected.alternativeSave($scope.bp.selected, parent, path, $uibModalInstance.close)
$scope.bp.selected.preSave($scope.bp.selected, parent, path)
.then(onSuccess, onError);
} else {
$scope.bp.selected['callback_data'] = $scope.data;
......
......@@ -15,7 +15,6 @@
*/
angular.module('psonocli').controller('ModalEditEntryCtrl', ['$rootScope', '$scope', '$uibModal', '$uibModalInstance', 'itemBlueprint', 'offlineCache', 'node', 'path', 'data',
function ($rootScope, $scope, $uibModal, $uibModalInstance, itemBlueprint, offlineCache, node, path, data) {
$scope.show_history = show_history;
$scope.reset = reset;
$scope.save = save;
......@@ -47,7 +46,9 @@
selected: itemBlueprint.get_blueprint($scope.node.type)
};
console.log($scope.data);
for (var i = $scope.bp.selected.fields.length - 1; i >= 0; i--) {
console.log($scope.bp.selected.fields[i].name);
if ($scope.data.hasOwnProperty($scope.bp.selected.fields[i].name)) {
$scope.bp.selected.fields[i].value = $scope.data[$scope.bp.selected.fields[i].name];
}
......
......@@ -585,6 +585,11 @@
' <i class="fa fa-external-link"></i>' +
'</a>' +
'</span>' +
'<span class="node-open-link" ng-if="item.type === \'file\'">' +
'<a href="#" class="btn btn-default" ng-click="$event.preventDefault(); $event.stopPropagation(); clickItem(item, $event)">' +
' <i class="fa fa-download"></i>' +
'</a>' +
'</span>' +
'<span class="node-dropdown" uib-dropdown on-toggle="toggled(open, \'drop_item_\' + item.id)">' +
'<a class="btn btn-default editbutton" href="#" role="button" id="drop_item_{{ ::item.id }}" uib-dropdown-toggle ng-click="$event.stopPropagation()">' +
' <i class="fa fa-cogs"></i>' +
......
(function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("undefined"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Depricated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(b,c,d){var e=new XMLHttpRequest;e.open("GET",b),e.responseType="blob",e.onload=function(){a(e.response,c,d)},e.onerror=function(){console.error("could not download file")},e.send()}function d(a){var b=new XMLHttpRequest;return b.open("HEAD",a,!1),b.send(),200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(a,b,d,e){if(e=e||open("","_blank"),e&&(e.document.title=e.document.body.innerText="downloading..."),"string"==typeof a)return c(a,b,d);var g="application/octet-stream"===a.type,h=/constructor/i.test(f.HTMLElement)||f.safari,i=/CriOS\/[\d]+/.test(navigator.userAgent);if((i||g&&h)&&"object"==typeof FileReader){var j=new FileReader;j.onloadend=function(){var a=j.result;a=i?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),e?e.location.href=a:location=a,e=null},j.readAsDataURL(a)}else{var k=f.URL||f.webkitURL,l=k.createObjectURL(a);e?e.location=l:location.href=l,e=null,setTimeout(function(){k.revokeObjectURL(l)},4E4)}});f.saveAs=a.saveAs=a,"undefined"!=typeof module&&(module.exports=a)});
//# sourceMappingURL=FileSaver.min.js.map
\ No newline at end of file
......@@ -126,6 +126,7 @@
templateUrl: 'view/index-gpg-encrypt.html'
})
.when('/secret/:type/:secret_id', {})
.when('/file/download/:file_id', {})
.when('/activation-code/:activation_code', {})
.when('/datastore/search/:default_search', {
templateUrl: 'view/datastore.html',
......@@ -211,8 +212,8 @@
return parts.join(' ');
};
}])
.run(['$rootScope', '$location', '$routeParams', '$http', '$templateCache', 'managerSecret', 'offlineCache', 'managerStatus',
function ($rootScope, $location, $routeParams, $http, $templateCache, managerSecret, offlineCache, managerStatus) {
.run(['$rootScope', '$location', '$routeParams', '$http', '$templateCache', 'managerSecret', 'managerFileTransfer', 'offlineCache', 'managerStatus',
function ($rootScope, $location, $routeParams, $http, $templateCache, managerSecret, managerFileTransfer, offlineCache, managerStatus) {
$rootScope.$on( "$routeChangeStart", function(event, next, current) {
var offline_redirect_urls = [
......@@ -233,6 +234,12 @@
var redirect = '/secret/';
if ($location.path().substring(0, redirect.length) === redirect && $routeParams.hasOwnProperty('secret_id')) {
managerSecret.redirect_secret($routeParams.type, $routeParams.secret_id);
return;
}
redirect = '/file/download/';
if ($location.path().substring(0, redirect.length) === redirect && $routeParams.hasOwnProperty('file_id')) {
managerFileTransfer.download_file($routeParams.file_id);
return;
}
});
}]);
......
......@@ -6,29 +6,14 @@
* @name psonocli.apiFileserver
* @requires $http
* @requires $q
* @requires $rootScope
* @requires psonocli.storage
* @requires psonocli.cryptoLibrary
* @requires psonocli.device
* @requires psonocli.offlineCache
*
* @description
* Service to talk to the psono REST api
*/
var apiFileserver = function($http, $q, $rootScope, storage, cryptoLibrary, device, offlineCache) {
var apiFileserver = function($http, $q) {
var decrypt_data = function(session_secret_key, data, req) {
if (session_secret_key && data !== null
&& data.hasOwnProperty('data')
&& data.data.hasOwnProperty('text')
&& data.data.hasOwnProperty('nonce')) {
data.data = JSON.parse(cryptoLibrary.decrypt_data(data.data.text, data.data.nonce, session_secret_key));
}
return data;
};
var call = function(fileserver_url, connection_type, endpoint, data, headers, session_secret_key, transformRequest) {
var call = function(fileserver_url, connection_type, endpoint, data, headers, transformRequest, responseType) {
if (!transformRequest) {
transformRequest = $http.defaults.transformRequest;
......@@ -38,7 +23,8 @@
method: connection_type,
url: fileserver_url + endpoint,
data: data,
transformRequest: transformRequest
transformRequest: transformRequest,
responseType: responseType
};
req.headers = headers;
......@@ -46,11 +32,11 @@
return $q(function(resolve, reject) {
var onSuccess = function(data) {
return resolve(decrypt_data(session_secret_key, data, req));
return resolve(data);
};
var onError = function(data) {
return reject(decrypt_data(session_secret_key, data, req));
return resolve(data);
};
$http(req)
......@@ -88,7 +74,38 @@
'Content-Type': undefined
};
return call(fileserver_url, connection_type, endpoint, data, headers, '', angular.identity);
return call(fileserver_url, connection_type, endpoint, data, headers, angular.identity);
};
/**
* @ngdoc
* @name psonocli.apiFileserver#download
* @methodOf psonocli.apiFileserver
*
* @description
* Ajax POST request to download a file chunk
*
* @param {string} fileserver_url The url of the target fileserver
* @param {string} token The token of the user
* @param {string} ticket The ticket to authenticate the download
* @param {string} ticket_nonce The nonce of the ticket
*
* @returns {promise} promise
*/
var download = function (fileserver_url, token, ticket, ticket_nonce) {
var endpoint = '/download/';
var connection_type = "POST";
var data = {
token: token,
ticket: ticket,
ticket_nonce: ticket_nonce
};
var headers = {
};
return call(fileserver_url, connection_type, endpoint, data, headers, undefined, 'arraybuffer');
};
/**
......@@ -115,11 +132,12 @@
return {
info: info,
upload: upload
upload: upload,
download: download
};
};
var app = angular.module('psonocli');
app.factory("apiFileserver", ['$http', '$q', '$rootScope', 'storage', 'cryptoLibrary', 'device', 'offlineCache', apiFileserver]);
app.factory("apiFileserver", ['$http', '$q', apiFileserver]);
}(angular));
......@@ -467,6 +467,15 @@
['autosubmit', 'autosubmit'],
['search', 'urlfilter']
]);
managerDatastore.fill_storage('datastore-file-leafs', datastore, [
['key', 'file_id'],
['file_id', 'file_id'],
['file_shard_id', 'file_shard_id'],
['file_secret_key', 'file_secret_key'],
['file_chunks', 'file_chunks'],
['file_title', 'file_title']
]);
password_datastore_read = true;
......@@ -518,9 +527,22 @@
// datastore has changed, so lets regenerate local lookup
managerDatastore.fill_storage('datastore-password-leafs', datastore, [
['key', 'secret_id'],
['secret_id', 'secret_id'],
['value', 'secret_key'],
['name', 'name'],
['urlfilter', 'urlfilter']
['urlfilter', 'urlfilter'],
['autosubmit', 'autosubmit'],
['search', 'urlfilter']
]);
managerDatastore.fill_storage('datastore-file-leafs', datastore, [
['key', 'file_id'],
['file_id', 'file_id'],
['file_shard_id', 'file_shard_id'],
['file_secret_key', 'file_secret_key'],
['file_chunks', 'file_chunks'],
['file_title', 'file_title']
]);
datastore = managerBase.filter_datastore_content(datastore);
......
......@@ -151,8 +151,6 @@
modalInstance.result.then(function (content) {
console.log(content);
if (typeof content === 'undefined') {
return;
}
......@@ -188,6 +186,12 @@
&& content.autosubmit_field === content.fields[i].name) {
datastore_object.autosubmit = content.fields[i].value;
}
if (content.hasOwnProperty("non_secret_fields")
&& content.non_secret_fields.indexOf(content.fields[i].name) !== -1) {
datastore_object[content.fields[i].name] = content.fields[i].value;
}
secret_object[content.fields[i].name] = content.fields[i].value;
}
......@@ -206,9 +210,8 @@
parent_datastore_id = closest_share['datastore_id'];
}
var onSuccess = function(e) {
datastore_object['secret_id'] = e.secret_id;
datastore_object['secret_key'] = e.secret_key;
var save_datastore = function() {
parent.items.push(datastore_object);
......@@ -223,9 +226,18 @@
}
content.fields[i].value = '';
}
};
var onSuccess = function(e) {
datastore_object['secret_id'] = e.secret_id;
datastore_object['secret_key'] = e.secret_key;
save_datastore();
};
if (content.skipSecretCreate) {
save_datastore();
} else {
managerSecret.create_secret(
secret_object,
link_id,
......@@ -236,6 +248,7 @@
content['callback_data']['callback_pass']
)
.then(onSuccess, onError);
}
}, function () {
// cancel triggered
......@@ -338,8 +351,13 @@
}
};
if (typeof(node.secret_id) === 'undefined') {
onSuccess(node)
} else {
managerSecret.read_secret(node.secret_id, node.secret_key)
.then(onSuccess, onError);
}
};
/**
......
......@@ -40,6 +40,11 @@
indices: ['key', 'urlfilter', 'name'],
uniques: ['key']
},
'datastore-file-leafs': {
name: 'datastore-file-leafs',
indices: ['key'],
uniques: ['key']
},
'datastore-user-leafs': {
name: 'datastore-user-leafs',
indices: ['key', 'filter', 'name'],
......
......@@ -170,6 +170,7 @@
<script src="js/lib/uuid.js" type="text/javascript"></script>
<script src="js/lib/chart.min.js" type="text/javascript"></script>
<script src="js/lib/client.min.js" type="text/javascript"></script>
<script src="js/lib/FileSaver.min.js" type="text/javascript"></script>
<script src="js/lib/jquery.min.js" type="text/javascript"></script>
<script src="js/lib/datatables.min.js" type="text/javascript"></script>
<script src="js/lib/snap.min.js" type="text/javascript"></script>
......
......@@ -80,6 +80,7 @@
<script src="js/lib/uuid.js" type="text/javascript"></script>
<script src="js/lib/chart.min.js" type="text/javascript"></script>
<script src="js/lib/client.min.js" type="text/javascript"></script>
<script src="js/lib/FileSaver.min.js" type="text/javascript"></script>
<script src="js/lib/jquery.min.js" type="text/javascript"></script>
<script src="js/lib/datatables.min.js" type="text/javascript"></script>
<script src="js/lib/snap.min.js" type="text/javascript"></script>
......
......@@ -294,6 +294,7 @@
<script src="js/lib/uuid.js" type="text/javascript"></script>
<script src="js/lib/chart.min.js" type="text/javascript"></script>
<script src="js/lib/client.min.js" type="text/javascript"></script>
<script src="js/lib/FileSaver.min.js" type="text/javascript"></script>
<script src="js/lib/jquery.min.js" type="text/javascript"></script>
<script src="js/lib/datatables.min.js" type="text/javascript"></script>
<script src="js/lib/snap.min.js" type="text/javascript"></script>
......
......@@ -71,6 +71,7 @@
<script src="js/lib/uuid.js" type="text/javascript"></script>
<script src="js/lib/chart.min.js" type="text/javascript"></script>
<script src="js/lib/client.min.js" type="text/javascript"></script>
<script src="js/lib/FileSaver.min.js" type="text/javascript"></script>
<script src="js/lib/jquery.min.js" type="text/javascript"></script>
<script src="js/lib/datatables.min.js" type="text/javascript"></script>
<script src="js/lib/snap.min.js" type="text/javascript"></script>
......
......@@ -130,6 +130,7 @@
<script src="js/lib/uuid.js" type="text/javascript"></script>
<script src="js/lib/chart.min.js" type="text/javascript"></script>
<script src="js/lib/client.min.js" type="text/javascript"></script>
<script src="js/lib/FileSaver.min.js" type="text/javascript"></script>
<script src="js/lib/jquery.min.js" type="text/javascript"></script>
<script src="js/lib/datatables.min.js" type="text/javascript"></script>
<script src="js/lib/snap.min.js" type="text/javascript"></script>
......
......@@ -13,6 +13,7 @@ self.addEventListener('install', function(event) {
'./index.html',
'./lost-password.html',
'./open-secret.html',
'./download-file.html',
'./popup_pgp.html',
'./privacy-policy.html',
'./privacy-policy-content.html',
......@@ -108,6 +109,7 @@ self.addEventListener('install', function(event) {
'./js/lib/uuid.js',
'./js/lib/chart.min.js',
'./js/lib/client.min.js',
'./js/lib/FileSaver.min.js',
'./js/lib/jquery.min.js',
'./js/lib/datatables.min.js',
'./js/lib/snap.min.js',
......
{
"FILE_ID": "Datei ID",
"FILE_SHARD_ID": "Datei shard ID",
"FILE_CHUNKS": "Datei Stück",
"NO_PERMISSION_OR_NOT_EXIST": "Es existiert nicht existent oder sie haben keine Berechtigung.",
"INSUFFICIENT_FUNDS": "Guthaben zu niedrig",
"NO_FILE_SELECTED": "Keine Datei ausgewählt",
"NO_FILESERVER_AVAILABLE": "Kein Fileserver verfügbar",
"FILE_SIZE": "Dateigröße",
"FILE_SIZE_BYTES": "Dateigröße (in Bytes)",
......@@ -136,6 +142,7 @@
"GRANT": "Gewähren",
"ACCEPTED": "Akzeptiert",
"DECRYPTING_SECRET": "Secret entschlüsseln ...",
"DECRYPTING_FILE": "Datei entschlüsseln ...",
"SET_NEW_PASSWORD": "Neues passwort speichern",
"SECOND_FACTOR_REQUIRED": "Zweiter Faktor erforderlich",
"ACTIVATE": "Aktivieren",
......