nextcloud /
passman-webextension
| 1 | $(document).ready(function () { |
||
| 2 | var _this = this; |
||
| 3 | var storage = new API.Storage(); |
||
| 4 | var runtimeSettings = {}; |
||
| 5 | |||
| 6 | API.runtime.sendMessage(API.runtime.id, {'method': 'getRuntimeSettings'}).then(function (settings) { |
||
| 7 | var accounts = settings.accounts; |
||
| 8 | runtimeSettings = settings; |
||
| 9 | for(var i = 0; i < accounts.length; i++) { |
||
| 10 | $('#savepw-vault').append('<option value=' + i + '>' + accounts[i].vault.name + '</option>'); |
||
| 11 | } |
||
| 12 | storage.get('activeTab').then(function (name) { |
||
| 13 | if (name && name !== '') { |
||
| 14 | // makeTabActive(name); |
||
| 15 | API.runtime.sendMessage(API.runtime.id, {method: "getActiveTab", args: {returnFn: "returnActiveTab"}}); |
||
| 16 | } |
||
| 17 | }); |
||
| 18 | |||
| 19 | }); |
||
| 20 | |||
| 21 | $('[t]').each(function () { |
||
| 22 | var string = $(this).attr('t'); |
||
| 23 | var startChar = string[0]; |
||
| 24 | var endChar = string[string.length - 1]; |
||
| 25 | var attribute; |
||
| 26 | if (startChar === '[' && endChar === ']') { |
||
| 27 | var data = string.replace('[', '').replace(']', '').split(','); |
||
| 28 | attribute = data[1].trim(); |
||
| 29 | string = data[0].trim(); |
||
| 30 | } |
||
| 31 | var translated = API.i18n.getMessage(string); |
||
| 32 | if (attribute) { |
||
| 33 | $(this).attr(attribute, translated); |
||
| 34 | } else { |
||
| 35 | $(this).text(translated); |
||
| 36 | } |
||
| 37 | }); |
||
| 38 | |||
| 39 | function fillLogin(login) { |
||
| 40 | API.runtime.sendMessage(API.runtime.id, { |
||
| 41 | method: 'passToParent', |
||
| 42 | args: { |
||
| 43 | injectMethod: 'enterLoginDetails', |
||
| 44 | args: login |
||
| 45 | } |
||
| 46 | }).then(function () { |
||
| 47 | removePasswordPicker(); |
||
| 48 | }); |
||
| 49 | } |
||
| 50 | |||
| 51 | function removePasswordPicker(login) { |
||
|
0 ignored issues
–
show
|
|||
| 52 | API.runtime.sendMessage(API.runtime.id, { |
||
| 53 | method: 'passToParent', |
||
| 54 | args: { |
||
| 55 | injectMethod: 'removePasswordPicker' |
||
| 56 | } |
||
| 57 | }); |
||
| 58 | } |
||
| 59 | |||
| 60 | function copyTextToClipboard(text) { |
||
| 61 | var copyFrom = document.createElement("textarea"); |
||
| 62 | copyFrom.textContent = text; |
||
| 63 | var body = document.getElementsByTagName('body')[0]; |
||
| 64 | body.appendChild(copyFrom); |
||
| 65 | copyFrom.select(); |
||
| 66 | document.execCommand('copy'); |
||
| 67 | body.removeChild(copyFrom); |
||
| 68 | } |
||
| 69 | |||
| 70 | _this.copyTextToClipboard = copyTextToClipboard; |
||
| 71 | |||
| 72 | |||
| 73 | function setupAddCredentialFields() { |
||
| 74 | var labelfield = $('#savepw-label'); |
||
| 75 | labelfield.val(document.title); |
||
| 76 | var userfield = $('#savepw-username'); |
||
| 77 | var pwfield = $('#savepw-password'); |
||
| 78 | var vaultfield = $('#savepw-vault'); |
||
| 79 | $('.togglePw').click(function () { |
||
| 80 | $('.togglePw').find('.fa').toggleClass('fa-eye').toggleClass('fa-eye-slash'); |
||
| 81 | if (pwfield.attr('type') === 'password') { |
||
| 82 | pwfield.attr('type', 'text'); |
||
| 83 | } else { |
||
| 84 | pwfield.attr('type', 'password'); |
||
| 85 | } |
||
| 86 | }); |
||
| 87 | |||
| 88 | $('#savepw-save').click(function (e) { |
||
| 89 | var fields = [labelfield, pwfield]; |
||
| 90 | var hasErrors = false; |
||
| 91 | $.each(fields, function (k, field) { |
||
| 92 | field.removeClass('error'); |
||
| 93 | if(!$(field).val()){ |
||
| 94 | field.addClass('error'); |
||
| 95 | hasErrors = true; |
||
| 96 | } |
||
| 97 | }); |
||
| 98 | e.preventDefault(); |
||
| 99 | if(hasErrors){ |
||
| 100 | return; |
||
| 101 | } |
||
| 102 | $(this).text(API.i18n.getMessage("saving")); |
||
| 103 | $(this).attr('disabled', true); |
||
| 104 | API.runtime.sendMessage(API.runtime.id, { |
||
| 105 | method: "injectCreateCredential", |
||
| 106 | args: { |
||
| 107 | label: labelfield.val(), |
||
| 108 | username: userfield.val(), |
||
| 109 | password: pwfield.val(), |
||
| 110 | vaultIndex: vaultfield.val() |
||
| 111 | } |
||
| 112 | }).then(removePasswordPicker); |
||
| 113 | }); |
||
| 114 | |||
| 115 | $('#savepw-cancel').click(function () { |
||
| 116 | labelfield.val(document.title); |
||
| 117 | userfield.val(''); |
||
| 118 | pwfield.val(''); |
||
| 119 | removePasswordPicker(); |
||
| 120 | }); |
||
| 121 | |||
| 122 | } |
||
| 123 | |||
| 124 | function toggleFieldType(field) { |
||
| 125 | if ($(field).attr('type').toLowerCase() === 'text') { |
||
| 126 | $(field).attr('type', 'password'); |
||
| 127 | } else { |
||
| 128 | $(field).attr('type', 'text'); |
||
| 129 | } |
||
| 130 | } |
||
| 131 | |||
| 132 | function genPwd(settings) { |
||
| 133 | /* jshint ignore:start */ |
||
| 134 | var password = generatePassword(settings['length'], |
||
| 135 | settings.useUppercase, |
||
| 136 | settings.useLowercase, |
||
| 137 | settings.useDigits, |
||
| 138 | settings.useSpecialChars, |
||
| 139 | settings.minimumDigitCount, |
||
| 140 | settings.avoidAmbiguousCharacters, |
||
| 141 | settings.requireEveryCharType); |
||
| 142 | /* jshint ignore:end */ |
||
| 143 | return password; |
||
| 144 | } |
||
| 145 | |||
| 146 | function getPasswordGenerationSettings(cb) { |
||
| 147 | var default_settings = { |
||
| 148 | 'length': 12, |
||
| 149 | 'useUppercase': true, |
||
| 150 | 'useLowercase': true, |
||
| 151 | 'useDigits': true, |
||
| 152 | 'useSpecialChars': true, |
||
| 153 | 'minimumDigitCount': 3, |
||
| 154 | 'avoidAmbiguousCharacters': false, |
||
| 155 | 'requireEveryCharType': true |
||
| 156 | }; |
||
| 157 | storage.get('password_generator_settings').then(function (_settings) { |
||
| 158 | if (!_settings) { |
||
| 159 | _settings = default_settings; |
||
| 160 | } |
||
| 161 | |||
| 162 | cb(_settings); |
||
| 163 | }).error(function () { |
||
| 164 | cb(default_settings); |
||
| 165 | }); |
||
| 166 | } |
||
| 167 | |||
| 168 | function setupPasswordGenerator() { |
||
| 169 | //getPasswordGeneratorSettings |
||
| 170 | getPasswordGenerationSettings(function (settings) { |
||
| 171 | var round = 0; |
||
| 172 | |||
| 173 | function generate_pass(inputId) { |
||
| 174 | var new_password = genPwd(settings); |
||
| 175 | $('#' + inputId).val(new_password); |
||
| 176 | setTimeout(function () { |
||
| 177 | if (round < 10) { |
||
| 178 | generate_pass(inputId); |
||
| 179 | round++; |
||
| 180 | } else { |
||
| 181 | round = 0; |
||
| 182 | } |
||
| 183 | }, 10); |
||
| 184 | } |
||
| 185 | |||
| 186 | $.each(settings, function (setting, val) { |
||
| 187 | if (typeof(val) === "boolean") { |
||
| 188 | $('[name="' + setting + '"]').prop('checked', val); |
||
| 189 | } else { |
||
| 190 | $('[name="' + setting + '"]').val(val); |
||
| 191 | } |
||
| 192 | }); |
||
| 193 | |||
| 194 | $('form[name="advancedSettings"]').change(function () { |
||
| 195 | var pw_settings_form = $(this); |
||
| 196 | settings = pw_settings_form.serializeObject(); |
||
| 197 | storage.set('password_generator_settings', settings); |
||
| 198 | }); |
||
| 199 | |||
| 200 | $('.renewpw').click(function () { |
||
| 201 | generate_pass('generated_password'); |
||
| 202 | }); |
||
| 203 | $('.renewpw_newac').click(function () { |
||
| 204 | generate_pass('savepw-password'); |
||
| 205 | |||
| 206 | }); |
||
| 207 | $('.renewpw').click(); |
||
| 208 | $('.renewpw_newac').click(); |
||
| 209 | |||
| 210 | $('.usepwd').click(function () { |
||
| 211 | $('#savepw-password').val($('#generated_password').val()); |
||
| 212 | $('.tab.add').click(); |
||
| 213 | }); |
||
| 214 | |||
| 215 | $('.togglePwVis').click(function () { |
||
| 216 | toggleFieldType('#generated_password'); |
||
| 217 | $(this).find('.fa').toggleClass('fa-eye-slash').toggleClass('fa-eye'); |
||
| 218 | }); |
||
| 219 | |||
| 220 | $('.adv_opt').click(function () { |
||
| 221 | |||
| 222 | var adv_settings = $('.pw-setting-advanced'); |
||
| 223 | $(this).find('i').toggleClass('fa-angle-right').toggleClass('fa-angle-down'); |
||
| 224 | if (adv_settings.is(':visible')) { |
||
| 225 | adv_settings.slideUp(); |
||
| 226 | } else { |
||
| 227 | adv_settings.slideDown(); |
||
| 228 | } |
||
| 229 | }); |
||
| 230 | }); |
||
| 231 | } |
||
| 232 | |||
| 233 | var picker = $('#password_picker'); |
||
| 234 | var makeTabActive = function (name) { |
||
| 235 | picker.find('.tab').removeClass('active'); |
||
| 236 | picker.find('.tab-content').children().hide(); |
||
| 237 | picker.find('.tab-' + name + '-content').show(); |
||
| 238 | picker.find('.tab.' + name).addClass('active'); |
||
| 239 | }; |
||
| 240 | |||
| 241 | picker.find('.tab').click(function () { |
||
| 242 | var name = $(this).attr('data-name'); |
||
| 243 | storage.set('activeTab', name).then(function (r) { |
||
|
0 ignored issues
–
show
|
|||
| 244 | makeTabActive(name); |
||
| 245 | if(name === 'search'){ |
||
| 246 | $('#password_search').focus(); |
||
| 247 | } |
||
| 248 | }); |
||
| 249 | }); |
||
| 250 | |||
| 251 | |||
| 252 | |||
| 253 | $('.tab.close').click(function () { |
||
| 254 | removePasswordPicker(); |
||
| 255 | }); |
||
| 256 | |||
| 257 | |||
| 258 | function disablePassman(where, url){ |
||
| 259 | var whereFn = (where === 'site') ? 'Site' : 'URL'; |
||
| 260 | API.runtime.sendMessage(API.runtime.id, { |
||
| 261 | method: "ignore"+ whereFn, |
||
| 262 | args: url |
||
| 263 | }).then(function () { |
||
| 264 | var text = (where === 'site') ? 'site_ignored' : 'url_ignored'; |
||
| 265 | $('.tab-ignore-content').find('.text').text(API.i18n.getMessage(text)); |
||
| 266 | setTimeout(function () { |
||
| 267 | removePasswordPicker(); |
||
| 268 | }, 2500); |
||
| 269 | }); |
||
| 270 | } |
||
| 271 | |||
| 272 | |||
| 273 | |||
| 274 | function returnActiveTab(tab) { |
||
| 275 | |||
| 276 | $('.disable-site').on('click', function () { |
||
| 277 | disablePassman('site', tab.url); |
||
| 278 | }); |
||
| 279 | |||
| 280 | $('.disable-page').on('click', function () { |
||
| 281 | disablePassman('url', tab.url); |
||
| 282 | }); |
||
| 283 | |||
| 284 | API.runtime.sendMessage(API.runtime.id, { |
||
| 285 | method: "getCredentialsByUrl", |
||
| 286 | args: [tab.url] |
||
| 287 | }).then(function (logins) { |
||
| 288 | if (logins.length === 0) { |
||
| 289 | API.runtime.sendMessage(API.runtime.id, { |
||
| 290 | 'method': 'getSetting', |
||
| 291 | args: 'no_results_found_tab' |
||
| 292 | }).then(function (value) { |
||
| 293 | makeTabActive(value); |
||
| 294 | }); |
||
| 295 | return; |
||
| 296 | } |
||
| 297 | if (logins.length !== 0) { |
||
| 298 | picker.find('.tab-list-content').html(''); |
||
| 299 | if(runtimeSettings.passwordPickerGotoList){ |
||
| 300 | makeTabActive('list'); |
||
| 301 | } |
||
| 302 | } |
||
| 303 | for (var i = 0; i < logins.length; i++) { |
||
| 304 | var login = logins[i]; |
||
| 305 | var div = $('<div>', {class: 'account', text: login.label}); |
||
| 306 | $('<br>').appendTo(div); |
||
| 307 | var username = (login.username !== '' ) ? login.username : login.email; |
||
| 308 | $('<small>').text(username).appendTo(div); |
||
| 309 | /* jshint ignore:start */ |
||
| 310 | div.click((function (login) { |
||
| 311 | return function () { |
||
| 312 | //enterLoginDetails(login); |
||
| 313 | //API.runtime.sendMessage(API.runtime.id, {method: 'getMasterPasswordSet'}) |
||
| 314 | fillLogin(login) |
||
| 315 | }; |
||
| 316 | })(login)); |
||
| 317 | /* jshint ignore:end*/ |
||
| 318 | |||
| 319 | picker.find('.tab-list-content').append(div); |
||
| 320 | } |
||
| 321 | }); |
||
| 322 | } |
||
| 323 | |||
| 324 | _this.returnActiveTab = returnActiveTab; |
||
| 325 | |||
| 326 | |||
| 327 | $('.no-credentials .save').on('click', function () { |
||
| 328 | $('.tab.add').click(); |
||
| 329 | }); |
||
| 330 | $('.no-credentials .search').on('click', function () { |
||
| 331 | $('.tab.search').click(); |
||
| 332 | }); |
||
| 333 | $('.no-credentials .gen').on('click', function () { |
||
| 334 | $('.tab.generate').click(); |
||
| 335 | }); |
||
| 336 | setupAddCredentialFields(); |
||
| 337 | setupPasswordGenerator(); |
||
| 338 | |||
| 339 | |||
| 340 | API.runtime.onMessage.addListener(function (msg, sender, sendResponse) { |
||
|
0 ignored issues
–
show
|
|||
| 341 | if (_this[msg.method]) { |
||
| 342 | _this[msg.method](msg.args, sender); |
||
| 343 | } |
||
| 344 | }); |
||
| 345 | |||
| 346 | |||
| 347 | $('#password_search').keyup(function () { |
||
| 348 | searchCredentials(); |
||
| 349 | }); |
||
| 350 | |||
| 351 | function url_domain(data) { |
||
| 352 | if(!data){ |
||
| 353 | return ''; |
||
| 354 | } |
||
| 355 | var matches = data.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i); |
||
| 356 | return matches && matches[1]; // domain will be null if no match is found |
||
| 357 | } |
||
| 358 | |||
| 359 | |||
| 360 | function searchCredentials() { |
||
| 361 | |||
| 362 | var searchText = $('#password_search').val(); |
||
| 363 | if (searchText === '') { |
||
| 364 | return; |
||
| 365 | } |
||
| 366 | API.runtime.sendMessage(API.runtime.id, { |
||
| 367 | 'method': 'searchCredential', |
||
| 368 | args: searchText |
||
| 369 | }).then(function (result) { |
||
| 370 | if (result.length === 0 || !result) { |
||
| 371 | $('#searchResults').html(API.i18n.getMessage('no_credentials_found')); |
||
| 372 | } |
||
| 373 | var html = ''; |
||
| 374 | for (var i = 0; i < result.length; i++) { |
||
| 375 | var login = result[i]; |
||
| 376 | var div = $('<div>', {class: 'account', text: login.label}); |
||
| 377 | $('<br>').appendTo(div); |
||
| 378 | |||
| 379 | var username = (login.username !== '' ) ? login.username : login.email; |
||
| 380 | $('<small>').text(username).appendTo(div); |
||
| 381 | $('<br>').appendTo(div); |
||
| 382 | $('<small>').text(url_domain(login.url)).appendTo(div); |
||
| 383 | /* jshint ignore:start */ |
||
| 384 | div.click((function (login) { |
||
| 385 | return function () { |
||
| 386 | //enterLoginDetails(login); |
||
| 387 | //API.runtime.sendMessage(API.runtime.id, {method: 'getMasterPasswordSet'}) |
||
| 388 | fillLogin(login); |
||
| 389 | //@TODO Ask to update the url of the login |
||
| 390 | API.runtime.sendMessage(API.runtime.id, { |
||
| 391 | 'method': 'updateCredentialUrlDoorhanger', |
||
| 392 | args: login |
||
| 393 | }) |
||
| 394 | }; |
||
| 395 | })(login)); |
||
| 396 | /* jshint ignore:end*/ |
||
| 397 | html += $('<div />').html(div).html(); |
||
| 398 | |||
| 399 | } |
||
| 400 | picker.find('#searchResults').html(html); |
||
| 401 | }); |
||
| 402 | } |
||
| 403 | |||
| 404 | }); |
||
| 405 |
This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.