From 29a70432647f9cc05a2cef08f7b44a6acf8dab23 Mon Sep 17 00:00:00 2001 From: Erayd Date: Thu, 10 Sep 2020 07:13:15 +1200 Subject: [PATCH] Add context screen & integrated TOTP support (#229) --- README.md | 43 +++++---- src/background.js | 127 +++++++++++++----------- src/fonts/SourceCodePro-LICENSE.txt | 93 ++++++++++++++++++ src/fonts/SourceCodePro-Regular.ttf | Bin 0 -> 192740 bytes src/helpers.js | 34 +++++++ src/options/interface.js | 3 + src/package.json | 2 + src/popup/colors-dark.less | 7 +- src/popup/colors-light.less | 27 +++++- src/popup/colors.less | 45 +++++++-- src/popup/detailsInterface.js | 144 ++++++++++++++++++++++++++++ src/popup/icon-copy.svg | 14 +++ src/popup/icon-details.svg | 8 ++ src/popup/interface.js | 18 +++- src/popup/popup.js | 28 ++++-- src/popup/popup.less | 101 ++++++++++++++++++- src/popup/searchinterface.js | 6 ++ src/yarn.lock | 14 ++- 18 files changed, 616 insertions(+), 98 deletions(-) create mode 100644 src/fonts/SourceCodePro-LICENSE.txt create mode 100644 src/fonts/SourceCodePro-Regular.ttf create mode 100644 src/popup/detailsInterface.js create mode 100644 src/popup/icon-copy.svg create mode 100644 src/popup/icon-details.svg diff --git a/README.md b/README.md index ad52d7d..05a847c 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ In order to use Browserpass you must also install a [companion native messaging - [Password store locations](#password-store-locations) - [Options](#options) - - [A note about autosubmit](#a-note-about-autosubmit) +- - [A note about OTP](#a-note-about-otp) - [Usage data](#usage-data) - [Security](#security) - [Privacy](#privacy) @@ -33,7 +34,6 @@ In order to use Browserpass you must also install a [companion native messaging - [Error: Unable to fetch and parse login fields](#error-unable-to-fetch-and-parse-login-fields) - [How to use the same username and password pair on multiple domains](#how-to-use-the-same-username-and-password-pair-on-multiple-domains) - [Why Browserpass on Firefox does not work on Mozilla domains?](#why-browserpass-on-firefox-does-not-work-on-mozilla-domains) - - [Why is OTP not supported?](#why-is-otp-not-supported) - [Building the extension](#building-the-extension) - [Build locally](#build-locally) - [Load an unpacked extension](#load-an-unpacked-extension) @@ -217,15 +217,16 @@ Using the `Custom store locations` setting in the browser extension options, you The list of available options: -| Name | Description | -| --------------------------------------------------------------- | ------------------------------------------------------------ | -| Automatically submit forms after filling (aka `autoSubmit`) | Make Browserpass automatically submit the login form for you | -| Default username (aka `username`) | Username to use when it's not defined in the password file | -| Custom gpg binary (aka `gpgPath`) | Path to a custom `gpg` binary to use | -| Custom store locations | List of password stores to use | -| Custom store locations - badge background color (aka `bgColor`) | Badge background color for a given password store in popup | -| Custom store locations - badge text color (aka `color`) | Badge text color for a given password store in popup | -| Ignore items (aka `ignore`) | Ignore all matching logins | +| Name | Description | +| --------------------------------------------------------------- | ------------------------------------------------------------- | +| Automatically submit forms after filling (aka `autoSubmit`) | Make Browserpass automatically submit the login form for you | +| Enable support for OTP tokens (aka `enableOTP`) | Generate TOTP codes if a TOTP seed is found in the pass entry | +| Default username (aka `username`) | Username to use when it's not defined in the password file | +| Custom gpg binary (aka `gpgPath`) | Path to a custom `gpg` binary to use | +| Custom store locations | List of password stores to use | +| Custom store locations - badge background color (aka `bgColor`) | Badge background color for a given password store in popup | +| Custom store locations - badge text color (aka `color`) | Badge text color for a given password store in popup | +| Ignore items (aka `ignore`) | Ignore all matching logins | Browserpass allows configuring certain settings in different places places using the following priority, highest first: @@ -233,6 +234,7 @@ Browserpass allows configuring certain settings in different places places using - `autoSubmit` 1. Options defined in `.browserpass.json` file located in the root of a password store: - `autoSubmit` + - `enableOTP` - `gpgPath` - `username` - `bgColor` @@ -240,6 +242,7 @@ Browserpass allows configuring certain settings in different places places using - `ignore` 1. Options defined in browser extension options: - Automatically submit forms after filling (aka `autoSubmit`) + - Enable support for OTP tokens (aka `enableOTP`) - Default username (aka `username`) - Custom gpg binary (aka `gpgPath`) - Custom store locations @@ -252,6 +255,16 @@ While we provide autosubmit as an option for users, we do not recommend it. This As the demand for autosubmit is extremely high, we have decided to provide it anyway - however it is disabled by default, and we recommend that users do not enable it. +### A note about OTP + +Tools like `pass-otp` make it possible to use `pass` for generating OTP codes, however keeping both passwords and OTP URI in the same location diminishes the major benefit that OTP is supposed to provide: two factor authentication. The purpose of multi-factor authentication is to protect your account even when attackers gain access to your password store, but if your OTP seed is stored in the same place, all auth factors will be compromised at once. In particular, Browserpass has access to the entire contents of your password entries, so if it is ever compromised, all your accounts will be at risk, even though you signed up for 2FA. + +Browserpass is opinionated, it does not promote `pass-otp` and by default does not generate OTP codes from OTP seeds in password entries, even though there are other password managers that provide such functionality out of the box. + +There are valid scenarios for using `pass-otp` (e.g. it gives protection against intercepting your password during transmission), but users are strongly advised to very carefully consider whether `pass-otp` is really an appropriate solution - and if so, come up with their own ways of accessing OTP codes that conforms to their security requirements. For the majority of people `pass-otp` is not recommended; using any phone app like Authy will be a much better and more secure alternative, because this way attackers would have to not only break into your password store, but they would _also_ have to break into your phone. + +If you still want the OTP support regardless, you may enable it in the Browserpass settings. + ## Usage data Browserpass keeps metadata of recently used credentials in local storage and Indexed DB of the background page. This is first and foremost internal data to make Browserpass function properly, used for example to implement the [Password matching and sorting](#password-matching-and-sorting) algorithm, but nevertheless you might find it useful to explore using your browser's devtools. For example, if you are considering to rotate all passwords that you used in the past month (e.g. if you just found out that you had a malicious app installed for several weeks), you can retrieve such list from Indexed DB quite easily (open an issue if you need help). @@ -360,16 +373,6 @@ The full list of blocked domains at the time of writing is: - sync.services.mozilla.com - testpilot.firefox.com -### Why is OTP not supported? - -Tools like `pass-otp` make it possible to use `pass` for generating OTP codes, however keeping both passwords and OTP URI in the same location diminishes the major benefit that OTP is supposed to provide: two factor authentication. The purpose of multi-factor authentication is to protect your account even when attackers gain access to your password store, but if your OTP seed is stored in the same place, all auth factors will be compromised at once. In particular, Browserpass has access to the entire contents of your password entries, so if it is ever compromised, all your accounts will be at risk, even though you signed up for 2FA. - -Browserpass is opinionated, it does not promote `pass-otp` and intentionally does not support generating OTP codes from OTP URIs in password entiries, even though there are other password managers that provide such functionality. - -There are valid scenarios for using `pass-otp` (e.g. it gives protection against intercepting your password during transmission), but users are strongly advised to very carefully consider whether `pass-otp` is really an appropriate solution - and if so, come up with their own ways of accessing OTP codes that conforms to their security requirements (for example by using dmenu/rofi scripts). For the majority of people `pass-otp` is not recommended; using any phone app like Authy will be a much better and more secure alternative, because this way attackers would have to not only break into your password store, but they would _also_ have to break into your phone. - -If you still want the OTP support, it is provided via a separate extension [browserpass-otp](https://github.com/browserpass/browserpass-otp). That extension integrates with Browserpass to ensure a streamlined workflow, for example if the OTP extension is installed, it will be automatically triggered when Browserpass fills an entry and an OTP token is present. - ## Building the extension ### Build locally diff --git a/src/background.js b/src/background.js index d451eec..a5be17d 100644 --- a/src/background.js +++ b/src/background.js @@ -10,14 +10,6 @@ const helpers = require("./helpers"); // native application id var appID = "com.github.browserpass.native"; -// OTP extension id -var otpID = [ - "afjjoildnccgmjbblnklbohcbjehjaph", // webstore releases - "jbnpmhhgnchcoljeobafpinmchnpdpin", // github releases - "fcmmcnalhjjejhpnlfnddimcdlmpkbdf", // local unpacked - "browserpass-otp@maximbaz.com", // firefox -]; - // default settings var defaultSettings = { autoSubmit: false, @@ -26,6 +18,7 @@ var defaultSettings = { foreignFills: {}, username: null, theme: "dark", + enableOTP: false, }; var authListeners = {}; @@ -562,7 +555,6 @@ async function getFullSettings() { try { settings.tab = (await chrome.tabs.query({ active: true, currentWindow: true }))[0]; let originInfo = new BrowserpassURL(settings.tab.url); - settings.host = originInfo.host; // TODO remove this after OTP extension is migrated settings.origin = originInfo.origin; } catch (e) {} @@ -750,6 +742,28 @@ async function handleMessage(settings, message, sendResponse) { }); } break; + case "copyOTP": + if (settings.enableOTP) { + try { + if (!message.login.fields.otp) { + throw new Exception("No OTP seed available"); + } + copyToClipboard(helpers.makeTOTP(message.login.fields.otp.params)); + sendResponse({ status: "ok" }); + } catch (e) { + sendResponse({ + status: "error", + message: "Unable to copy OTP token", + }); + } + } else { + sendResponse({ status: "error", message: "OTP support is disabled" }); + } + break; + + case "getDetails": + sendResponse({ status: "ok", login: message.login }); + break; case "launch": case "launchInNewTab": @@ -831,9 +845,13 @@ async function handleMessage(settings, message, sendResponse) { break; } - // trigger browserpass-otp - if (typeof message.login !== "undefined" && message.login.fields.hasOwnProperty("otp")) { - triggerOTPExtension(settings, message.action, message.login.fields.otp); + // copy OTP token after fill + if ( + settings.enableOTP && + typeof message.login !== "undefined" && + message.login.fields.hasOwnProperty("otp") + ) { + copyToClipboard(helpers.makeTOTP(message.login.fields.otp.params)); } } @@ -885,7 +903,7 @@ async function parseFields(settings, login) { secret: ["secret", "password", "pass"], login: ["login", "username", "user"], openid: ["openid"], - otp: ["otp", "totp", "hotp"], + otp: ["otp", "totp"], url: ["url", "uri", "website", "site", "link", "launch"], }; login.settings = { @@ -893,10 +911,9 @@ async function parseFields(settings, login) { }; var lines = login.raw.split(/[\r\n]+/).filter((line) => line.trim().length > 0); lines.forEach(function (line) { - // check for uri-encoded otp - if (line.match(/^otpauth:\/\/.+/)) { - login.fields.otp = { key: null, data: line }; - return; + // check for uri-encoded otp without line prefix + if (line.match(/^otpauth:\/\/.+/i)) { + line = `otp: ${line}`; } // split key / value & ignore non-k/v lines @@ -918,11 +935,7 @@ async function parseFields(settings, login) { Array.isArray(login.fields[key]) && login.fields[key].includes(parts[0].toLowerCase()) ) { - if (key === "otp") { - login.fields[key] = { key: parts[0].toLowerCase(), data: parts[1] }; - } else { - login.fields[key] = parts[1]; - } + login.fields[key] = parts[1]; break; } } @@ -962,6 +975,41 @@ async function parseFields(settings, login) { delete login.settings[key]; } } + + // preprocess otp + if (settings.enableOTP && login.fields.hasOwnProperty("otp")) { + if (login.fields.otp.match(/^otpauth:\/\/.+/i)) { + // attempt to parse otp data as URI + try { + let url = new URL(login.fields.otp.toLowerCase()); + let otpParts = url.pathname.split("/").filter((s) => s.trim()); + login.fields.otp = { + raw: login.fields.otp, + params: { + type: otpParts[0] === "otp" ? "totp" : otpParts[0], + secret: url.searchParams.get("secret").toUpperCase(), + algorithm: url.searchParams.get("algorithm") || "sha1", + digits: parseInt(url.searchParams.get("digits") || "6"), + period: parseInt(url.searchParams.get("period") || "30"), + }, + }; + } catch (e) { + throw new Exception(`Unable to parse URI: ${otp.data}`, e); + } + } else { + // use default params for secret-only otp data + login.fields.otp = { + raw: login.fields.otp, + params: { + type: "totp", + secret: login.fields.otp.toUpperCase(), + algorithm: "sha1", + digits: 6, + period: 30, + }, + }; + } + } } /** @@ -1046,41 +1094,6 @@ async function saveSettings(settings) { } } -/** - * Trigger OTP extension (browserpass-otp) - * - * @since 3.0.13 - * - * @param object settings Settings object - * @param string action Browserpass action - * @param object otp OTP field data - * @return void - */ -function triggerOTPExtension(settings, action, otp) { - // trigger otp extension - for (let targetID of otpID) { - chrome.runtime - .sendMessage(targetID, { - version: chrome.runtime.getManifest().version, - action: action, - otp: otp, - settings: { - host: settings.host, - origin: settings.origin, - tab: settings.tab, - }, - }) - // Both response & error are noop functions, because we don't care about - // the response, and if there's an error it just means the otp extension - // is probably not installed. We can't detect that without requesting the - // management permission, so this is an acceptable workaround. - .then( - (noop) => null, - (noop) => null - ); - } -} - /** * Handle browser extension installation and updates * diff --git a/src/fonts/SourceCodePro-LICENSE.txt b/src/fonts/SourceCodePro-LICENSE.txt new file mode 100644 index 0000000..6f4c937 --- /dev/null +++ b/src/fonts/SourceCodePro-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/src/fonts/SourceCodePro-Regular.ttf b/src/fonts/SourceCodePro-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3563e7347be1ef18a3a447df1cd5d049cc088e14 GIT binary patch literal 192740 zcmZQzWME(rWMp7qVGwY4admrm{mD`Wreie>3{2D91N?)ZU;4Cyf$5|O1A|bXdvK`J z!^R6q3{1C|FffSP`3LJ8O}%sd69bdq3kC*;gyh`Bg3l_OTN#-AJs21ady>ma6d3k% z7cww4tzckaP)aLE&t;38W6r?TaD{<^u{b@kxZwYP24)7PV3>@h>m1#Am+jcTA zFv>76Y0S$=O-$h^4fw>sau|$VI;AY?w z6tdjGz@)#6fgR4{64=4OcVPzu6V!nQhQjQ|>S}80%4}@R!p6eN>dNdd>an!q5;Aj6=_5Ds${MgTE@ zT*Ux!l?o`~fnBAdzmq|Pf$_^O1}+8>1{JUvDA1(AfyN-PlR=Jw@e3&EjE&@&L`B%x zMa9HKMfjMMnT?IiOik33l?7ppDqN;0>tzEL4nwqk)t`P$hLpTEi zlP1#y1`Y;622+>=@r3YB1}?DUKp_cAevt4J6BS`oR)>XF_@b$^XHN|FEX>a@^kkZ_ zV(#2^E?u>?EewndMGOo~LQE4FxEXwjundyQnZc3B4v$!NeONvKMIy*KAV(;Q!e9~O zw14{;1^#_t^kJIdcFz5sI|Cy_D+2?Q1UP*=Q*1Gkb%L#olm8uL&_9GxC?w?HJEjT$-ZBdREnqbLcbb8bA)bMO@h8|?N0_y&pp4CmRQ@0` z3aE$#6@{z7m z!uXbHB7-m@#q)w};>BSTJJ@_)ft?K8(1=h|Hy0BFC3itZQ$;}$J|;#H^DHG38E-Xr z$A51b)5MH}c}y&gb+x<$8H?QhIqC)4C^IlJBrz~BxiC#&;9&@cc@a-m+XV_s1_p4* zG79WqV7mY+W*MO(kdQ@$J|v8d8I9S6m6_Q^lR}soMdB~Kh}&PtG~wTNM$e!BG8rS< zFETJPv@tL+$udn~U}exI!WEDhg_y1=+7`s<$~58cc2F>SFfcF)Fil{PWr!uhoLvm8 z46t+p@(n1uKz`u5u!}(eDzghzV1xa)i$NTk-@!HuiyNB@gHn%)9h12-JF_ygy0RRz zsGvt$i~@^%Y+3*_D+?2|YMf1s8WR&M3p3M%e=oAK7$yD|FnUPXJJ^Ue{QJkq)F5i( zU@!4+2LmHR5Ca1f8@OsAE{&tQofDd}c`oc?;74<(nwqJgu^`BSVq&6#K{1!?nV2{O zAQaPte<>Y?*(Qu3e+wArbQq@_|69qx#9;9M3zG)Z90p+qbwrB9Q)EEuHAqzfsl$+q z22d5IZe+(~YNE#kt0@?DEMlBhRh?rj%ws`xthuV4wuFSXovNBGh_>a?kEjpyuM5-D z3#;=FtdG$5RCPn^1m$8$q+HAo65t2540bc9F)%XlFtBLvVBimJ^z4`ub{`Cftc|;xG#@ z^YpI^*V7BH^LH-|Gw0OSVqy1RP_YThA5!2Py@NqY zU?+njxOUTIU|^6E6tV=hY~V$yi5`09}W8_TL#T9JAcuaJyRCTTNq*SCtxHY+CG|W|0 z9rUGiRm@}+jddjyC51ROc;q$BRn%RKWf>S5v=|te^q3|vurnCLf*;!M#@^9Pkh7ALvy%JwgMpF3jDdkkiD?3ZB*J?bsRddXG22D%Vqj#DWMCE) zvIJG&5Y`R`W`P|HpbCT!DhDc!b}$HB*u@|U6)`Y07G^dU2L-&DnYpI>AH~jY zc4T`@46lR$3!f-YRK)fpG0A+=f-HPeyh)6~jJ7MpwPj_s#aH~>|8L_)31c}qV~LFn zj0|cF3`|Dg#9$6f3{0T($b^(05k=-M1`Y;(1}1QM!UT4#fuW))ii1QMneId+3#*8* zh^Pt2huwL_xa_c+w}ys~+M$0@uRy&Y1_mZ+ril!ki2f}L$VL_<8#zGⓈH_Cj+R= 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�(P+}*u`(fK;a1%1-DPY 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 z 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%0DKW4y@G^)nNHZugXfhZum^0Wh zxH9-K1T#c2B!bWPEn}!5k)5F7O+kLjYbkA%M1)z=Oq(I8nJFlE;As8G+{lKTxLKFX~udhxy*nV(wy~O za+v`!qy-yOa+v`!q$QhJa+v`Uq@e+uR&p6pq#>JKa+x79q!C+Ca+x79qzPMEa+x79 zq$yifa+x79q#0XZa+x79q&eH7wgK6pdA|Q1;mh`)*OR80|Nsqg8+jdgAjNWg$+E;462t1AgHAaav2kNmI}lJ-7f;0r2$$P6H6~+Rr=Nn(sbrC0u>|*hWEf;X>4#AQI=d>t?9c4aAju-m zBF-SiBE5NE5xPF4kcv?9x8Z#A1(%-S!86YgNG|40~>=dNF7rPiWsOL$;dPj zMGTZHnOJ_X{6Z1+0qJJuLlNTw&Eql0F=sKCp@=(!#b zEihXP%;sYG$H2rG!txK4OBk3Lco+;A{E%i(LB3;P;0O2Z;~5q+YB3go{q_S%jRn|G z5H(2*%NTVTi;-ld;Id3$H!?CXvb=@crpDj~R?Ea7!T_2rjsdF%jbDRimqDc?NCsqv z6GDc`7UTw2P=5lHIzY3$kkkVr*+BEmi~)?V7~e2~`pa^laK+YNW@Tk%XXRq$VKrnm zWwl_nVYOp*V0B`3VRd8mVD)14VfAAT0QX(Malr^W+f;zTiXnwz8N&?*P(MM4L4rY! zL50>v?V zLk2bmJ_ZqRFIJ5~hcy(e8$`Zg4FT&0k?&chB}50hDi)d7}hZy zVmQNajo|^qD~2!NwB*3R#0rWn7KT(fs|;idShfu&2DfP^ECw1g;sLGcVfh4F-@~c^mJ5K(@iCrfU}m1rpblE)!^#epEd$FkGO&Qw z^FYPmwt`j|vAhMVy8sFs5DTCaH zWckeUmE}A5l+(W~|5+JXSynXLB$xG0tG%$2=pL zg@ySK_yl0kIl(YT#l$)805h1T2QKIVe*ERK}?{!0aQjZF{prR zJV>ZAF%&VFvBoflFrEdqoS6KXe6ZyY& hash.hmac(hash[a], k), + }, + algorithm: params.algorithm, + digits: params.digits, + step: params.period, + }; + + return generator.generate(params.secret); +} + //----------------------------------- Private functions ----------------------------------// /** diff --git a/src/options/interface.js b/src/options/interface.js index 732dfcc..24451c6 100644 --- a/src/options/interface.js +++ b/src/options/interface.js @@ -55,6 +55,9 @@ function view(ctl, params) { "Automatically submit forms after filling (not recommended)" ) ); + nodes.push( + createCheckbox.call(this, "enableOTP", "Enable support for OTP tokens (not recommended)") + ); nodes.push(createInput.call(this, "username", "Default username", "john.smith")); nodes.push(createInput.call(this, "gpgPath", "Custom gpg binary", "/path/to/gpg")); diff --git a/src/package.json b/src/package.json index 178d98b..4d68a04 100644 --- a/src/package.json +++ b/src/package.json @@ -18,10 +18,12 @@ "@browserpass/url": "^1.1.6", "chrome-extension-async": "^3.4.1", "fuzzysort": "^1.1.4", + "hash.js": "^1.1.7", "idb": "^4.0.5", "ignore": "^5.1.8", "mithril": "^1.1.7", "moment": "^2.27.0", + "otplib": "^11.0.0", "sha1": "^1.1.1" }, "devDependencies": { diff --git a/src/popup/colors-dark.less b/src/popup/colors-dark.less index 7e42ede..768da75 100644 --- a/src/popup/colors-dark.less +++ b/src/popup/colors-dark.less @@ -15,6 +15,11 @@ @hint-bg-color: #d79921, @hint-color: #363636, @match-text-bg-color: transparent, - @match-text-color: #d79921 + @match-text-color: #d79921, + @invert-text-color: #414141, + @snack-color: #525252, + @snack-label-color: #afafaf, + @progress-color: #bd861a, + @edit-bg-color: #4a4a4a ); } diff --git a/src/popup/colors-light.less b/src/popup/colors-light.less index 273f62d..ab7df91 100644 --- a/src/popup/colors-light.less +++ b/src/popup/colors-light.less @@ -15,12 +15,19 @@ @hint-bg-color: #1c7ed6, @hint-color: #e7f5ff, @match-text-bg-color: #cfecff, - @match-text-color: #1873ea + @match-text-color: #1873ea, + @invert-text-color: #f1f3f5, + @snack-color: #7a7a7a, + @snack-label-color: #7a7a7a, + @progress-color: #c7d5ff, + @edit-bg-color: #ffffff ); .part.login .name .line1 .recent, .part.login .action.copy-password, - .part.login .action.copy-user { + .part.login .action.copy-user, + .part.login .action.details, + .part.details .action.copy { filter: invert(85%); } @@ -29,8 +36,22 @@ .part.login .action.copy-password:focus, .part.login .action.copy-password:hover, .part.login .action.copy-user:focus, - .part.login .action.copy-user:hover { + .part.login .action.copy-user:hover, + .part.login .action.details:focus, + .part.login .action.details:hover { // colour such that invert(85%) ~= @hover-bg-color background-color: #0c0804; } + + .part.details .part.snack { + &.line-otp { + background: transparent; + } + .progress-container { + background-color: #ffffff; + z-index: -1; + margin-top: -4px; + height: 34px; + } + } } diff --git a/src/popup/colors.less b/src/popup/colors.less index e28c839..34e1724 100644 --- a/src/popup/colors.less +++ b/src/popup/colors.less @@ -12,7 +12,12 @@ @hint-bg-color, @hint-color, @match-text-bg-color, - @match-text-color) { + @match-text-color, + @invert-text-color, + @snack-color, + @snack-label-color, + @progress-color, + @edit-bg-color) { html, body { background-color: @bg-color; @@ -27,6 +32,34 @@ color: @error-text-color; } + .part.details { + .part { + &.snack { + background-color: @edit-bg-color; + border-color: @snack-color; + .label { + background-color: @snack-label-color; + color: @invert-text-color; + } + .char.num, + .char.punct { + color: @match-text-color; + } + .progress-container { + background: transparent; + .progress { + background-color: @progress-color; + } + } + } + &.raw textarea { + background-color: @edit-bg-color; + border-color: @snack-color; + color: @text-color; + } + } + } + .part.search { background-color: @input-bg-color; } @@ -53,11 +86,11 @@ background-color: @default-bg-color; } - .part.login > .name:hover, - .part.login > .name:focus, - .part.login > .action:hover, - .part.login > .action:focus, - .part.login:focus > .name { + .part.login:not(.details-header) > .name:hover, + .part.login:not(.details-header) > .name:focus, + .part.login:not(.details-header) > .action:hover, + .part.login:not(.details-header) > .action:focus, + .part.login:not(.details-header):focus > .name { background-color: @hover-bg-color; } diff --git a/src/popup/detailsInterface.js b/src/popup/detailsInterface.js new file mode 100644 index 0000000..7c0a450 --- /dev/null +++ b/src/popup/detailsInterface.js @@ -0,0 +1,144 @@ +module.exports = DetailsInterface; + +const m = require("mithril"); +const Moment = require("moment"); +const helpers = require("../helpers"); + +/** + * Login details interface + * + * @since 3.6.0 + * + * @param object settings Settings object + * @param array login Target login object + * @return void + */ +function DetailsInterface(settings, login) { + // public methods + this.attach = attach; + this.view = view; + + //fields + this.settings = settings; + this.login = login; + + // get basename & dirname of entry + this.login.basename = this.login.login.substr(this.login.login.lastIndexOf("/") + 1); + this.login.dirname = this.login.login.substr(0, this.login.login.lastIndexOf("/")) + "/"; +} + +/** + * Attach the interface on the given element + * + * @since 3.6.0 + * + * @param DOMElement element Target element + * @return void + */ +function attach(element) { + m.mount(element, this); +} + +/** + * Generates vnodes for render + * + * @since 3.6.0 + * + * @param function ctl Controller + * @param object params Runtime params + * @return []Vnode + */ +function view(ctl, params) { + const login = this.login; + const storeBgColor = login.store.bgColor || login.store.settings.bgColor; + const storeColor = login.store.color || login.store.settings.color; + const passChars = login.fields.secret.split("").map((c) => { + if (c.match(/[0-9]/)) { + return m("span.char.num", c); + } else if (c.match(/[^\w\s]/)) { + return m("span.char.punct", c); + } + return m("span.char", c); + }); + + var nodes = []; + nodes.push( + m("div.part.login.details-header", [ + m("div.name", [ + m("div.line1", [ + m( + "div.store.badge", + { + style: `background-color: ${storeBgColor}; + color: ${storeColor}`, + }, + login.store.name + ), + m("div.path", [m.trust(login.dirname)]), + login.recent.when > 0 + ? m("div.recent", { + title: + "Used here " + + login.recent.count + + " time" + + (login.recent.count > 1 ? "s" : "") + + ", last " + + Moment(new Date(login.recent.when)).fromNow(), + }) + : null, + ]), + m("div.line2", [m.trust(login.basename)]), + ]), + ]), + m("div.part.details", [ + m("div.part.snack.line-secret", [ + m("div.label", "Secret"), + m("div.chars", passChars), + m("div.action.copy", { onclick: () => login.doAction("copyPassword") }), + ]), + m("div.part.snack.line-login", [ + m("div.label", "Login"), + m("div", login.fields.login), + m("div.action.copy", { onclick: () => login.doAction("copyUsername") }), + ]), + (() => { + if ( + this.settings.enableOTP && + login.fields.otp && + login.fields.otp.params.type === "totp" + ) { + // update progress + let progress = this.progress; + let updateProgress = (vnode) => { + let period = login.fields.otp.params.period; + let remaining = period - ((Date.now() / 1000) % period); + vnode.dom.style.transition = "none"; + vnode.dom.style.width = `${(remaining / period) * 100}%`; + setTimeout(function () { + vnode.dom.style.transition = `width linear ${remaining}s`; + vnode.dom.style.width = "0%"; + }, 100); + setTimeout(function () { + m.redraw(); + }, remaining); + }; + let progressNode = m("div.progress", { + oncreate: updateProgress, + onupdate: updateProgress, + }); + + // display otp snack + return m("div.part.snack.line-otp", [ + m("div.label", "Token"), + m("div.progress-container", progressNode), + m("div", helpers.makeTOTP(login.fields.otp.params)), + m("div.action.copy", { onclick: () => login.doAction("copyOTP") }), + ]); + } + })(), + m("div.part.raw", m("textarea", login.raw.trim())), + ]) + ); + + return nodes; +} diff --git a/src/popup/icon-copy.svg b/src/popup/icon-copy.svg new file mode 100644 index 0000000..2d505b3 --- /dev/null +++ b/src/popup/icon-copy.svg @@ -0,0 +1,14 @@ + + + + + + + diff --git a/src/popup/icon-details.svg b/src/popup/icon-details.svg new file mode 100644 index 0000000..d040a71 --- /dev/null +++ b/src/popup/icon-details.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/src/popup/interface.js b/src/popup/interface.js index 785fc4a..d96c752 100644 --- a/src/popup/interface.js +++ b/src/popup/interface.js @@ -106,15 +106,20 @@ function view(ctl, params) { ]), m("div.line2", [m.trust(result.display)]), ]), + m("div.action.copy-user", { + tabindex: 0, + title: "Copy username | ", + action: "copyUsername", + }), m("div.action.copy-password", { tabindex: 0, title: "Copy password | ", action: "copyPassword", }), - m("div.action.copy-user", { + m("div.action.details", { tabindex: 0, - title: "Copy username | ", - action: "copyUsername", + title: "Open Details | ", + action: "getDetails", }), ] ); @@ -188,6 +193,8 @@ function keyHandler(e) { e.target.querySelector(".action").focus(); } else if (e.target.nextElementSibling) { e.target.nextElementSibling.focus(); + } else { + this.doAction("getDetails"); } break; case "ArrowLeft": @@ -218,6 +225,11 @@ function keyHandler(e) { this.doAction(e.shiftKey ? "launchInNewTab" : "launch"); } break; + case "KeyO": + if (e.ctrlKey) { + this.doAction("getDetails"); + } + break; case "Home": { document.querySelector(".part.search input[type=text]").focus(); document.querySelector(".logins").scrollTo(0, 0); diff --git a/src/popup/popup.js b/src/popup/popup.js index 6b7da5f..aad6cce 100644 --- a/src/popup/popup.js +++ b/src/popup/popup.js @@ -3,7 +3,9 @@ require("chrome-extension-async"); const Interface = require("./interface"); +const DetailsInterface = require("./detailsInterface"); const helpers = require("../helpers"); +const m = require("mithril"); run(); @@ -21,11 +23,8 @@ function handleError(error, type = "error") { if (type == "error") { console.log(error); } - var errorNode = document.createElement("div"); - errorNode.setAttribute("class", "part " + type); - errorNode.textContent = error.toString(); - document.body.innerHTML = ""; - document.body.appendChild(errorNode); + var node = { view: () => m(`div.part.${type}`, error.toString()) }; + m.mount(document.body, node); } /** @@ -100,6 +99,12 @@ async function withLogin(action) { case "copyUsername": handleError("Copying username to clipboard...", "notice"); break; + case "copyOTP": + handleError("Copying OTP token to clipboard...", "notice"); + break; + case "getDetails": + handleError("Loading entry details...", "notice"); + break; default: handleError("Please wait...", "notice"); break; @@ -117,7 +122,18 @@ async function withLogin(action) { if (response.status != "ok") { throw new Error(response.message); } else { - window.close(); + if (response.login && typeof response.login === "object") { + response.login.doAction = withLogin.bind({ + settings: this.settings, + login: response.login, + }); + } + if (action === "getDetails") { + var details = new DetailsInterface(this.settings, response.login); + details.attach(document.body); + } else { + window.close(); + } } } catch (e) { handleError(e); diff --git a/src/popup/popup.less b/src/popup/popup.less index 9ca9a3e..984023a 100644 --- a/src/popup/popup.less +++ b/src/popup/popup.less @@ -20,6 +20,13 @@ src: local("Open Sans Light"), url("/fonts/OpenSans-Light.ttf") format("truetype"); } +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), url("/fonts/SourceCodePro-Regular.ttf") format("truetype"); +} + html, body { font-family: "Open Sans"; @@ -66,6 +73,11 @@ body { padding: 1px 4px; } +.details .header { + display: flex; + margin-bottom: 4px; +} + .part { box-sizing: border-box; display: flex; @@ -91,6 +103,80 @@ body { padding: 7px; } +.part.details { + flex-direction: column; + padding: 5px 10px 10px; + & > .part { + display: flex; + margin-bottom: 11px; + &:last-child { + margin-bottom: 0; + } + &.snack { + border: 1px solid; + border-radius: 2px; + height: 36px; + padding: 4px; + .char { + white-space: pre; + } + & > .label { + border-radius: 2px 0 0 2px; + cursor: default; + display: flex; + flex-grow: 0; + font-weight: bold; + justify-content: flex-end; + margin: -5px 8px -5px -5px; + padding: 4px 8px 4px 4px; + width: 3.25em; + } + & > :not(.label) { + display: flex; + align-items: center; + font-family: Source Code Pro, monospace; + } + & > .copy { + cursor: pointer; + flex-grow: 0; + padding: 0 24px 0 0; + background-image: url("/popup/icon-copy.svg"); + background-position: top 4px right 4px; + background-repeat: no-repeat; + background-size: 16px; + margin: 2px; + } + + & > .progress-container { + z-index: 2; + position: absolute; + margin: 30px 0 -4px calc(3.25em + 7px); + height: 1px; + width: calc(100% - 6.5em + 12px); + & > .progress { + height: 100%; + margin: 0; + } + } + } + &.raw textarea { + border: 1px solid; + border-radius: 2px; + flex-grow: 1; + font-family: Source Code Pro, monospace; + min-height: 110px; + min-width: 340px; + outline: none; + padding: 10px; + white-space: pre; + } + & > * { + flex-grow: 1; + align-items: center; + } + } +} + .part.search { padding: 6px 28px 6px 6px; background-image: url("/popup/icon-search.svg"); @@ -134,10 +220,19 @@ body { .part.login { display: flex; - cursor: pointer; align-items: center; height: @login-height; + &.details-header { + height: calc(@login-height + 6px); + padding: 0 4px; + outline: none; + } + + &:not(.details-header) { + cursor: pointer; + } + &:hover, &:focus { outline: none; @@ -186,6 +281,10 @@ body { &.copy-user { background-image: url("/popup/icon-user.svg"); } + + &.details { + background-image: url("/popup/icon-details.svg"); + } } } diff --git a/src/popup/searchinterface.js b/src/popup/searchinterface.js index 73e1126..8d80ca8 100644 --- a/src/popup/searchinterface.js +++ b/src/popup/searchinterface.js @@ -116,6 +116,12 @@ function view(ctl, params) { ); } break; + case "KeyO": + if (e.ctrlKey && e.target.selectionStart == e.target.selectionEnd) { + e.preventDefault(); + self.popup.results[0].doAction("getDetails"); + } + break; case "End": { if (e.target.selectionStart === e.target.value.length) { let logins = document.querySelectorAll(".login"); diff --git a/src/yarn.lock b/src/yarn.lock index 9291e98..a93c0c9 100644 --- a/src/yarn.lock +++ b/src/yarn.lock @@ -514,7 +514,7 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -772,6 +772,13 @@ os-browserify@~0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= +otplib@^11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/otplib/-/otplib-11.0.1.tgz#7d64aa87029f07c99c7f96819fb10cdb67dea886" + integrity sha512-oi57teljNyWTC/JqJztHOtSGeFNDiDh5C1myd+faocUtFAX27Sm1mbx69kpEJ8/JqrblI3kAm4Pqd6tZJoOIBQ== + dependencies: + thirty-two "1.0.2" + pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -1080,6 +1087,11 @@ syntax-error@^1.1.1: dependencies: acorn-node "^1.2.0" +thirty-two@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/thirty-two/-/thirty-two-1.0.2.tgz#4ca2fffc02a51290d2744b9e3f557693ca6b627a" + integrity sha1-TKL//AKlEpDSdEueP1V2k8prYno= + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"