auto login, indicates whether a page is bookmarked

This commit is contained in:
mantaohuang 2020-11-21 23:17:28 -05:00
parent ee03754735
commit 115c71b873
21 changed files with 26916 additions and 10 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
web-ext-artifacts
node_modules

View File

@ -1,21 +1,22 @@
{
"name": "Web Extension for Shaarli",
"description": "Share your link to your Shaarli on Firefox Quantum",
"version": "2.0.0",
"homepage_url": "https://github.com/ikipatang/shaarli-web-extension",
"name": "Web Extension for Shaarli modified",
"description": "Share your link to your Shaarli, test version",
"version": "2.0.1",
"homepage_url": "https://git.hmthsn.com/mantao/shaarli-web-extension",
"manifest_version": 2,
"icons": {
"48": "resources/icons/icon-48.png"
},
"permissions": [
"tabs",
"storage"
"storage",
"contextMenus"
],
"options_ui": {
"page": "src/options/options.html"
},
"background": {
"scripts": ["src/storage.js", "src/background.js"]
"page": "src/background-page.html"
},
"browser_action": {
"default_icon": "resources/icons/icon-24.png",
@ -25,5 +26,15 @@
"browser_style": false,
"default_icon": "resources/icons/icon-24.png",
"default_title": "Share"
}
},
"content_scripts": [
{
"matches": ["*://sl.hmthsn.com/login*"],
"js": ["src/login_helper.js"]
},
{
"matches": ["*://sl.hmthsn.com/*"],
"js": ["src/close_helper.js"]
}
]
}

