1
0
Fork 0
mirror of https://github.com/seiichiro0185/sailotp.git synced 2024-11-21 15:29:42 +00:00

Merge branch 'fix-crypto' into develop

This commit is contained in:
seiichiro 2023-02-26 16:39:23 +01:00
commit 78b9e561bd
26 changed files with 1119 additions and 351 deletions

View file

@ -4,6 +4,7 @@ DEFINES += APP_VERSION=\\\"$$VERSION\\\"
DEFINES += APP_BUILDNUM=\\\"$$RELEASE\\\"
CONFIG += sailfishapp
PKGCONFIG += libcrypto
SOURCES += src/harbour-sailotp.cpp
@ -21,7 +22,6 @@ DISTFILES += qml/harbour-sailotp.qml \
qml/lib/urldecoder.js \
qml/lib/storage.js \
qml/lib/crypto.js \
qml/lib/cryptojs-aes.js \
qml/lib/sha.js \
qml/sailotp.png \
rpm/harbour-sailotp.spec \
@ -48,4 +48,5 @@ TRANSLATIONS = translations/harbour-sailotp-de.ts \
include(src/qzxing/QZXing.pri)
include(src/FileIO/FileIO.pri)
include(src/QCipher/QCipher.pri)
include(src/qqrencode/qqrencode.pri)

View file

@ -1,35 +0,0 @@
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
e)).finalize(b)}}});var n=d.algo={};return d}(Math);
(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
l)}})();
CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();

View file

