Completed
Push — master ( b28cb5...a65932 )
by Sander
01:06
created

$j.ready   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 43

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 1
c 3
b 0
f 0
nc 1
nop 0
dl 0
loc 43
rs 8.8571
1
/* global API */
2
var $j = jQuery.noConflict();
3
$j(document).ready(function () {
4
    var _this = this;
5
6
    function removePasswordPicker() {
7
        $j('.passwordPickerIframe').remove();
8
    }
9
    _this.removePasswordPicker = removePasswordPicker;
10
11
    function enterLoginDetails(login) {
12
        var username = (login.username.trim() !== '' ) ? login.username : login.email;
13
14
        fillPassword(username, login.password);
15
        if ($j('.passwordPickerIframe').is(':visible')) {
16
            removePasswordPicker();
17
        }
18
    }
19
20
    _this.enterLoginDetails = enterLoginDetails;
21
22
23
    function showPasswordPicker(form) {
24
        if($j('.passwordPickerIframe').length > 1){
25
            return;
26
        }
27
        var loginField = $j(form[0]);
28
        var loginFieldPos = loginField.offset();
29
        var position = $j(form[1]).position();
30
        var passwordField = $j(form[1]);
31
        var passwordFieldPos = passwordField.offset();
32
33
        var left = loginFieldPos.left;
34
        var top = loginFieldPos.top;
35
        left = ($j(form[0]).parent().css('position') !== 'static') ? position.left : left;
36
        
37
        if (passwordFieldPos.top > loginFieldPos.top) {
38
            //console.log('login fields below each other')
39
            top = passwordFieldPos.top + passwordField.height() + 10;
40
41
        } else {
42
            // console.log('login fields next to each other')
43
            top = top + loginField.height() + 10;
44
        }
45
46
47
        var pickerUrl = API.extension.getURL('/html/inject/password_picker.html');
48
49
        var picker = $j('<iframe class="passwordPickerIframe" scrolling="no" height="400" width="350" frameborder="0" src="'+ pickerUrl+'"></iframe>');
50
        picker.css('position', 'absolute');
51
        picker.css('left', left);
52
        picker.css('z-index', 999);
53
        picker.css('top', top);
54
        $j('body').append($j(picker));
55
        // picker.css('width', $j(form).width());
56
        $j('.passwordPickerIframe:not(:last)').remove();
57
    }
58
59
    function createFormIcon(el, form) {
60
        var offset = el.offset();
0 ignored issues
show
Unused Code introduced by
The assignment to variable offset seems to be never used. Consider removing it.
Loading history...
61
        var width = el.width();
62
        var height = el.height()*1;
63
        var margin = (el.css('margin')) ? parseInt(el.css('margin').replace('px', '')) : 0;
0 ignored issues
show
Unused Code introduced by
The variable margin seems to be never used. Consider removing it.
Loading history...
64
        var padding = (el.css('padding')) ? parseInt(el.css('padding').replace('px', '')) : 0;
0 ignored issues
show
Unused Code introduced by
The variable padding seems to be never used. Consider removing it.
Loading history...
65
66
        var pickerIcon = 'data:image/png;base64,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';
67
68
        $j(el).css('background-image', 'url("'+ pickerIcon +'")');
69
        $j(el).css('background-size', 'contain');
70
        $j(el).css('background-repeat', 'no-repeat');
71
        $j(el).css('background-position-x', 'right');
72
73
74
        function onClick (e) {
75
            e.preventDefault();
76
            var offsetX = e.offsetX;
77
            var offsetRight = (width - offsetX);
78
            if(offsetRight < height){
79
                showPasswordPicker(form);
80
            }
81
        }
82
83
       // $j(el).bind('click', onClick);
84
        $j(el).click(onClick);
85
86
    }
87
88
    function createPasswordPicker(form) {
89
        for (var i = 0; i < form.length; i++) {
90
            var el = $j(form[i]);
91
            createFormIcon(el, form);
92
93
        }
94
    }
95
96
    function updatePositions() {
0 ignored issues
show
introduced by
The function updatePositions does not seem to be used and can be removed.
Loading history...
97
        $j('.passwordPickerIcon').remove();
98
        var forms = getLoginFields();
99
        for (var f = 0; f < forms.length; f++) {
100
            var form = forms[f];
101
            for (var i = 0; i < form.length; i++) {
102
                var el = $j(form[i]);
103
                createFormIcon(el, form);
104
            }
105
        }
106
    }
107
108
109
    function formSubmitted(fields) {
110
        var user = fields[0].value;
111
        var pass = fields[1].value;
112
        var params = {
113
            username: user,
114
            password: pass
115
        };
116
        //Disable password mining
117
        //$j(fields[1]).attr('type', 'hidden');
118
        API.runtime.sendMessage(API.runtime.id, {method: "minedForm", args: params});
119
120
    }
121
122
    function inIframe() {
123
        try {
124
            return window.self !== window.top;
125
        } catch (e) {
126
            return true;
127
        }
128
    }
129
130
131
    function checkForMined() {
132
        if (inIframe()) {
133
            return;
134
        }
135
        if(getLoginFields()){
136
            return;
137
        }
138
139
        API.runtime.sendMessage(API.runtime.id, {method: "getMinedData"}).then(function (data) {
140
            if (!data) {
141
                return;
142
            }
143
            if (data.hasOwnProperty('username') && data.hasOwnProperty('password') && data.hasOwnProperty('url')) {
144
                var doorhanger = $j('<div id="password-toolbar" class="container" style="display: none;">' +
145
                    '<span class="toolbar-text">' + data.title + ' ' + data.username + ' at ' + data.url + '</span></div>');
146
147
                var btnText = (data.guid === null) ? 'Save' : 'Update';
148
                var btnSave = $j('<button class="btn btn-success">' + btnText + '</button>');
149
                var btnCancel = $j('<button class="btn btn-default">Cancel</button>');
150
                btnSave.click(function () {
151
                    //closeToolbar();
152
                    API.runtime.sendMessage(API.runtime.id, {method: "saveMined"});
153
                });
154
155
                btnCancel.click(function () {
156
                    closeToolbar();
157
                    API.runtime.sendMessage(API.runtime.id, {method: "clearMined"});
158
                });
159
160
                doorhanger.append(btnCancel).append(btnSave);
161
                $j('#password-toolbar').remove();
162
                $j('body').append(doorhanger);
163
                $j('#password-toolbar').slideDown();
164
            }
165
        });
166
    }
167
168
    function minedLoginSaved(args) {
169
        // If the login added by the user then this is true
170
        if (args.selfAdded) {
171
            enterLoginDetails(args.credential);
172
            return;
173
        }
174
        if ($j('#password-toolbar').is(':visible')) {
175
            var action = (args.updated) ? 'updated' : 'saved';
176
            $j('#password-toolbar').html('Credential ' + action + '!');
177
            setTimeout(function () {
178
                closeToolbar();
179
            }, 2500);
180
        }
181
    }
182
183
    _this.minedLoginSaved = minedLoginSaved;
184
185
    function closeToolbar() {
186
        $j('#password-toolbar').slideUp(400, function () {
187
            $j('#password-toolbar').remove();
188
        });
189
    }
190
191
192
    function init() {
193
        checkForMined();
194
        API.runtime.sendMessage(API.runtime.id, {method: 'getRuntimeSettings'}).then(function (result) {
195
            var disablePasswordPicker = result.disablePasswordPicker;
196
197
            var loginFields = getLoginFields();
198
            if (loginFields.length > 0) {
199
                //@TODO prevent chrome from captuting pw's: http://stackoverflow.com/questions/27280461/prevent-chrome-from-prompting-to-save-password-from-input-box
200
                for (var i = 0; i < loginFields.length; i++) {
201
                    var form = getFormFromElement(loginFields[i][0]);
202
                    if(!disablePasswordPicker) {
203
                        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...
204
                    }
205
                    //Password miner
206
                    /* jshint ignore:start */
207
                    $j(form).submit((function (loginFields) {
208
                        return function () {
209
                            formSubmitted(loginFields);
210
                        };
211
                    })(loginFields[i]));
212
                    /* jshint ignore:end */
213
                }
214
215
                var url = window.location.href; //@TODO use a extension function
216
                API.runtime.sendMessage(API.runtime.id, {
217
                    method: "getCredentialsByUrl",
218
                    args: [url]
219
                }).then(function (logins) {
220
                    //console.log('Found ' + logins.length + ' logins for this site');
221
                    if (logins.length === 1) {
222
                        API.runtime.sendMessage(API.runtime.id, {method: 'isAutoFillEnabled'}).then(function (isEnabled) {
223
                            if (isEnabled) {
224
                                enterLoginDetails(logins[0]);
225
                            }
226
                        });
227
                    }
228
229
                });
230
            }
231
232
        });
233
234
    }
235
236
    var readyStateCheckInterval = setInterval(function () {
237
        if (document.readyState === "complete") {
238
            clearInterval(readyStateCheckInterval);
239
            API.runtime.sendMessage(API.runtime.id, {method: 'getMasterPasswordSet'}).then(function (result) {
240
                if (result) {
241
                    init();
242
                } else {
243
                    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...
244
                }
245
            });
246
247
            // var body = document.getElementsByTagName('body')[0];
248
            // observeDOM(body, function () {
249
            //     //init()
250
            // });
251
        }
252
    }, 10);
253
254
    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...
255
        //console.log('Method call', msg.method);
256
        if(_this[msg.method]) {
257
            _this[msg.method](msg.args, sender);
258
        }
259
    });
260
});