Skip to content
This repository was archived by the owner on Aug 27, 2020. It is now read-only.

Commit 4266a6b

Browse files
committed
second beta release
* adds new feature: fill-in password confirmation * adds new feature: fill-in password only * adds new feature: setting for url and submit-utl format * updates version Info.plist and Update.plist
1 parent a4a37c7 commit 4266a6b

File tree

9 files changed

+177
-51
lines changed

9 files changed

+177
-51
lines changed

Icon-Toolbar-128.png

-7.2 KB
Binary file not shown.

Info.plist

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
<key>CFBundleInfoDictionaryVersion</key>
1414
<string>6.0</string>
1515
<key>CFBundleShortVersionString</key>
16-
<string>1.0.beta1</string>
16+
<string>1.0.beta2</string>
1717
<key>CFBundleVersion</key>
18-
<string>0.9.1</string>
18+
<string>0.9.2</string>
1919
<key>Chrome</key>
2020
<dict>
2121
<key>Global Page</key>

README.md

+13-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ TODO write some useful stuff.
1212

1313
TODO write some useful stuff.
1414

15+
## Settings
16+
17+
TODO write some useful stuff.
18+
1519
## Features
1620

1721
- [X] Associate with KeePassHTTP
@@ -30,9 +34,15 @@ TODO write some useful stuff.
3034
- [X] Setting for language
3135
- [X] I18n support
3236
- [X] Translate into german
33-
- [ ] Fill-in password only
34-
- [ ] Forms with one one password field only
35-
- [ ] Forms with multiple password fields only
37+
- [X] Fill-in password
38+
- [X] Forms with one password field only
39+
- [X] Forms with two password fields only
40+
- [X] Setting for host-only URL on add/update
41+
- [X] Setting for protocol-host-path-only Submit-URL on add/update
42+
- [ ] Setting for auto-submit after fill-in
43+
- [ ] Auto submit form after fill-in
44+
- [ ] Setting for auto fill-in
45+
- [ ] Auto fill-in credentialson page visit
3646

3747
## Credits
3848

Settings.plist

+48
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,54 @@
2222
<key>Type</key>
2323
<string>TextField</string>
2424
</dict>
25+
<dict>
26+
<key>DefaultValue</key>
27+
<string>host</string>
28+
<key>Key</key>
29+
<string>url_format</string>
30+
<key>Title</key>
31+
<string>URL-Format</string>
32+
<key>Titles</key>
33+
<array>
34+
<string>Full</string>
35+
<string>Protocol, Host &amp; Path</string>
36+
<string>Protocol &amp; Host</string>
37+
<string>Host</string>
38+
</array>
39+
<key>Type</key>
40+
<string>PopUpButton</string>
41+
<key>Values</key>
42+
<array>
43+
<string>full</string>
44+
<string>protocol_host_path</string>
45+
<string>protocol_host</string>
46+
<string>host</string>
47+
</array>
48+
</dict>
49+
<dict>
50+
<key>DefaultValue</key>
51+
<string>protocol_host</string>
52+
<key>Key</key>
53+
<string>submit_url_format</string>
54+
<key>Title</key>
55+
<string>Submit-URL-Format</string>
56+
<key>Titles</key>
57+
<array>
58+
<string>Full</string>
59+
<string>Protocol, Host &amp; Path</string>
60+
<string>Protocol &amp; Host</string>
61+
<string>Host</string>
62+
</array>
63+
<key>Type</key>
64+
<string>PopUpButton</string>
65+
<key>Values</key>
66+
<array>
67+
<string>full</string>
68+
<string>protocol_host_path</string>
69+
<string>protocol_host</string>
70+
<string>host</string>
71+
</array>
72+
</dict>
2573
<dict>
2674
<key>DefaultValue</key>
2775
<string>en</string>

