Completed
Pull Request — master (#195)
by Sander
38s
created

$(document).ready   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
c 0
b 0
f 0
nc 2
nop 1
dl 0
loc 6
rs 9.4285
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
Unused Code introduced by
The parameter login 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...
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
            e.preventDefault();
90
            $(this).text(API.i18n.getMessage("saving"));
91
            $(this).attr('disabled', true);
92
            API.runtime.sendMessage(API.runtime.id, {
93
                method: "injectCreateCredential",
94
                args: {
95
                    label: labelfield.val(),
96
                    username: userfield.val(),
97
                    password: pwfield.val(),
98
                    vaultIndex: vaultfield.val()
99
                }
100
            }).then(removePasswordPicker);
101
        });
102
103
        $('#savepw-cancel').click(function () {
104
            labelfield.val(document.title);
105
            userfield.val('');
106
            pwfield.val('');
107
            removePasswordPicker();
108
        });
109
110
    }
111
112
    function toggleFieldType(field) {
113
        if ($(field).attr('type').toLowerCase() === 'text') {
114
            $(field).attr('type', 'password');
115
        } else {
116
            $(field).attr('type', 'text');
117
        }
118
    }
119
120
    function genPwd(settings) {
121
        /* jshint ignore:start */
122
        var password = generatePassword(settings['length'],
123
            settings.useUppercase,
124
            settings.useLowercase,
125
            settings.useDigits,
126
            settings.useSpecialChars,
127
            settings.minimumDigitCount,
128
            settings.avoidAmbiguousCharacters,
129
            settings.requireEveryCharType);
130
        /* jshint ignore:end */
131
        return password;
132
    }
133
134
    function getPasswordGenerationSettings(cb) {
135
        var default_settings = {
136
            'length': 12,
137
            'useUppercase': true,
138
            'useLowercase': true,
139
            'useDigits': true,
140
            'useSpecialChars': true,
141
            'minimumDigitCount': 3,
142
            'avoidAmbiguousCharacters': false,
143
            'requireEveryCharType': true
144
        };
145
        storage.get('password_generator_settings').then(function (_settings) {
146
            if (!_settings) {
147
                _settings = default_settings;
148
            }
149
150
            cb(_settings);
151
        }).error(function () {
152
            cb(default_settings);
153
        });
154
    }
155
156
    function setupPasswordGenerator() {
157
        //getPasswordGeneratorSettings
158
        getPasswordGenerationSettings(function (settings) {
159
            var round = 0;
160
161
            function generate_pass(inputId) {
162
                var new_password = genPwd(settings);
163
                $('#' + inputId).val(new_password);
164
                setTimeout(function () {
165
                    if (round < 10) {
166
                        generate_pass(inputId);
167
                        round++;
168
                    } else {
169
                        round = 0;
170
                    }
171
                }, 10);
172
            }
173
174
            $.each(settings, function (setting, val) {
175
                if (typeof(val) === "boolean") {
176
                    $('[name="' + setting + '"]').prop('checked', val);
177
                } else {
178
                    $('[name="' + setting + '"]').val(val);
179
                }
180
            });
181
182
            $('form[name="advancedSettings"]').change(function () {
183
                var pw_settings_form = $(this);
184
                settings = pw_settings_form.serializeObject();
185
                storage.set('password_generator_settings', settings);
186
            });
187
188
            $('.renewpw').click(function () {
189
                generate_pass('generated_password');
190
            });
191
            $('.renewpw_newac').click(function () {
192
                generate_pass('savepw-password');
193
194
            });
195
            $('.renewpw').click();
196
            $('.renewpw_newac').click();
197
198
            $('.usepwd').click(function () {
199
                $('#savepw-password').val($('#generated_password').val());
200
                $('.tab.add').click();
201
            });
202
203
            $('.togglePwVis').click(function () {
204
                toggleFieldType('#generated_password');
205
                $(this).find('.fa').toggleClass('fa-eye-slash').toggleClass('fa-eye');
206
            });
207
208
            $('.adv_opt').click(function () {
209
210
                var adv_settings = $('.pw-setting-advanced');
211
                $(this).find('i').toggleClass('fa-angle-right').toggleClass('fa-angle-down');
212
                if (adv_settings.is(':visible')) {
213
                    adv_settings.slideUp();
214
                } else {
215
                    adv_settings.slideDown();
216
                }
217
            });
218
        });
219
    }
220
221
    var picker = $('#password_picker');
222
    var makeTabActive = function (name) {
223
        picker.find('.tab').removeClass('active');
224
        picker.find('.tab-content').children().hide();
225
        picker.find('.tab-' + name + '-content').show();
226
        picker.find('.tab.' + name).addClass('active');
227
    };
228
229
    var defaultTab = null;
0 ignored issues
show
Unused Code introduced by
The variable defaultTab seems to be never used. Consider removing it.
Loading history...
230
    picker.find('.tab').click(function () {
231
        var name = $(this).attr('data-name');
232
        storage.set('activeTab', name).then(function (r) {
0 ignored issues
show
Unused Code introduced by
The parameter r 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...
233
            defaultTab = name;
0 ignored issues
show
Unused Code introduced by
The variable defaultTab seems to be never used. Consider removing it.
Loading history...
234
            makeTabActive(name);
235
        });
236
    });