@ -274,7 +274,7 @@ Page {
horizontalAlignment: TextEdit.left
plainText: "\n"+qsTr("SailOTP uses the following third party libs:")+'
http://caligatio.github.io/jsSHA/
https://code.google.com/archive/p/crypto-js/
https://github.com/jlinoff/openssl-aes-cipher/
http://sourceforge.net/projects/qzxing/
http://fukuchi.org/works/qrencode/'
color: Theme.secondaryHighlightColor

View file

@ -28,11 +28,12 @@
*/
import QtQuick 2.0
import QtQuick 2.2
import Sailfish.Silica 1.0
import Sailfish.Pickers 1.0
import harbour.sailotp.FileIO 1.0 // Import FileIO Class
import harbour.sailotp.QCipher 1.0 // Import FileIO Class
import "../lib/storage.js" as DB // Import the storage library for Config-Access
import "../lib/cryptojs-aes.js" as CryptoJS //Import AES encryption library
// Define Layout of the Export / Import Page
Dialog {
@ -82,6 +83,11 @@ Dialog {
onError: { console.log(msg); }
}
// QCipher Object for Encryption
QCipher {
id: cipher
}
SilicaFlickable {
id: exportFlickable
anchors.fill: parent
@ -92,16 +98,29 @@ Dialog {
onClicked: {
if (mode == "export") {
mode = "import"
fileName.text = ""
} else {
mode = "export"
fileName.text = creFileName()
}
}
}
}
// FilePicker for the Input File
Component {
id: filePickerPage
FilePickerPage {
nameFilters: [ '*' ]
onSelectedContentPropertiesChanged: {
fileName.text = selectedContentProperties.filePath
}
}
}
VerticalScrollDecorator {}
Column {
Column {
anchors.fill: parent
DialogHeader {
acceptText: mode == "export" ? qsTr("Export") : qsTr("Import")
@ -110,9 +129,10 @@ Dialog {
TextField {
id: fileName
width: parent.width
text: mode == "export" ? creFileName() : XDG_HOME_DIR + "/";
text: mode == "export" ? creFileName() : "";
label: qsTr("Filename")
placeholderText: mode == "import" ? qsTr("File to import") : qsTr("File to export")
placeholderText: qsTr("File to export")
visible: mode == "export"
focus: true
horizontalAlignment: TextInput.AlignLeft
@ -121,6 +141,14 @@ Dialog {
EnterKey.onClicked: filePassword.focus = true
}
ValueButton {
width: parent.width
label: qsTr("File to import")
value: fileName.text ? fileName.text : "None"
visible: mode == "import"
onClicked: pageStack.push(filePickerPage)
}
TextSwitch {
id: fileOverwrite
checked: false
@ -186,7 +214,7 @@ Dialog {
color: Theme.secondaryColor
visible: mode == "export"
text: qsTr("Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.")+"\n\n"+qsTr("To view the content of the export file outside of SailOTP use the following openssl command:") + "\n\nopenssl enc -d -a -A -md md5 -aes-256-cbc -in <file>"
text: qsTr("Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.")+"\n\n"+qsTr("To view the content of the export file outside of SailOTP use the following openssl command:") + "\n\nopenssl enc -d -a -aes-256-cbc -in <file>"
}
}
}
@ -206,14 +234,18 @@ Dialog {
if (plainText != "") {
try {
chipherText = CryptoJS.CryptoJS.AES.encrypt(plainText, filePassword.text);
if (!exportFile.write(chipherText)) {
notify.show(qsTr("Error writing to file ")+ fileName.text, 4000);
chipherText = cipher.encrypt(plainText, filePassword.text);
if (chipherText != "") {
if (!exportFile.write(chipherText)) {
notify.show(qsTr("Error writing to file ")+ fileName.text, 4000);
} else {
notify.show(qsTr("Token Database exported to ")+ fileName.text, 4000);
}
} else {
notify.show(qsTr("Token Database exported to ")+ fileName.text, 4000);
notify.show(qsTr("Could not encrypt tokens. Error: "), 4000);
}
} catch(e) {
notify.show(qsTr("Could not encrypt tokens. Error: "), 4000);
notify.show(qsTr("Could not encrypt tokens. Error: ") + e, 4000);
}
} else {
notify.show(qsTr("Could not read tokens from Database"), 4000);
@ -225,7 +257,7 @@ Dialog {
if (chipherText != "") {
try {
var errormsg = ""
plainText = CryptoJS.CryptoJS.AES.decrypt(chipherText, filePassword.text).toString(CryptoJS.CryptoJS.enc.Utf8);
plainText = cipher.decrypt(chipherText, filePassword.text)
if (DB.json2db(plainText, errormsg)) {
notify.show(qsTr("Tokens imported from ")+ fileName.text, 4000);
} else {

View file

@ -1,3 +1,8 @@
* Mon Feb 20 2023 Stefan Brand <sailfish@seiichiro0185.org> 1.11.0-1
- Rework Export/Import File Encryption to use C++
- Switch to SHA256 for Export/Import Encryption instead of MD5
- Add FilePicker to select Import-File
* Wed Jan 25 2023 Stefan Brand <sailfish@seiichiro0185.org> 1.10.2-1
- Add Sailjail Permission for Camera Use (contributed by Keeper-of-the-Keys)

View file

@ -1,6 +1,6 @@
Name: harbour-sailotp
Summary: SailOTP
Version: 1.10.2
Version: 1.11.0
Release: 1
Group: Security
URL: https://github.com/seiichiro0185/sailotp/
@ -26,6 +26,7 @@ PkgConfigBR:
- Qt5Core
- Qt5Multimedia
- sailfishapp >= 1.0.2
- libcrypto
Requires:
- sailfishsilica-qt5 >= 0.10.9

View file

@ -52,7 +52,7 @@ QString FileIO::read()
QTextStream t( &file );
do {
line = t.readLine();
fileContent += line;
fileContent += line + "\n";
} while (!line.isNull());
file.close();

9
src/QCipher/QCipher.pri Normal file
View file

@ -0,0 +1,9 @@
QT += core quick
INCLUDEPATH += $$PWD/src
HEADERS += $$PWD/src/cipher.h \
$$PWD/src/qcipher.h
SOURCES += $$PWD/src/cipher.cpp \
$$PWD/src/qcipher.cpp

3
src/QCipher/README.md Normal file
View file

@ -0,0 +1,3 @@
# QChipher - a minimal OpenSSL Encryption / Decryption Wrapper
Based on https://github.com/jlinoff/openssl-aes-cipher by Joe Linoff

476
src/QCipher/src/cipher.cpp Normal file
View file

@ -0,0 +1,476 @@
// ================================================================
// Description: Cipher class.
// Copyright: Copyright (c) 2012 by Joe Linoff
// Version: 1.3.0
// Author: Joe Linoff
//
// LICENSE
// The cipher package is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// The cipher package is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details. You should have received
// a copy of the GNU General Public License along with the change
// tool; if not, write to the Free Software Foundation, Inc., 59
// Temple Place, Suite 330, Boston, MA 02111-1307 USA.
// ================================================================
#include "cipher.h"
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <stdexcept>
#include <sstream>
#include <cstring> // strlen
#include <cstdlib> // getenv
#include <unistd.h> // getdomainname
#include <openssl/aes.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <openssl/err.h>
using namespace std;
// ================================================================
// MACROS
// ================================================================
#define DBG_PRE __FILE__ << ":" << __LINE__ << ": "
#define DBG_FCT(fct) if(m_debug) cout << DBG_PRE << "FCT " << fct << endl
#define DBG_TDUMP(v) if(m_debug) tdump(__FILE__, __LINE__, #v, v)
#define DBG_PKV(v) if(m_debug) vdump(__FILE__, __LINE__, #v, v)
#define DBG_PKVR(k, v) if(m_debug) vdump(__FILE__, __LINE__, k, v)
#define DBG_BDUMP(a, x) if(m_debug) bdump(__FILE__, __LINE__, #a, a, x)
#define DBG_MDUMP(a) if(m_debug) bdump(__FILE__, __LINE__, #a, (unsigned char*)a.c_str(), a.size())
#define DBG_MADEIT cout << DBG_PRE << "MADE IT" << endl
#define PKV(v) vdump(__FILE__, __LINE__, #v, v)
#define SALTED_PREFIX "Salted__"
namespace
{
// ================================================================
// DEBUG mode only.
// Formated dump of a general type.
// ================================================================
template<typename T> void vdump(const string& fn,
uint ln,
const string& prefix,
const T& d)
{
cout << fn << ":" << ln << ": " << prefix << "\t" << d << endl;
}
// ================================================================
// DEBUG mode only.
// Explicit template instantiation of the above for string
// types so that I can report the length.
// ================================================================
template<> void vdump<string>(const string& fn,
uint ln,
const string& prefix,
const string& d)
{
cout << fn << ":" << ln << ": "
<< prefix << "\t"
<< left << setw(64) << d
<< " (" << d.size() << ")"
<< endl;
}
// ================================================================
// DEBUG mode only.
// Dump for fixed sized types like m_salt and m_key.
// ================================================================
template<typename T> void tdump(const string& fn,
uint ln,
const string& prefix,
const T& d)
{
cout << fn << ":" << ln << ": " << prefix << "\t";
for(uint i=0;i<sizeof(T);++i) {
#if 0
// Prettified output.
// I turned it off so that the format would match openssl.
if ((i%16)==0) {
if (i) {
cout << endl;
cout << "\t\t\t";
}
else {
if (prefix.size()<4) {
cout << "\t";
}
cout << "\t";
}
}
else if (i) {
cout << ", ";
}
#endif
cout << setw(2) << setfill('0') << hex << right << uint(d[i]) << dec << setfill(' ');
}
cout << " (" << sizeof(T) << ")" << endl;
}
// ================================================================
// DEBUG mode only.
// Binary data dump.
// ================================================================
void bdump(const string& fn,
uint ln,
const string& prefix,
unsigned char* a,
unsigned int len)
{
cout << fn << ":" << ln << ": " << prefix;
for(uint i=0;i<len;++i) {
if ((i%16)==0) {
if (i) {
cout << endl;
cout << "\t\t\t";
}
else {
cout << "\t\t";
}
}
else if (i) {
cout << ", ";
}
cout << setw(2) << hex << right << uint(a[i]) << dec;
}
cout << " (" << len << ")" << endl;
}
}
// ================================================================
// Constructor.
// ================================================================
Cipher::Cipher()
: m_cipher(CIPHER_DEFAULT_CIPHER),
m_digest(CIPHER_DEFAULT_DIGEST),
m_count(CIPHER_DEFAULT_COUNT),
m_embed(true), // compatible with openssl
m_debug(false)
{
}
// ================================================================
// Constructor.
// ================================================================
Cipher::Cipher(const std::string& cipher,
const std::string& digest,
uint count,
bool embed)
: m_cipher(cipher),
m_digest(digest),
m_count(count),
m_embed(embed),
m_debug(false)
{
}
// ================================================================
// Destructor.
// ================================================================
Cipher::~Cipher()
{
}
// ================================================================
// encrypt
// ================================================================
string Cipher::encrypt(const string& plaintext,
const string& pass,
const string& salt)
{
DBG_FCT("encrypt");
set_salt(salt);
init(pass);
kv1_t x = encode_cipher(plaintext);
uchar* ct = x.first;
uint ctlen = x.second;
DBG_BDUMP(ct, ctlen);
string ret = encode_base64(ct, ctlen);
delete [] ct;
DBG_MDUMP(ret);
return ret;
}
// ================================================================
// decrypt
// ================================================================
string Cipher::decrypt(const string& mimetext,
const string& pass,
const string& salt)
{
DBG_FCT("decrypt");
DBG_PKV(mimetext);
kv1_t x = decode_base64(mimetext);
uchar* ct = x.first;
uint ctlen = x.second;
DBG_PKV(ctlen);
DBG_BDUMP(ct, ctlen);
if (strncmp((const char*)ct, SALTED_PREFIX, 8) == 0) {
memcpy(m_salt, &ct[8], 8);
ct += 16;
ctlen -= 16;
}
else {
set_salt(salt);
}
init(pass);
string ret = decode_cipher(ct, ctlen);
DBG_MDUMP(ret);
return ret;
}
// ================================================================
// encode_base64
// ================================================================
string Cipher::encode_base64(uchar* ciphertext,
uint ciphertext_len) const
{
DBG_FCT("encode_base64");
BIO* b64 = BIO_new(BIO_f_base64());
BIO* bm = BIO_new(BIO_s_mem());
b64 = BIO_push(b64, bm);
if (BIO_write(b64, ciphertext, ciphertext_len)<2) {
throw runtime_error("BIO_write() failed");
}
if (BIO_flush(b64)<1) {
throw runtime_error("BIO_flush() failed");
}
BUF_MEM *bptr=0;
BIO_get_mem_ptr(b64, &bptr);
uint len=bptr->length;
char* mimetext = new char[len+1];
memcpy(mimetext, bptr->data, bptr->length-1);
mimetext[bptr->length-1]=0;
BIO_free_all(b64);
string ret = mimetext;
delete [] mimetext;
return ret;
}
// ================================================================
// decode_base64
// ================================================================
Cipher::kv1_t Cipher::decode_base64(const string& mimetext) const
{
DBG_FCT("decode_base64");
kv1_t x;
int SZ=mimetext.size(); // this will always be smaller
x.first = new uchar[SZ];
char* tmpbuf = new char[SZ+1];
strcpy(tmpbuf, mimetext.c_str());
BIO* b64 = BIO_new(BIO_f_base64());
BIO* bm = BIO_new_mem_buf(tmpbuf, mimetext.size());
bm = BIO_push(b64, bm);
if (SZ <= 64) {
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
}
x.second = BIO_read(bm, x.first, SZ);
BIO_free_all(bm);
delete [] tmpbuf;
return x;
}
// ================================================================
// encode_cipher
// ================================================================
Cipher::kv1_t Cipher::encode_cipher(const string& plaintext) const
{
DBG_FCT("encode_cipher");
uint SZ = plaintext.size() + AES_BLOCK_SIZE + 20; // leave some padding
uchar* ciphertext = new uchar[SZ];
bzero(ciphertext, SZ);
uchar* pbeg = ciphertext;
// This requires some explanation.
// In order to be compatible with openssl, I need to append
// 16 characters worth of information that describe the salt.
// I found this in the openssl source code but I couldn't
// find any associated documentation.
uint off = 0;
if (m_embed) {
memcpy(&ciphertext[0], SALTED_PREFIX, 8);
memcpy(&ciphertext[8], m_salt, 8);
off = 16;
ciphertext += off;
}
int ciphertext_len=0;
EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
const EVP_CIPHER* cipher = EVP_aes_256_cbc();
EVP_CIPHER_CTX_init(ctx);
if (1 != EVP_EncryptInit_ex(ctx, cipher, NULL, m_key, m_iv)) {
EVP_CIPHER_CTX_free(ctx);
throw runtime_error("EVP_EncryptInit_ex DBG_PKV() init key/iv failed");
}
EVP_CIPHER_CTX_set_key_length(ctx, EVP_MAX_KEY_LENGTH);
// Encrypt the plaintext data all at once.
// It would be straightforward to chunk it but that
// add unecesary complexity at this point.
uchar* pt_buf = (uchar*)plaintext.c_str();
uint pt_len = plaintext.size();
if (1 != EVP_EncryptUpdate(ctx, ciphertext, &ciphertext_len, pt_buf, pt_len)) {
EVP_CIPHER_CTX_free(ctx);
throw runtime_error("EVP_EncryptUpdate() failed");
}
uchar* pad_buf = ciphertext + ciphertext_len; // pad at the end
int pad_len=0;
if (1 != EVP_EncryptFinal_ex(ctx, pad_buf, &pad_len)) {
EVP_CIPHER_CTX_free(ctx);
throw runtime_error("EVP_EncryptFinal_ex() failed");
}
ciphertext_len += pad_len + off; // <off> for the Salted prefix
EVP_CIPHER_CTX_free(ctx);
return kv1_t(pbeg, ciphertext_len);
}
// ================================================================
// decode_cipher
// ================================================================
string Cipher::decode_cipher(uchar* ciphertext,
uint ciphertext_len) const
{
DBG_FCT("decode_cipher");
const uint SZ = ciphertext_len+20;
uchar* plaintext = new uchar[SZ];
int plaintext_len = 0;
EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
bzero(plaintext, SZ);
EVP_CIPHER_CTX_init(ctx);
if (1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, m_key, m_iv)) {
EVP_CIPHER_CTX_free(ctx);
throw runtime_error("EVP_DecryptInit_ex() failed");
}
//EVP_CIPHER_CTX_set_key_length(ctx, EVP_MAX_KEY_LENGTH);
if (1 != EVP_DecryptUpdate(ctx, plaintext, &plaintext_len, ciphertext, ciphertext_len)) {
EVP_CIPHER_CTX_free(ctx);
throw runtime_error("EVP_DecryptUpdate() failed");
}
int plaintext_padlen=0;
if (1 != EVP_DecryptFinal_ex(ctx, plaintext+plaintext_len, &plaintext_padlen)) {
ERR_print_errors_fp(stderr);
EVP_CIPHER_CTX_free(ctx);
throw runtime_error("EVP_DecryptFinal_ex() failed");
}
plaintext_len += plaintext_padlen;
plaintext[plaintext_len] = 0;
string ret = (char*)plaintext;
delete [] plaintext;
EVP_CIPHER_CTX_free(ctx);
return ret;
}
// ================================================================
// set_salt
// ================================================================
void Cipher::set_salt(const string& salt)
{
DBG_FCT("set_salt");
if (salt.length() == 0) {
// Choose a random salt.
for(uint i=0;i<sizeof(m_salt);++i) {
m_salt[i] = rand() % 256;
}
}
else if (salt.length() == 8) {
memcpy(m_salt, salt.c_str(), 8);
}
else if (salt.length()<8) {
throw underflow_error("init(): salt is too short, must be 8 characters");
}
else if (salt.length()>8) {
throw overflow_error("init(): salt is too long, must be 8 characters");
}
}
// ================================================================
// init()
// ================================================================
void Cipher::init(const string& pass)
{
DBG_FCT("init");
// Use a default passphrase if the user didn't specify one.
m_pass = pass;
if (m_pass.empty() ) {
// Default: ' deFau1t pASsw0rD'
// Obfuscate so that a simple strings will not find it.
char a[] = {' ', 'd', 'e', 'F', 'a', 'u', '1', 't', ' ',
'p', 'A', 'S', 's', 'w', '0', 'r', 'D', 0};
m_pass = a;
}
// Create the key and IV values from the passkey.
bzero(m_key, sizeof(m_key));
bzero(m_iv, sizeof(m_iv));
OpenSSL_add_all_algorithms();
const EVP_CIPHER* cipher = EVP_get_cipherbyname(m_cipher.c_str());
const EVP_MD* digest = EVP_get_digestbyname(m_digest.c_str());
if (!cipher) {
string msg = "init(): cipher does not exist "+m_cipher;
throw runtime_error(msg);
}
if (!digest) {
string msg = "init(): digest does not exist "+m_digest;
throw runtime_error(msg);
}
int ks = EVP_BytesToKey(cipher, // cipher type
digest, // message digest
m_salt, // 8 bytes
(uchar*)m_pass.c_str(), // pass value
m_pass.length(),
m_count, // number of rounds
m_key,
m_iv);
if (ks!=32) {
throw runtime_error("init() failed: "
"EVP_BytesToKey did not return a 32 byte key");
}
DBG_PKV(m_pass);
DBG_PKV(m_cipher);
DBG_PKV(m_digest);
DBG_TDUMP(m_salt);
DBG_TDUMP(m_key);
DBG_TDUMP(m_iv);
DBG_PKV(m_count);
}
// ================================================================
// get_version
// ================================================================
std::string Cipher::get_version() {
return "1.3.0";
}
// ================================================================
// get_ssl_version
// ================================================================
#define TO_STRING_(x) #x
#define TO_STRING(x) TO_STRING_(x)
std::string Cipher::get_ssl_version() {
return TO_STRING(OPENSSL_VERSION_NUMBER);
}

208
src/QCipher/src/cipher.h Normal file
View file

@ -0,0 +1,208 @@
// ================================================================
// Description: Cipher class.
// Copyright: Copyright (c) 2012 by Joe Linoff
// Version: 1.3.0
// Author: Joe Linoff
//
// LICENSE
// The cipher package is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// The cipher package is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details. You should have received
// a copy of the GNU General Public License along with the change
// tool; if not, write to the Free Software Foundation, Inc., 59
// Temple Place, Suite 330, Boston, MA 02111-1307 USA.
// ================================================================
#ifndef cipher_h
#define cipher_h
#include <string>
#include <vector>
#include <utility> // pair
#define CIPHER_DEFAULT_CIPHER "aes-256-cbc"
#define CIPHER_DEFAULT_DIGEST "sha256"
#define CIPHER_DEFAULT_COUNT 1
/**
* The cipher object encrypts plaintext data or decrypts ciphertext
* data. All data is in ASCII because it is MIME encoded.
*
* The default cipher used is AES-256-CBC from the openssl library
* but there are many others available. The default digest used is
* SHA256 which is stronger than MD5.
*
* The algorithms mimic openssl so files created with this object
* and with the openssl tool are interchangeable.
*
* Here is how you would use it to encrypt and decrypt plaintext
* data in memory.
* @code
* #include "cipher.h"
* #include <string>
* using namepsace std;
*
* // Example the encrypts and decrypts some plaintext.
* // Use encrypt_file or decrypt_file to deal with files.
* void cipher_test()
* {
* string pass = "testTEST!23_";
* string salt = "12345678"; // must be 8 chars
* string plaintext = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
*
* // Encrypt and decrypt.
* Cipher c;
* string ciphertext = c.encrypt(plaintext ,pass,salt);
* string decoded = c.decrypt(ciphertext,pass,salt);
*
* // Test the results
* if (plaintext == decoded) {
* cout << "passed" << endl;
* }
* else {
* cout << "failed" << endl;
* }
* }
* @endcode
* @author Joe Linoff
*/
class Cipher
{
public:
typedef unsigned int uint;
typedef unsigned char uchar;
typedef uchar aes_key_t[32];
typedef uchar aes_iv_t[32];
typedef uchar aes_salt_t[8];
typedef std::pair<uchar*,uint> kv1_t;
public:
/**
* Constructor.
*/
Cipher();
/**
* Constructor.
* @param cipher The cipher algorithm to use (ex. aes-256-cbc).
* @param digest The digest to use (ex. sha256).
* @param count The number of iterations (def. 1).
* @param embed Embed the salt. If this is false, the output will
* not be compatible with openssl.
*/
Cipher(const std::string& cipher,
const std::string& digest,
uint count=1,
bool embed=true);
/**
* Destructor.
*/
~Cipher();
public:
/**
* Encrypt buffer using AES 256 CBC (SHA256).
* @param plaintext The plaintext buffer.
* @param pass The passphrase.
* @param salt The optional salt.
* @returns The ciphertext: encrypted, MIME encoded data.
*/
std::string encrypt(const std::string& plaintext,
const std::string& pass="",
const std::string& salt="");
public:
/**
* Decrypt a buffer using AES 256 CBC (SHA256).
* @param ciphertext The encrypted data.
* @param pass The passphrase.
* @param salt The optional salt.
* @returns The plaintext: decrypted, MIME decoded data.
*/
std::string decrypt(const std::string& ciphertext,
const std::string& pass="",
const std::string& salt="");
public:
/**
* Base64 encode.
* @param ciphertext Binary cipher text.
* @param ciphertext_len Length of cipher buffer.
* @returns The encoded ASCII MIME string.
*/
std::string encode_base64(uchar* ciphertext,
uint ciphertext_len) const;
/**
* Cipher encode.
* @param plaintext ASCII data to encode.
* @returns Binary data.
*/
kv1_t encode_cipher(const std::string& plaintext) const;
/**
* Base64 decode.
* @param mimetext ASCII MIME text.
* @returns Binary data.
*/
kv1_t decode_base64(const std::string& mimetext) const;
/**
* Cipher decode.
* @param ciphertext Binary cipher text.
* @param ciphertext_len Length of cipher buffer.
* @returns The decoded ASCII string.
*/
std::string decode_cipher(uchar* ciphertext,
uint ciphertext_len) const;
public:
/**
* Get the version of this class.
* @returns The version of the class.
*/
static std::string get_version();
/**
* Get the version of ssl.
*/
static std::string get_ssl_version();
public:
/**
* Set the internal debug flag.
* This is only useful for library developers.
* @param b True for debug or false otherwise.
*/
void debug(bool b=true) {m_debug=b;}
/**
* Is debug mode set?
* @returns The current debug mode.
*/
bool debug() const {return m_debug;}
private:
/**
* Convert string salt to internal format.
* @param salt The salt.
*/
void set_salt(const std::string& salt);
/**
* Initialize the cipher: set the key and IV values.
* @param pass The passphrase.
*/
void init(const std::string& pass);
private:
std::string m_pass;
std::string m_cipher;
std::string m_digest;
aes_salt_t m_salt;
aes_key_t m_key;
aes_iv_t m_iv;
uint m_count;
bool m_embed;
bool m_debug;
};
#endif

View file

@ -0,0 +1,29 @@
#include "qcipher.h"
QCipher::QCipher(QObject *parent) : QObject(parent)
{
c = Cipher("aes-256-cbc", "sha256");
}
QString QCipher::encrypt(QString plaintext, QString pass)
{
try {
std::string enc;
enc = c.encrypt(plaintext.toStdString(), pass.toStdString());
return QString::fromUtf8(enc.c_str());
} catch (...) {
return "";
}
}
QString QCipher::decrypt(QString ciphertext, QString pass)
{
try {
std::string dec;
dec = c.decrypt(ciphertext.toStdString(), pass.toStdString());
return QString::fromUtf8(dec.c_str());
} catch (...) {
return "";
}
};

24
src/QCipher/src/qcipher.h Normal file
View file

@ -0,0 +1,24 @@
#ifndef QCIPHER_H
#define QCIPHER_H
#include <QObject>
#include <QString>
#include "cipher.h"
class QCipher : public QObject
{
Q_OBJECT
public:
explicit QCipher(QObject *parent = nullptr);
Q_INVOKABLE QString encrypt(QString plaintext, QString pass);
Q_INVOKABLE QString decrypt(QString ciphertext, QString pass);
private:
Cipher c;
signals:
};
#endif // QCIPHER_H

View file

@ -31,6 +31,7 @@
#include <sailfishapp.h>
#include <QGuiApplication>
#include "fileio.h"
#include "qcipher.h"
#include "qzxing.h"
#include "qqrencode.h"
@ -58,6 +59,8 @@ int main(int argc, char *argv[])
// Register FileIO Class
qmlRegisterType<FileIO, 1>("harbour.sailotp.FileIO", 1, 0, "FileIO");
// Register QCipher Class
qmlRegisterType<QCipher, 1>("harbour.sailotp.QCipher", 1, 0, "QCipher");
// Prepare the QML and set Homedir
view->setSource(SailfishApp::pathTo("qml/harbour-sailotp.qml"));

View file

@ -178,119 +178,120 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation>Datei existiert, aktiviere &quot;Existierende überschreiben&quot; um sie zu ersetzen.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation>Gewählte Datei existiert nicht!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation>Export</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation>Import</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation>Dateiname</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation>Aus Datei importieren</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation>In Datei exportieren</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation>Existierende überschreiben</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation>Passwort</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation>Passwort für die Datei</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation>Passwörter nicht identisch!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation>Passwörter identisch!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation>Passwort wiederholen</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation>Hier können Tokens aus einer Datei importiert werden. Gib die Datei und das beim Export gewählte Passwort ein. Nach links ziehen um zu starten.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation>Hier können Tokens in eine Datei exportiert werden. Die Datei wird mit AES-256-CBC verschlüsselt und Base64-kodiert. Wähle ein starkes Passwort, die Datei enthält die geheimen Schlüssel zur Erzeugung der Tokens für deine Accounts. Nach links ziehen um zu starten.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translation>Mit folgendem Openssl-Befehl kann der Inhalt der Exportdatei außerhalb von SailOTP angezeigt werden:</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation>Fehler beim Schreiben der Datei</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation>Datenbank exportiert nach </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation>Fehler beim Verschlüsseln. Fehler: </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation>Datenbank konnte nicht gelesen werden</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation>Tokens importiert aus </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation>Fehler beim entschlüsseln, falsches Passwort?</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation>Datei konnte nicht gelesen werden</translation>
</message>

View file

@ -178,119 +178,120 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation>El fichero ya existe, escoja la opción &quot;Sobreescribir existente&quot; para sobreescribirlo.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation>¡El fichero proporcionado no exsiste!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation>Exportar</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation>Importar</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation>Nombre del fichero</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation>Fichero a importar</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation>Fichero a exportar</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation>Sobreescribir existente</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation>Contraseña</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation>Contraseña para el fichero</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation>¡Las contraseñas no coinciden!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation>¡Las contraseñas coinciden!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation>Contraseña repetida para el archivo</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation>Aquí puede Importar Tokens desde un fichero. Ponga la localización del fichero y la contraseña utilizada en la exportación. Tire hacia la izquierda para comenzar la importación.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation>Aquí puede exportar Tokens a un fichero. El fichero exportado será encriptado con AES-256-CBC y codificado en Base64. Escoja una contraseña segura, el fichero contendrá las cadenas secretas utilizadas para la generación de los Tokens. Tire hacia la izquierda para comenzar la exportación.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translation>Para ver los contenidos del fichero de exportación fuera de SailOTP utilize el siguiente comando openssl:</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation>Error escribiendo el fichero</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation>Base de datos de Tokens exportada en</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation>No se ha podido encriptar los tokens. Error: </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation>No se ha podido leer los tokens desde la Base de datos</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation>Tokens importados desde</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation>No se ha podido desencriptar el fichero, ¿ha utilizado el password correcto?</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation>No se ha podido leer desde el fichero</translation>
</message>

View file

@ -178,119 +178,120 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation>Tiedosto on jo olemassa. Voit korvata vanhan tiedoston valitsemalla Ylikirjoita tiedosto.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation>Tiedostoa ei ole olemassa!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation>Vie</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation>Tuo</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation>Tiedoston nimi</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation>Tuotava tiedosto</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation>Vietävä tiedosto</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation>Ylikirjoita tiedosto</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation>Salasana</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation>Tiedoston salasana</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation>Salasanat eivät täsmää!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation>Salasanat täsmäävät!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation>Tiedoston salasanan vahvistus</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation>Voit tuoda tunnuksia tiedostosta. Anna tiedoston polku sekä salasana, jonka annoit vientiä tehdessäsi. Pyyhkäise vasemmalle aloittaaksesi tuonnin.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation>Voit viedä tunnukset tiedostoon. Vientitiedosto salataan AES-256-CBC-salauksella ja koodataan Base64-koodauksella. Valitse vahva salasana, koska tiedosto sisältää käyttäjätiliesi tunnukset. Pyyhkäise vasemmalle aloittaaksesi viennin.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translation>Jos haluat tarkastella vientitiedoston sisältöä SailOTP:n ulkopuolella, käytä seuraavaa OpenSSL-komentoa:</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation>Virhe kirjoitettaessa tiedostoa</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation>Tunnustietokanta viety tiedostoon </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation>Tunnusten salaaminen epäonnistui. Virhe: </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation>Tunnusten lukeminen tietokannasta epäonnistui</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation>Tunnukset tuotu tiedostosta </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation>Tiedoston salauksen purkaminen epäonnistui. Tarkista salasana.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation>Tiedoston lukeminen epäonnistui </translation>
</message>

View file

@ -178,120 +178,121 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation>Le fichier existe déjà, cochez &quot;Écraser un fichier existant&quot; pour le remplacer.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation>Le fichier spécifé n&apos;existe pas !</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation>Importer</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation>Exporter</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation>Nom du fichier</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation>Fichier à importer</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation>Fichier à exporter</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation>Écraser un fichier existant</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation>Mot de passe</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation>Mot de passe pour le fichier</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation>Les mots de passe ne correspondent pas !</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation>Les mots de passe correspondent !</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation>Confirmation du mot de passe pour le fichier</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation>Vous pouvez ici importer les paramètres d&apos;OTP depuis un fichier. Indiquez le fichier et le mot de passe utilisés lors de l&apos;export. Glissez vers la droite pour démarrer l&apos;import.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation>Vous pouvez ici exporter les paramètres d&apos;OTP vers un fichier. Ce fichier sera chiffré en AES-256-CBC et encodé en Base64. Ce fichier contiendra les secrets utilisés pour générer les OTP de vos comptes, choisissez donc un mot de passe fort. Glissez vers la droite pour démarrer l&apos;export.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translatorcomment>Translated using Google Translate</translatorcomment>
<translation>Pour afficher le contenu du fichier d&apos;exportation en dehors de SailOTP, utilisez la commande openssl suivante:</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation>Erreur lors de l&apos;écriture du fichier</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation>Base des paramètres d&apos;OTP exportée vers</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation>Impossible de chiffrer les paramètes d&apos;OTP. Erreur :</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation>Impossible de lire les paramètres d&apos;OTP depuis la base de données</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation>Paramètres d&apos;OTP importés depuis</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation>Impossible de déchiffrer le fichier, utilisez-vous le bon mot de passe ?</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation>Impossible de lire depuis le fichier</translation>
</message>

View file

@ -178,119 +178,120 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation>A fájl már létezik, válaszd a &quot;Meglévő felülírása&quot; lehetőséget a felülíráshoz.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation>Az adott fájl nem létezik!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation>Exportálás</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation>Importálás</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation>Fájlnév</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation>Importálandó fájl</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation>Exportálandó fájl</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation>Meglévő felülírása</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation>Jelszó</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation>Jelszó a fájlhoz</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation>A jelszavak nem egyeznek!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation>A jelszavak egyeznek!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation>Megismételt jelszó a fájlhoz</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation>Itt tudsz tokeneket importálni egy fájlból. Írd be a fájl helyét, és az exportáláskor használt jelszót. Húzd balra az importálás indításához.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation>Itt tudsz tokeneket exportálni egy fájlba. Az exportált fájl AES-256-CBC és Base64 kódolással lesz ellátva. Válassz egy erős jelszót, a fájl a fiókjaidoz létrehozandó tokenehez tartozó jelszavakat fogja tartalmazni. Húzd balra az exportálás indításához.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translation>Az exportfájl tartalmának a SailOTP-n kívüli megtekintéséhez használd a következő openssl parancsokat:</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation>Hiba a fájlba íráskor </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation>Tokenadatbázis exportálva ide: </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation>A tokenek nem titkosíthatók. Hiba: </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation>A tokenek nem olvashatók az adatbázisból</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation>Tokenek importálva innen: </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation>Nem lehet dekódolni a fájlt, a helyes jelszót használtad?</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation>Nem olvasható a fájlból </translation>
</message>

View file

@ -178,119 +178,120 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation>Il file esiste già, scegli &quot;Sovrascrivi esistente&quot; per sovrascriverlo.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation>Il file passato non esiste!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation>Esporta</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation>Importa</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation>Nome file</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation>File da importare</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation>File da esportare</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation>Sovrascrivi esistente</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation>Password</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation>Password per il file</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation>Le password non corrispondono!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation>Le password corrispondono!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation>Password Ripetuta per il file</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation>Da qua puoi Importare i Token da un file. Inserisci la posizione del file e la password usata nell&apos;esportazione. Scorri a sinistra per iniziare l&apos;importazione.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation>Da qua puoi Esportare i Token su un file. Il file esportato sarà criptato con AES-256-CBC e codificato Base64. Scegli una password forte, il file conterrà i segreti usati per generare i Token per i tuoi account. Scorri a sinistra per iniziare l&apos;esportazione.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translation>Per vedere il contenuto del file esportato al di fuori di SailORP usa il seguente comando openssl:</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation>Errore in scrittura del file </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation>Database dei Toen esportato su </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation>Impossibile criptare i token. Errore: </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation>Impossibile leggere i token dal Database</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation>Token importati da </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation>Non ho potuto decrittare il file, hai scritto la password correttamente?</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation>Impossibile leggere dal file </translation>
</message>

View file

@ -178,119 +178,120 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation>Bestand bestaat al, kies &quot;Bestaande overschrijven&quot; om het te overschrijven.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation>Bestand bestaat niet!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation>Exporteer</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation>Importeer</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation>Bestandsnaam</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation>Bestand om te importeren</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation>Bestand om te exporteren</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation>Bestaand bestand overschrijven</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation>Wachtwoord</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation>Wachtwoord voor het bestand</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation>Wachtwoorden komen niet overeen!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation>Wachtwoorden komen overeen!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation>Herhaal wachtwoord voor het bestand</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation>Hier kunt u tokens uit een bestand importeren. Geef de bestandslocatie en het wachtwoord dat u bij export hebt gebruikt op. Veeg naar links om het importeren te starten.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation>Hier kun je tokens naar een bestand exporteren. Het geexporteerde bestand wordt versleuteld met AES-256-CBC en is Base64-gecodeerd. Kies een sterk wachtwoord, het bestand bevat de geheimen die worden gebruikt om de tokens voor uw accounts te genereren. Veeg naar links om de export te starten.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translation>Als u de inhoud van het exportbestand buiten SailOTP wilt bekijken, gebruikt u de volgende OpenSSL-opdracht:</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation>Fout bij schrijven naar bestand </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation>Token Database geexporteerd naar </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation>Kan tokens niet coderen. Fout: </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation>Kan geen tokens uit database lezen</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation>Tokens geimporteerd uit </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation>Kan het bestand niet ontsleutelen, heeft u het juiste wachtwoord gebruikt?</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation>Kan niet lezen uit bestand </translation>
</message>

View file

@ -178,119 +178,120 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation>Arquivo existe, habilite &quot;Sobrescrever existente&quot; para sobrescrevê-lo.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation>Não foi possíve encontrar o arquivo!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation>Exportar</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation>Importar</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation>Nome do arquivo</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation>Arquivo para importar</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation>Arquivo para exportar</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation>Sobrescrever existente</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation>Senha</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation>Insira a senha do arquivo aqui</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation>As senhas não coincidem!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation>Senha correta</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation>Confirme a senha do arquivo aqui</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation>Importe Tokens salvos de um arquivo. Insira a localização do arquivo e a senha usada durante a exportação. Deslize para a esquerda para iniciar a importação.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation>Exporte os Tokens para um arquivo. O arquivo exportado será criptografado com AES-256-CBC e codificado em Base64. Escolha uma senha forte pois o arquivo conterá todos os segredos usados para gerar os Tokens disponíveis. Deslize para a esquerda para iniciar o processo.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translation>Para visualizar o conteúdo do arquivo expotado fora do SailOTP use o seguinte comando openssl:</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation>Não foi possível escrever no arquivo</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation>Base de dados dos Tokens exportada para</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation>Não foi possível criptografar Tokens. Erro:</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation>Não foi possível ler Tokens da base de dados</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation>Tokens importados de</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation>Não foi possível decriptografar arquivo, por favor cheque a senha.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation>Não foi possível ler arquivo</translation>
</message>

View file

@ -178,120 +178,121 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation>Файл уже существует, выберите: «Перезаписать существующий» для его перезаписи.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation>Данный файл не существует!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation>Экспорт</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation>Импорт</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation>Имя файла</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation>Файл для импорта</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation>Файл для экспорта</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation>Перезаписать существующий</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation>Пароль</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation>Пароль для файла</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation>Пароли не совпадают!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation>Пароли совпадают!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation>Повторный пароль для файла</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation>Здесь можно импортировать токены из файла. Введите путь к файлу и пароль, использованный при экспорте. Потяните влево чтобы начать импорт.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation>Здесь можно экспортировать токены в файл. Экспортированный файл будет зашифрован с использованием AES-256-CBC и кодирован в Base64. Выберите сильный пароль файл будет содержать секреты, использованные для генерации токенов для Ваших аккаунтов. Потяните влево чтобы начать экспорт.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translatorcomment>Translated using Google Translate</translatorcomment>
<translation>Чтобы просмотреть содержимое файла экспорта за пределами SailOTP, используйте следующую команду openssl:</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation>Ошибка при записи в файл </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation>База данных токенов экспортирована в </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation>Не удалось зашифровать токены. Ошибка: </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation>Не удалось прочесть токены из базы данных</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation>Токены импортированы из </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation>Не удалось расшифровать файл. Был ли введен правильный пароль?</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation>Не удалось прочесть из файла </translation>
</message>

View file

@ -178,119 +178,120 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation>Filen finns redan. Välj &quot;Skriv över befintlig&quot; för att skriva över den.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation>Angiven fil finns inte!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation>Exportera</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation>Importera</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation>Filnamn</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation>Fil att importera</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation>Fil att exportera</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation>Skriv över befintlig</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation>Lösenord</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation>Lösenord för filen</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation>Lösenorden stämmer inte!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation>Lösenorden stämmer!</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation>Upprepat lösenordet för filen</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation>Här kan du importera Token från en fil. Ange filens sökväg och lösenordet du angav vid exporten. Svep åt vänster för att starta importen.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation>Här kan du exportera Token till en fil. Den exporterade filen kommer att krypteras med AES-256-CBC och Base64. Välj ett starkt lösenord, filen kommer att innehålla hemligheterna som användes för att generera Token för ditt konto. Svep åt vänster för att starta exporten.</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translation>För att visa innehållet i exportfilen utanför SailOTP, använder du följande openssl-kommando:</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation>Fel vid skrivning till fil </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation>Token-databas exporterad till </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation>Kunde inte kryptera token. Fel: </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation>Kunde inte läsa token från databasen</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation>Token importerade från </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation>Kunde inte dekryptera filen. Angav du rätt lösenord?</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation>Kunde inte läsa från fil </translation>
</message>

View file

@ -178,119 +178,120 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation>&quot;&quot;</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation>使</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation>使AES-256-CBC和Base64编码进行加密</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translation>SailfOTP外面查看导出的文件使openssl命令</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation> </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation> </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation> </translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation>使</translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation> </translation>
</message>

View file

@ -178,119 +178,120 @@
<context>
<name>ExportPage</name>
<message>
<location filename="../qml/pages/ExportPage.qml" line="63"/>
<location filename="../qml/pages/ExportPage.qml" line="64"/>
<source>File already exists, choose &quot;Overwrite existing&quot; to overwrite it.</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="72"/>
<location filename="../qml/pages/ExportPage.qml" line="73"/>
<source>Given file does not exist!</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Export</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="91"/>
<location filename="../qml/pages/ExportPage.qml" line="107"/>
<location filename="../qml/pages/ExportPage.qml" line="97"/>
<location filename="../qml/pages/ExportPage.qml" line="126"/>
<source>Import</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="114"/>
<location filename="../qml/pages/ExportPage.qml" line="133"/>
<source>Filename</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="146"/>
<source>File to import</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="115"/>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<source>File to export</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="128"/>
<location filename="../qml/pages/ExportPage.qml" line="156"/>
<source>Overwrite existing</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="134"/>
<location filename="../qml/pages/ExportPage.qml" line="162"/>
<source>Password</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="135"/>
<location filename="../qml/pages/ExportPage.qml" line="163"/>
<source>Password for the file</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords don&apos;t match!</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="148"/>
<location filename="../qml/pages/ExportPage.qml" line="176"/>
<source>Passwords match!</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="149"/>
<location filename="../qml/pages/ExportPage.qml" line="177"/>
<source>Repeated Password for the file</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="173"/>
<location filename="../qml/pages/ExportPage.qml" line="201"/>
<source>Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import.</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export.</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="189"/>
<location filename="../qml/pages/ExportPage.qml" line="217"/>
<source>To view the content of the export file outside of SailOTP use the following openssl command:</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="211"/>
<location filename="../qml/pages/ExportPage.qml" line="240"/>
<source>Error writing to file </source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="213"/>
<location filename="../qml/pages/ExportPage.qml" line="242"/>
<source>Token Database exported to </source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="216"/>
<location filename="../qml/pages/ExportPage.qml" line="245"/>
<location filename="../qml/pages/ExportPage.qml" line="248"/>
<source>Could not encrypt tokens. Error: </source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="219"/>
<location filename="../qml/pages/ExportPage.qml" line="251"/>
<source>Could not read tokens from Database</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="230"/>
<location filename="../qml/pages/ExportPage.qml" line="262"/>
<source>Tokens imported from </source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="235"/>
<location filename="../qml/pages/ExportPage.qml" line="267"/>
<source>Unable to decrypt file, did you use the right password?</source>
<translation></translation>
</message>
<message>
<location filename="../qml/pages/ExportPage.qml" line="238"/>
<location filename="../qml/pages/ExportPage.qml" line="270"/>
<source>Could not read from file </source>
<translation></translation>
</message>