Update.plist

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
<key>Developer Identifier</key>
1111
<string>897X8SYVFR</string>
1212
<key>CFBundleVersion</key>
13-
<string>1.0.beta1</string>
13+
<string>1.0.beta2</string>
1414
<key>CFBundleShortVersionString</key>
15-
<string>0.9.1</string>
15+
<string>0.9.2</string>
1616
<key>URL</key>
17-
<string>https://github.com/mmichaa/passafari.safariextension/releases/download/v1.0.beta1/passafari-v1.0.beta1.safariextz</string>
17+
<string>https://github.com/mmichaa/passafari.safariextension/releases/download/v1.0.beta2/passafari-v1.0.beta2.safariextz</string>
1818
</dict>
1919
</array>
2020
</dict>

end.js

+24-13
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@ if(window.parent === window) {
2828
function passafari_injected_message_fillin(event_name, event_data) {
2929
if(event_data.length === 1) {
3030
var credentials = event_data[0];
31-
var input_candidates = passafari_input_candidates();
31+
var input_candidates = passafari_input_candidates(true);
3232

3333
if(input_candidates.length === 1) {
3434
var inputs = input_candidates[0];
3535

36-
inputs.username.value = credentials.Login;
37-
inputs.password.value = credentials.Password;
36+
if(inputs.username) { inputs.username.value = credentials.Login; }
37+
if(inputs.password) { inputs.password.value = credentials.Password; }
38+
if(inputs.password_confirmation) { inputs.password_confirmation.value = credentials.Password; }
3839
} else {
3940
console.log("passafari_injected_message_fillin: more than one inputs found.")
4041
console.log(inputs);
@@ -49,15 +50,16 @@ function passafari_injected_message_fillin(event_name, event_data) {
4950

5051
// CALLED by passafari_injected_message_handler
5152
function passafari_injected_message_readout(event_name, event_data) {
52-
var input_candidates = passafari_input_candidates();
53+
var input_candidates = passafari_input_candidates(false);
5354

5455
if(input_candidates.length === 1) {
5556
var inputs = input_candidates[0];
5657

5758
var username = inputs.username.value;
5859
var password = inputs.password.value;
60+
var submit_url = inputs.username.form.action;
5961

60-
passafari_notify_global_page("passafari_message_readout", {"Login": username, "Password": password, "Uuid": undefined});
62+
passafari_notify_global_page("passafari_message_readout", {"Login": username, "Password": password, "SubmitUrl": submit_url, "Uuid": undefined});
6163
} else {
6264
console.log("passafari_injected_message_readout: more than one inputs found.")
6365
console.log(inputs);
@@ -75,7 +77,7 @@ function passafari_notify_global_page(msg_name, msg_data) {
7577
}
7678

7779
// UTILS end.js related
78-
function passafari_input_candidates() {
80+
function passafari_input_candidates(allow_password_only) {
7981
var candidates = [];
8082

8183
for(var form_idx=0; form_idx < document.forms.length; form_idx++) {
@@ -85,7 +87,7 @@ function passafari_input_candidates() {
8587
continue;
8688
}
8789

88-
var inputs = { "username": undefined, "password": undefined };
90+
var inputs = { "username": undefined, "password": undefined, "password_confirmation": undefined };
8991

9092
for(var elem_idx=0; elem_idx < form.elements.length; elem_idx++) {
9193
var elem = form.elements[elem_idx];
@@ -97,23 +99,32 @@ function passafari_input_candidates() {
9799
var elem_type = elem.type.toLowerCase();
98100

99101
if(elem_type === "password") {
100-
inputs["password"] = elem;
102+
if(inputs.password === undefined) { inputs.password = elem; }
103+
else if(inputs.password_confirmation === undefined) { inputs.password_confirmation = elem; }
101104
}
102-
else if(elem_type === 'email' || elem_type === 'text') {
103-
inputs["username"] = elem;
105+
else if(elem_type === "email" || elem_type === "text") {
106+
inputs.username = elem;
104107
}
105108

106-
if(inputs["username"] && inputs["password"]) {
107-
candidates.push(inputs);
109+
if(inputs.username && inputs.password && inputs.password_confirmation) {
108110
break;
109111
}
110112
}
113+
114+
if(inputs.username && inputs.password) {
115+
candidates.push(inputs);
116+
continue;
117+
}
118+
else if(allow_password_only && inputs.password) {
119+
candidates.push(inputs);
120+
continue;
121+
}
111122
}
112123

113124
for(var candidate_idx=0; candidate_idx < candidates.length; candidate_idx++) {
114125
var inputs = candidates[candidate_idx];
115126

116-
if(inputs.username === document.activeElement || inputs.password === document.activeElement) {
127+
if(inputs.password === document.activeElement || inputs.username === document.activeElement) {
117128
console.log("passafari_input_candidates: using focused fields.")
118129
candidates = [ inputs ];
119130
break;

global.js

+78-15
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,11 @@ function passafari_command_update(event) {
8282
if(credential) {
8383
var updateCallback = function(code) { console.log("passafari_command_update: response code '" + code + "'.") };
8484
var tab = undefined;
85-
var entryId = credential.Uuid;
85+
var entry_id = credential.Uuid;
8686
var username = credential.Login;
8787
var password = credential.Password;
88-
var url = safari.application.activeBrowserWindow.activeTab.url;
88+
var url = passafari_format_url(passafari_active_tab_url());
89+
var submit_url = passafari_format_submit_url(credential.SubmitUrl);
8990

9091
if(password === undefined || password === "") {
9192
var passwords = passafari_generate_password();
@@ -95,7 +96,7 @@ function passafari_command_update(event) {
9596
passafari_notify_injected("passafari_message_fillin", [ credential ]);
9697
}
9798
}
98-
keepass.updateCredentials(updateCallback, tab, entryId, username, password, url);
99+
keepass.updateCredentials(updateCallback, tab, entry_id, username, password, url, submit_url);
99100
} else {
100101
console.log("passafari_command_update: no credential found in cache for index '" + idx + "'.");
101102
}
@@ -124,6 +125,7 @@ function passafari_message_readout(event) {
124125
var credential_upd = clone(credential);
125126
credential_upd.passafari_command = "passafari_command_update"
126127
credential_upd.Password = readout.Password;
128+
credential_upd.SubmitUrl = readout.SubmitUrl;
127129
credentials.push(credential_upd);
128130
continue;
129131
} else {
@@ -163,27 +165,30 @@ function passafari_display_credentials(credentials) {
163165
var menu_item_image = undefined;
164166

165167
if(credential.passafari_command === "passafari_command_select") {
166-
//menu_item_label = "credentials.fillin".toLocaleString() + ": " + credential.Login + " (" + credential.Name + ")";
167168
menu_item_label = credential.Login + " (" + credential.Name + ")";
168169
menu_item_image = safari.extension.baseURI + "images/font-awesome-pencil-square-o.png";
169170
} else if(credential.passafari_command === "passafari_command_update" && credential.Uuid !== undefined) {
170-
//menu_item_label = "credentials.update".toLocaleString() + ": " + credential.Login + " (" + credential.Name + ")";
171-
menu_item_label = credential.Login + " (" + credential.Name + ")";
171+
menu_item_label = credential.Login + " (" + credential.Name;
172172
menu_item_image = safari.extension.baseURI + "images/font-awesome-floppy-o.png";
173173

174+
if (credential.Password === undefined || credential.Password === "") {
175+
menu_item_label = menu_item_label + "; " + "credentials.password_generated".toLocaleString() + ")";
176+
} else {
177+
menu_item_label = menu_item_label + "; " + "credentials.password_entered".toLocaleString() + ")";
178+
}
179+
174180
if (!menu_update_item_added) {
175181
menu.appendSeparator("passafari_credentials_update_section");
176182
menu_update_item_added = true;
177183
}
178184
} else if(credential.passafari_command === "passafari_command_update" && credential.Uuid === undefined) {
179-
//menu_item_label = "credentials.add".toLocaleString() + ": " + credential.Login;
180185
menu_item_label = credential.Login;
181186
menu_item_image = safari.extension.baseURI + "images/font-awesome-plus-square-o.png";
182187

183188
if (credential.Password === undefined || credential.Password === "") {
184189
menu_item_label = menu_item_label + " (" + "credentials.password_generated".toLocaleString() + ")";
185190
} else {
186-
menu_item_label = menu_item_label + " (" + "credentials.password_readout".toLocaleString() + ")";
191+
menu_item_label = menu_item_label + " (" + "credentials.password_entered".toLocaleString() + ")";
187192
}
188193

189194
if (!menu_add_item_added) {
@@ -215,6 +220,10 @@ function passafari_toolbar_item() {
215220
return safari.extension.toolbarItems[0];
216221
}
217222

223+
function passafari_active_tab_url() {
224+
return safari.application.activeBrowserWindow.activeTab.url;
225+
}
226+
218227
// UTILS global.js related
219228
function passafari_credentials_cache(credentials) {
220229
if(credentials === undefined) {
@@ -229,6 +238,60 @@ function passafari_credentials_cache(credentials) {
229238
return credentials;
230239
}
231240

241+
// UTILS global.js related
242+
function passafari_format_url(url) {
243+
var format = safari.extension.settings.url_format;
244+
245+
if(format === "protocol_host_path") {
246+
return passafari_url_protocol_host_path_only(url);
247+
} else if(format === "protocol_host") {
248+
return passafari_url_protocol_host_only(url);
249+
} else if(format === "host") {
250+
return passafari_url_host_only(url);
251+
} else {
252+
return url;
253+
}
254+
}
255+
256+
// UTILS global.js related
257+
function passafari_format_submit_url(url) {
258+
var format = safari.extension.settings.submit_url_format;
259+
260+
if(format === "protocol_host_path") {
261+
return passafari_url_protocol_host_path_only(url);
262+
} else if(format === "protocol_host") {
263+
return passafari_url_protocol_host_only(url);
264+
} else if(format === "host") {
265+
return passafari_url_host_only(url);
266+
} else {
267+
return url;
268+
}
269+
}
270+
271+
// UTILS global.js related (passafari_format_url & passafari_format_submit_url)
272+
function passafari_url_host_only(url) {
273+
var link = document.createElement("a");
274+
link.href = url;
275+
276+
return link.host;
277+
}
278+
279+
// UTILS global.js related (passafari_format_url & passafari_format_submit_url)
280+
function passafari_url_protocol_host_only(url) {
281+
var link = document.createElement("a");
282+
link.href = url;
283+
284+
return link.protocol + "//" + link.host;
285+
}
286+
287+
// UTILS global.js related (passafari_format_url & passafari_format_submit_url)
288+
function passafari_url_protocol_host_path_only(url) {
289+
var link = document.createElement("a");
290+
link.href = url;
291+
292+
return link.protocol + "//" + link.host + link.pathname;
293+
}
294+
232295
// UTILS global.js / keepass.js related
233296
function passafari_associate(event) {
234297
if(keepass.isConfigured()) {
@@ -251,21 +314,21 @@ function passafari_associate(event) {
251314
function passafari_retrieve_credentials(callback) {
252315
callback = (callback === undefined) ? function(credentials) {} : callback;
253316
var tab = undefined;
254-
var url = safari.application.activeBrowserWindow.activeTab.url;
255-
var submiturl = undefined;
256-
var forceCallback = false;
257-
var triggerUnlock = true;
317+
var url = passafari_format_url(passafari_active_tab_url());
318+
var submit_url = passafari_format_submit_url(passafari_active_tab_url());
319+
var force_callback = false;
320+
var trigger_unlock = true;
258321

259322
if(url) {
260-
return keepass.retrieveCredentials(callback, tab, url, submiturl, forceCallback, triggerUnlock);
323+
return keepass.retrieveCredentials(callback, tab, url, submit_url, force_callback, trigger_unlock);
261324
} else {
262325
return undefined;
263326
}
264327
}
265328

266329
// UTILS global.js / keepass.js related
267-
function passafari_generate_password(callback, forceCallback) {
330+
function passafari_generate_password(callback, force_callback) {
268331
callback = (callback === undefined) ? function(passwords) {} : callback;
269332

270-
return keepass.generatePassword(callback, undefined, forceCallback);
333+
return keepass.generatePassword(callback, undefined, force_callback);
271334
}

0 commit comments

Comments
 (0)