├── .gitignore ├── LICENSE.md ├── README.md ├── chromeipass ├── background │ ├── aes.js │ ├── browserAction.js │ ├── cryptoHelpers.js │ ├── event.js │ ├── httpauth.js │ ├── init.js │ ├── keepass.js │ ├── page.js │ ├── sjcl.js │ └── utf8.js ├── bootstrap-btn.css ├── chromeipass.css ├── chromeipass.js ├── icons │ ├── 19x19 │ │ ├── icon_bang_aqua-inverse_19x19.png │ │ ├── icon_bang_aqua_19x19.png │ │ ├── icon_bang_blue-inverse_19x19.png │ │ ├── icon_bang_blue_19x19.png │ │ ├── icon_bang_green-inverse_19x19.png │ │ ├── icon_bang_green_19x19.png │ │ ├── icon_bang_grey-inverse_19x19.png │ │ ├── icon_bang_grey_19x19.png │ │ ├── icon_bang_orange-inverse_19x19.png │ │ ├── icon_bang_orange_19x19.png │ │ ├── icon_bang_pink-inverse_19x19.png │ │ ├── icon_bang_pink_19x19.png │ │ ├── icon_bang_purple-inverse_19x19.png │ │ ├── icon_bang_purple_19x19.png │ │ ├── icon_bang_red-inverse_19x19.png │ │ ├── icon_bang_red_19x19.png │ │ ├── icon_bang_yellow-inverse_19x19.png │ │ ├── icon_bang_yellow_19x19.png │ │ ├── icon_cross_aqua-inverse_19x19.png │ │ ├── icon_cross_aqua_19x19.png │ │ ├── icon_cross_blue-inverse_19x19.png │ │ ├── icon_cross_blue_19x19.png │ │ ├── icon_cross_green-inverse_19x19.png │ │ ├── icon_cross_green_19x19.png │ │ ├── icon_cross_grey-inverse_19x19.png │ │ ├── icon_cross_grey_19x19.png │ │ ├── icon_cross_orange-inverse_19x19.png │ │ ├── icon_cross_orange_19x19.png │ │ ├── icon_cross_pink-inverse_19x19.png │ │ ├── icon_cross_pink_19x19.png │ │ ├── icon_cross_purple-inverse_19x19.png │ │ ├── icon_cross_purple_19x19.png │ │ ├── icon_cross_red-inverse_19x19.png │ │ ├── icon_cross_red_19x19.png │ │ ├── icon_cross_yellow-inverse_19x19.png │ │ ├── icon_cross_yellow_19x19.png │ │ ├── icon_new_bang_aqua-inverse_19x19.png │ │ ├── icon_new_bang_aqua_19x19.png │ │ ├── icon_new_bang_blue-inverse_19x19.png │ │ ├── icon_new_bang_blue_19x19.png │ │ ├── icon_new_bang_green-inverse_19x19.png │ │ ├── icon_new_bang_green_19x19.png │ │ ├── icon_new_bang_grey-inverse_19x19.png │ │ ├── icon_new_bang_grey_19x19.png │ │ ├── icon_new_bang_orange-inverse_19x19.png │ │ ├── icon_new_bang_orange_19x19.png │ │ ├── icon_new_bang_pink-inverse_19x19.png │ │ ├── icon_new_bang_pink_19x19.png │ │ ├── icon_new_bang_purple-inverse_19x19.png │ │ ├── icon_new_bang_purple_19x19.png │ │ ├── icon_new_bang_red-inverse_19x19.png │ │ ├── icon_new_bang_red_19x19.png │ │ ├── icon_new_bang_yellow-inverse_19x19.png │ │ ├── icon_new_bang_yellow_19x19.png │ │ ├── icon_new_cross_aqua-inverse_19x19.png │ │ ├── icon_new_cross_aqua_19x19.png │ │ ├── icon_new_cross_blue-inverse_19x19.png │ │ ├── icon_new_cross_blue_19x19.png │ │ ├── icon_new_cross_green-inverse_19x19.png │ │ ├── icon_new_cross_green_19x19.png │ │ ├── icon_new_cross_grey-inverse_19x19.png │ │ ├── icon_new_cross_grey_19x19.png │ │ ├── icon_new_cross_orange-inverse_19x19.png │ │ ├── icon_new_cross_orange_19x19.png │ │ ├── icon_new_cross_pink-inverse_19x19.png │ │ ├── icon_new_cross_pink_19x19.png │ │ ├── icon_new_cross_purple-inverse_19x19.png │ │ ├── icon_new_cross_purple_19x19.png │ │ ├── icon_new_cross_red-inverse_19x19.png │ │ ├── icon_new_cross_red_19x19.png │ │ ├── icon_new_cross_yellow-inverse_19x19.png │ │ ├── icon_new_cross_yellow_19x19.png │ │ ├── icon_new_normal_aqua-inverse_19x19.png │ │ ├── icon_new_normal_aqua_19x19.png │ │ ├── icon_new_normal_blue-inverse_19x19.png │ │ ├── icon_new_normal_blue_19x19.png │ │ ├── icon_new_normal_green-inverse_19x19.png │ │ ├── icon_new_normal_green_19x19.png │ │ ├── icon_new_normal_grey-inverse_19x19.png │ │ ├── icon_new_normal_grey_19x19.png │ │ ├── icon_new_normal_orange-inverse_19x19.png │ │ ├── icon_new_normal_orange_19x19.png │ │ ├── icon_new_normal_pink-inverse_19x19.png │ │ ├── icon_new_normal_pink_19x19.png │ │ ├── icon_new_normal_purple-inverse_19x19.png │ │ ├── icon_new_normal_purple_19x19.png │ │ ├── icon_new_normal_red-inverse_19x19.png │ │ ├── icon_new_normal_red_19x19.png │ │ ├── icon_new_normal_yellow-inverse_19x19.png │ │ ├── icon_new_normal_yellow_19x19.png │ │ ├── icon_new_questionmark_aqua-inverse_19x19.png │ │ ├── icon_new_questionmark_aqua_19x19.png │ │ ├── icon_new_questionmark_blue-inverse_19x19.png │ │ ├── icon_new_questionmark_blue_19x19.png │ │ ├── icon_new_questionmark_green-inverse_19x19.png │ │ ├── icon_new_questionmark_green_19x19.png │ │ ├── icon_new_questionmark_grey-inverse_19x19.png │ │ ├── icon_new_questionmark_grey_19x19.png │ │ ├── icon_new_questionmark_orange-inverse_19x19.png │ │ ├── icon_new_questionmark_orange_19x19.png │ │ ├── icon_new_questionmark_pink-inverse_19x19.png │ │ ├── icon_new_questionmark_pink_19x19.png │ │ ├── icon_new_questionmark_purple-inverse_19x19.png │ │ ├── icon_new_questionmark_purple_19x19.png │ │ ├── icon_new_questionmark_red-inverse_19x19.png │ │ ├── icon_new_questionmark_red_19x19.png │ │ ├── icon_new_questionmark_yellow-inverse_19x19.png │ │ ├── icon_new_questionmark_yellow_19x19.png │ │ ├── icon_normal_aqua-inverse_19x19.png │ │ ├── icon_normal_aqua_19x19.png │ │ ├── icon_normal_blue-inverse_19x19.png │ │ ├── icon_normal_blue_19x19.png │ │ ├── icon_normal_green-inverse_19x19.png │ │ ├── icon_normal_green_19x19.png │ │ ├── icon_normal_grey-inverse_19x19.png │ │ ├── icon_normal_grey_19x19.png │ │ ├── icon_normal_orange-inverse_19x19.png │ │ ├── icon_normal_orange_19x19.png │ │ ├── icon_normal_pink-inverse_19x19.png │ │ ├── icon_normal_pink_19x19.png │ │ ├── icon_normal_purple-inverse_19x19.png │ │ ├── icon_normal_purple_19x19.png │ │ ├── icon_normal_red-inverse_19x19.png │ │ ├── icon_normal_red_19x19.png │ │ ├── icon_normal_yellow-inverse_19x19.png │ │ ├── icon_normal_yellow_19x19.png │ │ ├── icon_questionmark_aqua-inverse_19x19.png │ │ ├── icon_questionmark_aqua_19x19.png │ │ ├── icon_questionmark_blue-inverse_19x19.png │ │ ├── icon_questionmark_blue_19x19.png │ │ ├── icon_questionmark_green-inverse_19x19.png │ │ ├── icon_questionmark_green_19x19.png │ │ ├── icon_questionmark_grey-inverse_19x19.png │ │ ├── icon_questionmark_grey_19x19.png │ │ ├── icon_questionmark_orange-inverse_19x19.png │ │ ├── icon_questionmark_orange_19x19.png │ │ ├── icon_questionmark_pink-inverse_19x19.png │ │ ├── icon_questionmark_pink_19x19.png │ │ ├── icon_questionmark_purple-inverse_19x19.png │ │ ├── icon_questionmark_purple_19x19.png │ │ ├── icon_questionmark_red-inverse_19x19.png │ │ ├── icon_questionmark_red_19x19.png │ │ ├── icon_questionmark_yellow-inverse_19x19.png │ │ ├── icon_questionmark_yellow_19x19.png │ │ ├── icon_remember_red_background_19x19.png │ │ └── icon_remember_red_lock_19x19.png │ ├── keepass_128x128.png │ ├── keepass_16x16.png │ ├── keepass_38x38.png │ ├── keepass_48x48.png │ ├── key_16x16.png │ └── key_24x24.png ├── images │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ ├── ui-bg_flat_75_ffffff_40x100.png │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ ├── ui-bg_glass_65_ffffff_1x400.png │ ├── ui-bg_glass_75_dadada_1x400.png │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ ├── ui-bg_glass_95_fef1ec_1x400.png │ └── ui-bg_highlight-soft_75_cccccc_1x100.png ├── jquery-1.11.1.min.js ├── jquery-ui-1.10.2.custom.min.css ├── jquery-ui-1.10.2.custom.min.js ├── manifest.json ├── options │ ├── bootstrap-responsive.min.css │ ├── bootstrap.min.css │ ├── bootstrap.min.js │ ├── http-auth-dialog.png │ ├── options.html │ └── options.js └── popups │ ├── popup.css │ ├── popup.html │ ├── popup.js │ ├── popup_functions.js │ ├── popup_httpauth.html │ ├── popup_httpauth.js │ ├── popup_login.html │ ├── popup_login.js │ ├── popup_multiple-fields.html │ ├── popup_remember.html │ ├── popup_remember.js │ └── throbber.gif ├── documentation ├── PassIFox.md ├── chromeIPass - old readme from web store.txt ├── chromeIPass-changelog ├── chromeIPass.md └── images │ ├── cip-autocomplete.png │ ├── cip-browser-icon.png │ ├── cip-choose-credential-fields.png │ ├── cip-console-background.png │ ├── cip-console-inline.png │ ├── cip-context-menu.png │ ├── cip-extensions-developer-mode.png │ ├── cip-extensions-normal-mode.png │ ├── cip-password-generator.png │ ├── cip-popup-choose-credentials.png │ ├── cip-popup-connect.png │ ├── cip-popup-normal.png │ ├── cip-popup-remember-update.png │ ├── cip-popup-remember.png │ ├── cip-settings-connected-databases.png │ ├── cip-settings-general.png │ ├── cip-settings-specified-credential-fields.png │ ├── cip-store-screenshot.png │ ├── http-auth-request.png │ ├── keepass-association-key.png │ ├── keepass-password-generation-options.png │ └── psd │ ├── cip-autocomplete.psd │ ├── cip-browser-icon.psd │ ├── cip-choose-credential-fields.psd │ ├── cip-console-background.psd │ ├── cip-console-inline.psd │ ├── cip-context-menu.psd │ ├── cip-extensions-developer-mode.psd │ ├── cip-extensions-normal-mode.psd │ ├── cip-password-generator.psd │ ├── cip-popup-choose-credentials.psd │ ├── cip-popup-connect.psd │ ├── cip-popup-normal.psd │ ├── cip-popup-remember-update.psd │ ├── cip-popup-remember.psd │ ├── cip-settings-connected-databases.psd │ ├── cip-settings-general.psd │ ├── cip-settings-specified-credential-fields.psd │ ├── cip-store-screenshot.psd │ ├── http-auth-request.psd │ ├── keepass-association-key.psd │ └── keepass-password-generation-options.psd ├── passifox.xpi ├── passifox ├── chrome.manifest ├── chrome │ ├── content │ │ └── passifox.xul │ └── skin │ │ └── default │ │ ├── keepass-big.png │ │ └── keepass.png ├── components │ └── loginmanagerstorage.js ├── defaults │ └── preferences │ │ └── defaults.js ├── install.rdf └── modules │ └── KeePassFox.jsm └── update.rdf /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | /nbproject/ 3 | chromeipass.pem 4 | /chromeipass-data/ 5 | .idea/ 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PassIFox and chromeIPass 2 | 3 | are extensions to integrate [KeePass](http://keepass.info)/[KeePassXC](https://keepassxc.org/) as a password manager with Mozilla Firefox and Google Chrome browsers. 4 | 5 | They require [KeePassHttp](https://github.com/pfn/keepasshttp/), a KeePass plugin to expose password entries securely (256bit AES/CBC) over HTTP. 6 | 7 | 8 | ## chromeIPass (for Google Chrome) 9 | 10 | - [Download](https://chrome.google.com/webstore/detail/chromeipass/ompiailgknfdndiefoaoiligalphfdae) 11 | - [Documentation](https://github.com/pfn/passifox/blob/master/documentation/chromeIPass.md) (features, installation guide, troubleshooting, functionality, etc.) 12 | 13 | ## PassIFox (for Mozilla Firefox) 14 | 15 | - [Download](https://addons.mozilla.org/en-US/firefox/addon/passifox/) 16 | - [Documentation](https://github.com/pfn/passifox/blob/master/documentation/PassIFox.md) 17 | 18 | Currently, the documentation of PassIFox is not up-to-date! 19 | Support is always welcome. 20 | 21 | ## Troubleshooting 22 | 23 | If you [open an issue](https://github.com/pfn/passifox/issues/), always give us the following information: 24 | 25 | 1. the extension are you using (chromeIPass or PassIFox) and its version 26 | 2. version of your browser 27 | 2. KeePassHttp version 28 | 3. KeePass/KeePassXC version 29 | 4. pages on which the error occur 30 | 31 | PassIFox & ChromeIPass Copyright © 2010-2017 Perry Nguyen 32 | This program is free software: you can redistribute it and/or modify 33 | it under the terms of the GNU General Public License as published by 34 | the Free Software Foundation, version 3 of the License. 35 | 36 | This program is distributed in the hope that it will be useful, 37 | but WITHOUT ANY WARRANTY; without even the implied warranty of 38 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 39 | GNU General Public License for more details. 40 | 41 | You should have received a copy of the GNU General Public License 42 | along with this program. If not, see . -------------------------------------------------------------------------------- /chromeipass/background/browserAction.js: -------------------------------------------------------------------------------- 1 | var browserAction = {}; 2 | 3 | var BLINK_TIMEOUT_DEFAULT = 7500; 4 | var BLINK_TIMEOUT_REDIRECT_THRESHOLD_TIME_DEFAULT = -1; 5 | var BLINK_TIMEOUT_REDIRECT_COUNT_DEFAULT = 1; 6 | 7 | browserAction.show = function(callback, tab) { 8 | var data = {}; 9 | if(!page.tabs[tab.id] || page.tabs[tab.id].stack.length == 0) { 10 | browserAction.showDefault(callback, tab); 11 | return; 12 | } 13 | else { 14 | data = page.tabs[tab.id].stack[page.tabs[tab.id].stack.length - 1]; 15 | } 16 | 17 | chrome.browserAction.setIcon({ 18 | tabId: tab.id, 19 | path: "/icons/19x19/" + browserAction.generateIconName(data.iconType, data.icon) 20 | }); 21 | 22 | if(data.popup) { 23 | chrome.browserAction.setPopup({ 24 | tabId: tab.id, 25 | popup: "popups/" + data.popup 26 | }); 27 | } 28 | } 29 | 30 | browserAction.update = function(interval) { 31 | if(!page.tabs[page.currentTabId] || page.tabs[page.currentTabId].stack.length == 0) { 32 | return; 33 | } 34 | 35 | var data = page.tabs[page.currentTabId].stack[page.tabs[page.currentTabId].stack.length - 1]; 36 | 37 | if(typeof data.visibleForMilliSeconds != "undefined") { 38 | if(data.visibleForMilliSeconds <= 0) { 39 | browserAction.stackPop(page.currentTabId); 40 | browserAction.show(null, {"id": page.currentTabId}); 41 | page.clearCredentials(page.currentTabId); 42 | return; 43 | } 44 | data.visibleForMilliSeconds -= interval; 45 | } 46 | 47 | if(data.intervalIcon) { 48 | data.intervalIcon.counter += 1; 49 | if(data.intervalIcon.counter < data.intervalIcon.max) { 50 | return; 51 | } 52 | 53 | data.intervalIcon.counter = 0; 54 | data.intervalIcon.index += 1; 55 | 56 | if(data.intervalIcon.index > data.intervalIcon.icons.length - 1) { 57 | data.intervalIcon.index = 0; 58 | } 59 | 60 | chrome.browserAction.setIcon({ 61 | tabId: page.currentTabId, 62 | path: "/icons/19x19/" + browserAction.generateIconName(null, data.intervalIcon.icons[data.intervalIcon.index]) 63 | }); 64 | } 65 | } 66 | 67 | browserAction.showDefault = function(callback, tab) { 68 | var stackData = { 69 | level: 1, 70 | iconType: "normal", 71 | popup: "popup.html" 72 | } 73 | if(!keepass.isConfigured() || keepass.isDatabaseClosed || !keepass.isKeePassHttpAvailable || page.tabs[tab.id].errorMessage) { 74 | stackData.iconType = "cross"; 75 | } 76 | 77 | if(page.tabs[tab.id].loginList.length > 0) { 78 | stackData.iconType = "questionmark"; 79 | stackData.popup = "popup_login.html"; 80 | } 81 | 82 | browserAction.stackUnshift(stackData, tab.id); 83 | 84 | browserAction.show(null, tab); 85 | } 86 | 87 | browserAction.stackAdd = function(callback, tab, icon, popup, level, push, visibleForMilliSeconds, visibleForPageUpdates, redirectOffset, dontShow) { 88 | var id = tab.id || page.currentTabId; 89 | 90 | if(!level) { 91 | level = 1; 92 | } 93 | 94 | var stackData = { 95 | "level": level, 96 | "icon": icon 97 | } 98 | 99 | if(popup) { 100 | stackData.popup = popup; 101 | } 102 | 103 | if(visibleForMilliSeconds) { 104 | stackData.visibleForMilliSeconds = visibleForMilliSeconds; 105 | } 106 | 107 | if(visibleForPageUpdates) { 108 | stackData.visibleForPageUpdates = visibleForPageUpdates; 109 | } 110 | 111 | if(redirectOffset) { 112 | stackData.redirectOffset = redirectOffset; 113 | } 114 | 115 | if(push) { 116 | browserAction.stackPush(stackData, id); 117 | } 118 | else { 119 | browserAction.stackUnshift(stackData, id); 120 | } 121 | 122 | if(!dontShow) { 123 | browserAction.show(null, {"id": id}); 124 | } 125 | } 126 | 127 | 128 | browserAction.removeLevelFromStack = function(callback, tab, level, type, dontShow) { 129 | if(!page.tabs[tab.id]) { 130 | return; 131 | } 132 | 133 | if(!type) { 134 | type = "<="; 135 | } 136 | 137 | var newStack = []; 138 | for(var i = 0; i < page.tabs[tab.id].stack.length; i++) { 139 | if( 140 | (type == "<" && page.tabs[tab.id].stack[i].level >= level) || 141 | (type == "<=" && page.tabs[tab.id].stack[i].level > level) || 142 | (type == "=" && page.tabs[tab.id].stack[i].level != level) || 143 | (type == "==" && page.tabs[tab.id].stack[i].level != level) || 144 | (type == "!=" && page.tabs[tab.id].stack[i].level == level) || 145 | (type == ">" && page.tabs[tab.id].stack[i].level <= level) || 146 | (type == ">=" && page.tabs[tab.id].stack[i].level < level) 147 | ) { 148 | newStack.push(page.tabs[tab.id].stack[i]); 149 | } 150 | } 151 | 152 | page.tabs[tab.id].stack = newStack; 153 | 154 | if(!dontShow) { 155 | browserAction.show(callback, tab); 156 | } 157 | } 158 | 159 | browserAction.stackPop = function(tabId) { 160 | var id = tabId || page.currentTabId; 161 | 162 | page.tabs[id].stack.pop(); 163 | }; 164 | 165 | browserAction.stackPush = function(data, tabId) { 166 | var id = tabId || page.currentTabId; 167 | 168 | browserAction.removeLevelFromStack(null, {"id": id}, data.level, "<=", true); 169 | page.tabs[id].stack.push(data); 170 | }; 171 | 172 | browserAction.stackUnshift = function(data, tabId) { 173 | var id = tabId || page.currentTabId; 174 | 175 | browserAction.removeLevelFromStack(null, {"id": id}, data.level, "<=", true); 176 | page.tabs[id].stack.unshift(data); 177 | }; 178 | 179 | 180 | browserAction.removeRememberPopup = function(callback, tab, removeImmediately) { 181 | if(!page.tabs[tab.id]) { 182 | return; 183 | } 184 | 185 | if(page.tabs[tab.id].stack.length == 0) { 186 | page.clearCredentials(tab.id); 187 | return; 188 | } 189 | var data = page.tabs[tab.id].stack[page.tabs[tab.id].stack.length - 1]; 190 | 191 | if(removeImmediately || !isNaN(data.visibleForPageUpdates)) { 192 | var currentMS = Date.now(); 193 | if( removeImmediately || (data.visibleForPageUpdates <= 0 && data.redirectOffset > 0)) { 194 | browserAction.stackPop(tab.id); 195 | browserAction.show(null, {"id": tab.id}); 196 | page.clearCredentials(tab.id); 197 | return; 198 | } 199 | else if (!isNaN(data.visibleForPageUpdates) && data.redirectOffset > 0 && currentMS >= data.redirectOffset) { 200 | data.visibleForPageUpdates = data.visibleForPageUpdates - 1; 201 | } 202 | } 203 | }; 204 | 205 | browserAction.setRememberPopup = function(tabId, username, password, url, usernameExists, credentialsList) { 206 | var settings = typeof(localStorage.settings)=='undefined' ? {} : JSON.parse(localStorage.settings); 207 | 208 | var id = tabId || page.currentTabId; 209 | 210 | var timeoutMinMillis = parseInt(getValueOrDefault(settings, "blinkMinTimeout", BLINK_TIMEOUT_REDIRECT_THRESHOLD_TIME_DEFAULT, 0)) ; 211 | if (timeoutMinMillis > 0) { 212 | timeoutMinMillis += Date.now(); 213 | } 214 | var blinkTimeout = getValueOrDefault(settings, "blinkTimeout", BLINK_TIMEOUT_DEFAULT, 0); 215 | var pageUpdateAllowance = getValueOrDefault(settings, "allowedRedirect", BLINK_TIMEOUT_REDIRECT_COUNT_DEFAULT, 0); 216 | 217 | var stackData = { 218 | visibleForMilliSeconds: blinkTimeout, 219 | visibleForPageUpdates: pageUpdateAllowance, 220 | redirectOffset: timeoutMinMillis, 221 | level: 10, 222 | intervalIcon: { 223 | index: 0, 224 | counter: 0, 225 | max: 2, 226 | icons: ["icon_remember_red_background_19x19.png", "icon_remember_red_lock_19x19.png"] 227 | }, 228 | icon: "icon_remember_red_background_19x19.png", 229 | popup: "popup_remember.html" 230 | } 231 | 232 | browserAction.stackPush(stackData, id); 233 | 234 | page.tabs[id].credentials = { 235 | "username": username, 236 | "password": password, 237 | "url": url, 238 | "usernameExists": usernameExists, 239 | "list": credentialsList 240 | }; 241 | 242 | browserAction.show(null, {"id": id}); 243 | } 244 | 245 | function getValueOrDefault(settings, key, defaultVal, min) { 246 | try { 247 | var val = settings[key]; 248 | if (isNaN(val) || val < min) { 249 | val = defaultVal; 250 | } 251 | return val; 252 | } catch(e) { return defaultVal; } 253 | } 254 | 255 | browserAction.generateIconName = function(iconType, icon) { 256 | if(icon) { 257 | return icon; 258 | } 259 | 260 | var name = "icon_"; 261 | name += (keepass.keePassHttpUpdateAvailable()) ? "new_" : ""; 262 | name += (!iconType || iconType == "normal") ? "normal_" : iconType + "_"; 263 | name += keepass.getIconColor(); 264 | name += "_19x19.png"; 265 | 266 | return name; 267 | } -------------------------------------------------------------------------------- /chromeipass/background/cryptoHelpers.js: -------------------------------------------------------------------------------- 1 | /* 2 | * cryptoHelpers.js: implements AES - Advanced Encryption Standard 3 | * from the SlowAES project, http://code.google.com/p/slowaes/ 4 | * 5 | * Copyright (c) 2008 Josh Davis ( http://www.josh-davis.org ), 6 | * Mark Percival ( http://mpercival.com ), 7 | * Johan Sundstrom ( http://ecmanaut.blogspot.com ), 8 | * John Resig ( http://ejohn.org ) 9 | * 10 | * Licensed under the Apache License, Version 2.0 11 | * http://www.apache.org/licenses/ 12 | */ 13 | 14 | var cryptoHelpers = { 15 | // encodes a unicode string to UTF8 (8 bit characters are critical to AES functioning properly) 16 | encode_utf8:function(s) 17 | { 18 | try{return unescape(encodeURIComponent(s));} 19 | catch(e){throw 'error during utf8 encoding: cryptoHelpers.encode_utf8.';} 20 | }, 21 | 22 | // decodes a UTF8 string back to unicode 23 | decode_utf8:function(s) 24 | { 25 | try{return decodeURIComponent(escape(s));} 26 | catch(e){throw('error during utf8 decoding: cryptoHelpers.decode_utf8.');} 27 | }, 28 | 29 | //convert a number array to a hex string 30 | toHex:function() 31 | { 32 | var array = []; 33 | if(arguments.length == 1 && arguments[0].constructor == Array) 34 | array = arguments[0]; 35 | else 36 | array = arguments; 37 | var ret = ''; 38 | for(var i = 0;i < array.length;i++) 39 | ret += (array[i] < 16 ? '0' : '') + array[i].toString(16); 40 | return ret.toLowerCase(); 41 | }, 42 | 43 | //convert a hex string to a number array 44 | toNumbers:function(s) 45 | { 46 | var ret = []; 47 | s.replace(/(..)/g,function(s){ 48 | ret.push(parseInt(s,16)); 49 | }); 50 | return ret; 51 | }, 52 | 53 | // get a random number in the range [min,max] 54 | getRandom:function(min,max) 55 | { 56 | if(min === null) 57 | min = 0; 58 | if(max === null) 59 | max = 1; 60 | return Math.floor(Math.random()*(max+1)) + min; 61 | }, 62 | 63 | generateSharedKey:function(len) 64 | { 65 | if(len === null) 66 | len = 16; 67 | var key = []; 68 | for(var i = 0; i < len*2; i++) 69 | key.push(this.getRandom(0,255)); 70 | return key; 71 | }, 72 | 73 | generatePrivateKey:function(s,size) 74 | { 75 | var sha = jsHash.sha2.arr_sha256(s); 76 | return sha.slice(0,size); 77 | }, 78 | 79 | convertStringToByteArray: function(s) 80 | { 81 | var byteArray = []; 82 | for(var i = 0;i < s.length;i++) 83 | { 84 | byteArray.push(s.charCodeAt(i)); 85 | } 86 | return byteArray; 87 | }, 88 | 89 | convertByteArrayToString: function(byteArray) 90 | { 91 | var s = ''; 92 | for(var i = 0;i < byteArray.length;i++) 93 | { 94 | s += String.fromCharCode(byteArray[i]) 95 | } 96 | return s; 97 | }, 98 | 99 | base64: { 100 | // Takes a Nx16x1 byte array and converts it to Base64 101 | chars: [ 102 | 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 103 | 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 104 | 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 105 | 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 106 | 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 107 | 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 108 | 'w', 'x', 'y', 'z', '0', '1', '2', '3', 109 | '4', '5', '6', '7', '8', '9', '+', '/', 110 | '=', // for decoding purposes 111 | ], 112 | 113 | encode_line: function(flatArr){ 114 | var b64 = ''; 115 | 116 | for (var i = 0; i < flatArr.length; i += 3){ 117 | b64 += this.chars[flatArr[i] >> 2]; 118 | b64 += this.chars[((flatArr[i] & 3) << 4) | (flatArr[i + 1] >> 4)]; 119 | if (!(flatArr[i + 1] == null)){ 120 | b64 += this.chars[((flatArr[i + 1] & 15) << 2) | (flatArr[i + 2] >> 6)]; 121 | }else{ 122 | b64 += '='; 123 | } 124 | if (!(flatArr[i + 2] == null)){ 125 | b64 += this.chars[flatArr[i + 2] & 63]; 126 | }else{ 127 | b64 += '='; 128 | } 129 | } 130 | return b64; 131 | }, 132 | 133 | encode: function(flatArr) 134 | { 135 | var b64 = this.encode_line(flatArr); 136 | // OpenSSL is super particular about line breaks 137 | var broken_b64 = b64.slice(0, 64) + '\n'; 138 | for (var i = 1; i < (Math.ceil(b64.length / 64)); i++) 139 | { 140 | broken_b64 += b64.slice(i * 64, i * 64 + 64) + (Math.ceil(b64.length / 64) == i + 1 ? '': '\n'); 141 | } 142 | return broken_b64; 143 | }, 144 | 145 | decode: function(string) 146 | { 147 | string = string.replace(/[\r\n\t ]+/g, '') + '===='; // drop all whitespaces and pad with '=' (end of b64 marker) 148 | var flatArr = []; 149 | var c = []; 150 | var b = []; 151 | for (var i = 0; ; i = i + 4){ 152 | c[0] = this.chars.indexOf(string.charAt(i)); 153 | if(c[0] == 64){ 154 | return flatArr; 155 | } 156 | c[1] = this.chars.indexOf(string.charAt(i + 1)); 157 | c[2] = this.chars.indexOf(string.charAt(i + 2)); 158 | c[3] = this.chars.indexOf(string.charAt(i + 3)); 159 | 160 | if( 161 | (c[0] < 0) || // char1 is wrong 162 | (c[1] < 0) || (c[1] == 64) || // char2 is wrong 163 | (c[2] < 0) || // char3 is neither an valid char nor '=' 164 | (c[3] < 0) // char4 is neither an valid char nor '=' 165 | ){ 166 | throw 'error during base64 decoding at pos '+i+': cryptoHelpers.base64.decode.'; 167 | } 168 | 169 | flatArr.push((c[0] << 2) | (c[1] >> 4)); 170 | if(c[2] >= 0 && c[2] < 64){ 171 | flatArr.push(((c[1] & 15) << 4) | (c[2] >> 2)); 172 | if(c[3] >= 0 && c[2] < 64){ 173 | flatArr.push(((c[2] & 3) << 6) | c[3]); 174 | } 175 | } 176 | } 177 | }, 178 | 179 | }, 180 | 181 | }; 182 | -------------------------------------------------------------------------------- /chromeipass/background/event.js: -------------------------------------------------------------------------------- 1 | var event = {}; 2 | 3 | 4 | event.onMessage = function(request, sender, callback) { 5 | if (request.action in event.messageHandlers) { 6 | //console.log("onMessage(" + request.action + ") for #" + sender.tab.id); 7 | 8 | if(!sender.hasOwnProperty('tab') || sender.tab.id < 1) { 9 | sender.tab = {}; 10 | sender.tab.id = page.currentTabId; 11 | } 12 | 13 | event.invoke(event.messageHandlers[request.action], callback, sender.tab.id, request.args); 14 | 15 | // onMessage closes channel for callback automatically 16 | // if this method does not return true 17 | if(callback) { 18 | return true; 19 | } 20 | } 21 | } 22 | 23 | /** 24 | * Get interesting information about the given tab. 25 | * Function adapted from AdBlock-Plus. 26 | * 27 | * @param {function} handler to call after invoke 28 | * @param {function} callback to call after handler or null 29 | * @param {integer} senderTabId 30 | * @param {array} args 31 | * @param {bool} secondTime 32 | * @returns null (asynchronous) 33 | */ 34 | event.invoke = function(handler, callback, senderTabId, args, secondTime) { 35 | if(senderTabId < 1) { 36 | return; 37 | } 38 | 39 | if(!page.tabs[senderTabId]) { 40 | page.createTabEntry(senderTabId); 41 | } 42 | 43 | // remove information from no longer existing tabs 44 | page.removePageInformationFromNotExistingTabs(); 45 | 46 | chrome.tabs.get(senderTabId, function(tab) { 47 | //chrome.tabs.query({"active": true, "windowId": chrome.windows.WINDOW_ID_CURRENT}, function(tabs) { 48 | //if (tabs.length === 0) 49 | // return; // For example: only the background devtools or a popup are opened 50 | //var tab = tabs[0]; 51 | 52 | if(!tab) { 53 | return; 54 | } 55 | 56 | if (!tab.url) { 57 | // Issue 6877: tab URL is not set directly after you opened a window 58 | // using window.open() 59 | if (!secondTime) { 60 | window.setTimeout(function() { 61 | event.invoke(handler, callback, senderTabId, args, true); 62 | }, 250); 63 | } 64 | return; 65 | } 66 | 67 | if(!page.tabs[tab.id]) { 68 | page.createTabEntry(tab.id); 69 | } 70 | 71 | args = args || []; 72 | 73 | args.unshift(tab); 74 | args.unshift(callback); 75 | 76 | if(handler) { 77 | handler.apply(this, args); 78 | } 79 | else { 80 | console.log("undefined handler for tab " + tab.id); 81 | } 82 | }); 83 | } 84 | 85 | 86 | event.onShowAlert = function(callback, tab, message) { 87 | if( page.settings.supressAlerts ){ console.log(message); } 88 | else { alert(message); } 89 | } 90 | 91 | event.onLoadSettings = function(callback, tab) { 92 | page.settings = (typeof(localStorage.settings) == 'undefined') ? {} : JSON.parse(localStorage.settings); 93 | } 94 | 95 | event.onLoadKeyRing = function(callback, tab) { 96 | keepass.keyRing = (typeof(localStorage.keyRing) == 'undefined') ? {} : JSON.parse(localStorage.keyRing); 97 | if(keepass.isAssociated() && !keepass.keyRing[keepass.associated.hash]) { 98 | keepass.associated = { 99 | "value": false, 100 | "hash": null 101 | }; 102 | } 103 | } 104 | 105 | event.onGetSettings = function(callback, tab) { 106 | event.onLoadSettings(); 107 | callback({ data: page.settings }); 108 | } 109 | 110 | event.onSaveSettings = function(callback, tab, settings) { 111 | localStorage.settings = JSON.stringify(settings); 112 | event.onLoadSettings(); 113 | } 114 | 115 | event.onGetStatus = function(callback, tab) { 116 | keepass.testAssociation(tab); 117 | 118 | var configured = keepass.isConfigured(); 119 | var keyId = null; 120 | if (configured) { 121 | keyId = keepass.keyRing[keepass.databaseHash].id; 122 | } 123 | 124 | browserAction.showDefault(null, tab); 125 | 126 | callback({ 127 | identifier: keyId, 128 | configured: configured, 129 | databaseClosed: keepass.isDatabaseClosed, 130 | keePassHttpAvailable: keepass.isKeePassHttpAvailable, 131 | encryptionKeyUnrecognized: keepass.isEncryptionKeyUnrecognized, 132 | associated: keepass.isAssociated(), 133 | error: page.tabs[tab.id].errorMessage 134 | }); 135 | } 136 | 137 | event.onPopStack = function(callback, tab) { 138 | browserAction.stackPop(tab.id); 139 | browserAction.show(null, tab); 140 | } 141 | 142 | event.onGetTabInformation = function(callback, tab) { 143 | var id = tab.id || page.currentTabId; 144 | 145 | callback(page.tabs[id]); 146 | } 147 | 148 | event.onGetConnectedDatabase = function(callback, tab) { 149 | callback({ 150 | "count": Object.keys(keepass.keyRing).length, 151 | "identifier": (keepass.keyRing[keepass.associated.hash]) ? keepass.keyRing[keepass.associated.hash].id : null 152 | }); 153 | } 154 | 155 | event.onGetKeePassHttpVersions = function(callback, tab) { 156 | if(keepass.currentKeePassHttp.version == 0) { 157 | keepass.getDatabaseHash(tab); 158 | } 159 | callback({"current": keepass.currentKeePassHttp.version, "latest": keepass.latestKeePassHttp.version}); 160 | } 161 | 162 | event.onCheckUpdateKeePassHttp = function(callback, tab) { 163 | keepass.checkForNewKeePassHttpVersion(); 164 | callback({"current": keepass.currentKeePassHttp.version, "latest": keepass.latestKeePassHttp.version}); 165 | } 166 | 167 | event.onUpdateAvailableKeePassHttp = function(callback, tab) { 168 | callback(keepass.keePassHttpUpdateAvailable()); 169 | } 170 | 171 | event.onRemoveCredentialsFromTabInformation = function(callback, tab) { 172 | var id = tab.id || page.currentTabId; 173 | 174 | page.clearCredentials(id); 175 | } 176 | 177 | event.onSetRememberPopup = function(callback, tab, username, password, url, usernameExists, credentialsList) { 178 | browserAction.setRememberPopup(tab.id, username, password, url, usernameExists, credentialsList); 179 | } 180 | 181 | event.onLoginPopup = function(callback, tab, logins) { 182 | var stackData = { 183 | level: 1, 184 | iconType: "questionmark", 185 | popup: "popup_login.html" 186 | } 187 | browserAction.stackUnshift(stackData, tab.id); 188 | 189 | page.tabs[tab.id].loginList = logins; 190 | 191 | browserAction.show(null, tab); 192 | } 193 | 194 | event.onHTTPAuthPopup = function(callback, tab, data) { 195 | var stackData = { 196 | level: 1, 197 | iconType: "questionmark", 198 | popup: "popup_httpauth.html" 199 | } 200 | browserAction.stackUnshift(stackData, tab.id); 201 | 202 | page.tabs[tab.id].loginList = data; 203 | 204 | browserAction.show(null, tab); 205 | } 206 | 207 | event.onMultipleFieldsPopup = function(callback, tab) { 208 | var stackData = { 209 | level: 1, 210 | iconType: "normal", 211 | popup: "popup_multiple-fields.html" 212 | } 213 | browserAction.stackUnshift(stackData, tab.id); 214 | 215 | browserAction.show(null, tab); 216 | } 217 | 218 | 219 | // all methods named in this object have to be declared BEFORE this! 220 | event.messageHandlers = { 221 | 'add_credentials': keepass.addCredentials, 222 | 'alert': event.onShowAlert, 223 | 'associate': keepass.associate, 224 | 'check_update_keepasshttp': event.onCheckUpdateKeePassHttp, 225 | 'get_connected_database': event.onGetConnectedDatabase, 226 | 'get_keepasshttp_versions': event.onGetKeePassHttpVersions, 227 | 'get_settings': event.onGetSettings, 228 | 'get_status': event.onGetStatus, 229 | 'get_tab_information': event.onGetTabInformation, 230 | 'load_keyring': event.onLoadKeyRing, 231 | 'load_settings': event.onLoadSettings, 232 | 'pop_stack': event.onPopStack, 233 | 'popup_login': event.onLoginPopup, 234 | 'popup_multiple-fields': event.onMultipleFieldsPopup, 235 | 'remove_credentials_from_tab_information': event.onRemoveCredentialsFromTabInformation, 236 | 'retrieve_credentials': keepass.retrieveCredentials, 237 | 'show_default_browseraction': browserAction.showDefault, 238 | 'update_credentials': keepass.updateCredentials, 239 | 'save_settings': event.onSaveSettings, 240 | 'set_remember_credentials': event.onSetRememberPopup, 241 | 'stack_add': browserAction.stackAdd, 242 | 'update_available_keepasshttp': event.onUpdateAvailableKeePassHttp, 243 | 'generate_password': keepass.generatePassword, 244 | 'copy_password': keepass.copyPassword 245 | }; -------------------------------------------------------------------------------- /chromeipass/background/httpauth.js: -------------------------------------------------------------------------------- 1 | var httpAuth = httpAuth || {}; 2 | 3 | httpAuth.pendingCallbacks = []; 4 | httpAuth.requestId = ""; 5 | httpAuth.callback = null; 6 | httpAuth.tabId = 0; 7 | httpAuth.url = null; 8 | httpAuth.isProxy = false; 9 | httpAuth.proxyUrl = null; 10 | 11 | 12 | httpAuth.handleRequest = function (details, callback) { 13 | if(httpAuth.requestId == details.requestId || !page.tabs[details.tabId]) { 14 | callback({}); 15 | } 16 | else { 17 | httpAuth.requestId = details.requestId; 18 | httpAuth.pendingCallbacks.push(callback); 19 | httpAuth.processPendingCallbacks(details); 20 | } 21 | } 22 | 23 | httpAuth.processPendingCallbacks = function(details) { 24 | httpAuth.callback = httpAuth.pendingCallbacks.pop(); 25 | httpAuth.tabId = details.tabId; 26 | httpAuth.url = details.url; 27 | httpAuth.isProxy = details.isProxy; 28 | 29 | if(details.challenger){ 30 | httpAuth.proxyUrl = details.challenger.host; 31 | } 32 | 33 | // WORKAROUND: second parameter should be tab, but is an own object with tab-id 34 | // but in background.js only tab.id is used. To get tabs we could use 35 | // chrome.tabs.get(tabId, callback) <-- but what should callback be? 36 | 37 | var url = (httpAuth.isProxy && httpAuth.proxyUrl) ? httpAuth.proxyUrl : httpAuth.url; 38 | 39 | keepass.retrieveCredentials(httpAuth.loginOrShowCredentials, { "id" : details.tabId }, url, url, true); 40 | } 41 | 42 | httpAuth.loginOrShowCredentials = function(logins) { 43 | // at least one login found --> use first to login 44 | if (logins.length > 0) { 45 | var url = (httpAuth.isProxy && httpAuth.proxyUrl) ? httpAuth.proxyUrl : httpAuth.url; 46 | event.onHTTPAuthPopup(null, {"id": httpAuth.tabId}, {"logins": logins, "url": url}); 47 | //generate popup-list for HTTP Auth usernames + descriptions 48 | 49 | if(page.settings.autoFillAndSend) { 50 | httpAuth.callback({ 51 | authCredentials: { 52 | username: logins[0].Login, 53 | password: logins[0].Password 54 | } 55 | }); 56 | } 57 | else { 58 | httpAuth.callback({}); 59 | } 60 | } 61 | // no logins found 62 | else { 63 | httpAuth.callback({}); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /chromeipass/background/init.js: -------------------------------------------------------------------------------- 1 | // since version 2.0 the extension is using a keyRing instead of a single key-name-pair 2 | keepass.convertKeyToKeyRing(); 3 | // load settings 4 | page.initSettings(); 5 | // create tab information structure for every opened tab 6 | page.initOpenedTabs(); 7 | // initial connection with KeePassHttp 8 | keepass.getDatabaseHash(null); 9 | // set initial tab-ID 10 | chrome.tabs.query({"active": true, "windowId": chrome.windows.WINDOW_ID_CURRENT}, function(tabs) { 11 | if (tabs.length === 0) 12 | return; // For example: only the background devtools or a popup are opened 13 | page.currentTabId = tabs[0].id; 14 | }); 15 | // Milliseconds for intervall (e.g. to update browserAction) 16 | var _interval = 250; 17 | 18 | 19 | /** 20 | * Generate information structure for created tab and invoke all needed 21 | * functions if tab is created in foreground 22 | * @param {object} tab 23 | */ 24 | chrome.tabs.onCreated.addListener(function(tab) { 25 | if(tab.id > 0) { 26 | //console.log("chrome.tabs.onCreated(" + tab.id+ ")"); 27 | if(tab.selected) { 28 | page.currentTabId = tab.id; 29 | event.invoke(page.switchTab, null, tab.id, []); 30 | } 31 | } 32 | }); 33 | 34 | /** 35 | * Remove information structure of closed tab for freeing memory 36 | * @param {integer} tabId 37 | * @param {object} removeInfo 38 | */ 39 | chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) { 40 | delete page.tabs[tabId]; 41 | if(page.currentTabId == tabId) { 42 | page.currentTabId = -1; 43 | } 44 | }); 45 | 46 | /** 47 | * Remove stored credentials on switching tabs. 48 | * Invoke functions to retrieve credentials for focused tab 49 | * @param {object} activeInfo 50 | */ 51 | chrome.tabs.onActivated.addListener(function(activeInfo) { 52 | // remove possible credentials from old tab information 53 | page.clearCredentials(page.currentTabId, true); 54 | browserAction.removeRememberPopup(null, {"id": page.currentTabId}, true); 55 | 56 | chrome.tabs.get(activeInfo.tabId, function(info) { 57 | //console.log(info.id + ": " + info.url); 58 | if(info && info.id) { 59 | page.currentTabId = info.id; 60 | if(info.status == "complete") { 61 | //console.log("event.invoke(page.switchTab, null, "+info.id + ", []);"); 62 | event.invoke(page.switchTab, null, info.id, []); 63 | } 64 | } 65 | }); 66 | }); 67 | 68 | /** 69 | * Update browserAction on every update of the page 70 | * @param {integer} tabId 71 | * @param {object} changeInfo 72 | */ 73 | chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 74 | if(changeInfo.status == "complete") { 75 | event.invoke(browserAction.removeRememberPopup, null, tabId, []); 76 | } 77 | }); 78 | 79 | 80 | /** 81 | * Retrieve Credentials and try auto-login for HTTPAuth requests 82 | */ 83 | chrome.webRequest.onAuthRequired.addListener(httpAuth.handleRequest, 84 | { urls: [""] }, ["asyncBlocking"] 85 | ); 86 | 87 | /** 88 | * Interaction between background-script and front-script 89 | */ 90 | chrome.extension.onMessage.addListener(event.onMessage); 91 | 92 | 93 | /** 94 | * Add context menu entry for filling in username + password 95 | */ 96 | chrome.contextMenus.create({ 97 | "title": "Fill &User + Pass", 98 | "contexts": [ "editable" ], 99 | "onclick": function(info, tab) { 100 | chrome.tabs.sendMessage(tab.id, { 101 | action: "fill_user_pass" 102 | }); 103 | } 104 | }); 105 | 106 | /** 107 | * Add context menu entry for filling in only password which matches for given username 108 | */ 109 | chrome.contextMenus.create({ 110 | "title": "Fill &Pass Only", 111 | "contexts": [ "editable" ], 112 | "onclick": function(info, tab) { 113 | chrome.tabs.sendMessage(tab.id, { 114 | action: "fill_pass_only" 115 | }); 116 | } 117 | }); 118 | 119 | /** 120 | * Add context menu entry for creating icon for generate-password dialog 121 | */ 122 | chrome.contextMenus.create({ 123 | "title": "Show Password &Generator Icons", 124 | "contexts": [ "editable" ], 125 | "onclick": function(info, tab) { 126 | chrome.tabs.sendMessage(tab.id, { 127 | action: "activate_password_generator" 128 | }); 129 | } 130 | }); 131 | 132 | /** 133 | * Add context menu entry for creating icon for generate-password dialog 134 | */ 135 | chrome.contextMenus.create({ 136 | "title": "&Save credentials", 137 | "contexts": [ "editable" ], 138 | "onclick": function(info, tab) { 139 | chrome.tabs.sendMessage(tab.id, { 140 | action: "remember_credentials" 141 | }); 142 | } 143 | }); 144 | 145 | /** 146 | * Listen for keyboard shortcuts specified by user 147 | */ 148 | chrome.commands.onCommand.addListener(function(command) { 149 | 150 | if(command === "fill-username-password") { 151 | chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { 152 | if (tabs.length) { 153 | chrome.tabs.sendMessage(tabs[0].id, { action: "fill_user_pass" }); 154 | } 155 | }); 156 | } 157 | 158 | if(command === "fill-password") { 159 | chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { 160 | if (tabs.length) { 161 | chrome.tabs.sendMessage(tabs[0].id, { action: "fill_pass_only" }); 162 | } 163 | }); 164 | } 165 | }); 166 | 167 | /** 168 | * Interval which updates the browserAction (e.g. blinking icon) 169 | */ 170 | window.setInterval(function() { 171 | browserAction.update(_interval); 172 | }, _interval); -------------------------------------------------------------------------------- /chromeipass/background/page.js: -------------------------------------------------------------------------------- 1 | var page = {}; 2 | 3 | // special information for every tab 4 | page.tabs = {}; 5 | 6 | page.currentTabId = -1; 7 | page.settings = (typeof(localStorage.settings) == 'undefined') ? {} : JSON.parse(localStorage.settings); 8 | page.blockedTabs = {}; 9 | 10 | page.initSettings = function() { 11 | event.onLoadSettings(); 12 | if(!("checkUpdateKeePassHttp" in page.settings)) { 13 | page.settings.checkUpdateKeePassHttp = 3; 14 | } 15 | if(!("autoCompleteUsernames" in page.settings)) { 16 | page.settings.autoCompleteUsernames = 1; 17 | } 18 | if(!("autoFillAndSend" in page.settings)) { 19 | page.settings.autoFillAndSend = 1; 20 | } 21 | if(!("usePasswordGenerator" in page.settings)) { 22 | page.settings.usePasswordGenerator = 1; 23 | } 24 | if(!("autoFillSingleEntry" in page.settings)) { 25 | page.settings.autoFillSingleEntry = 1; 26 | } 27 | if(!("autoRetrieveCredentials" in page.settings)) { 28 | page.settings.autoRetrieveCredentials = 1; 29 | } 30 | if(!("hostname" in page.settings)) { 31 | page.settings.hostname = "localhost"; 32 | } 33 | if(!("port" in page.settings)) { 34 | page.settings.port = "19455"; 35 | } 36 | localStorage.settings = JSON.stringify(page.settings); 37 | } 38 | 39 | page.initOpenedTabs = function() { 40 | chrome.tabs.query({}, function(tabs) { 41 | for(var i = 0; i < tabs.length; i++) { 42 | page.createTabEntry(tabs[i].id); 43 | } 44 | }); 45 | } 46 | 47 | page.isValidProtocol = function(url) { 48 | var protocol = url.substring(0, url.indexOf(":")); 49 | protocol = protocol.toLowerCase(); 50 | return !(url.indexOf(".") == -1 || (protocol != "http" && protocol != "https" && protocol != "ftp" && protocol != "sftp")); 51 | } 52 | 53 | page.switchTab = function(callback, tab) { 54 | browserAction.showDefault(null, tab); 55 | 56 | chrome.tabs.sendMessage(tab.id, {action: "activated_tab"}); 57 | } 58 | 59 | page.clearCredentials = function(tabId, complete) { 60 | if(!page.tabs[tabId]) { 61 | return; 62 | } 63 | 64 | page.tabs[tabId].credentials = {}; 65 | delete page.tabs[tabId].credentials; 66 | 67 | if(complete) { 68 | page.tabs[tabId].loginList = []; 69 | 70 | chrome.tabs.sendMessage(tabId, { 71 | action: "clear_credentials" 72 | }); 73 | } 74 | } 75 | 76 | page.createTabEntry = function(tabId) { 77 | //console.log("page.createTabEntry("+tabId+")"); 78 | page.tabs[tabId] = { 79 | "stack": [], 80 | "errorMessage": null, 81 | "loginList": {} 82 | }; 83 | } 84 | 85 | page.removePageInformationFromNotExistingTabs = function() { 86 | var rand = Math.floor(Math.random()*1001); 87 | if(rand == 28) { 88 | chrome.tabs.query({}, function(tabs) { 89 | var $tabIds = {}; 90 | var $infoIds = Object.keys(page.tabs); 91 | 92 | for(var i = 0; i < tabs.length; i++) { 93 | $tabIds[tabs[i].id] = true; 94 | } 95 | 96 | for(var i = 0; i < $infoIds.length; i++) { 97 | if(!($infoIds[i] in $tabIds)) { 98 | delete page.tabs[$infoIds[i]]; 99 | } 100 | } 101 | }); 102 | } 103 | }; 104 | 105 | page.debugConsole = function() { 106 | if(arguments.length > 1) { 107 | console.log(page.sprintf(arguments[0], arguments)); 108 | } 109 | else { 110 | console.log(arguments[0]); 111 | } 112 | }; 113 | 114 | page.sprintf = function(input, args) { 115 | return input.replace(/{(\d+)}/g, function(match, number) { 116 | return typeof args[number] != 'undefined' 117 | ? (typeof args[number] == 'object' ? JSON.stringify(args[number]) : args[number]) 118 | : match 119 | ; 120 | }); 121 | } 122 | 123 | page.debugDummy = function() {}; 124 | 125 | page.debug = page.debugDummy; 126 | 127 | page.setDebug = function(bool) { 128 | if(bool) { 129 | page.debug = page.debugConsole; 130 | return "Debug mode enabled"; 131 | } 132 | else { 133 | page.debug = page.debugDummy; 134 | return "Debug mode disabled"; 135 | } 136 | }; 137 | -------------------------------------------------------------------------------- /chromeipass/background/utf8.js: -------------------------------------------------------------------------------- 1 | var UTF8 = { 2 | decode : function (utftext) { 3 | var string = ""; 4 | var i = 0; 5 | var c = c1 = c2 = 0; 6 | 7 | while (i < utftext.length) { 8 | c = utftext.charCodeAt(i); 9 | if (c < 128) { 10 | string += String.fromCharCode(c); 11 | i++; 12 | } 13 | else if((c > 191) && (c < 224)) { 14 | c2 = utftext.charCodeAt(i+1); 15 | string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 16 | i += 2; 17 | } else { 18 | c2 = utftext.charCodeAt(i+1); 19 | c3 = utftext.charCodeAt(i+2); 20 | string += String.fromCharCode( 21 | ((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); 22 | i += 3; 23 | } 24 | 25 | } 26 | return string; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /chromeipass/bootstrap-btn.css: -------------------------------------------------------------------------------- 1 | .b2c-btn { 2 | display: inline-block; 3 | *display: inline; 4 | padding: 4px 14px; 5 | margin-bottom: 0; 6 | *margin-left: .3em; 7 | font-size: 14px; 8 | line-height: 20px; 9 | *line-height: 20px; 10 | color: #333333; 11 | text-align: center; 12 | text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); 13 | vertical-align: middle; 14 | cursor: pointer; 15 | background-color: #f5f5f5; 16 | *background-color: #e6e6e6; 17 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); 18 | background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); 19 | background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); 20 | background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); 21 | background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); 22 | background-repeat: repeat-x; 23 | border: 1px solid #bbbbbb; 24 | *border: 0; 25 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 26 | border-color: #e6e6e6 #e6e6e6 #bfbfbf; 27 | border-bottom-color: #a2a2a2; 28 | -webkit-border-radius: 4px; 29 | -moz-border-radius: 4px; 30 | border-radius: 4px; 31 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); 32 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 33 | *zoom: 1; 34 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 35 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 36 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 37 | } 38 | 39 | .b2c-btn:hover, 40 | .b2c-btn:active, 41 | .b2c-btn.active, 42 | .b2c-btn.disabled, 43 | .b2c-btn[disabled] { 44 | color: #333333; 45 | background-color: #e6e6e6; 46 | *background-color: #d9d9d9; 47 | } 48 | 49 | .b2c-btn:active, 50 | .b2c-btn.active { 51 | background-color: #cccccc \9; 52 | } 53 | 54 | .b2c-btn:first-child { 55 | *margin-left: 0; 56 | } 57 | 58 | .b2c-btn:hover { 59 | color: #333333; 60 | text-decoration: none; 61 | background-color: #e6e6e6; 62 | *background-color: #d9d9d9; 63 | /* Buttons in IE7 don't get borders, so darken on hover */ 64 | 65 | background-position: 0 -15px; 66 | -webkit-transition: background-position 0.1s linear; 67 | -moz-transition: background-position 0.1s linear; 68 | -o-transition: background-position 0.1s linear; 69 | transition: background-position 0.1s linear; 70 | } 71 | 72 | .b2c-btn:focus { 73 | outline: thin dotted #333; 74 | outline: 5px auto -webkit-focus-ring-color; 75 | outline-offset: -2px; 76 | } 77 | 78 | .b2c-btn.active, 79 | .b2c-btn:active { 80 | background-color: #e6e6e6; 81 | background-color: #d9d9d9 \9; 82 | background-image: none; 83 | outline: 0; 84 | -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 85 | -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 86 | box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); 87 | } 88 | 89 | .b2c-btn.disabled, 90 | .b2c-btn[disabled] { 91 | cursor: default; 92 | background-color: #e6e6e6; 93 | background-image: none; 94 | opacity: 0.65; 95 | filter: alpha(opacity=65); 96 | -webkit-box-shadow: none; 97 | -moz-box-shadow: none; 98 | box-shadow: none; 99 | } 100 | 101 | .b2c-btn-large { 102 | padding: 9px 14px; 103 | font-size: 16px; 104 | line-height: normal; 105 | -webkit-border-radius: 5px; 106 | -moz-border-radius: 5px; 107 | border-radius: 5px; 108 | } 109 | 110 | .b2c-btn-large [class^="icon-"] { 111 | margin-top: 2px; 112 | } 113 | 114 | .b2c-btn-small { 115 | padding: 3px 9px; 116 | font-size: 12px; 117 | line-height: 18px; 118 | } 119 | 120 | .b2c-btn-small [class^="icon-"] { 121 | margin-top: 0; 122 | } 123 | 124 | .b2c-btn-mini { 125 | padding: 2px 6px; 126 | font-size: 11px; 127 | line-height: 17px; 128 | } 129 | 130 | .b2c-btn-block { 131 | display: block; 132 | width: 100%; 133 | padding-right: 0; 134 | padding-left: 0; 135 | -webkit-box-sizing: border-box; 136 | -moz-box-sizing: border-box; 137 | box-sizing: border-box; 138 | } 139 | 140 | .b2c-btn-block + .b2c-btn-block { 141 | margin-top: 5px; 142 | } 143 | 144 | input[type="submit"].b2c-btn-block, 145 | input[type="reset"].b2c-btn-block, 146 | input[type="button"].b2c-btn-block { 147 | width: 100%; 148 | } 149 | 150 | .b2c-btn-primary.active, 151 | .b2c-btn-warning.active, 152 | .b2c-btn-danger.active, 153 | .b2c-btn-success.active, 154 | .b2c-btn-info.active, 155 | .b2c-btn-inverse.active { 156 | color: rgba(255, 255, 255, 0.75); 157 | } 158 | 159 | .b2c-btn { 160 | border-color: #c5c5c5; 161 | border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); 162 | } 163 | 164 | .b2c-btn-primary { 165 | color: #ffffff; 166 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 167 | background-color: #006dcc; 168 | *background-color: #0044cc; 169 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); 170 | background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); 171 | background-image: -o-linear-gradient(top, #0088cc, #0044cc); 172 | background-image: linear-gradient(to bottom, #0088cc, #0044cc); 173 | background-image: -moz-linear-gradient(top, #0088cc, #0044cc); 174 | background-repeat: repeat-x; 175 | border-color: #0044cc #0044cc #002a80; 176 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 177 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); 178 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 179 | } 180 | 181 | .b2c-btn-primary:hover, 182 | .b2c-btn-primary:active, 183 | .b2c-btn-primary.active, 184 | .b2c-btn-primary.disabled, 185 | .b2c-btn-primary[disabled] { 186 | color: #ffffff; 187 | background-color: #0044cc; 188 | *background-color: #003bb3; 189 | } 190 | 191 | .b2c-btn-primary:active, 192 | .b2c-btn-primary.active { 193 | background-color: #003399 \9; 194 | } 195 | 196 | .b2c-btn-warning { 197 | color: #ffffff; 198 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 199 | background-color: #faa732; 200 | *background-color: #f89406; 201 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); 202 | background-image: -webkit-linear-gradient(top, #fbb450, #f89406); 203 | background-image: -o-linear-gradient(top, #fbb450, #f89406); 204 | background-image: linear-gradient(to bottom, #fbb450, #f89406); 205 | background-image: -moz-linear-gradient(top, #fbb450, #f89406); 206 | background-repeat: repeat-x; 207 | border-color: #f89406 #f89406 #ad6704; 208 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 209 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); 210 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 211 | } 212 | 213 | .b2c-btn-warning:hover, 214 | .b2c-btn-warning:active, 215 | .b2c-btn-warning.active, 216 | .b2c-btn-warning.disabled, 217 | .b2c-btn-warning[disabled] { 218 | color: #ffffff; 219 | background-color: #f89406; 220 | *background-color: #df8505; 221 | } 222 | 223 | .b2c-btn-warning:active, 224 | .b2c-btn-warning.active { 225 | background-color: #c67605 \9; 226 | } 227 | 228 | .b2c-btn-danger { 229 | color: #ffffff; 230 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 231 | background-color: #da4f49; 232 | *background-color: #bd362f; 233 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); 234 | background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); 235 | background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); 236 | background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); 237 | background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); 238 | background-repeat: repeat-x; 239 | border-color: #bd362f #bd362f #802420; 240 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 241 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); 242 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 243 | } 244 | 245 | .b2c-btn-danger:hover, 246 | .b2c-btn-danger:active, 247 | .b2c-btn-danger.active, 248 | .b2c-btn-danger.disabled, 249 | .b2c-btn-danger[disabled] { 250 | color: #ffffff; 251 | background-color: #bd362f; 252 | *background-color: #a9302a; 253 | } 254 | 255 | .b2c-btn-danger:active, 256 | .b2c-btn-danger.active { 257 | background-color: #942a25 \9; 258 | } 259 | 260 | .b2c-btn-success { 261 | color: #ffffff; 262 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 263 | background-color: #5bb75b; 264 | *background-color: #51a351; 265 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); 266 | background-image: -webkit-linear-gradient(top, #62c462, #51a351); 267 | background-image: -o-linear-gradient(top, #62c462, #51a351); 268 | background-image: linear-gradient(to bottom, #62c462, #51a351); 269 | background-image: -moz-linear-gradient(top, #62c462, #51a351); 270 | background-repeat: repeat-x; 271 | border-color: #51a351 #51a351 #387038; 272 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 273 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); 274 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 275 | } 276 | 277 | .b2c-btn-success:hover, 278 | .b2c-btn-success:active, 279 | .b2c-btn-success.active, 280 | .b2c-btn-success.disabled, 281 | .b2c-btn-success[disabled] { 282 | color: #ffffff; 283 | background-color: #51a351; 284 | *background-color: #499249; 285 | } 286 | 287 | .b2c-btn-success:active, 288 | .b2c-btn-success.active { 289 | background-color: #408140 \9; 290 | } 291 | 292 | .b2c-btn-info { 293 | color: #ffffff; 294 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 295 | background-color: #49afcd; 296 | *background-color: #2f96b4; 297 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); 298 | background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); 299 | background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); 300 | background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); 301 | background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); 302 | background-repeat: repeat-x; 303 | border-color: #2f96b4 #2f96b4 #1f6377; 304 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 305 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); 306 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 307 | } 308 | 309 | .b2c-btn-info:hover, 310 | .b2c-btn-info:active, 311 | .b2c-btn-info.active, 312 | .b2c-btn-info.disabled, 313 | .b2c-btn-info[disabled] { 314 | color: #ffffff; 315 | background-color: #2f96b4; 316 | *background-color: #2a85a0; 317 | } 318 | 319 | .b2c-btn-info:active, 320 | .b2c-btn-info.active { 321 | background-color: #24748c \9; 322 | } 323 | 324 | .b2c-btn-inverse { 325 | color: #ffffff; 326 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 327 | background-color: #363636; 328 | *background-color: #222222; 329 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); 330 | background-image: -webkit-linear-gradient(top, #444444, #222222); 331 | background-image: -o-linear-gradient(top, #444444, #222222); 332 | background-image: linear-gradient(to bottom, #444444, #222222); 333 | background-image: -moz-linear-gradient(top, #444444, #222222); 334 | background-repeat: repeat-x; 335 | border-color: #222222 #222222 #000000; 336 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 337 | filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); 338 | filter: progid:dximagetransform.microsoft.gradient(enabled=false); 339 | } 340 | 341 | .b2c-btn-inverse:hover, 342 | .b2c-btn-inverse:active, 343 | .b2c-btn-inverse.active, 344 | .b2c-btn-inverse.disabled, 345 | .b2c-btn-inverse[disabled] { 346 | color: #ffffff; 347 | background-color: #222222; 348 | *background-color: #151515; 349 | } 350 | 351 | .b2c-btn-inverse:active, 352 | .b2c-btn-inverse.active { 353 | background-color: #080808 \9; 354 | } 355 | 356 | button.b2c-btn, 357 | input[type="submit"].b2c-btn { 358 | *padding-top: 3px; 359 | *padding-bottom: 3px; 360 | } 361 | 362 | button.b2c-btn::-moz-focus-inner, 363 | input[type="submit"].b2c-btn::-moz-focus-inner { 364 | padding: 0; 365 | border: 0; 366 | } 367 | 368 | button.b2c-btn.b2c-btn-large, 369 | input[type="submit"].b2c-btn.b2c-btn-large { 370 | *padding-top: 7px; 371 | *padding-bottom: 7px; 372 | } 373 | 374 | button.b2c-btn.b2c-btn-small, 375 | input[type="submit"].b2c-btn.b2c-btn-small { 376 | *padding-top: 3px; 377 | *padding-bottom: 3px; 378 | } 379 | 380 | button.b2c-btn.b2c-btn-mini, 381 | input[type="submit"].b2c-btn.b2c-btn-mini { 382 | *padding-top: 1px; 383 | *padding-bottom: 1px; 384 | } 385 | 386 | .b2c-input-append { 387 | display: inline-block; 388 | margin-bottom: 10px; 389 | white-space: nowrap; 390 | vertical-align: middle; 391 | } 392 | 393 | .b2c-input-append input, 394 | .b2c-input-append select, 395 | .b2c-input-append .b2c-uneditable-input, 396 | .b2c-input-append .b2c-dropdown-menu, 397 | .b2c-input-append .b2c-popover { 398 | font-size: 14px; 399 | } 400 | 401 | .b2c-input-append input, 402 | .b2c-input-append select, 403 | .b2c-input-append .b2c-uneditable-input { 404 | position: relative; 405 | margin-bottom: 0; 406 | *margin-left: 0; 407 | vertical-align: top; 408 | -webkit-border-radius: 0 4px 4px 0; 409 | -moz-border-radius: 0 4px 4px 0; 410 | border-radius: 0 4px 4px 0; 411 | } 412 | 413 | .b2c-input-append input:focus, 414 | .b2c-input-append select:focus, 415 | .b2c-input-append .b2c-b2c-uneditable-input:focus { 416 | z-index: 2; 417 | } 418 | 419 | .b2c-input-append .b2c-add-on { 420 | display: inline-block; 421 | width: auto; 422 | height: 20px; 423 | min-width: 16px; 424 | padding: 4px 5px; 425 | font-size: 14px; 426 | font-weight: normal; 427 | line-height: 20px; 428 | text-align: center; 429 | text-shadow: 0 1px 0 #ffffff; 430 | background-color: #eeeeee; 431 | border: 1px solid #ccc; 432 | } 433 | 434 | .b2c-input-append .b2c-add-on, 435 | .b2c-input-append .b2c-btn, 436 | .b2c-input-append .b2c-btn-group > .b2c-dropdown-toggle { 437 | vertical-align: top; 438 | -webkit-border-radius: 0; 439 | -moz-border-radius: 0; 440 | border-radius: 0; 441 | } 442 | 443 | .b2c-input-append .b2c-active { 444 | background-color: #a9dba9; 445 | border-color: #46a546; 446 | } 447 | 448 | .b2c-input-append input, 449 | .b2c-input-append select, 450 | .b2c-input-append .b2c-uneditable-input { 451 | -webkit-border-radius: 4px 0 0 4px; 452 | -moz-border-radius: 4px 0 0 4px; 453 | border-radius: 4px 0 0 4px; 454 | } 455 | 456 | .b2c-input-append .b2c-add-on, 457 | .b2c-input-append .b2c-btn, 458 | .b2c-input-append .b2c-btn-group { 459 | margin-left: -1px; 460 | } 461 | 462 | .b2c-input-append .b2c-add-on:last-child, 463 | .b2c-input-append .b2c-btn:last-child, 464 | .b2c-input-append .b2c-btn-group:last-child > .b2c-dropdown-toggle { 465 | -webkit-border-radius: 0 4px 4px 0; 466 | -moz-border-radius: 0 4px 4px 0; 467 | border-radius: 0 4px 4px 0; 468 | } -------------------------------------------------------------------------------- /chromeipass/chromeipass.css: -------------------------------------------------------------------------------- 1 | .cip-ui-autocomplete li.cip-ui-menu-item { 2 | text-align: left !important; 3 | font-size: 12px !important; 4 | font-weight: normal !important; 5 | font-style: normal !important; 6 | font-family: Verdana, Arial, sans-serif !important; 7 | color: #222222 !important; 8 | } 9 | .cip-ui-dialog-titlebar-close { 10 | visibility: hidden !important; 11 | } 12 | .cip-ui-widget-overlay { 13 | background: none !important; 14 | z-index: 2147483601 !important; 15 | } 16 | .cip-ui-dialog { 17 | z-index: 2147483602 !important; 18 | } 19 | .cip-ui-dialog .cip-ui-dialog-title { 20 | font-size:.9em !important; 21 | } 22 | .cip-ui-dialog .cip-ui-dialog-titlebar { 23 | padding:.1em .5em !important; 24 | } 25 | .cip-ui-dialog-content { 26 | font-size: .9em !important; 27 | } 28 | 29 | #cip-genpw-dialog { 30 | text-align: left !important; 31 | } 32 | #cip-genpw-dialog button { 33 | height: 26px !important; 34 | } 35 | .cip-genpw-clearfix:after { 36 | clear: both; 37 | line-height: 0; 38 | content: ""; 39 | display: table; 40 | } 41 | .cip-genpw-icon { 42 | position: absolute; 43 | cursor: pointer; 44 | } 45 | .cip-genpw-icon.cip-icon-key-small { 46 | width: 16px; 47 | height: 16px; 48 | background-image: url(chrome-extension://__MSG_@@extension_id__/icons/key_16x16.png); 49 | } 50 | .cip-genpw-icon.cip-icon-key-big { 51 | width: 24px; 52 | height: 24px; 53 | background-image: url(chrome-extension://__MSG_@@extension_id__/icons/key_24x24.png); 54 | } 55 | .cip-genpw-password-frame { 56 | margin-top: 5px !important; 57 | margin-bottom: 5px !important; 58 | } 59 | .cip-genpw-password-frame > * { 60 | height: 20px !important; 61 | font-size: 11px !important; 62 | } 63 | .cip-genpw-textfield { 64 | background: none !important; 65 | font-size: 11px !important; 66 | display: inline !important; 67 | border: 1px solid rgb(170, 170, 170) !important; 68 | padding: 1px 2px !important; 69 | max-width: none !important; 70 | min-width: 0 !important; 71 | font-size: 1em !important; 72 | width: 240px !important; 73 | padding-left: 5px !important; 74 | } 75 | #cip-genpw-quality { 76 | width: 50px !important; 77 | padding-top: 1px !important; 78 | padding-bottom: 1px !important; 79 | } 80 | .cip-genpw-label { 81 | display: block !important; 82 | margin: 5px 0 !important; 83 | } 84 | .cip-genpw-checkbox { 85 | vertical-align: middle !important; 86 | } 87 | #cip-genpw-btn-fillin { 88 | margin-right: 5px; 89 | } 90 | 91 | .b2c-modal-backdrop { 92 | position: fixed; 93 | top: 0; 94 | right: 0; 95 | bottom: 0; 96 | left: 0; 97 | z-index: 2147483645; 98 | } 99 | .b2c-modal-backdrop:after { 100 | content:''; 101 | position: fixed; 102 | top: 0; 103 | right: 0; 104 | bottom: 0; 105 | left: 0; 106 | background-color: #000000; 107 | opacity: 0.8; 108 | filter: alpha(opacity=80); 109 | } 110 | #b2c-cipDefine-fields { 111 | z-index: 2147483646; 112 | } 113 | #b2c-cipDefine-description { 114 | z-index: 2147483646; 115 | color: #efefef; 116 | border: 2px solid #555555; 117 | padding: 7px 5px; 118 | position: absolute; 119 | top: 100px; 120 | left: 150px; 121 | text-align: left; 122 | cursor: pointer; 123 | background-color:rgba(255,255,255,0.3); 124 | font-size: 15px; 125 | } 126 | #b2c-cipDefine-description div:first-of-type { 127 | margin-top: 0; 128 | padding-top: 0; 129 | text-align: left; 130 | color: #efefef; 131 | padding-bottom: 8px; 132 | font-weight: bold; 133 | font-size: 160%; 134 | } 135 | #b2c-cipDefine-description p { 136 | margin-top: 10px; 137 | padding-top: 10px; 138 | color: #efefef; 139 | border-top: 2px solid #666666; 140 | line-height: 110%; 141 | } 142 | #b2c-help { 143 | margin-bottom: 3px; 144 | } 145 | .b2c-fixed-field { 146 | position: absolute; 147 | border: 2px solid #efefef; 148 | cursor: pointer; 149 | z-index: 2147483646; 150 | text-align: left; 151 | font-weight: bold; 152 | background-color:rgba(239,239,239,0.4); 153 | } 154 | .b2c-fixed-hover-field { 155 | border: 2px solid orange; 156 | background-color:rgba(255,165,239,0.4); 157 | } 158 | .b2c-fixed-password-field { 159 | border: 2px solid red; 160 | color: #efefef; 161 | background-color:rgba(255,0,0,0.4); 162 | } 163 | .b2c-fixed-username-field { 164 | border: 2px solid limegreen; 165 | color: #efefef; 166 | background-color:rgba(50,205,50,0.4); 167 | } 168 | .b2c-fixed-string-field { 169 | border: 2px solid deepskyblue; 170 | color: #efefef; 171 | background-color:rgba(30,144,255,0.4); 172 | } -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_aqua-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_aqua-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_aqua_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_aqua_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_blue-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_blue-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_blue_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_blue_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_green-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_green-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_green_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_green_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_grey-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_grey-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_grey_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_grey_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_orange-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_orange-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_orange_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_orange_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_pink-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_pink-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_pink_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_pink_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_purple-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_purple-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_purple_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_purple_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_red-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_red-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_red_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_red_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_yellow-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_yellow-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_bang_yellow_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_bang_yellow_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_aqua-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_aqua-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_aqua_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_aqua_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_blue-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_blue-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_blue_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_blue_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_green-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_green-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_green_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_green_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_grey-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_grey-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_grey_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_grey_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_orange-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_orange-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_orange_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_orange_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_pink-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_pink-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_pink_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_pink_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_purple-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_purple-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_purple_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_purple_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_red-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_red-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_red_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_red_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_yellow-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_yellow-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_cross_yellow_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_cross_yellow_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_aqua-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_aqua-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_aqua_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_aqua_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_blue-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_blue-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_blue_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_blue_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_green-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_green-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_green_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_green_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_grey-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_grey-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_grey_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_grey_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_orange-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_orange-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_orange_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_orange_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_pink-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_pink-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_pink_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_pink_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_purple-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_purple-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_purple_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_purple_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_red-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_red-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_red_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_red_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_yellow-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_yellow-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_bang_yellow_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_bang_yellow_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_aqua-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_aqua-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_aqua_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_aqua_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_blue-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_blue-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_blue_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_blue_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_green-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_green-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_green_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_green_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_grey-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_grey-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_grey_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_grey_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_orange-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_orange-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_orange_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_orange_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_pink-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_pink-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_pink_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_pink_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_purple-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_purple-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_purple_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_purple_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_red-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_red-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_red_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_red_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_yellow-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_yellow-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_cross_yellow_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_cross_yellow_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_aqua-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_aqua-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_aqua_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_aqua_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_blue-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_blue-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_blue_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_blue_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_green-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_green-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_green_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_green_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_grey-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_grey-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_grey_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_grey_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_orange-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_orange-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_orange_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_orange_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_pink-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_pink-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_pink_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_pink_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_purple-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_purple-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_purple_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_purple_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_red-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_red-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_red_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_red_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_yellow-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_yellow-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_normal_yellow_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_normal_yellow_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_aqua-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_aqua-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_aqua_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_aqua_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_blue-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_blue-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_blue_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_blue_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_green-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_green-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_green_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_green_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_grey-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_grey-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_grey_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_grey_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_orange-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_orange-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_orange_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_orange_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_pink-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_pink-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_pink_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_pink_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_purple-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_purple-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_purple_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_purple_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_red-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_red-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_red_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_red_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_yellow-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_yellow-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_new_questionmark_yellow_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_new_questionmark_yellow_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_aqua-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_aqua-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_aqua_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_aqua_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_blue-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_blue-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_blue_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_blue_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_green-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_green-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_green_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_green_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_grey-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_grey-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_grey_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_grey_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_orange-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_orange-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_orange_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_orange_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_pink-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_pink-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_pink_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_pink_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_purple-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_purple-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_purple_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_purple_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_red-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_red-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_red_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_red_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_yellow-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_yellow-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_normal_yellow_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_normal_yellow_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_aqua-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_aqua-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_aqua_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_aqua_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_blue-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_blue-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_blue_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_blue_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_green-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_green-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_green_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_green_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_grey-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_grey-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_grey_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_grey_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_orange-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_orange-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_orange_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_orange_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_pink-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_pink-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_pink_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_pink_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_purple-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_purple-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_purple_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_purple_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_red-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_red-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_red_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_red_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_yellow-inverse_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_yellow-inverse_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_questionmark_yellow_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_questionmark_yellow_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_remember_red_background_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_remember_red_background_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/19x19/icon_remember_red_lock_19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/19x19/icon_remember_red_lock_19x19.png -------------------------------------------------------------------------------- /chromeipass/icons/keepass_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/keepass_128x128.png -------------------------------------------------------------------------------- /chromeipass/icons/keepass_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/keepass_16x16.png -------------------------------------------------------------------------------- /chromeipass/icons/keepass_38x38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/keepass_38x38.png -------------------------------------------------------------------------------- /chromeipass/icons/keepass_48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/keepass_48x48.png -------------------------------------------------------------------------------- /chromeipass/icons/key_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/key_16x16.png -------------------------------------------------------------------------------- /chromeipass/icons/key_24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/icons/key_24x24.png -------------------------------------------------------------------------------- /chromeipass/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /chromeipass/images/ui-bg_flat_75_ffffff_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/images/ui-bg_flat_75_ffffff_40x100.png -------------------------------------------------------------------------------- /chromeipass/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /chromeipass/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /chromeipass/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /chromeipass/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /chromeipass/images/ui-bg_glass_95_fef1ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/images/ui-bg_glass_95_fef1ec_1x400.png -------------------------------------------------------------------------------- /chromeipass/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /chromeipass/jquery-ui-1.10.2.custom.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.10.2 - 2013-03-26 2 | * http://jqueryui.com 3 | * Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.dialog.css, jquery.ui.menu.css 4 | * Copyright 2013 jQuery Foundation and other contributors Licensed MIT */ 5 | 6 | /* 7 | removed all classes with "icon" 8 | replaced .ui- with .cip-ui- 9 | replaced url(images with url(chrome-extension://__MSG_@@extension_id__/images 10 | */ 11 | .cip-ui-helper-hidden{display:none}.cip-ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.cip-ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.cip-ui-helper-clearfix:before,.cip-ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.cip-ui-helper-clearfix:after{clear:both}.cip-ui-helper-clearfix{min-height:0}.cip-ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.cip-ui-front{z-index:100}.cip-ui-state-disabled{cursor:default!important}.cip-ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.cip-ui-resizable{position:relative}.cip-ui-resizable-handle{position:absolute;font-size:.1px;display:block}.cip-ui-resizable-disabled .cip-ui-resizable-handle,.cip-ui-resizable-autohide .cip-ui-resizable-handle{display:none}.cip-ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.cip-ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.cip-ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.cip-ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.cip-ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.cip-ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.cip-ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.cip-ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.cip-ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.cip-ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.cip-ui-button,.cip-ui-button:link,.cip-ui-button:visited,.cip-ui-button:hover,.cip-ui-button:active{text-decoration:none}.cip-ui-button .cip-ui-button-text{display:block;line-height:normal}.cip-ui-button-text-only .cip-ui-button-text{padding:.4em 1em}input.cip-ui-button{padding:.4em 1em}.cip-ui-buttonset{margin-right:7px}.cip-ui-buttonset .cip-ui-button{margin-left:0;margin-right:-.3em}input.cip-ui-button::-moz-focus-inner,button.cip-ui-button::-moz-focus-inner{border:0;padding:0}.cip-ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.cip-ui-dialog .cip-ui-dialog-titlebar{padding:.4em 1em;position:relative}.cip-ui-dialog .cip-ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.cip-ui-dialog .cip-ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.cip-ui-dialog .cip-ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0;overflow:auto}.cip-ui-dialog .cip-ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.cip-ui-dialog .cip-ui-dialog-buttonpane .cip-ui-dialog-buttonset{float:right}.cip-ui-dialog .cip-ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.cip-ui-dialog .cip-ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.cip-ui-draggable .cip-ui-dialog-titlebar{cursor:move}.cip-ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.cip-ui-menu .cip-ui-menu{margin-top:-3px;position:absolute}.cip-ui-menu .cip-ui-menu-item{margin:0;padding:0;width:100%}.cip-ui-menu .cip-ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0}.cip-ui-menu .cip-ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.cip-ui-menu .cip-ui-menu-item a.cip-ui-state-focus,.cip-ui-menu .cip-ui-menu-item a.cip-ui-state-active{font-weight:400;margin:-1px}.cip-ui-menu .cip-ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.cip-ui-menu .cip-ui-state-disabled a{cursor:default}.cip-ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.cip-ui-widget .cip-ui-widget{font-size:1em}.cip-ui-widget input,.cip-ui-widget select,.cip-ui-widget textarea,.cip-ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.cip-ui-widget-content{border:1px solid #aaa;background:#fff url(chrome-extension://__MSG_@@extension_id__/images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.cip-ui-widget-content a{color:#222}.cip-ui-widget-header{border:1px solid #aaa;background:#ccc url(chrome-extension://__MSG_@@extension_id__/images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.cip-ui-widget-header a{color:#222}.cip-ui-state-default,.cip-ui-widget-content .cip-ui-state-default,.cip-ui-widget-header .cip-ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(chrome-extension://__MSG_@@extension_id__/images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.cip-ui-state-default a,.cip-ui-state-default a:link,.cip-ui-state-default a:visited{color:#555;text-decoration:none}.cip-ui-state-hover,.cip-ui-widget-content .cip-ui-state-hover,.cip-ui-widget-header .cip-ui-state-hover,.cip-ui-state-focus,.cip-ui-widget-content .cip-ui-state-focus,.cip-ui-widget-header .cip-ui-state-focus{border:1px solid #999;background:#dadada url(chrome-extension://__MSG_@@extension_id__/images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.cip-ui-state-hover a,.cip-ui-state-hover a:hover,.cip-ui-state-hover a:link,.cip-ui-state-hover a:visited{color:#212121;text-decoration:none}.cip-ui-state-active,.cip-ui-widget-content .cip-ui-state-active,.cip-ui-widget-header .cip-ui-state-active{border:1px solid #aaa;background:#fff url(chrome-extension://__MSG_@@extension_id__/images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.cip-ui-state-active a,.cip-ui-state-active a:link,.cip-ui-state-active a:visited{color:#212121;text-decoration:none}.cip-ui-state-highlight,.cip-ui-widget-content .cip-ui-state-highlight,.cip-ui-widget-header .cip-ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(chrome-extension://__MSG_@@extension_id__/images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.cip-ui-state-highlight a,.cip-ui-widget-content .cip-ui-state-highlight a,.cip-ui-widget-header .cip-ui-state-highlight a{color:#363636}.cip-ui-state-error,.cip-ui-widget-content .cip-ui-state-error,.cip-ui-widget-header .cip-ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(chrome-extension://__MSG_@@extension_id__/images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.cip-ui-state-error a,.cip-ui-widget-content .cip-ui-state-error a,.cip-ui-widget-header .cip-ui-state-error a{color:#cd0a0a}.cip-ui-state-error-text,.cip-ui-widget-content .cip-ui-state-error-text,.cip-ui-widget-header .cip-ui-state-error-text{color:#cd0a0a}.cip-ui-priority-primary,.cip-ui-widget-content .cip-ui-priority-primary,.cip-ui-widget-header .cip-ui-priority-primary{font-weight:bold}.cip-ui-priority-secondary,.cip-ui-widget-content .cip-ui-priority-secondary,.cip-ui-widget-header .cip-ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.cip-ui-state-disabled,.cip-ui-widget-content .cip-ui-state-disabled,.cip-ui-widget-header .cip-ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.cip-ui-corner-all,.cip-ui-corner-top,.cip-ui-corner-left,.cip-ui-corner-tl{border-top-left-radius:4px}.cip-ui-corner-all,.cip-ui-corner-top,.cip-ui-corner-right,.cip-ui-corner-tr{border-top-right-radius:4px}.cip-ui-corner-all,.cip-ui-corner-bottom,.cip-ui-corner-left,.cip-ui-corner-bl{border-bottom-left-radius:4px}.cip-ui-corner-all,.cip-ui-corner-bottom,.cip-ui-corner-right,.cip-ui-corner-br{border-bottom-right-radius:4px}.cip-ui-widget-overlay{background:#aaa url(chrome-extension://__MSG_@@extension_id__/images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.cip-ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(chrome-extension://__MSG_@@extension_id__/images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} -------------------------------------------------------------------------------- /chromeipass/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chromeIPass", 3 | "version": "2.8.1", 4 | "manifest_version": 2, 5 | "description": "KeePass integration for browser Chrome using KeePassHttp", 6 | "icons": { 7 | "16": "icons/keepass_16x16.png", 8 | "48": "icons/keepass_48x48.png", 9 | "128": "icons/keepass_128x128.png" 10 | }, 11 | 12 | "browser_action": { 13 | "default_icon": { 14 | "19": "icons/19x19/icon_normal_blue_19x19.png", 15 | "38": "icons/keepass_38x38.png" 16 | }, 17 | "default_title": "chromeIPass", 18 | "default_popup": "popups/popup.html" 19 | }, 20 | 21 | "options_page": "options/options.html", 22 | "background": { 23 | "scripts": [ 24 | "background/aes.js", 25 | "background/cryptoHelpers.js", 26 | "background/utf8.js", 27 | "background/keepass.js", 28 | "background/httpauth.js", 29 | "background/browserAction.js", 30 | "background/page.js", 31 | "background/event.js", 32 | "background/init.js" 33 | ] 34 | }, 35 | "content_scripts": [ 36 | { 37 | "matches": ["http://*/*", "https://*/*"], 38 | "js": ["jquery-1.11.1.min.js", "jquery-ui-1.10.2.custom.min.js", "chromeipass.js"], 39 | "css": ["jquery-ui-1.10.2.custom.min.css", "bootstrap-btn.css", "chromeipass.css"], 40 | "run_at": "document_idle", 41 | "all_frames": true 42 | } 43 | ], 44 | "commands": { 45 | "fill-username-password": { 46 | "description": "Insert username + password", 47 | "suggested_key": { 48 | "default": "Ctrl+Shift+U", 49 | "mac": "Command+Shift+U" 50 | } 51 | }, 52 | "fill-password": { 53 | "description": "Insert a password", 54 | "suggested_key": { 55 | "default": "Ctrl+Shift+P", 56 | "mac": "Command+Shift+P" 57 | } 58 | } 59 | }, 60 | "web_accessible_resources": [ 61 | "jquery.min.map", 62 | "icons/key_16x16.png", 63 | "icons/key_24x24.png", 64 | "images/ui-bg_flat_0_aaaaaa_40x100.png", 65 | "images/ui-bg_flat_0_aaaaaa_40x100.png", 66 | "images/ui-bg_flat_75_ffffff_40x100.png", 67 | "images/ui-bg_glass_55_fbf9ee_1x400.png", 68 | "images/ui-bg_glass_65_ffffff_1x400.png", 69 | "images/ui-bg_glass_75_dadada_1x400.png", 70 | "images/ui-bg_glass_75_e6e6e6_1x400.png", 71 | "images/ui-bg_glass_95_fef1ec_1x400.png", 72 | "images/ui-bg_highlight-soft_75_cccccc_1x100.png" 73 | ], 74 | "permissions": [ 75 | "activeTab", 76 | "contextMenus", 77 | "clipboardWrite", 78 | "tabs", 79 | "webRequest", 80 | "webRequestBlocking", 81 | "https://*/*", 82 | "http://*/*", 83 | "http://localhost:19455/", 84 | "http://localhost/", 85 | "https://raw.github.com/" 86 | ] 87 | } 88 | -------------------------------------------------------------------------------- /chromeipass/options/bootstrap-responsive.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Responsive v2.3.0 3 | * 4 | * Copyright 2012 Twitter, Inc 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Designed and built with all the love in the world @twitter by @mdo and @fat. 9 | */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} 10 | -------------------------------------------------------------------------------- /chromeipass/options/http-auth-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/options/http-auth-dialog.png -------------------------------------------------------------------------------- /chromeipass/options/options.js: -------------------------------------------------------------------------------- 1 | if(cIPJQ) { 2 | var $ = cIPJQ.noConflict(true); 3 | } 4 | 5 | $(function() { 6 | options.initMenu(); 7 | options.initGeneralSettings(); 8 | options.initConnectedDatabases(); 9 | options.initSpecifiedCredentialFields(); 10 | options.initAbout(); 11 | }); 12 | 13 | var options = options || {}; 14 | 15 | options.settings = typeof(localStorage.settings)=='undefined' ? {} : JSON.parse(localStorage.settings); 16 | options.keyRing = typeof(localStorage.keyRing)=='undefined' ? {} : JSON.parse(localStorage.keyRing); 17 | 18 | options.initMenu = function() { 19 | $(".navbar:first ul.nav:first li a").click(function(e) { 20 | e.preventDefault(); 21 | $(".navbar:first ul.nav:first li").removeClass("active"); 22 | $(this).parent("li").addClass("active"); 23 | $("div.tab").hide(); 24 | $("div.tab#tab-" + $(this).attr("href").substring(1)).fadeIn(); 25 | }); 26 | 27 | $("div.tab:first").show(); 28 | } 29 | 30 | options.initGeneralSettings = function() { 31 | $("#tab-general-settings input[type=checkbox]").each(function() { 32 | $(this).attr("checked", options.settings[$(this).attr("name")]); 33 | }); 34 | 35 | $("#tab-general-settings input[type=checkbox]").change(function() { 36 | options.settings[$(this).attr("name")] = $(this).is(':checked'); 37 | localStorage.settings = JSON.stringify(options.settings); 38 | 39 | chrome.extension.sendMessage({ 40 | action: 'load_settings' 41 | }); 42 | }); 43 | 44 | $("#tab-general-settings input[type=radio]").each(function() { 45 | if($(this).val() == options.settings[$(this).attr("name")]) { 46 | $(this).attr("checked", options.settings[$(this).attr("name")]); 47 | } 48 | }); 49 | 50 | $("#tab-general-settings input[type=radio]").change(function() { 51 | options.settings[$(this).attr("name")] = $(this).val(); 52 | localStorage.settings = JSON.stringify(options.settings); 53 | 54 | chrome.extension.sendMessage({ 55 | action: 'load_settings' 56 | }); 57 | }); 58 | 59 | chrome.extension.sendMessage({ 60 | action: "get_keepasshttp_versions" 61 | }, options.showKeePassHttpVersions); 62 | 63 | $("#tab-general-settings button.checkUpdateKeePassHttp:first").click(function(e) { 64 | e.preventDefault(); 65 | $(this).attr("disabled", true); 66 | chrome.extension.sendMessage({ 67 | action: "check_update_keepasshttp" 68 | }, options.showKeePassHttpVersions); 69 | }); 70 | 71 | $("#showDangerousSettings").click(function() { 72 | $('#dangerousSettings').is(":visible") ? $(this).text("Show these settings anyway") : $(this).text("Hide"); 73 | $("#dangerousSettings").toggle(); 74 | }); 75 | 76 | $("#hostname").val(options.settings["hostname"]); 77 | $("#port").val(options.settings["port"]); 78 | $("#blinkTimeout").val(options.settings["blinkTimeout"]); 79 | $("#blinkMinTimeout").val(options.settings["blinkMinTimeout"]); 80 | $("#allowedRedirect").val(options.settings["allowedRedirect"]); 81 | 82 | $("#portButton").click(function() { 83 | var port = $.trim($("#port").val()); 84 | var portNumber = parseInt(port); 85 | if(isNaN(port) || portNumber < 1025 || portNumber > 99999) { 86 | $("#port").closest(".control-group").addClass("error"); 87 | alert("The port number has to be in range 1025 - 99999.\nNothing saved!"); 88 | return; 89 | } 90 | 91 | options.settings["port"] = portNumber.toString(); 92 | $("#port").closest(".control-group").removeClass("error").addClass("success"); 93 | setTimeout(function() {$("#port").closest(".control-group").removeClass("success")}, 2500); 94 | 95 | localStorage.settings = JSON.stringify(options.settings); 96 | 97 | chrome.extension.sendMessage({ 98 | action: 'load_settings' 99 | }); 100 | }); 101 | 102 | $("#hostnameButton").click(function() { 103 | var hostname = $("#hostname").val(); 104 | if($.trim(hostname) == "") { 105 | $("#hostname").closest(".control-group").addClass("error"); 106 | alert("Hostname cannot be empty.\nNothing saved!"); 107 | return; 108 | } 109 | 110 | options.settings["hostname"] = hostname; 111 | $("#hostname").closest(".control-group").removeClass("error").addClass("success"); 112 | setTimeout(function() {$("#hostname").closest(".control-group").removeClass("success")}, 2500); 113 | 114 | localStorage.settings = JSON.stringify(options.settings); 115 | 116 | chrome.extension.sendMessage({ 117 | action: 'load_settings' 118 | }); 119 | }); 120 | 121 | $("#blinkTimeoutButton").click(function(){ 122 | var blinkTimeout = $.trim($("#blinkTimeout").val()); 123 | var blinkTimeoutval = parseInt(blinkTimeout); 124 | 125 | options.settings["blinkTimeout"] = blinkTimeoutval.toString(); 126 | $("#blinkTimeout").closest(".control-group").removeClass("error").addClass("success"); 127 | setTimeout(function() {$("#blinkTimeout").closest(".control-group").removeClass("success")}, 2500); 128 | 129 | localStorage.settings = JSON.stringify(options.settings); 130 | 131 | chrome.extension.sendMessage({ 132 | action: 'load_settings' 133 | }); 134 | }); 135 | 136 | $("#blinkMinTimeoutButton").click(function(){ 137 | var blinkMinTimeout = $.trim($("#blinkMinTimeout").val()); 138 | var blinkMinTimeoutval = parseInt(blinkMinTimeout); 139 | 140 | options.settings["blinkMinTimeout"] = blinkMinTimeoutval.toString(); 141 | $("#blinkMinTimeout").closest(".control-group").removeClass("error").addClass("success"); 142 | setTimeout(function() {$("#blinkMinTimeout").closest(".control-group").removeClass("success")}, 2500); 143 | 144 | localStorage.settings = JSON.stringify(options.settings); 145 | 146 | chrome.extension.sendMessage({ 147 | action: 'load_settings' 148 | }); 149 | }); 150 | 151 | $("#allowedRedirectButton").click(function(){ 152 | var allowedRedirect = $.trim($("#allowedRedirect").val()); 153 | var allowedRedirectval = parseInt(allowedRedirect); 154 | 155 | options.settings["allowedRedirect"] = allowedRedirectval.toString(); 156 | $("#allowedRedirect").closest(".control-group").removeClass("error").addClass("success"); 157 | setTimeout(function() {$("#allowedRedirect").closest(".control-group").removeClass("success")}, 2500); 158 | 159 | localStorage.settings = JSON.stringify(options.settings); 160 | 161 | chrome.extension.sendMessage({ 162 | action: 'load_settings' 163 | }); 164 | }); 165 | }; 166 | 167 | options.showKeePassHttpVersions = function(response) { 168 | if(response.current <= 0) { 169 | response.current = "unknown"; 170 | } 171 | if(response.latest <= 0) { 172 | response.latest = "unknown"; 173 | } 174 | $("#tab-general-settings .kphVersion:first em.yourVersion:first").text(response.current); 175 | $("#tab-general-settings .kphVersion:first em.latestVersion:first").text(response.latest); 176 | 177 | $("#tab-about em.versionKPH").text(response.current); 178 | 179 | $("#tab-general-settings button.checkUpdateKeePassHttp:first").attr("disabled", false); 180 | } 181 | 182 | options.initConnectedDatabases = function() { 183 | $("#dialogDeleteConnectedDatabase").modal({keyboard: true, show: false, backdrop: true}); 184 | $("#tab-connected-databases tr.clone:first button.delete:first").click(function(e) { 185 | e.preventDefault(); 186 | $("#dialogDeleteConnectedDatabase").data("hash", $(this).closest("tr").data("hash")); 187 | $("#dialogDeleteConnectedDatabase .modal-body:first span:first").text($(this).closest("tr").children("td:first").text()); 188 | $("#dialogDeleteConnectedDatabase").modal("show"); 189 | }); 190 | 191 | $("#dialogDeleteConnectedDatabase .modal-footer:first button.yes:first").click(function(e) { 192 | $("#dialogDeleteConnectedDatabase").modal("hide"); 193 | 194 | var $hash = $("#dialogDeleteConnectedDatabase").data("hash"); 195 | $("#tab-connected-databases #tr-cd-" + $hash).remove(); 196 | 197 | delete options.keyRing[$hash]; 198 | localStorage.keyRing = JSON.stringify(options.keyRing); 199 | 200 | chrome.extension.sendMessage({ 201 | action: 'load_keyring' 202 | }); 203 | 204 | if($("#tab-connected-databases table tbody:first tr").length > 2) { 205 | $("#tab-connected-databases table tbody:first tr.empty:first").hide(); 206 | } 207 | else { 208 | $("#tab-connected-databases table tbody:first tr.empty:first").show(); 209 | } 210 | }); 211 | 212 | $("#tab-connected-databases tr.clone:first .dropdown-menu:first").width("230px"); 213 | 214 | $("#tab-connected-databases tr.clone:first .color.dropdown .dropdown-menu a").click(function(e) { 215 | e.preventDefault(); 216 | var $icon = $(this).attr("href").substring(1); 217 | var $hash = $(this).closest("tr").data("hash"); 218 | 219 | $(this).parent().parent().find("a.dropdown-toggle:first").find("img:first").attr("src", "/icons/19x19/icon_normal_" + $icon + "_19x19.png"); 220 | 221 | options.keyRing[$hash].icon = $icon; 222 | localStorage.keyRing = JSON.stringify(options.keyRing); 223 | chrome.extension.sendMessage({ 224 | action: 'load_keyring' 225 | }); 226 | }); 227 | 228 | var $trClone = $("#tab-connected-databases table tr.clone:first").clone(true); 229 | $trClone.removeClass("clone"); 230 | for(var hash in options.keyRing) { 231 | var $tr = $trClone.clone(true); 232 | $tr.data("hash", hash); 233 | $tr.attr("id", "tr-cd-" + hash); 234 | 235 | var $icon = options.keyRing[hash].icon || "blue"; 236 | $("a.dropdown-toggle:first img:first", $tr).attr("src", "/icons/19x19/icon_normal_" + $icon + "_19x19.png"); 237 | 238 | $tr.children("td:first").text(options.keyRing[hash].id); 239 | var lastUsed = (options.keyRing[hash].lastUsed) ? new Date(options.keyRing[hash].lastUsed).toLocaleString() : "unknown"; 240 | $tr.children("td:eq(2)").text(lastUsed); 241 | var date = (options.keyRing[hash].created) ? new Date(options.keyRing[hash].created).toLocaleDateString() : "unknown"; 242 | $tr.children("td:eq(3)").text(date); 243 | $("#tab-connected-databases table tbody:first").append($tr); 244 | } 245 | 246 | if($("#tab-connected-databases table tbody:first tr").length > 2) { 247 | $("#tab-connected-databases table tbody:first tr.empty:first").hide(); 248 | } 249 | else { 250 | $("#tab-connected-databases table tbody:first tr.empty:first").show(); 251 | } 252 | $("#connect-button").click(function() { 253 | chrome.extension.sendMessage({ 254 | action: "associate" 255 | }); 256 | }); 257 | } 258 | 259 | options.initSpecifiedCredentialFields = function() { 260 | $("#dialogDeleteSpecifiedCredentialFields").modal({keyboard: true, show: false, backdrop: true}); 261 | $("#tab-specified-fields tr.clone:first button.delete:first").click(function(e) { 262 | e.preventDefault(); 263 | $("#dialogDeleteSpecifiedCredentialFields").data("url", $(this).closest("tr").data("url")); 264 | $("#dialogDeleteSpecifiedCredentialFields").data("tr-id", $(this).closest("tr").attr("id")); 265 | $("#dialogDeleteSpecifiedCredentialFields .modal-body:first strong:first").text($(this).closest("tr").children("td:first").text()); 266 | $("#dialogDeleteSpecifiedCredentialFields").modal("show"); 267 | }); 268 | 269 | $("#dialogDeleteSpecifiedCredentialFields .modal-footer:first button.yes:first").click(function(e) { 270 | $("#dialogDeleteSpecifiedCredentialFields").modal("hide"); 271 | 272 | var $url = $("#dialogDeleteSpecifiedCredentialFields").data("url"); 273 | var $trId = $("#dialogDeleteSpecifiedCredentialFields").data("tr-id"); 274 | $("#tab-specified-fields #" + $trId).remove(); 275 | 276 | delete options.settings["defined-credential-fields"][$url]; 277 | localStorage.settings = JSON.stringify(options.settings); 278 | 279 | chrome.extension.sendMessage({ 280 | action: 'load_settings' 281 | }); 282 | 283 | if($("#tab-specified-fields table tbody:first tr").length > 2) { 284 | $("#tab-specified-fields table tbody:first tr.empty:first").hide(); 285 | } 286 | else { 287 | $("#tab-specified-fields table tbody:first tr.empty:first").show(); 288 | } 289 | }); 290 | 291 | var $trClone = $("#tab-specified-fields table tr.clone:first").clone(true); 292 | $trClone.removeClass("clone"); 293 | var counter = 1; 294 | for(var url in options.settings["defined-credential-fields"]) { 295 | var $tr = $trClone.clone(true); 296 | $tr.data("url", url); 297 | $tr.attr("id", "tr-scf" + counter); 298 | counter += 1; 299 | 300 | $tr.children("td:first").text(url); 301 | $("#tab-specified-fields table tbody:first").append($tr); 302 | } 303 | 304 | if($("#tab-specified-fields table tbody:first tr").length > 2) { 305 | $("#tab-specified-fields table tbody:first tr.empty:first").hide(); 306 | } 307 | else { 308 | $("#tab-specified-fields table tbody:first tr.empty:first").show(); 309 | } 310 | } 311 | 312 | options.initAbout = function() { 313 | $("#tab-about em.versionCIP").text(chrome.app.getDetails().version); 314 | } 315 | -------------------------------------------------------------------------------- /chromeipass/popups/popup.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: sans-serif; 3 | min-width:357px; 4 | overflow-x:hidden; 5 | background: #eee; 6 | font-size: 15px; 7 | } 8 | .credentials ul { 9 | margin-left: 0; 10 | margin-right: 0; 11 | padding-left: 0; 12 | padding-right: 0; 13 | list-style-position: inside; 14 | } 15 | .credentials li { 16 | list-style: none; 17 | padding-top: 1px; 18 | padding-bottom: 1px; 19 | padding-left: 10px; 20 | padding-right: 5px; 21 | margin-left: 10px; 22 | margin-right: 5px; 23 | } 24 | .credentials a { 25 | cursor: pointer; 26 | display: block; 27 | color: #336; 28 | } 29 | .credentials li:hover { 30 | cursor: pointer; 31 | background: #ccc; 32 | } 33 | 34 | .settings { 35 | padding-bottom: 10px; 36 | margin-bottom: 10px; 37 | border-bottom: 1px solid #333; 38 | font-size: 90%; 39 | } 40 | .settings label { 41 | display: block; 42 | } 43 | .settings label input { 44 | vertical-align: middle; 45 | } 46 | .settings .description { 47 | margin-top: 3px; 48 | font-size: 80%; 49 | color: #787878; 50 | } 51 | .small { 52 | margin-top: 3px; 53 | margin-left: 12px; 54 | font-size: 80%; 55 | color: #787878; 56 | } 57 | #update-available { 58 | display: none; 59 | font-size: 90%; 60 | color: #cc0000; 61 | font-weight: bold; 62 | border-top: 1px solid #333; 63 | padding-top: 10px; 64 | margin-top: 10px; 65 | } 66 | #update-available a:link, 67 | #update-available a:visited { 68 | text-decoration: underline; 69 | color: #cc0000; 70 | } 71 | #update-available a:hover, 72 | #update-available a:active { 73 | text-decoration: none; 74 | } -------------------------------------------------------------------------------- /chromeipass/popups/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | KeePass - Popup 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
16 | You use an old version of KeePassHttp. 17 |
18 | Please download the latest version from GitHub. 19 |
20 |
21 | 22 |
23 |

Checking status...

24 |
25 | 26 | 35 | 36 | 48 | 49 | 56 | 57 | 67 | 68 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /chromeipass/popups/popup.js: -------------------------------------------------------------------------------- 1 | function status_response(r) { 2 | $('#initial-state').hide(); 3 | $('#error-encountered').hide(); 4 | $('#need-reconfigure').hide(); 5 | $('#not-configured').hide(); 6 | $('#configured-and-associated').hide(); 7 | $('#configured-not-associated').hide(); 8 | 9 | 10 | if(!r.keePassHttpAvailable || r.databaseClosed) { 11 | $('#error-message').html(r.error); 12 | $('#error-encountered').show(); 13 | } 14 | else if(!r.configured) { 15 | $('#not-configured').show(); 16 | } 17 | else if(r.encryptionKeyUnrecognized) { 18 | $('#need-reconfigure').show(); 19 | $('#need-reconfigure-message').html(r.error); 20 | } 21 | else if(!r.associated) { 22 | //$('#configured-not-associated').show(); 23 | //$('#unassociated-identifier').html(r.identifier); 24 | $('#need-reconfigure').show(); 25 | $('#need-reconfigure-message').html(r.error); 26 | } 27 | else if(typeof(r.error) != "undefined") { 28 | $('#error-encountered').show(); 29 | $('#error-message').html(r.error); 30 | } 31 | else { 32 | $('#configured-and-associated').show(); 33 | $('#associated-identifier').html(r.identifier); 34 | } 35 | } 36 | 37 | $(function() { 38 | $("#connect-button").click(function() { 39 | chrome.extension.sendMessage({ 40 | action: "associate" 41 | }); 42 | close(); 43 | }); 44 | 45 | $("#reconnect-button").click(function() { 46 | chrome.extension.sendMessage({ 47 | action: "associate" 48 | }); 49 | close(); 50 | }); 51 | 52 | $("#reload-status-button").click(function() { 53 | chrome.extension.sendMessage({ 54 | action: "get_status" 55 | }, status_response); 56 | }); 57 | 58 | $("#redetect-fields-button").click(function() { 59 | chrome.tabs.query({"active": true, "windowId": chrome.windows.WINDOW_ID_CURRENT}, function(tabs) { 60 | if (tabs.length === 0) 61 | return; // For example: only the background devtools or a popup are opened 62 | var tab = tabs[0]; 63 | 64 | chrome.tabs.sendMessage(tab.id, { 65 | action: "redetect_fields" 66 | }); 67 | }); 68 | }); 69 | 70 | chrome.extension.sendMessage({ 71 | action: "get_status" 72 | }, status_response); 73 | }); -------------------------------------------------------------------------------- /chromeipass/popups/popup_functions.js: -------------------------------------------------------------------------------- 1 | var $ = cIPJQ.noConflict(true); 2 | var _settings = typeof(localStorage.settings)=='undefined' ? {} : JSON.parse(localStorage.settings); 3 | //var global = chrome.extension.getBackgroundPage(); 4 | 5 | function updateAvailableResponse(available) { 6 | if(available) { 7 | $("#update-available").show(); 8 | } 9 | else { 10 | $("#update-available").hide(); 11 | } 12 | } 13 | 14 | function initSettings() { 15 | $("#settings #btn-options").click(function() { 16 | close(); 17 | chrome.tabs.create({ 18 | url: "../options/options.html" 19 | }) 20 | }); 21 | 22 | $("#settings #btn-choose-credential-fields").click(function() { 23 | var global = chrome.extension.getBackgroundPage(); 24 | chrome.tabs.sendMessage(global.page.currentTabId, { 25 | action: "choose_credential_fields" 26 | }); 27 | close(); 28 | }); 29 | } 30 | 31 | 32 | $(function() { 33 | initSettings(); 34 | 35 | chrome.extension.sendMessage({ 36 | action: "update_available_keepasshttp" 37 | }, updateAvailableResponse); 38 | }); 39 | -------------------------------------------------------------------------------- /chromeipass/popups/popup_httpauth.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | KeePass - Popup 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
16 | You use an old version of KeePassHttp. 17 |
18 | Please download the latest version from GitHub. 19 |
20 |
21 | 22 |
23 |

24 | Select the login information you would like to get logged in with: 25 |

26 |
    27 |
    28 | 29 | 30 | -------------------------------------------------------------------------------- /chromeipass/popups/popup_httpauth.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | var global = chrome.extension.getBackgroundPage(); 3 | 4 | chrome.tabs.getSelected(null, function(tab) { 5 | //var data = global.tab_httpauth_list["tab" + tab.id]; 6 | var data = global.page.tabs[tab.id].loginList; 7 | var ul = document.getElementById("login-list"); 8 | for (var i = 0; i < data.logins.length; i++) { 9 | var li = document.createElement("li"); 10 | var a = document.createElement("a"); 11 | a.textContent = data.logins[i].Login + " (" + data.logins[i].Name + ")"; 12 | li.appendChild(a); 13 | $(a).data("url", data.url.replace(/:\/\//g, "://" + data.logins[i].Login + ":" + data.logins[i].Password + "@")); 14 | $(a).click(function() { 15 | chrome.tabs.update(tab.id, {"url": $(this).data("url")}); 16 | close(); 17 | }); 18 | ul.appendChild(li); 19 | } 20 | }); 21 | }); -------------------------------------------------------------------------------- /chromeipass/popups/popup_login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | KeePass - Popup 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
    12 | 13 | 14 | 15 |
    16 | You use an old version of KeePassHttp. 17 |
    18 | Please download the latest version from GitHub. 19 |
    20 |
    21 | 22 |
    23 |

    24 | Select the login information you would like to get entered into the page: 25 |

    26 |
      27 |
      28 | 29 | 30 | -------------------------------------------------------------------------------- /chromeipass/popups/popup_login.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | var global = chrome.extension.getBackgroundPage(); 3 | 4 | chrome.tabs.query({"active": true, "windowId": chrome.windows.WINDOW_ID_CURRENT}, function(tabs) { 5 | if (tabs.length === 0) 6 | return; // For example: only the background devtools or a popup are opened 7 | var tab = tabs[0]; 8 | 9 | var logins = global.page.tabs[tab.id].loginList; 10 | var ul = document.getElementById("login-list"); 11 | for (var i = 0; i < logins.length; i++) { 12 | var li = document.createElement("li"); 13 | var a = document.createElement("a"); 14 | a.textContent = logins[i]; 15 | li.appendChild(a); 16 | a.setAttribute("id", "" + i); 17 | a.addEventListener('click', function(e) { 18 | var id = e.target.id; 19 | chrome.tabs.sendMessage(tab.id, { 20 | action: 'fill_user_pass_with_specific_login', 21 | id: id 22 | }); 23 | close(); 24 | }); 25 | ul.appendChild(li); 26 | } 27 | }); 28 | }); -------------------------------------------------------------------------------- /chromeipass/popups/popup_multiple-fields.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | KeePass - Popup 4 | 5 | 6 | 7 | 8 | 9 | 10 |
      11 | 12 | 13 | 14 |
      15 | You use an old version of KeePassHttp. 16 |
      17 | Please download the latest version from GitHub. 18 |
      19 |
      20 | 21 |
      22 |

      23 | chromeIPass found more than one password field on this page. To enter your 24 | logins, right-click on one of the password fields, and choose either the 25 | "Fill User + Pass" or "Fill Pass Only" command. 26 |

      27 |
      28 | 29 | 30 | -------------------------------------------------------------------------------- /chromeipass/popups/popup_remember.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | KeePass - Popup 4 | 5 | 6 | 7 | 8 | 9 | 17 | 18 | 19 |
      20 |

      21 | Username or password changed! Save it? 22 |
      23 | Url: 24 |
      25 | Username: 26 |

      27 |

      28 | 29 | 30 | 31 |

      32 |
      33 | 34 |
      35 |

      Credentials will be saved in connected database with identifier .

      36 |
      37 | 38 |
      39 |

      The used username is currently not saved!

      40 |

      The credentials with the used username are marked bold.

      41 |

      42 | Please choose the credentials you want to update: 43 |

      44 |
        45 |
        46 | 47 | 48 | -------------------------------------------------------------------------------- /chromeipass/popups/popup_remember.js: -------------------------------------------------------------------------------- 1 | var _tab; 2 | 3 | function _initialize(tab) { 4 | _tab = tab; 5 | 6 | // no credentials set or credentials already cleared 7 | if(!_tab.credentials.username) { 8 | _close(); 9 | return; 10 | } 11 | 12 | // no existing credentials to update --> disable update-button 13 | if(_tab.credentials.list.length == 0) { 14 | $("#btn-update").attr("disabled", true).removeClass("b2c-btn-warning"); 15 | } 16 | 17 | var url = _tab.credentials.url; 18 | url = (url.length > 50) ? url.substring(0, 50) + "..." : url; 19 | $(".information-url:first span:first").text(url); 20 | $(".information-username:first span:first").text(_tab.credentials.username); 21 | 22 | $("#btn-new").click(function(e) { 23 | chrome.extension.sendMessage({ 24 | action: 'add_credentials', 25 | args: [_tab.credentials.username, _tab.credentials.password, _tab.credentials.url] 26 | }, _verifyResult); 27 | }); 28 | 29 | $("#btn-update").click(function(e) { 30 | e.preventDefault(); 31 | 32 | // only one entry which could be updated 33 | if(_tab.credentials.list.length == 1) { 34 | chrome.extension.sendMessage({ 35 | action: 'update_credentials', 36 | args: [_tab.credentials.list[0].Uuid, _tab.credentials.username, _tab.credentials.password, _tab.credentials.url] 37 | }, _verifyResult); 38 | } 39 | else { 40 | $(".credentials:first .username-new:first strong:first").text(_tab.credentials.username); 41 | $(".credentials:first .username-exists:first strong:first").text(_tab.credentials.username); 42 | 43 | if(_tab.credentials.usernameExists) { 44 | $(".credentials:first .username-new:first").hide(); 45 | $(".credentials:first .username-exists:first").show(); 46 | } 47 | else { 48 | $(".credentials:first .username-new:first").show(); 49 | $(".credentials:first .username-exists:first").hide(); 50 | } 51 | 52 | for(var i = 0; i < _tab.credentials.list.length; i++) { 53 | var $a = $("") 54 | .attr("href", "#") 55 | .text(_tab.credentials.list[i].Login + " (" + _tab.credentials.list[i].Name + ")") 56 | .data("entryId", i) 57 | .click(function(e) { 58 | e.preventDefault(); 59 | chrome.extension.sendMessage({ 60 | action: 'update_credentials', 61 | args: [_tab.credentials.list[$(this).data("entryId")].Uuid, _tab.credentials.username, _tab.credentials.password, _tab.credentials.url] 62 | }, _verifyResult); 63 | }); 64 | 65 | if(_tab.credentials.usernameExists && _tab.credentials.username == _tab.credentials.list[i].Login) { 66 | $a.css("font-weight", "bold"); 67 | } 68 | 69 | var $li = $("
      • ").append($a); 70 | $("ul#list").append($li); 71 | } 72 | 73 | $(".credentials").show(); 74 | } 75 | }); 76 | 77 | $("#btn-dismiss").click(function(e) { 78 | e.preventDefault(); 79 | _close(); 80 | }); 81 | } 82 | 83 | function _connected_database(db) { 84 | if(db.count > 1 && db.identifier) { 85 | $(".connected-database:first em:first").text(db.identifier); 86 | $(".connected-database:first").show(); 87 | } 88 | else { 89 | $(".connected-database:first").hide(); 90 | } 91 | } 92 | 93 | function _verifyResult(code) { 94 | if(code == "success") { 95 | _close(); 96 | } 97 | } 98 | 99 | function _close() { 100 | chrome.extension.sendMessage({ 101 | action: 'remove_credentials_from_tab_information' 102 | }); 103 | 104 | chrome.extension.sendMessage({ 105 | action: 'pop_stack' 106 | }); 107 | 108 | close(); 109 | } 110 | 111 | $(function() { 112 | chrome.extension.sendMessage({ 113 | action: 'stack_add', 114 | args: ["icon_remember_red_background_19x19.png", "popup_remember.html", 10, true, 0] 115 | }); 116 | 117 | chrome.extension.sendMessage({ 118 | action: 'get_tab_information' 119 | }, _initialize); 120 | 121 | chrome.extension.sendMessage({ 122 | action: 'get_connected_database' 123 | }, _connected_database); 124 | }); -------------------------------------------------------------------------------- /chromeipass/popups/throbber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/chromeipass/popups/throbber.gif -------------------------------------------------------------------------------- /documentation/PassIFox.md: -------------------------------------------------------------------------------- 1 | # PassIFox 2 | 3 | PassIFox extension for Firefox4+ 4 | 5 | Implements a transparent replacement for the built-in Firefox password storage 6 | 7 | This extension is for use with [KeePassHttp](https://github.com/pfn/keepasshttp) 8 | 9 | The XPI can be installed using the link: https://passifox.appspot.com/passifox.xpi 10 | 11 | ### Requirements 12 | - [KeePassXC](https://keepassxc.org/) v2.1.1 or higher 13 | 14 | OR 15 | - [KeePass](http://keepass.info/) 16 | - [KeePassHttp](https://github.com/pfn/keepasshttp/) 17 | 18 | ### Installation 19 | 20 | [Download PassIFox](https://passifox.appspot.com/passifox.xpi) and drag-n-drop it into your Firefox. The installation process should start. 21 | 22 | ### Configuration 23 | 24 | There is no explicit configuration necessary. Only `Remember passwords for 25 | sites` in Firefox under Preferences > Security has to be enabled. PassIFox 26 | and KeePassHttp will communicate with each other on http://localhost:19455/ 27 | 28 | When a login form is discovered for the first time, PassIFox will 29 | initialize itself and request an "Association" with KeePass (KeePassHttp). 30 | Alternatively, for forms that do not fill automatically, a context menu 31 | item on text and password fields allow manually filling in a login. 32 | 33 | Once that is completed, Firefox can freely retrieve passwords from 34 | KeePass. KeePass must be running and unlocked in order for passwords 35 | to be available. 36 | 37 | Entries in KeePass can be stored as http://host.name/ or just host.name 38 | without any extra fluff. KeePassHttp will do the work to figure out what 39 | you want. There are some permissions things where KeePassHttp will 40 | notify you when passwords are requested and the hostnames do not exactly 41 | match. When those prompts occur, you can accept, deny and remember your 42 | choice. 43 | 44 | For example, take the URL "http://www.google.com/" the entry in KeePass 45 | can be named http://www.google.com, www.google.com, or google.com 46 | Any will match a request for passwords, but if the entry is named 47 | google.com, and a request for comes from http://www.google.com you 48 | will be prompted to approve the request, and if you like, you can choose 49 | to remember the selection so that you are not prompted again. 50 | 51 | NOTE: Keep in mind, the field in which you put the names is the 'Title' 52 | field, and not 'URL'. Use 'URL' to store a shortcut link that will take 53 | you to your site. Use the 'Title' field to match sites for logins. -------------------------------------------------------------------------------- /documentation/chromeIPass - old readme from web store.txt: -------------------------------------------------------------------------------- 1 | KeePass integration for browser Chrome using KeePassHttp 2 | 3 | NEW UPDATE, Version 2.2.1, brings many requested features to ChromeIPass. 4 | 5 | ChromeIPass brings KeePass integration to the Google Chrome browser! 6 | 7 | For users of KeePass 2.17 and newer, please make sure to use KeePassHttp 1.0.4.0 or newer; previous versions will not work. For users of KeePass 2.16 and older, be sure to use KeePassHttp 1.0.3.9 and lower. It is strongly recommended that you use the latest versions of KeePassHttp and KeePass. 8 | 9 | Changes: 10 | 2.3.4: Lukas Schulze: fix "checking status" bug 11 | 2.3.3: Lukas Schulze: added permissions for update-function for KeePassHttp; added keyboard support for context-menu; fixed escaping identifiers; fixed detection of field combinations when pressing Ctrl+Shift+U; redesigned dialog of password-generator 12 | 2.3.1: Lukas Schulze: added password-generator (only works with the latest version of KeePassHttp, disabled for older versions); changed the way of identifying and accessing credential fields (no longer uses only the ID of an field, because several sites don't use unique IDs); improved feature choose-own-credential-fields 13 | 2.2.3: Lukas Schulze: fix jQuery css styling issues (chromeipass no longer override web-site appearance). Fix jquery date pickers. 14 | 2.2.1: Update to webstore manifest version2. Completely re-worked for the updated Chrome extension APIs, supports updating and saving new KeePass entries, supports HTTP authentication (Basic and Digest auth). Many more new features. All new enhancements are courtesy of Lukas Schulze, thank you! 15 | 1.0.7: fix forms that use HTML5's type="email" for username (e.g. amazon) 16 | 1.0.4: minor bugfix in getFields, filter user fields to only be text 17 | 1.0.6: utf8 support for login and password fields, thanks DeniSix 18 | 19 | Support: 20 | * Please post any questions or support issues at the github messenger/tracker (the "Developer Website" link to the right) 21 | 22 | Features: 23 | * Secure integration with KeePass using the KeePassHttp plugin (https://github.com/pfn/keepasshttp/ download from https://passifox.appspot.com/KeePassHttp.plgx) 24 | * Automated password form fill 25 | * Support for multiple logins at a single site (intuitive pageAction-based workflow) 26 | * Context menu entries for manually selecting username and password fields to fill 27 | * Notifications are always displayed whenever passwords are retrieved from KeePass, in some instances it is even possible to deny and allow access. (When the host names do not match exactly, user interaction is required to allow access; the decision can be remembered). 28 | * Open source, available for inspection at https://github.com/pfn/passifox 29 | * Also supported on Firefox4: use the same KeePass database for Google Chrome and Firefox 30 | 31 | Future features and enhancements: 32 | * Automatic password generation and entry creation 33 | 34 | Requirements: 35 | * KeePass 2 (http://keepass.info) version 2.17 or newer 36 | * KeePassHttp (https://github.com/pfn/keepasshttp/ download at https://passifox.appspot.com/KeePassHttp.plgx) 37 | 38 | Directions: 39 | 1) Install KeePass 40 | 2) Install KeePassHttp by dropping KeePassHttp.plgx into the KeePass Program Files directory 41 | 2a) Log into KeePass 42 | 2b) Verify KeePassHttp has been installed correctly by checking Tools > Plugins 43 | 3) Navigate to any page containing a password 44 | 4) Click the KeePass icon in the URL bar and click the "Connect" button 45 | 5) Switch to the KeePass window and enter a descriptive name for your "Chrome Browser" into the dialog that popped up and click save. 46 | 6) Your passwords are now securely retrieved from KeePass and automatically entered into password forms and fields when needed. 47 | 7) Passwords in KeePass should be entered with the "Title" containing the domain or host name for the site in question; KeePassHttp does some basic pattern matching, for example "google.com" would match http://login.google.com/ if there were such a thing. (KeePassHttp 1.0.2.0 now searches the "URL" field in the same way) 48 | 8) If you are ever lost, click on the KeePass icon in the URL bar and it will let you know status as well as any available options. 49 | 50 | Linux and Mac users: 51 | If you are using KeePass with Mono, then you're in luck. I have tested KeePassHttp with Mono 2.6.7 and it appears to work well. I cannot get the plgx file to work on Linux, perhaps you may have more luck, but I can get my dll files to work directly when put into the KeePass directory (possibly the Plugin directory as well, I have not tried). You can get KeePassHttp.dll and Newtonsoft.Json.dll from https://github.com/pfn/keepasshttp/tree/master/KeePassHttp 52 | 53 | Windows users: 54 | If the PLGX file does not work, it is possible to use the DLL files as mentioned above for Linux and Mac users. The above DLLs are universal binaries and work cross-platform. 55 | 56 | It is recommended to disable the builtin Chrome password management when using this extension. -------------------------------------------------------------------------------- /documentation/chromeIPass-changelog: -------------------------------------------------------------------------------- 1 | 2.3.4: Lukas Schulze: fix "checking status" bug 2 | 2.3.3: Lukas Schulze: added permissions for update-function for KeePassHttp; added keyboard support for context-menu; fixed escaping identifiers; fixed detection of field combinations when pressing Ctrl+Shift+U; redesigned dialog of password-generator 3 | 2.3.1: Lukas Schulze: added password-generator (only works with the latest version of KeePassHttp, disabled for older versions); changed the way of identifying and accessing credential fields (no longer uses only the ID of an field, because several sites don't use unique IDs); improved feature choose-own-credential-fields 4 | 2.2.3: Lukas Schulze: fix jQuery css styling issues (chromeipass no longer override web-site appearance). Fix jquery date pickers. 5 | 2.2.1: Update to webstore manifest version2. Completely re-worked for the updated Chrome extension APIs, supports updating and saving new KeePass entries, supports HTTP authentication (Basic and Digest auth). Many more new features. All new enhancements are courtesy of Lukas Schulze, thank you! 6 | 1.0.7: fix forms that use HTML5's type="email" for username (e.g. amazon) 7 | 1.0.4: minor bugfix in getFields, filter user fields to only be text 8 | 1.0.6: utf8 support for login and password fields, thanks DeniSix -------------------------------------------------------------------------------- /documentation/images/cip-autocomplete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-autocomplete.png -------------------------------------------------------------------------------- /documentation/images/cip-browser-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-browser-icon.png -------------------------------------------------------------------------------- /documentation/images/cip-choose-credential-fields.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-choose-credential-fields.png -------------------------------------------------------------------------------- /documentation/images/cip-console-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-console-background.png -------------------------------------------------------------------------------- /documentation/images/cip-console-inline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-console-inline.png -------------------------------------------------------------------------------- /documentation/images/cip-context-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-context-menu.png -------------------------------------------------------------------------------- /documentation/images/cip-extensions-developer-mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-extensions-developer-mode.png -------------------------------------------------------------------------------- /documentation/images/cip-extensions-normal-mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-extensions-normal-mode.png -------------------------------------------------------------------------------- /documentation/images/cip-password-generator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-password-generator.png -------------------------------------------------------------------------------- /documentation/images/cip-popup-choose-credentials.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-popup-choose-credentials.png -------------------------------------------------------------------------------- /documentation/images/cip-popup-connect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-popup-connect.png -------------------------------------------------------------------------------- /documentation/images/cip-popup-normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-popup-normal.png -------------------------------------------------------------------------------- /documentation/images/cip-popup-remember-update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-popup-remember-update.png -------------------------------------------------------------------------------- /documentation/images/cip-popup-remember.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-popup-remember.png -------------------------------------------------------------------------------- /documentation/images/cip-settings-connected-databases.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-settings-connected-databases.png -------------------------------------------------------------------------------- /documentation/images/cip-settings-general.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-settings-general.png -------------------------------------------------------------------------------- /documentation/images/cip-settings-specified-credential-fields.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-settings-specified-credential-fields.png -------------------------------------------------------------------------------- /documentation/images/cip-store-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/cip-store-screenshot.png -------------------------------------------------------------------------------- /documentation/images/http-auth-request.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/http-auth-request.png -------------------------------------------------------------------------------- /documentation/images/keepass-association-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/keepass-association-key.png -------------------------------------------------------------------------------- /documentation/images/keepass-password-generation-options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/keepass-password-generation-options.png -------------------------------------------------------------------------------- /documentation/images/psd/cip-autocomplete.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-autocomplete.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-browser-icon.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-browser-icon.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-choose-credential-fields.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-choose-credential-fields.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-console-background.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-console-background.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-console-inline.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-console-inline.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-context-menu.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-context-menu.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-extensions-developer-mode.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-extensions-developer-mode.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-extensions-normal-mode.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-extensions-normal-mode.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-password-generator.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-password-generator.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-popup-choose-credentials.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-popup-choose-credentials.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-popup-connect.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-popup-connect.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-popup-normal.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-popup-normal.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-popup-remember-update.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-popup-remember-update.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-popup-remember.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-popup-remember.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-settings-connected-databases.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-settings-connected-databases.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-settings-general.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-settings-general.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-settings-specified-credential-fields.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-settings-specified-credential-fields.psd -------------------------------------------------------------------------------- /documentation/images/psd/cip-store-screenshot.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/cip-store-screenshot.psd -------------------------------------------------------------------------------- /documentation/images/psd/http-auth-request.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/http-auth-request.psd -------------------------------------------------------------------------------- /documentation/images/psd/keepass-association-key.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/keepass-association-key.psd -------------------------------------------------------------------------------- /documentation/images/psd/keepass-password-generation-options.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/documentation/images/psd/keepass-password-generation-options.psd -------------------------------------------------------------------------------- /passifox.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/passifox.xpi -------------------------------------------------------------------------------- /passifox/chrome.manifest: -------------------------------------------------------------------------------- 1 | content passifox chrome/content/ 2 | skin passifox classic/1.0 chrome/skin/default/ 3 | resource passifox ./ 4 | 5 | overlay chrome://browser/content/browser.xul chrome://passifox/content/passifox.xul 6 | contract @hanhuy.com/login-manager-storage;1 {fa199659-10c4-4e3a-a73b-e2b4e1deae96} 7 | component {fa199659-10c4-4e3a-a73b-e2b4e1deae96} components/loginmanagerstorage.js 8 | category login-manager-storage nsILoginManagerStorage @hanhuy.com/login-manager-storage;1 9 | -------------------------------------------------------------------------------- /passifox/chrome/content/passifox.xul: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 132 | 133 | -------------------------------------------------------------------------------- /passifox/chrome/skin/default/keepass-big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/passifox/chrome/skin/default/keepass-big.png -------------------------------------------------------------------------------- /passifox/chrome/skin/default/keepass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pfn/passifox/e2dc0537eb97ad005698da3eeddecced8c087f2d/passifox/chrome/skin/default/keepass.png -------------------------------------------------------------------------------- /passifox/components/loginmanagerstorage.js: -------------------------------------------------------------------------------- 1 | const Ci = Components.interfaces; 2 | const Cu = Components.utils; 3 | const Cc = Components.classes; 4 | 5 | Cu.import("resource://gre/modules/XPCOMUtils.jsm"); 6 | Cu.import("resource://gre/modules/Services.jsm"); 7 | Cu.import("resource://passifox/modules/KeePassFox.jsm"); 8 | 9 | function LoginManagerStorage() { 10 | this.wrappedJSObject = this; 11 | XPCOMUtils.defineLazyGetter(this, "_kpf", function() new KeePassFox()); 12 | XPCOMUtils.defineLazyGetter(this, "_loginSavingDB", function() { 13 | let f = Services.dirsvc.get("ProfD", Ci.nsIFile); 14 | f.append("passifox-ignore-hosts.sqlite"); 15 | let ss = Cc["@mozilla.org/storage/service;1"] 16 | .getService(Ci.mozIStorageService); 17 | let c = ss.openDatabase(f); 18 | if (!c.tableExists("hosts")) { 19 | c.beginTransaction(); 20 | c.executeSimpleSQL("CREATE TABLE hosts (name varchar)"); 21 | c.executeSimpleSQL("CREATE UNIQUE INDEX hostname ON hosts (name)"); 22 | c.commitTransaction(); 23 | } 24 | return c; 25 | }); 26 | function makeSt(s) function() this._loginSavingDB.createStatement(s); 27 | XPCOMUtils.defineLazyGetter(this, "_getAllLoginSavingSt", 28 | makeSt("SELECT name FROM hosts")); 29 | XPCOMUtils.defineLazyGetter(this, "_insLoginSavingSt", 30 | makeSt("INSERT INTO hosts VALUES (:name)")); 31 | XPCOMUtils.defineLazyGetter(this, "_delLoginSavingSt", 32 | makeSt("DELETE FROM hosts WHERE name = :name")); 33 | XPCOMUtils.defineLazyGetter(this, "_getLoginSavingSt", 34 | makeSt("SELECT name FROM hosts WHERE name = :name")); 35 | this.log("Creating storage service"); 36 | } 37 | 38 | LoginManagerStorage.prototype = { 39 | classDescription: "KeePassFox Login Manager Storage", 40 | classID: Components.ID("{fa199659-10c4-4e3a-a73b-e2b4e1deae96}"), 41 | QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports, 42 | Ci.nsILoginManagerStorage]), 43 | _xpcom_factory: { 44 | createInstance: function(outer, iid) { 45 | if (outer != null) 46 | throw Components.results.NS_ERROR_NO_AGGREGATION; 47 | if (!LoginManagerStorage.instance) 48 | LoginManagerStorage.instance = new LoginManagerStorage(); 49 | return LoginManagerStorage.instance.QueryInterface(iid); 50 | }, 51 | }, 52 | uiBusy: false, // XXX seems to be needed in <=ff4.0b7 53 | log: function(m) { 54 | if (!this._kpf._debug) 55 | return; 56 | Services.console.logStringMessage("LoginManagerStorage: " + m); 57 | }, 58 | stub: function(arguments) { 59 | if (!this._kpf._debug) 60 | return; 61 | let args = []; 62 | for (let i = 0; i < arguments.length; i++) { 63 | let arg = arguments[i]; 64 | if (typeof(arg) == "object") 65 | arg = JSON.stringify(arg); 66 | args.push(arg); 67 | } 68 | this.log(arguments.callee.name + "(" + args.join(",") + ")"); 69 | }, 70 | 71 | init: function _init() { }, // don't need to init 72 | initialize: function _init() { }, // don't need to init 73 | // ignored, no implementation 74 | initWithFile: function _initWithFile(inFile, outFile) { }, 75 | 76 | addLogin: function addLogin(login) { 77 | this.stub(arguments); 78 | let r = { 79 | url: login.hostname, 80 | submiturl: login.formSubmitURL, 81 | username: login.username, 82 | password: login.password 83 | }; 84 | if (login.httpRealm) 85 | r.realm = login.httpRealm; 86 | 87 | login.QueryInterface(Ci.nsILoginMetaInfo); 88 | if (login.guid) 89 | r.uuid = login.guid; 90 | 91 | this._kpf.set_login(r); 92 | this._sendNotification("addLogin", login); 93 | }, 94 | // not implemented--removals should be managed in KeePass 95 | removeLogin: function _removeLogin(login) { 96 | //this._sendNotification("removeLogin", login); 97 | }, 98 | 99 | modifyLogin: function modifyLogin(oldLogin, newLoginData) { 100 | let newLogin; 101 | let needsUpdate = false; 102 | newLogin = oldLogin.clone().QueryInterface(Ci.nsILoginMetaInfo); 103 | if (newLoginData instanceof Ci.nsILoginInfo) { 104 | newLogin.init(newLoginData.hostname, 105 | newLoginData.formSubmitURL, newLoginData.httpRealm, 106 | newLoginData.username, newLoginData.password, 107 | newLoginData.usernameField, newLoginData.passwordField); 108 | newLogin.QueryInterface(Ci.nsILoginMetaInfo); 109 | 110 | if (newLogin.username != oldLogin.username) { 111 | this.log("Updating username"); 112 | needsUpdate = true; 113 | } 114 | if (newLogin.password != oldLogin.password) { 115 | this.log("Updating password"); 116 | needsUpdate = true; 117 | } 118 | } else if (newLoginData instanceof Ci.nsIPropertyBag) { 119 | let propEnum = newLoginData.enumerator; 120 | while (propEnum.hasMoreElements()) { 121 | let prop = propEnum.getNext().QueryInterface(Ci.nsIProperty); 122 | switch (prop.name) { 123 | // nsILoginInfo properties... 124 | // 125 | // only care about these 4 for updating 126 | case "hostname": 127 | case "username": 128 | case "password": 129 | case "formSubmitURL": 130 | needsUpdate = true; 131 | this.log("updating field: " + prop.name); 132 | case "usernameField": 133 | case "passwordField": 134 | case "httpRealm": 135 | // nsILoginMetaInfo properties... 136 | case "guid": 137 | case "timeCreated": 138 | case "timeLastUsed": 139 | case "timePasswordChanged": 140 | case "timesUsed": 141 | if (prop.name == "guid") { 142 | this.log("Guid is changing?! Not supported"); 143 | break; 144 | } 145 | newLogin[prop.name] = prop.value; 146 | break; 147 | 148 | // Fake property, allows easy incrementing. 149 | case "timesUsedIncrement": 150 | newLogin.timesUsed += prop.value; 151 | break; 152 | 153 | // Fail if caller requests setting an unknown property. 154 | default: 155 | throw "Unexpected propertybag item: " + prop.name; 156 | } 157 | } 158 | } else { 159 | throw "newLoginData needs an expected interface!"; 160 | } 161 | if (needsUpdate) { 162 | this.addLogin(newLogin); 163 | this._sendNotification("modifyLogin", [oldLogin, newLogin]); 164 | } 165 | }, 166 | getAllLogins: function getAllLogins(outCount) { 167 | this.stub(arguments); 168 | let entries = this._kpf.get_all_logins(); 169 | outCount.value = entries.length; 170 | let logins = []; 171 | for (let i = 0; i < entries.length; i++) { 172 | let l = Cc['@mozilla.org/login-manager/loginInfo;1'] 173 | .createInstance(Ci.nsILoginInfo); 174 | l.init(entries[i].Name, null, null, 175 | entries[i].Login, "Stored in KeePass", "", ""); 176 | l.QueryInterface(Ci.nsILoginMetaInfo); 177 | l.guid = entries[i].Uuid; 178 | logins.push(l); 179 | } 180 | return logins; 181 | }, 182 | getAllEncryptedLogins: function getAllEncryptedLogins(outCount) { 183 | return this.getAllLogins(outCount); 184 | }, 185 | searchLogins: function searchLogins(count, matchData) { 186 | this.stub(arguments); 187 | var host, form, realm; 188 | 189 | try{ 190 | host = matchData.getProperty("hostname"); 191 | } catch(e){ 192 | host = ''; 193 | } 194 | try{ 195 | form = matchData.getProperty("formSubmitURL"); 196 | } catch(e){ 197 | form = ''; 198 | } 199 | try{ 200 | realm = matchData.getProperty("httpRealm"); 201 | } catch(e){ 202 | realm = null; 203 | } 204 | 205 | return this.findLogins(count, host, form, realm); 206 | }, 207 | 208 | removeAllLogins: function() { }, // never, ever do this 209 | 210 | getAllDisabledHosts: function(count) { 211 | count.value = 0; 212 | let result = []; 213 | 214 | let st = this._getAllLoginSavingSt; 215 | this._doWithLoginSavingDB(st, function() { 216 | while (st.executeStep()) 217 | result.push(st.row['name']); 218 | count.value = result.length; 219 | }); 220 | return result; 221 | }, 222 | getLoginSavingEnabled: function(hostname) { 223 | let st = this._getLoginSavingSt; 224 | st.params['name'] = hostname; 225 | let enabled = true; 226 | this._doWithLoginSavingDB(st, function() { 227 | enabled = !st.executeStep(); 228 | }); 229 | return enabled; 230 | }, 231 | setLoginSavingEnabled: function(hostname, enabled) { 232 | let st = enabled ? this._delLoginSavingSt : this._insLoginSavingSt; 233 | st.params['name'] = hostname; 234 | this._doWithLoginSavingDB(st, function() st.execute()); 235 | }, 236 | _doWithLoginSavingDB: function(st, r) { 237 | let c = this._loginSavingDB; 238 | try { 239 | c.beginTransaction(); 240 | r(); 241 | c.commitTransaction(); 242 | } catch (e) { 243 | c.rollbackTransaction(); 244 | this.log("Error in login saving db: " + e); 245 | Cu.reportError(e); 246 | } finally { 247 | st.reset(); 248 | } 249 | }, 250 | 251 | get isLoggedIn() { return true; }, 252 | findLogins: function findLogins(outCount, hostname, submitURL, realm) { 253 | this.stub(arguments); 254 | 255 | let entries = this._kpf.get_logins(hostname, submitURL, false, realm); 256 | outCount.value = entries.length; 257 | let logins = []; 258 | for (let i = 0; i < entries.length; i++) { 259 | let l = Cc['@mozilla.org/login-manager/loginInfo;1'] 260 | .createInstance(Ci.nsILoginInfo); 261 | l.init(hostname, submitURL, realm, 262 | entries[i].Login, entries[i].Password, "", ""); 263 | l.QueryInterface(Ci.nsILoginMetaInfo); 264 | l.guid = entries[i].Uuid; 265 | logins.push(l); 266 | } 267 | return logins; 268 | }, 269 | // is there anything wrong with always returning a non-zero value? 270 | countLogins: function countLogins(hostname, submitURL, realm) { 271 | this.stub(arguments); 272 | let c = this._kpf.get_logins_count(hostname); 273 | return c; 274 | }, 275 | // copied from storage-mozStorage.js 276 | _sendNotification: function(changeType, data) { 277 | let dataObject = data; 278 | // Can't pass a raw JS string or array though notifyObservers(). :-( 279 | if (data instanceof Array) { 280 | dataObject = Cc["@mozilla.org/array;1"]. 281 | createInstance(Ci.nsIMutableArray); 282 | for (let i = 0; i < data.length; i++) 283 | dataObject.appendElement(data[i], false); 284 | } else if (typeof(data) == "string") { 285 | dataObject = Cc["@mozilla.org/supports-string;1"]. 286 | createInstance(Ci.nsISupportsString); 287 | dataObject.data = data; 288 | } 289 | Services.obs.notifyObservers(dataObject, 290 | "passwordmgr-storage-changed", changeType); 291 | }, 292 | }; 293 | 294 | const NSGetFactory = XPCOMUtils.generateNSGetFactory([LoginManagerStorage]); 295 | 296 | -------------------------------------------------------------------------------- /passifox/defaults/preferences/defaults.js: -------------------------------------------------------------------------------- 1 | // default connection url 2 | pref("extensions.passifox.keepasshttp_url", "http://localhost:19455/"); 3 | // allow enabling and disabling of passifox notifications. 4 | // all enabled by default. 5 | pref("extensions.passifox.notification.kpf-db-note", true); 6 | pref("extensions.passifox.notification.kpf-error-note", true); 7 | pref("extensions.passifox.notification.kpf-running-note", true); 8 | pref("extensions.passifox.notification.kpf-associate-note", true); 9 | // set the default timeout (in seconds) for displaying an notification if enabled 10 | pref("extensions.passifox.notification.timeout", 30); 11 | // eof 12 | -------------------------------------------------------------------------------- /passifox/install.rdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | passifox@hanhuy.com 5 | 1.2.2 6 | 2 7 | 8 | 9 | 10 | 11 | 12 | PassIFox 13 | KeePass(XC) Login Manager Storage and Integration using the KeePassHttp plugin 14 | chrome://passifox/skin/keepass-big.png 15 | Perry Nguyen 16 | https://github.com/pfn/passifox 17 | https://passifox.appspot.com/update.rdf 18 | 19 | 20 | -------------------------------------------------------------------------------- /update.rdf: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 1.2.0 10 | 11 | 12 | {ec8030f7-c20a-464f-9b0e-13a3a9e97384} 13 | 4.0b1 14 | 49.* 15 | https://passifox.appspot.com/passifox.xpi 16 | sha1:6f888d614b7551c8f07b24fee2066650d8815841 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | --------------------------------------------------------------------------------