Merge branch 'release-1.14'

This commit is contained in:
antelle 2020-05-02 13:31:26 +02:00
commit 4c5d7eb762
No known key found for this signature in database
GPG Key ID: 094A2F2D6136A4EE
10 changed files with 107 additions and 89 deletions

View File

@ -598,6 +598,7 @@
"dropboxSetupDesc": "Some configuration is required to use Dropbox in a self-hosted app. Please create your own Dropbox app and fill in its key below.",
"dropboxAppKey": "Dropbox app key",
"dropboxAppKeyDesc": "Copy the key from your Dropbox app (Developer settings)",
"dropboxAppKeyHint": "your app key",
"dropboxAppSecret": "Dropbox app secret",
"dropboxAppSecretDesc": "The secret can be found next to the app key",
"dropboxFolder": "App folder",

View File

@ -1,5 +1,4 @@
{
"appBrowserAuthComplete": "Die Authentifizierung ist abgeschlossen, Sie können diesen Tab jetzt schließen.",
"months": [
"Januar",
"Februar",
@ -358,6 +357,7 @@
"appRightsAlert": "Schreibschutz für KeeWeb wird eingerichtet",
"appRightsAlertBody1": "Ihre KeeWeb-Anwendung ist nicht gegen Änderungen von außen gesichert. Um diesen Schreibschutz einzurichten, benötigt die App Administratorrechte.",
"appRightsAlertBody2": "Sie möchten der App keine Administratorrechte erteilen? Mit folgendem Befehl können Sie den Schreibschutz auch von Hand im Terminal aktivieren",
"appBrowserAuthComplete": "Die Authentifizierung ist abgeschlossen, Sie können diesen Tab jetzt schließen.",
"setGenTitle": "Allgemeine Einstellungen",
"setGenUpdate": "Update",
"setGenNewVersion": "Eine neue Version der App ist verfügbar und wurde heruntergeladen",
@ -434,6 +434,7 @@
"setGenLockAutoType": "Bei Auto-Type",
"setGenLockOrSleep": "Bei Aktivierung von Bildschirmsperre oder Ruhezustand",
"setGenStorage": "Synchronisierung",
"setGenStorageLogout": "Abmelden",
"setGenShowAdvanced": "Erweiterte Einstellungen anzeigen",
"setGenDevTools": "Entwicklerwerkzeuge anzeigen",
"setGenTryBeta": "Beta-Version bis zum Schließen der App ausprobieren",
@ -588,6 +589,8 @@
"dropboxSetupDesc": "Etwas Konfiguration ist notwendig, um Dropbox in einer selbst gehosteten Web-App zu verwenden. Bitte erstellen Sie eine eigene Dropbox-App und tragen Sie ihren App-Schlüssel unten ein.",
"dropboxAppKey": "Dropbox App-Schlüssel",
"dropboxAppKeyDesc": "Kopieren Sie den Schlüssel aus Ihrer Dropbox-App (Entwicklereinstellungen)",
"dropboxAppSecret": "Dropbox App Secret",
"dropboxAppSecretDesc": "Das App Secret ist neben dem App Key zu finden",
"dropboxFolder": "App-Ordner",
"dropboxFolderDesc": "Wenn Ihre App mit der gesamten Dropbox verlinkt ist (anstatt mit einem bestimmten Ordner), geben Sie hier den Pfad zum Ordner mit Ihren KDBX-Dateien an.",
"dropboxFolderSettingsDesc": "Wählen Sie einen Ordner in Ihrer Dropbox, in dem die Dateien gespeichert werden (standardmäßig das Stammverzeichnis)",

View File

@ -1,5 +1,4 @@
{
"appBrowserAuthComplete": "Authentification terminée, vous pouvez fermer cet onglet.",
"months": [
"Janvier",
"Février",
@ -62,8 +61,8 @@
"history": "historique",
"template": "modèle",
"notImplemented": "Non Implémenté",
"saveChanges": "Sauvegarder les changements",
"discardChanges": "Annuler les changements",
"saveChanges": "Sauvegarder les modifications",
"discardChanges": "Annuler les modifications",
"advanced": "Avancé",
"shortcuts": "Raccourcis",
"help": "Aide",
@ -101,26 +100,26 @@
"alertDoNotAsk": "Ne plus me le redemander",
"appBeta": "ATTENTION: version beta, aperçu seulement",
"footerOpen": "Ouvrir/Nouveau",
"footerSyncError": "Erreur de synchro",
"footerSyncError": "Erreur de synchronisation",
"footerTitleGen": "Générer",
"footerTitleLock": "Verrouiller",
"genLen": "Longueur",
"genNewPass": "Nouveau mot de passe",
"genPresetDefault": "réglages par défaut",
"genPresetDerived": "comme ancien mot de passe",
"genPresetDerived": "identique à l'ancien mot de passe",
"genPresetPronounceable": "prononçable",
"genPresetMed": "longueur moyenne",
"genPresetLong": "long",
"genPresetPin4": "code à 4 chiffres",
"genPresetMac": "adresse MAC",
"genPresetHash128": "hash 128-bit",
"genPresetHash256": "hash 256-bit",
"genPresetHash128": "hash 128 bits",
"genPresetHash256": "hash 256 bits",
"genHidePass": "Masquer le mot de passe",
"genShowPass": "Afficher le mot de passe",
"grpTitle": "Groupe",
"grpSearch": "Activer la recherche dans les entrées de ce groupe",
"grpAutoType": "Activer l'auto-complétion",
"grpAutoTypeSeq": "Séquence auto-complétion",
"grpAutoTypeSeq": "Séquence d'auto-complétion",
"grpAutoTypeSeqDefault": "Utiliser la séquence d'auto-complétion par défaut",
"grpTrash": "Supprimer le groupe et toutes ses entrées",
"tagTitle": "Tag",
@ -132,7 +131,7 @@
"tagExistsBody": "Un tag existe déjà avec ce nom. Merci de choisir un autre nom.",
"tagBadName": "Nom invalide",
"tagBadNameBody": "Un nom de tag ne peut pas contenir les caractères {}. Merci de les supprimer.",
"genPsTitle": "Générateur de préréglage",
"genPsTitle": "Préréglages du Générateur",
"genPsCreate": "Nouveau préréglage",
"genPsDelete": "Supprimer préréglage",
"genPsNew": "préréglage",
@ -144,18 +143,18 @@
"genPsDigits": "Chiffres",
"genPsSpecial": "Caractères spéciaux",
"genPsBrackets": "Parenthèses",
"genPsHigh": "Caractères ASCII hauts",
"genPsHigh": "Caractères ASCII étendus",
"genPsAmbiguous": "Caractères ambigus",
"genPsInclude": "Caractères additionnels à inclure",
"genPsExample": "Exemple de mot de passe généré",
"genPsPattern": "Modèle",
"genPsPatternHelp": "Des modèles peuvent être utilisés pour spécifier des règles de sélection de caractères. 1-AA générera un mot de passe commençant par un chiffre, suivi d'un tiret et de 2 lettres. Vous pouvez utiliser ces symboles :",
"genPsAllRanges": "Tous les caractères",
"genPsIncluded": "Symboles additionnels ajoutés au-dessus",
"keyChangeTitleRemote": "Clé maître changée",
"keyChangeMessageRemote": "La clé maître a été changée pour cette base de donnée. Merci d'entrer une nouvelle clé",
"keyChangeTitleExpired": "Clé maître expirée",
"keyChangeMessageExpired": "La clé maître pour cette base de donnée est expirée. Merci d'entrer une nouvelle clé",
"genPsIncluded": "Caractères additionnels ajoutés ci-dessus",
"keyChangeTitleRemote": "Clé Maître Modifiée",
"keyChangeMessageRemote": "La clé maître a été modifiée pour cette base de données. Merci de saisir une nouvelle clé.",
"keyChangeTitleExpired": "Clé Maître Expirée",
"keyChangeMessageExpired": "La clé maître pour cette base de donnée est expirée. Merci de saisir une nouvelle clé.",
"keyChangeRepeatPassword": "Mot de passe, encore une fois",
"keyEnter": "Entrée",
"iconFavTitle": "Télécharger et utiliser le favicon du site web",
@ -358,6 +357,7 @@
"appRightsAlert": "Protéger l'appli KeeWeb",
"appRightsAlertBody1": "Votre application KeeWeb est accessible en écriture. Nous demandons les droits administrateurs pour le mettre en écriture uniquement pour les administrateurs.",
"appRightsAlertBody2": "Vous ne voulez pas donner les permissions ? Vous pouvez le faire vous-même à partir d'un terminal",
"appBrowserAuthComplete": "Authentification terminée, vous pouvez fermer cet onglet.",
"setGenTitle": "Paramètres",
"setGenUpdate": "Mettre à jour",
"setGenNewVersion": "Une nouvelle version a été téléchargée",
@ -434,6 +434,7 @@
"setGenLockAutoType": "sur saisie auto",
"setGenLockOrSleep": "Quand l'ordinateur est verrouillé ou mis en sommeil",
"setGenStorage": "Stockage",
"setGenStorageLogout": "Déconnexion",
"setGenShowAdvanced": "Afficher les paramètres avancés",
"setGenDevTools": "Afficher les outils de développement",
"setGenTryBeta": "Essayer une fois la version beta ",
@ -588,6 +589,9 @@
"dropboxSetupDesc": "Une configuration particulière est nécessaire pour utiliser Dropbox dans une application auto-hébergée. Merci de créer votre propre application Dropbox et d'inscrire sa clé ci-dessous.",
"dropboxAppKey": "Clé Dropbox",
"dropboxAppKeyDesc": "Copier la clé de votre appli Dropbox (Réglages développeur)",
"dropboxAppKeyHint": "Votre \"Dropbox App Key\"",
"dropboxAppSecret": "Votre \"Dropbox App Secret\"",
"dropboxAppSecretDesc": "Votre \"Dropbox App Secret\" peut être trouvée à côté de votre \"Dropbox App Key\".",
"dropboxFolder": "Dossier Appli",
"dropboxFolderDesc": "Si votre appli est liée à l'espace Dropbox entier (et non un dossier), définir le dossier avec vos fichiers Kdbx ici",
"dropboxFolderSettingsDesc": "Sélectionner un dossier dans votre Dropbox où les fichiers sont stockés (à la racine par défaut)",

View File

@ -2,6 +2,7 @@ import { StorageBase } from 'storage/storage-base';
import { Features } from 'util/features';
import { UrlFormat } from 'util/formatting/url-format';
import { DropboxApps } from 'const/cloud-storage-apps';
import { Locale } from 'util/locale';
const DropboxCustomErrors = {
BadKey: 'bad-key'
@ -203,7 +204,7 @@ class StorageDropbox extends StorageBase {
value = DropboxApps.FullDropbox.id;
break;
case 'custom':
value = '(your app key)';
value = `(${Locale.dropboxAppKeyHint})`;
break;
default:
return;

View File

@ -138,81 +138,87 @@ class StorageBase {
}
_httpRequestLauncher(config, onLoad) {
Launcher.resolveProxy(config.url, proxy => {
const https = Launcher.req('https');
const net = Launcher.remReq('electron').net;
const opts = Launcher.req('url').parse(config.url);
const opts = Launcher.req('url').parse(config.url);
opts.method = config.method || 'GET';
opts.headers = {
'User-Agent': navigator.userAgent,
...config.headers
};
opts.timeout = Timeouts.DefaultHttpRequest;
opts.method = config.method || 'GET';
opts.headers = {
'User-Agent': navigator.userAgent,
...config.headers
};
opts.timeout = Timeouts.DefaultHttpRequest;
let data;
if (config.data) {
if (config.dataIsMultipart) {
data = Buffer.concat(config.data.map(chunk => Buffer.from(chunk)));
} else {
data = Buffer.from(config.data);
}
opts.headers['Content-Length'] = data.byteLength;
let data;
if (config.data) {
if (config.dataIsMultipart) {
data = Buffer.concat(config.data.map(chunk => Buffer.from(chunk)));
} else {
data = Buffer.from(config.data);
}
// Electron's API doesn't like that, while node.js needs it
// opts.headers['Content-Length'] = data.byteLength;
}
if (proxy) {
opts.headers.Host = opts.host;
opts.host = proxy.host;
opts.port = proxy.port;
opts.path = config.url;
}
const req = net.request(opts);
const req = https.request(opts);
req.on('response', res => {
const chunks = [];
res.on('data', chunk => chunks.push(chunk));
res.on('end', () => {
this.logger.debug(
'HTTP response',
opts.method,
config.url,
res.statusCode,
res.headers
);
let response = Buffer.concat(chunks);
if (config.responseType === 'json') {
try {
response = JSON.parse(response.toString('utf8'));
} catch (e) {
return config.error && config.error('json parse error');
}
} else {
response = response.buffer.slice(
response.byteOffset,
response.byteOffset + response.length
);
}
onLoad({
status: res.statusCode,
response,
getResponseHeader: name => res.headers[name.toLowerCase()]
});
});
});
req.on('error', () => {
return config.error && config.error('network error', {});
});
req.on('timeout', () => {
req.abort();
return config.error && config.error('timeout', {});
});
if (data) {
req.write(data);
}
req.end();
let closed = false;
req.on('close', () => {
closed = true;
});
req.on('response', res => {
const chunks = [];
const onClose = () => {
this.logger.debug(
'HTTP response',
opts.method,
config.url,
res.statusCode,
res.headers
);
let response = Buffer.concat(chunks);
if (config.responseType === 'json') {
try {
response = JSON.parse(response.toString('utf8'));
} catch (e) {
return config.error && config.error('json parse error');
}
} else {
response = response.buffer.slice(
response.byteOffset,
response.byteOffset + response.length
);
}
onLoad({
status: res.statusCode,
response,
getResponseHeader: name => res.headers[name.toLowerCase()]
});
};
res.on('data', chunk => {
chunks.push(chunk);
if (closed && !res.readable) {
// sometimes 'close' event arrives faster in Electron
onClose();
}
});
// in Electron it's not res.on('end'), like in node.js, which is a bit weird
req.on('close', onClose);
});
req.on('error', e => {
this.logger.error('HTTP error', opts.method, config.url, e);
return config.error && config.error('network error', {});
});
req.on('timeout', () => {
req.abort();
return config.error && config.error('timeout', {});
});
if (data) {
req.write(data);
}
req.end();
}
_openPopup(url, title, width, height, extras) {

View File

@ -1,6 +1,6 @@
{
"name": "KeeWeb",
"version": "1.14.0",
"version": "1.14.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@ -1,6 +1,6 @@
{
"name": "KeeWeb",
"version": "1.14.0",
"version": "1.14.1",
"description": "Free cross-platform password manager compatible with KeePass",
"main": "main.js",
"homepage": "https://keeweb.info",

2
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "keeweb",
"version": "1.14.0",
"version": "1.14.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@ -1,6 +1,6 @@
{
"name": "keeweb",
"version": "1.14.0",
"version": "1.14.1",
"description": "Free cross-platform password manager compatible with KeePass",
"main": "Gruntfile.js",
"private": true,

View File

@ -1,5 +1,8 @@
Release notes
-------------
##### v1.14.1 (2020-05-02)
`-` fix #1478: fixed proxy issues with storage providers
##### v1.14.0 (2020-04-18)
`+` using OAuth authorization code grant for all storage providers
`-` fixed a number of vulnerabilities in opening untrusted kdbx files