9747
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -26,5 +26,9 @@
"build": "web-ext build",
"test": "echo \"Error: no test specified\" && exit 1",
"version": "version-changelog CHANGELOG.md"
},
"dependencies": {
"browserify": "^17.0.0",
"unirest": "^0.6.0"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
shaarli-web-extension.xpi Normal file

Binary file not shown.

13
src/background-page.html Normal file
View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
"scripts": ["src/storage.js", "src/background.js"]
<script src="lib/jquery-3.5.1.js"></script>
<script src="lib/crypto-js.js"></script>
<script src="lib/client.js"></script>
<script type="module" src="storage.js"></script>
<script type="module" src="background.js"></script>
</head>
</html>

View File

@ -1,3 +1,7 @@
/**
* Open the given url in a popup
* @param {string} url -
@ -12,9 +16,9 @@ function openInPopup(url, width, height) {
allowScriptsToClose: true,
width,
height,
});
})
}
var last_tab;
/**
* Share Current Tab
* @return {void} -
@ -59,9 +63,125 @@ browser.tabs.query({active: true, currentWindow: true}).then((tabs) => {
showPageAction(tabs[0].id);
});
async function getCurrentTab() {
// Get active tabs in current window
var tabs = await browser.tabs.query({
currentWindow: true,
active: true,
});
if (tabs.length < 1) {
throw new Error("no tab available");
}
// Make sure URL protocol supported
var supportedProtocols = ["https:", "http:", "ftp:", "file:"],
activeTab = tabs[0],
url = document.createElement('a');
if (activeTab.url !== "") {
url.href = activeTab.url;
if (supportedProtocols.indexOf(url.protocol) === -1) {
throw new Error(`protocol "${url.protocol}" is not supported`);
}
}
last_tab = activeTab
return activeTab;
}
async function findLocalBookmark(url){
let data = await browser.storage.local.get("links");
let result = data.links.hasOwnProperty(url);
return result
}
async function updateIcon() {
// Set initial icon
var runtimeUrl = await browser.runtime.getURL("/"),
icon = {path: {
16: "../resources/icons/action-default-16.png",
32: "../resources/icons/action-default-32.png",
64: "../resources/icons/action-default-64.png"
}};
// Firefox allows using empty object as default icon.
// This way, Firefox will use default_icon that defined in manifest.json
// if (runtimeUrl.startsWith("moz")) {
// icon = {};
// }
// Get current active tab
try {
var tab = await getCurrentTab()
var local = await findLocalBookmark(tab.url);
if (local) icon.path = {
16: "../resources/icons/action-bookmarked-16.png",
32: "../resources/icons/action-bookmarked-32.png",
64: "../resources/icons/action-bookmarked-64.png"
}
// console.log("tab:", tab);
// icon.tabId = tab.id;
// browser.pageAction.setIcon(icon);
} catch {}
return browser.browserAction.setIcon(icon);
}
function updateActiveTab() {
updateIcon().catch(err => console.error(err.message));
}
/*
Listeners
*/
browser.tabs.onActivated.addListener(tabActivation);
browser.browserAction.onClicked.addListener(shareCurrentTab);
browser.pageAction.onClicked.addListener(shareCurrentTab);
browser.tabs.onUpdated.addListener(updateActiveTab);
browser.tabs.onActivated.addListener(updateActiveTab);
browser.windows.onFocusChanged.addListener(updateActiveTab);
updateActiveTab();
let onCreated = console.log;
browser.contextMenus.create({
id: "log-selection",
title: "Sync bookmarks",
contexts: ["all"]
}, onCreated);
async function sync_links(){
var token = await browser.storage.local.get("token")
token = token.token
var result = await getLinks(token);
let links = {}
result.forEach((value)=>{
links[value.url] = true;
})
browser.storage.local.set({"links":links});
console.log(links);
}
browser.contextMenus.onClicked.addListener(async function(info, tab) {
switch (info.menuItemId) {
case "log-selection":
await sync_links();
break;
}
})
console.log("addon loaded")
browser.runtime.onMessage.addListener(async (message) => {
console.log("sync signal received",message)
if (message === "sync") {
await new Promise(r => setTimeout(r, 1000));
await sync_links();
await new Promise(r => setTimeout(r, 100));
updateIcon();
}
});
sync_links();
browser.storage.local.set({"attempt":0});

3
src/close_helper.js Normal file
View File

@ -0,0 +1,3 @@
window.onbeforeunload = function() {
browser.runtime.sendMessage("sync");
}

31
src/lib/client.js Normal file
View File

@ -0,0 +1,31 @@
var base64url = function(aStr) { return btoa(aStr.replace(/\+/g,'-').replace(/\//g,'_')).replace(/\=+$/m,'') }
function generateToken(secret){
header = base64url(`{
"typ": "JWT",
"alg": "HS512"
}`);
payload = base64url(`{
"iat": ${Math.floor(Date.now() / 1000)}
}`)
console.log(payload)
// payload = base64url(`{
// "iat": 1605996074
// }`)
var hash = CryptoJS.HmacSHA512(header + '.'+ payload, secret);
var signature = hash.toString(CryptoJS.enc.Base64).replace(/\=+$/m,'').replaceAll('/','_').replaceAll('+','-');
return header + "." + payload + "." + signature
}
async function getLinks(api_token){
let token = generateToken(api_token)
var result = await $.ajax(
{
url: "https://sl.hmthsn.com/api/v1/links",
//url: "http://127.0.0.1:8081/",
type: 'GET',
headers:{"Authorization": 'Bearer ' + token}
} )
return result
}

6059
src/lib/crypto-js.js Normal file

File diff suppressed because it is too large Load Diff

10872
src/lib/jquery-3.5.1.js vendored Normal file

File diff suppressed because it is too large Load Diff

10
src/login_helper.js Normal file
View File

@ -0,0 +1,10 @@
browser.storage.local.get().then(async (storage) => {
if(storage.attempt==0 && storage.login.length && storage.password.length){
await browser.storage.local.set({
attempt: 1
})
document.getElementsByName("login")[0].value=storage.login
document.getElementsByName("password")[0].value=storage.password
document.getElementsByName("loginform")[0].submit()
}
})

View File

@ -14,6 +14,24 @@
<input id="url" type="text" name="url">
</label>
</div>
<div class="row">
<label>
<span>Shaarli API Token</span>
<input id="token" type="text" name="token">
</label>
</div>
<div class="row">
<label>
<span>Shaarli User</span>
<input id="login" type="text" name="login">
</label>
</div>
<div class="row">
<label>
<span>Shaarli Password</span>
<input id="password" type="text" name="password">
</label>
</div>
<div class="row">
<label>
<span>Popup dimensions (px)</span>

View File

@ -29,11 +29,18 @@ function updateUI(restoredSettings) {
const popupHeight = document.querySelector("#popupHeight");
const pageAction = document.querySelector("#pageAction");
const token = document.querySelector("#token");
const login = document.querySelector("#login");
const password = document.querySelector("#password");
// Set HTML input with stored values
url.value = restoredSettings.url;
popupWidth.value = restoredSettings.popupWidth;
popupHeight.value = restoredSettings.popupHeight;
pageAction.checked = restoredSettings.pageAction;
token.value = restoredSettings.token;
login.value = restoredSettings.login;
password.value = restoredSettings.password;
}
/**
@ -45,12 +52,18 @@ function storeSettings() {
const popupWidth = document.querySelector("#popupWidth");
const popupHeight = document.querySelector("#popupHeight");
const pageAction = document.querySelector("#pageAction");
const token = document.querySelector("#token");
const login = document.querySelector("#login");
const password = document.querySelector("#password");
const settings = {
url: url.value,
popupWidth: parseIntDimension(popupWidth.value),
popupHeight: parseIntDimension(popupHeight.value),
pageAction: pageAction.checked,
token: token.value,
login: login.value,
password: password.value,
attempt: 0
};
// console.log('storeSettings settings');
// console.log(settings);

View File

@ -6,6 +6,10 @@ var storage = {
pageAction: false,
popupWidth: 900,
popupHeight: 600,
login: "",
password: "",
token: "",
attempt: 0
}
/**