Update manifest to v3 (Chrome only)

This commit is contained in:
2022-09-26 20:30:40 +02:00
parent 2cb26d6d40
commit 129335dc2d
9 changed files with 403 additions and 363 deletions

View File

@@ -1,5 +1,5 @@
/*
Copyright (C) 2013-2020 Grégory Soutadé
Copyright (C) 2013-2022 Grégory Soutadé
This file is part of gPass.
@@ -17,30 +17,27 @@
along with gPass. If not, see <http://www.gnu.org/licenses/>.
*/
var gpass_enabled = true;
/* from misc.js */
/* Can't directly add it, because it's now a module */
var DEBUG = false;
var browser = browser || chrome;
const SERVER = {OK : 0, FAILED : 1, RESTART_REQUEST : 2};
const GPASS_ICON = {NORMAL:0, DISABLED:1, ACTIVATED:2};
function _notification(message, data)
function debug(s)
{
if (message !== data)
message += data;
options = {
type: "basic",
title : "gPass",
message : message,
iconUrl:browser.extension.getURL("icons/gpass_icon_64.png")
};
browser.notifications.create(options).then(
function created(notification_id)
{
window.setTimeout(function() {
browser.notifications.clear(notification_id);
}, 2000);
}
);
if (DEBUG)
console.log(s);
}
function notify(text, data)
{
browser.runtime.sendMessage({type: "notification", options:{"message":text, "data":data}});
}
var gpass_enabled = true;
function _add_name(logins, name)
{
for(var i=0; i<logins.length; i++)
@@ -77,7 +74,7 @@ function try_get_name(fields, type_filters, match)
{
if (field.hasAttribute("name") && field.value != "")
{
name = field.getAttribute("name");
var name = field.getAttribute("name");
// Subset of common user field
if (name == "user") user = field.value;
else if (name == "usr") user = field.value;
@@ -130,7 +127,7 @@ function on_focus(e)
if (logins.length || all_logins.length)
{
parameters = {
var parameters = {
type:"update_icon",
icon_id:GPASS_ICON.ACTIVATED,
};
@@ -143,7 +140,7 @@ function on_blur(e)
if (!gpass_enabled)
return;
parameters = {
var parameters = {
type:"update_icon",
icon_id:GPASS_ICON.NORMAL,
};
@@ -159,8 +156,8 @@ function on_sumbit(e)
debug("on_submit");
logins = get_logins(form, true);
all_logins = get_logins(form, false);
var logins = get_logins(form, true);
var all_logins = get_logins(form, false);
if (!logins.length)
logins = all_logins;
@@ -174,17 +171,17 @@ function on_sumbit(e)
if (field.getAttribute("type") == "password")
{
password = field.value;
var password = field.value;
if (!password.startsWith("@@") && !password.startsWith("@_"))
continue;
// Remove current value to limit master key stealing
field.value = "";
password_computed = true;
do_submit = !password.startsWith("@_");
mkey = password.substring(2);
var do_submit = !password.startsWith("@_");
var mkey = password.substring(2);
parameters = {
var parameters = {
type:"password",
logins:logins,
domain:domain,
@@ -195,18 +192,19 @@ function on_sumbit(e)
browser.runtime.sendMessage(parameters, {},
function (response) {
debug(response);
var field = fields[response.options.field_id];
switch(response.value)
{
case SERVER.OK:
var field = fields[response.options.field_id];
set_password(form, field, response.password, do_submit)
notify("Password successfully replaced", "");
break;
case SERVER.FAILED:
if (logins.length != all_logins.length)
if (logins.length != all_logins.length && all_logins.length != 0)
{
parameters[logins] = all_logins;
browser.runtime.sendMessage(parameters);
debug("Try with all logins");
parameters[logins] = all_logins;
browser.runtime.sendMessage(parameters);
}
break;
case SERVER.RESTART_REQUEST:
@@ -214,7 +212,7 @@ function on_sumbit(e)
break;
}
}
);
);
}
}
@@ -222,10 +220,9 @@ function on_sumbit(e)
{
debug("No password computed");
form.submit();
return true;
}
return false;
return true;
}
function set_password(form, field, password, do_submit)
@@ -236,7 +233,7 @@ function set_password(form, field, password, do_submit)
if (do_submit)
{
// Propagate change
change_cb = field.onchange;
var change_cb = field.onchange;
if (change_cb)
change_cb();
// Try to type "enter"
@@ -272,7 +269,7 @@ function block_all_forms(doc, do_block)
{
if (do_block)
{
old_cb = form.onsubmit;
var old_cb = form.onsubmit;
if (old_cb)
form.removeEventListener("submit", old_cb);
form.addEventListener("submit", on_sumbit);
@@ -325,13 +322,13 @@ browser.runtime.onMessage.addListener(
debug("getUsername");
if (managed_forms.length == 1)
{
fields = managed_forms[0].getElementsByTagName("input");
var fields = managed_forms[0].getElementsByTagName("input");
type_filters = new Array();
var type_filters = new Array();
// Get all <input type="text"> && <input type="email">
type_filters.push("text");
type_filters.push("email");
logins = try_get_name(fields, type_filters, true);
var logins = try_get_name(fields, type_filters, true);
if (logins.length == 1)
sendResponse(logins[0]);
@@ -347,12 +344,12 @@ browser.runtime.onMessage.addListener(
var response = "";
if (managed_forms.length == 1)
{
fields = managed_forms[0].getElementsByTagName("input");
password_field = null;
var fields = managed_forms[0].getElementsByTagName("input");
var password_field = null;
for (a=0; a<fields.length; a++)
for (var a=0; a<fields.length; a++)
{
field = fields[a];
var field = fields[a];
if (field.getAttribute("type") == "password")
{
if (password_field == null)
@@ -369,12 +366,11 @@ browser.runtime.onMessage.addListener(
if (password_field)
{
set_password(managed_forms[0], password_field,
request.password, request.submit);
request.password, request.submit);
response = "ok";
}
}
sendResponse(response);
return true;
}
else if (request.type == "blockForms")
{
@@ -384,11 +380,13 @@ browser.runtime.onMessage.addListener(
{
unblock_all_forms();
}
return true;
});
function document_loaded()
{
parameters = {
var parameters = {
"type": "is_gpass_enabled",
};

View File

@@ -1,5 +1,5 @@
/*
Copyright (C) 2013-2020 Grégory Soutadé
Copyright (C) 2013-2022 Grégory Soutadé
This file is part of gPass.
@@ -19,13 +19,12 @@
var DEBUG = false;
SERVER = {OK : 0, FAILED : 1, RESTART_REQUEST : 2};
GPASS_ICON = {NORMAL:0, DISABLED:1, ACTIVATED:2};
export const SERVER = {OK : 0, FAILED : 1, RESTART_REQUEST : 2};
export const GPASS_ICON = {NORMAL:0, DISABLED:1, ACTIVATED:2};
var browser = browser || chrome;
var crypto = crypto || window.crypto;
export var browser = browser || chrome;
function notify(text, data)
export function notify(text, data)
{
browser.runtime.sendMessage({type: "notification", options:{"message":text, "data":data}});
}
@@ -54,9 +53,9 @@ function str2ab(str) {
return bufView;
}
function crypto_pbkdf2(mkey, salt, level)
export function crypto_pbkdf2(crypto, mkey, salt, level)
{
AESCBC = {
var AESCBC = {
name: "AES-CBC",
length: 256,
}
@@ -83,9 +82,9 @@ function crypto_pbkdf2(mkey, salt, level)
});
}
function simple_pbkdf2(mkey, salt, level)
export function simple_pbkdf2(crypto, mkey, salt, level)
{
AESCBC = {
var AESCBC = {
name: "AES-CBC",
length: 256,
}
@@ -122,7 +121,7 @@ function _encrypt(mkey, iv, data)
data = str2ab(data);
promise = mkey.then(function(mkey){
var promise = mkey.then(function(mkey){
return crypto.subtle.encrypt({
name: "AES-CBC",
iv: iv
@@ -142,15 +141,15 @@ async function _decrypt(mkey, iv, data)
while ((data.length % 16))
data += "\0";
nulliv = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
pkcs7_padding = new Uint8Array([16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]);
var nulliv = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
var pkcs7_padding = new Uint8Array([16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]);
pkcs7_padding = await _encrypt(mkey, nulliv, ab2str(pkcs7_padding));
data = str2ab(data + pkcs7_padding);
nulliv = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
promise = mkey.then(function(mkey){
var promise = mkey.then(function(mkey){
return crypto.subtle.decrypt({
name: "AES-CBC",
iv: iv
@@ -165,13 +164,14 @@ async function _decrypt(mkey, iv, data)
return promise;
}
async function encrypt_ecb(mkey, data)
export async function encrypt_ecb(mkey, data)
{
var result = "";
var res;
debug("Encrypt ECB " + data);
nulliv = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
var nulliv = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
while (data.length > 16)
{
@@ -186,13 +186,14 @@ async function encrypt_ecb(mkey, data)
return result;
}
async function decrypt_ecb(mkey, data)
export async function decrypt_ecb(mkey, data)
{
var result = "";
var res;
debug("Decrypt ECB " + data);
nulliv = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
var nulliv = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
while (data.length > 16)
{
@@ -207,7 +208,7 @@ async function decrypt_ecb(mkey, data)
return result;
}
async function encrypt_cbc(mkey, iv, data)
export async function encrypt_cbc(mkey, iv, data)
{
debug("Encrypt CBC " + data);
@@ -217,7 +218,7 @@ async function encrypt_cbc(mkey, iv, data)
return result.slice(0, result.length-16);
}
async function decrypt_cbc(mkey, iv, data)
export async function decrypt_cbc(mkey, iv, data)
{
debug("Decrypt CBC " + data);
@@ -227,22 +228,22 @@ async function decrypt_cbc(mkey, iv, data)
return result.slice(0, result.length-16);
}
async function digest(data)
export async function digest(crypto, data)
{
return crypto.subtle.digest("SHA-256", str2ab(data)).then(function (hash) {
return ab2str(hash);
});
}
function wildcard_domain(domain)
export function wildcard_domain(domain)
{
var parts = domain.split(".");
// Standard root domain (zzz.xxx.com) or more
if (parts.length > 2)
{
res = "*.";
for (i=1; i<parts.length; i++)
var res = "*.";
for (var i=1; i<parts.length; i++)
res += parts[i] + ".";
return res.substr(0, res.length-1);
}
@@ -254,14 +255,14 @@ function wildcard_domain(domain)
}
// http://stackoverflow.com/questions/3745666/how-to-convert-from-hex-to-ascii-in-javascript
function hex2a(hex) {
export function hex2a(hex) {
var str = '';
for (var i = 0; i < hex.length; i += 2)
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
return str;
}
function a2hex(_str_) {
export function a2hex(_str_) {
var hex = '';
for (var i = 0; i < _str_.length; i++)
{
@@ -272,8 +273,9 @@ function a2hex(_str_) {
return hex;
}
function debug(s)
export function debug(s)
{
if (DEBUG)
console.log(s);
}

View File

@@ -2,31 +2,29 @@
// (c) Steven Levithan <stevenlevithan.com>
// MIT License
parseURI = {
parseUri : function (str) {
var o = {
export function parseUri (str) {
var o = {
strictMode: false,
key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
q: {
name: "queryKey",
parser: /(?:^|&)([^&=]*)=?([^&]*)/g
name: "queryKey",
parser: /(?:^|&)([^&=]*)=?([^&]*)/g
},
parser: {
strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
}},
m = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
uri = {},
i = 14;
m = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
uri = {},
i = 14;
while (i--) uri[o.key[i]] = m[i] || "";
while (i--) uri[o.key[i]] = m[i] || "";
uri[o.q.name] = {};
uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
if ($1) uri[o.q.name][$1] = $2;
});
uri[o.q.name] = {};
uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
if ($1) uri[o.q.name][$1] = $2;
});
return uri;
}
return uri;
}
};