Completed
Push — master ( bba01d...8c82ac )
by Sander
01:20
created

$j.ready   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
/* global API */
2
var $j = jQuery.noConflict();
3
$j(document).ready(function () {
4
    var storage = new API.Storage();
5
6
    var password_picker_html = null;
7
    var _this = this;
8
9
    $j.ajax({
10
        url: API.extension.getURL('/html/inject/password_picker.html'),
11
        contentType: 'text',
12
        type: 'GET',
13
        success: function (data) {
14
            // Firefox parsed data as a XMLDoc, revert that
15
            if (typeof data === 'object') {
16
                data = '<div id="password_picker">' + data.documentElement.innerHTML + '</div>';
17
            }
18
            password_picker_html = $j(data);
19
        }
20
    });
21
22
    function removePasswordPicker() {
23
        $j('#password_picker').remove();
24
    }
25
26
    function enterLoginDetails(login) {
27
        console.log('called', login)
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
28
        var username = (login.username.trim() !== '' ) ? login.username : login.email;
29
30
        fillPassword(username, login.password);
31
        if ($j('#password_picker').is(':visible')) {
32
            removePasswordPicker();
33
        }
34
    }
35
36
    _this.enterLoginDetails = enterLoginDetails;
37
    function setupAddCredentialFields() {
38
        var labelfield = $j('#savepw-label');
39
        labelfield.val(document.title);
40
        var userfield = $j('#savepw-username');
41
        var pwfield = $j('#savepw-password');
42
        $j('.togglePw').click(function () {
43
            $j('.togglePw').toggleClass('fa-eye').toggleClass('fa-eye-slash');
44
            if (pwfield.attr('type') === 'password') {
45
                pwfield.attr('type', 'text');
46
            } else {
47
                pwfield.attr('type', 'password');
48
            }
49
        });
50
51
        $j('#savepw-save').click(function (e) {
52
            e.preventDefault();
53
            API.runtime.sendMessage(API.runtime.id, {
54
                method: "injectCreateCredential", args: {
55
                    label: labelfield.val(),
56
                    username: userfield.val(),
57
                    password: pwfield.val()
58
                }
59
            });
60
        });
61
62
        $j('#savepw-cancel').click(function () {
63
            labelfield.val(document.title);
64
            userfield.val('');
65
            pwfield.val('');
66
            removePasswordPicker();
67
        });
68
69
    }
70
71
    function toggleFieldType(field) {
72
        if ($j(field).attr('type').toLowerCase() === 'text') {
73
            $j(field).attr('type', 'password');
74
        } else {
75
            $j(field).attr('type', 'text');
76
        }
77
    }
78
79
    function genPwd(settings) {
80
        /* jshint ignore:start */
81
        var password = generatePassword(settings['length'],
82
            settings.useUppercase,
83
            settings.useLowercase,
84
            settings.useDigits,
85
            settings.useSpecialChars,
86
            settings.minimumDigitCount,
87
            settings.avoidAmbiguousCharacters,
88
            settings.requireEveryCharType);
89
        /* jshint ignore:end */
90
        return password;
91
    }
92
93
    function getPasswordGenerationSettings(cb) {
94
        var default_settings = {
95
            'length': 12,
96
            'useUppercase': true,
97
            'useLowercase': true,
98
            'useDigits': true,
99
            'useSpecialChars': true,
100
            'minimumDigitCount': 3,
101
            'avoidAmbiguousCharacters': false,
102
            'requireEveryCharType': true
103
        };
104
        storage.get('password_generator_settings').then(function (_settings) {
105
            if (!_settings) {
106
                _settings = default_settings;
107
            }
108
109
            cb(_settings);
110
        }).error(function () {
111
            cb(default_settings);
112
        });
113
    }
114
115
    function setupPasswordGenerator() {
116
        //getPasswordGeneratorSettings
117
        getPasswordGenerationSettings(function (settings) {
118
            var round = 0;
119
120
            function generate_pass() {
121
                var new_password = genPwd(settings);
122
                $j('#generated_password').val(new_password);
123
                setTimeout(function () {
124
                    if (round < 10) {
125
                        generate_pass();
126
                        round++;
127
                    } else {
128
                        round = 0;
129
                    }
130
                }, 10);
131
            }
132
133
            $j.each(settings, function (setting, val) {
134
                if (typeof(val) === "boolean") {
135
                    $j('[name="' + setting + '"]').prop('checked', val);
136
                } else {
137
                    $j('[name="' + setting + '"]').val(val);
138
                }
139
            });
140
141
            $j('form[name="advancedSettings"]').change(function () {
142
                var pw_settings_form = $j(this);
143
                settings = pw_settings_form.serializeObject();
144
                storage.set('password_generator_settings', settings);
145
            });
146
147
            $j('.renewpw').click(function () {
148
                generate_pass();
149
            });
150
            $j('.renewpw').click();
151
152
            $j('.usepwd').click(function () {
153
                $j('#savepw-password').val($j('#generated_password').val());
154
                $j('.tab.add').click();
155
            });
156
157
            $j('.togglePwVis').click(function () {
158
                toggleFieldType('#generated_password');
159
                $j(this).find('.fa').toggleClass('fa-eye-slash').toggleClass('fa-eye');
160
            });
161
162
            $j('.adv_opt').click(function () {
163
164
                var adv_settings = $j('.pw-setting-advanced');
165
                $j(this).find('i').toggleClass('fa-angle-right').toggleClass('fa-angle-down');
166
                if (adv_settings.is(':visible')) {
167
                    adv_settings.slideUp();
168
                } else {
169
                    adv_settings.slideDown();
170
                }
171
            });
172
        });
173
    }
174
175
    function showPasswordPicker(form) {
176
        var loginField = $j(form[0]);
177
        var loginFieldPos = loginField.offset();
178
        var passwordField = $j(form[1]);
179
        var passwordFieldPos = passwordField.offset();
180
181
        var left = loginFieldPos.left;
182
        var top = loginFieldPos.top;
183
184
        if (passwordFieldPos.top > loginFieldPos.top) {
185
            //console.log('login fields below each other')
186
            top = passwordFieldPos.top + passwordField.height() + 10;
187
188
        } else {
189
            // console.log('login fields next to each other')
190
            top = top + loginField.height() + 10;
191
        }
192
193
        var position = $j(form[1]).position();
0 ignored issues
show
Unused Code introduced by
The assignment to variable position seems to be never used. Consider removing it.
Loading history...
194
        $j(document.body).after($j(password_picker_html));
195
196
        var picker = $j('#password_picker');
197
        picker.css('position', 'absolute');
198
        picker.css('left', left);
199
        picker.css('top', top);
200
        // picker.css('width', $j(form).width());
201
        picker.find('.tab').click(function () {
202
            var target = $j(this).attr('class').replace('active', '').replace('tab', '').trim();
203
            picker.find('.tab').removeClass('active');
204
            picker.find('.tab-content').children().hide();
205
            picker.find('.tab-' + target + '-content').show();
206
            picker.find('.tab.' + target).addClass('active');
207
        });
208
209
        $j('.tab.close').click(function () {
210
            picker.find('.tab-list-content').show();
211
            removePasswordPicker();
212
        });
213
214
        var url = window.location.href;
215
        API.runtime.sendMessage(API.runtime.id, {method: "getCredentialsByUrl", args: [url]}).then(function (logins) {
216
            if (logins.length !== 0) {
217
                picker.find('.tab-list-content').html('');
218
            }
219
            for (var i = 0; i < logins.length; i++) {
220
                var login = logins[i];
221
                var row = $j('<div class="account">' + login.label + '<br /><small>' + login.username + '</small></div>');
222
                row.click((function (login) {
223
                    return function () {
224
                        enterLoginDetails(login);
225
                    };
226
                })(login));
227
228
                picker.find('.tab-list-content').append(row);
229
            }
230
        });
231
        $j('.no-credentials .save').on('click', function () {
232
            $j('.tab.add').click();
233
        });
234
        $j('.no-credentials .gen').on('click', function () {
235
            $j('.tab.generate').click();
236
        });
237
        setupAddCredentialFields();
238
        setupPasswordGenerator();
239
    }
240
241
    function createFormIcon(el, form) {
242
        var offset = el.offset();
243
        var width = el.width();
244
        var height = el.height();
245
        var margin = (el.css('margin')) ? parseInt(el.css('margin').replace('px', '')) : 0;
246
        var padding = (el.css('padding')) ? parseInt(el.css('padding').replace('px', '')) : 0;
247
        var paddingRight = parseInt(el.css('padding-right').replace('px', ''));
248
        var fontSize = el.css('font-size');
249
        var borderh = (el.css('border-height')) ? el.css('border-height') : '2px';
250
        var borderw = (el.css('border-width')) ? el.css('border-width') : '2px';
251
        var borderColor = el.css('border-color');
0 ignored issues
show
Unused Code introduced by
The variable borderColor seems to be never used. Consider removing it.
Loading history...
252
        var borderHeight = parseInt(borderh.replace('px', ''));
253
        var borderWidth = parseInt(borderw.replace('px', ''));
254
        var iconWidth = width * 0.1;
255
        var pickerButton = $j('<span class="passwordPickerIcon" style="display: inline-block"> </span>');
256
        $j('body').append(pickerButton);
257
        if (el.find('.passwordPickerIcon').length > 0) {
258
            pickerButton = el.find('.passwordPickerIcon')[0];
259
        }
260
261
262
        //pickerButton.css('background-image', 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAAAAXNSR0IArs4c6QAAAPhJREFUOBHlU70KgzAQPlMhEvoQTg6OPoOjT+JWOnRqkUKHgqWP4OQbOPokTk6OTkVULNSLVc62oJmbIdzd95NcuGjX2/3YVI/Ts+t0WLE2ut5xsQ0O+90F6UxFjAI8qNcEGONia08e6MNONYwCS7EQAizLmtGUDEzTBNd1fxsYhjEBnHPQNG3KKTYV34F8ec/zwHEciOMYyrIE3/ehKAqIoggo9inGXKmFXwbyBkmSQJqmUNe15IRhCG3byphitm1/eUzDM4qR0TTNjEixGdAnSi3keS5vSk2UDKqqgizLqB4YzvassiKhGtZ/jDMtLOnHz7TE+yf8BaDZXA509yeBAAAAAElFTkSuQmCC")');
263
        pickerButton.css('background-image', 'url("data:image/png;base64,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")');
264
        pickerButton.css('background-repeat', 'no-repeat');
265
        pickerButton.css('background-attachment', 'scroll');
266
        //pickerButton.css('background-size', '16px 18px');
267
        pickerButton.css('background-size', 'contain');
268
        pickerButton.css('background-position', '98% 50%');
269
        pickerButton.css('cursor', 'pointer');
270
        pickerButton.css('text-align', 'center');
271
        pickerButton.css('box-sizing', 'content-box');
272
        pickerButton.css('position', 'absolute');
273
        /*
274
         pickerButton.css('background-color', 'rgb(234, 234, 234)');
275
         pickerButton.css('border-top-right-radius', el.css('border-top-right-radius'));
276
         pickerButton.css('border-bottom-right-radius', el.css('border-bottom-right-radius'));
277
         pickerButton.css('border-color', borderColor);*/
278
279
        pickerButton.css('z-index', '999');
280
        pickerButton.css('width', iconWidth);
281
282
283
        pickerButton.css('padding', padding);
284
        pickerButton.css('font-size', fontSize);
285
        pickerButton.css('height', height);
286
        pickerButton.css('margin', margin);
287
        pickerButton.css('font-weight', el.css('font-weight'));
288
        pickerButton.css('top', Math.round((offset.top + (height / 4) - margin / 2 - padding / 2 ) - (borderHeight / 2)) + 'px');
289
        pickerButton.css('left', Math.round((offset.left + width * 0.9) + paddingRight - padding + borderWidth) + 'px');
290
291
292
        var onClick = function () {
293
            showPasswordPicker(form);
294
        };
295
296
        //$j('body').append(pickerButton);
297
298
        pickerButton.find('fa-key').click(onClick);
299
        $j(pickerButton).click(onClick);
300
301
    }
302
303
    function createPasswordPicker(form) {
304
        for (var i = 0; i < form.length; i++) {
305
            var el = $j(form[i]);
306
            createFormIcon(el, form);
307
308
        }
309
    }
310
311
    function updatePositions() {
312
        $j('.passwordPickerIcon').remove();
313
        var forms = getLoginFields();
314
        for (var f = 0; f < forms.length; f++) {
315
            var form = forms[f];
316
            for (var i = 0; i < form.length; i++) {
317
                var el = $j(form[i]);
318
                createFormIcon(el, form);
319
            }
320
        }
321
    }
322
323
324
    function togglePasswordPicker(e) {
325
        if (e.target.className === "passwordPickerIcon" || e.target.className === "fa fa-key") {
326
            return;
327
        }
328
        var picker = $j('#password_picker');
329
        if (!picker.is(e.target)
330
            && picker.has(e.target).length === 0
331
332
        ) {
333
            if (picker) {
334
                picker.remove();
335
            }
336
        }
337
    }
338
339
    function formSubmitted(fields) {
340
        var user = fields[0].value;
341
        var pass = fields[1].value;
342
        var params = {
343
            username: user,
344
            password: pass
345
        };
346
        //Disable password mining
347
        //$j(fields[1]).attr('type', 'hidden');
348
        API.runtime.sendMessage(API.runtime.id, {method: "minedForm", args: params});
349
350
    }
351
352
    function inIframe() {
353
        try {
354
            return window.self !== window.top;
355
        } catch (e) {
356
            return true;
357
        }
358
    }
359
360
361
    function checkForMined() {
362
        if (inIframe()) {
363
            return;
364
        }
365
366
        API.runtime.sendMessage(API.runtime.id, {method: "getMinedData"}).then(function (data) {
367
            if (!data) {
368
                return;
369
            }
370
            if (data.hasOwnProperty('username') && data.hasOwnProperty('password') && data.hasOwnProperty('url')) {
371
                var doorhanger = $j('<div id="password-toolbar" class="container" style="display: none;"><span class="toolbar-text">' + data.title + ' ' + data.username + ' at ' + data.url + '</span></div>');
372
373
                var btnText = (data.guid === null) ? 'Save' : 'Update';
374
                var btnSave = $j('<button class="btn btn-success">' + btnText + '</button>');
375
                var btnCancel = $j('<button class="btn btn-default">Cancel</button>');
376
                btnSave.click(function () {
377
                    //closeToolbar();
378
                    API.runtime.sendMessage(API.runtime.id, {method: "saveMined"});
379
                });
380
381
                btnCancel.click(function () {
382
                    closeToolbar();
383
                    API.runtime.sendMessage(API.runtime.id, {method: "clearMined"});
384
                });
385
386
                doorhanger.append(btnCancel).append(btnSave);
387
                $j('#password-toolbar').remove();
388
                $j('body').append(doorhanger);
389
                $j('#password-toolbar').slideDown();
390
            }
391
        });
392
    }
393
394
    function minedLoginSaved(args) {
395
        // If the login added by the user then this is true
396
        if (args.selfAdded) {
397
            enterLoginDetails(args.credential);
398
            return;
399
        }
400
        if ($j('#password-toolbar').is(':visible')) {
401
            var action = (args.updated) ? 'updated' : 'saved';
402
            $j('#password-toolbar').html('Credential ' + action + '!');
403
            setTimeout(function () {
404
                closeToolbar();
405
            }, 2500);
406
        }
407
    }
408
409
    _this.minedLoginSaved = minedLoginSaved;
410
411
    function closeToolbar() {
412
        $j('#password-toolbar').slideUp(400, function () {
413
            $j('#password-toolbar').remove();
414
        });
415 View Code Duplication
    }
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
416
417
    function insertFontCSS() {
418
        var fontPath = API.extension.getURL('');
419
        var fontCss = ["@font-face {",
420
            "font-family: 'FontAwesome';",
421
            "src: url('" + fontPath + "fonts/fontawesome-webfont.eot?v=4.7.0');",
422
            "src: url('" + fontPath + "fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('" + fontPath + "fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('" + fontPath + "fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('" + fontPath + "fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('" + fontPath + "fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');",
423
            "font-weight: normal;",
424
            "font-style: normal;",
425
            "}"];
426
        if (window.navigator.userAgent.indexOf('Firefox') !== -1) {
427
            fontCss[2] = "src: url('" + fontPath + "fonts/fontawesome-webfont.eot?v=4.7.0');";
428
            fontCss[3] = "src: url('" + fontPath + "fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('" + fontPath + "fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('" + fontPath + "fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('" + fontPath + "fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('" + fontPath + "fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');";
429
        }
430
        var css = fontCss.join('');
431
        var style = document.createElement('style'),
432
            head = document.head || document.getElementsByTagName('head')[0];
433
434
        style.type = 'text/css';
435
        if (style.styleSheet) {
436
            style.styleSheet.cssText = css;
437
        } else {
438
            style.appendChild(document.createTextNode(css));
439
        }
440
441
        head.appendChild(style);
442
    }
443
444
445
    function init() {
446
        insertFontCSS();
447
        $j(document).unbind('click', togglePasswordPicker);
448
        checkForMined();
449
        API.runtime.sendMessage(API.runtime.id, {method: 'getRuntimeSettings'}).then(function (result) {
450
            var disablePasswordPicker = result.disablePasswordPicker;
451
452
            var loginFields = getLoginFields();
453
            if (loginFields.length > 0) {
454
                //@TODO prevent chrome from captuting pw's: http://stackoverflow.com/questions/27280461/prevent-chrome-from-prompting-to-save-password-from-input-box
455
                for (var i = 0; i < loginFields.length; i++) {
456
                    if(!disablePasswordPicker) {
457
                        var form = getFormFromElement(loginFields[i][0]);
458
                        createPasswordPicker(loginFields[i], form);
0 ignored issues
show
Bug introduced by
The call to createPasswordPicker seems to have too many arguments starting with form.
Loading history...
459
                    }
460
                    //Password miner
461
                    $j(form).submit((function (loginFields) {
0 ignored issues
show
Bug introduced by
The variable form seems to not be initialized for all possible execution paths. Are you sure $j handles undefined variables?
Loading history...
462
                        return function () {
463
                            formSubmitted(loginFields);
464
                        }
465
                    })(loginFields[i]));
466
                }
467
468
                var url = window.location.href; //@TODO use a extension function
469
                API.runtime.sendMessage(API.runtime.id, {
470
                    method: "getCredentialsByUrl",
471
                    args: [url]
472
                }).then(function (logins) {
473
                    //console.log('Found ' + logins.length + ' logins for this site');
474
                    if (logins.length === 1) {
475
                        API.runtime.sendMessage(API.runtime.id, {method: 'isAutoFillEnabled'}).then(function (isEnabled) {
476
                            if (isEnabled) {
477
                                enterLoginDetails(logins[0]);
478
                            }
479
                        });
480
                    }
481
482
                });
483
            }
484
485
        });
486
487
        $j(document).click(togglePasswordPicker);
488
        $j(window).on('resize', function () {
489
            if (getLoginFields().length > 0) {
490
                updatePositions();
491
            }
492
        });
493
    }
494
495
    var readyStateCheckInterval = setInterval(function () {
496
        if (document.readyState === "complete") {
497
            clearInterval(readyStateCheckInterval);
498
            API.runtime.sendMessage(API.runtime.id, {method: 'getMasterPasswordSet'}).then(function (result) {
499
                if (result) {
500
                    init();
501
                } else {
502
                    console.log('[Passman extension] Stopping, vault key not set');
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
503
                }
504
            });
505
506
            var body = document.getElementsByTagName('body')[0];
507
            observeDOM(body, function () {
508
                //init()
509
            });
510
        }
511
    }, 10);
512
513
    API.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
0 ignored issues
show
Unused Code introduced by
The parameter sendResponse is not used and could be removed.

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.

Loading history...
514
        _this[msg.method](msg.args, sender);
515
    });
516
});