237
    
238
239
240
    $('.tab.close').click(function () {
241
        removePasswordPicker();
242
    });
243
244
245
    function disablePassman(where, url){
246
        var whereFn = (where === 'site') ? 'Site' : 'URL';
247
        API.runtime.sendMessage(API.runtime.id, {
248
            method: "ignore"+ whereFn,
249
            args: url
250
        }).then(function () {
251
            var text = (where === 'site') ? 'site_ignored' : 'url_ignored';
252
            $('.tab-ignore-content').find('.text').text(API.i18n.getMessage(text));
253
            setTimeout(function () {
254
                removePasswordPicker();
255
            }, 2500);
256
        });
257
    }
258
259
260
261
    function returnActiveTab(tab) {
262
263
        $('.disable-site').on('click', function () {
264
            disablePassman('site', tab.url);
265
        });
266
267
        $('.disable-page').on('click', function () {
268
            disablePassman('url', tab.url);
269
        });
270
271
        API.runtime.sendMessage(API.runtime.id, {
272
            method: "getCredentialsByUrl",
273
            args: [tab.url]
274
        }).then(function (logins) {
275
            if (logins.length === 0) {
276
                API.runtime.sendMessage(API.runtime.id, {
277
                    'method': 'getSetting',
278
                    args: 'no_results_found_tab'
279
                }).then(function (value) {
280
                    makeTabActive(value);
281
                });
282
                return;
283
            }
284
            if (logins.length !== 0) {
285
                picker.find('.tab-list-content').html('');
286
                if(runtimeSettings.passwordPickerGotoList){
287
                    makeTabActive('list');
288
                }
289
            }
290
            for (var i = 0; i < logins.length; i++) {
291
                var login = logins[i];
292
                var div = $('<div>', {class: 'account', text: login.label});
293
                $('<br>').appendTo(div);
294
                var username = (login.username !== '' ) ? login.username : login.email;
295
                $('<small>').text(username).appendTo(div);
296
                /* jshint ignore:start */
297
                div.click((function (login) {
298
                    return function () {
299
                        //enterLoginDetails(login);
300
                        //API.runtime.sendMessage(API.runtime.id, {method: 'getMasterPasswordSet'})
301
                        fillLogin(login)
302
                    };
303
                })(login));
304
                /* jshint ignore:end*/
305
306
                picker.find('.tab-list-content').append(div);
307
            }
308
        });
309
    }
310
311
    _this.returnActiveTab = returnActiveTab;
312
313
314
    $('.no-credentials .save').on('click', function () {
315
        $('.tab.add').click();
316
    });
317
    $('.no-credentials .search').on('click', function () {
318
        $('.tab.search').click();
319
    });
320
    $('.no-credentials .gen').on('click', function () {
321
        $('.tab.generate').click();
322
    });
323
    setupAddCredentialFields();
324
    setupPasswordGenerator();
325
326
327
    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...
328
        if (_this[msg.method]) {
329
            _this[msg.method](msg.args, sender);
330
        }
331
    });
332
333
334
    $('#password_search').keypress(function (e) {
335
        if (e.which === 13) {
336
            searchCredentials();
337
        }
338
    });
339
340
    function url_domain(data) {
341
        if(!data){
342
            return '';
343
        }
344
        var matches = data.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
345
        return matches && matches[1];  // domain will be null if no match is found
346
    }
347
348
349
    function searchCredentials() {
350
        $('#searchResults').html('');
351
        var searchText = $('#password_search').val();
352
        if (searchText === '') {
353
            return;
354
        }
355
        API.runtime.sendMessage(API.runtime.id, {
356
            'method': 'searchCredential',
357
            args: searchText
358
        }).then(function (result) {
359
            if (result.length === 0 || !result) {
360
                $('#searchResults').html(API.i18n.getMessage('no_credentials_found'));
361
            }
362
            for (var i = 0; i < result.length; i++) {
363
                var login = result[i];
364
                var div = $('<div>', {class: 'account', text: login.label});
365
                $('<br>').appendTo(div);
366
367
                var username = (login.username !== '' ) ? login.username : login.email;
368
                $('<small>').text(username).appendTo(div);
369
                $('<br>').appendTo(div);
370
                $('<small>').text(url_domain(login.url)).appendTo(div);
371
                /* jshint ignore:start */
372
                div.click((function (login) {
373
                    return function () {
374
                        //enterLoginDetails(login);
375
                        //API.runtime.sendMessage(API.runtime.id, {method: 'getMasterPasswordSet'})
376
                        fillLogin(login);
377
                        //@TODO Ask to update the url of the login
378
                        API.runtime.sendMessage(API.runtime.id, {
379
                            'method': 'updateCredentialUrlDoorhanger',
380
                            args: login
381
                        })
382
                    };
383
                })(login));
384
                /* jshint ignore:end*/
385
386
                picker.find('#searchResults').append(div);
387
            }
388
        });
389
    }
390
391
});
392