fixing authentication + minor issues

This commit is contained in:
msramalho
2023-03-07 22:29:32 +00:00
parent 886dcbab28
commit f2766b994c
10 changed files with 77 additions and 167 deletions

View File

@@ -1,18 +1,15 @@
// Import './options-storage.js';
import optionsStorage from './options-storage.js';
import { getReasonPhrase } from 'http-status-codes';
// const API_ENDPOINT = process.env.API_ENDPOINT || 'http://134.122.58.133:8004/tasks';
const API_ENDPOINT = process.env.API_ENDPOINT || 'http://localhost:8004/tasks';
console.log(`using API_ENDPOINT=${API_ENDPOINT}`)
const LOGIN_FAILED = `Could not login, make sure your google account email has been granted access by the developers.`;
const LOGIN_FAILED = `Please login before using this feature.`;
chrome.runtime.onMessage.addListener(((r, s, sendResponse) => {
processMessages(r, s)
//TODO: improve body
.then(response => {
console.log(`SUCCESS (${r.action}): ${JSON.stringify(response)}`)
sendResponse({ status: "success", result: response })
@@ -74,12 +71,12 @@ function processMessages(request, sender) {
getUrl(resolve, reject);
break;
}
case 'getProfileEmail': {
getProfileEmail(resolve, reject);
case 'oauthLogin': {
oauthLogin(resolve, reject, request.interactive);
break;
}
case 'oauthLogin': {
oauthLogin(resolve, reject);
case 'logout': {
logout(resolve, reject);
break;
}
// No default
@@ -99,28 +96,32 @@ function getUrl(resolve, reject) {
});
}
function getProfileEmail(resolve, reject) {
chrome.identity.getProfileUserInfo({ accountStatus: 'ANY' }, async userInfo => {
resolve(userInfo);
//TODO: reject if bad user info?
});
}
function oauthLogin(resolve, reject) {
function oauthLogin(resolve, reject, interactive) {
try {
chrome.identity.getAuthToken({ interactive: true }, async accessToken => {
console.error(`GOT token ${accessToken}`);
resolve(true);
// force re-auth if interactive is needed
if (interactive) {
chrome.identity.clearAllCachedAuthTokens();
}
chrome.identity.getAuthToken({ interactive: interactive }, async accessToken => {
console.warn(`GOT token ${accessToken}`);
if (accessToken === undefined) { resolve({ success: false, message: "Could not get access token." }); }
resolve({ success: true });
});
} catch (e) {
// reject(new Error(`LOGIN FAILED: ${e}`));
console.error(`LOGIN FAILED: ${e}`);
resolve(false);
resolve({ success: false, message: `Login failed: ${e}` });
}
}
function logout(resolve, reject) {
chrome.identity.clearAllCachedAuthTokens();
resolve(true);
}
function archiveUrl(resolve, reject, optionalUrl) {
chrome.identity.getAuthToken({ interactive: true }, async accessToken => {
chrome.identity.getAuthToken({ interactive: false }, async accessToken => {
if (accessToken == undefined) {
reject(new Error(LOGIN_FAILED));
return;
@@ -148,6 +149,7 @@ function submitUrlArchive(url, accessToken) {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
},
body: JSON.stringify({ url, access_token: accessToken }),
})
@@ -160,7 +162,7 @@ function submitUrlArchive(url, accessToken) {
function checkTaskStatus(resolve, reject, task) {
console.log('API: STATUS');
return new Promise((InnerResolve, innerReject) => {
chrome.identity.getAuthToken({ interactive: true }, async accessToken => {
chrome.identity.getAuthToken({ interactive: false }, async accessToken => {
if (accessToken == undefined) {
reject(new Error(LOGIN_FAILED));
return;
@@ -169,6 +171,7 @@ function checkTaskStatus(resolve, reject, task) {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
},
})
.then(getJsonOrError)
@@ -192,7 +195,7 @@ function checkTaskStatus(resolve, reject, task) {
function search(resolve, reject, url) {
console.log('API: SEARCH');
chrome.identity.getAuthToken({ interactive: true }, async accessToken => {
chrome.identity.getAuthToken({ interactive: false }, async accessToken => {
if (accessToken == undefined) {
reject(new Error(LOGIN_FAILED));
return;
@@ -201,6 +204,7 @@ function search(resolve, reject, url) {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
},
})
.then(getJsonOrError)
@@ -211,7 +215,7 @@ function search(resolve, reject, url) {
async function syncLocalTasks(resolve, reject) {
console.log('API: SYNC');
chrome.identity.getAuthToken({ interactive: true }, async accessToken => {
chrome.identity.getAuthToken({ interactive: false }, async accessToken => {
if (accessToken == undefined) {
reject(new Error(LOGIN_FAILED));
return;
@@ -220,6 +224,7 @@ async function syncLocalTasks(resolve, reject) {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
},
})
.then(getJsonOrError)
@@ -242,7 +247,7 @@ async function syncLocalTasks(resolve, reject) {
async function deleteTask(resolve, reject, taskId) {
console.log('API: DELETE TASK');
chrome.identity.getAuthToken({ interactive: true }, async accessToken => {
chrome.identity.getAuthToken({ interactive: false }, async accessToken => {
if (accessToken == undefined) {
reject(new Error(LOGIN_FAILED));
return;
@@ -251,11 +256,12 @@ async function deleteTask(resolve, reject, taskId) {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
},
})
.then(getJsonOrError)
.then(async deleteOp => {
if(deleteOp.deleted){
if (deleteOp.deleted) {
const storage = await optionsStorage.getAll();
delete storage.archivedUrls[taskId];
await optionsStorage.set(storage);

View File

@@ -6,7 +6,7 @@ export default new OptionsSync({
errorMessage: ""
},
migrations: [
// OptionsSync.migrations.removeUnused,
OptionsSync.migrations.removeUnused,
],
logging: true,
storageType: "local"

View File

@@ -1,29 +0,0 @@
// eslint-disable-next-line import/no-unassigned-import
// import 'webext-base-css';
// import '../css/options.css';
// import optionsStorage from './options-storage.js';
// const rangeInputs = [...document.querySelectorAll('input[type="range"][name^="color"]')];
// const numberInputs = [...document.querySelectorAll('input[type="number"][name^="color"]')];
// const output = document.querySelector('.color-output');
// function updateOutputColor() {
// output.style.backgroundColor = `rgb(${rangeInputs[0].value}, ${rangeInputs[1].value}, ${rangeInputs[2].value})`;
// }
// function updateInputField(event) {
// numberInputs[rangeInputs.indexOf(event.currentTarget)].value = event.currentTarget.value;
// }
// for (const input of rangeInputs) {
// input.addEventListener('input', updateOutputColor);
// input.addEventListener('input', updateInputField);
// }
// async function init() {
// await optionsStorage.syncForm('#options-form');
// updateOutputColor();
// }
// init();

View File

@@ -6,17 +6,7 @@ import 'material-design-icons/iconfont/material-icons.css';
const app = createApp(Popup);
app.mount('#app');
// Import browser from 'webextension-polyfill';
// import optionsStorage from './options-storage.js';
document.addEventListener('DOMContentLoaded', async () => {
// TODO: uncomment if using options
// listenForOptionsClick();
M.Tooltip.init(document.querySelectorAll('.tooltipped'), { enterDelay: 500 }); // enable tooltips
});
// Function listenForOptionsClick() {
// document.querySelector('#optionsBtn').addEventListener('click', () => {
// browser.runtime.openOptionsPage();
// });
// }

View File

@@ -1,19 +0,0 @@
// /**
// *
// *
// */
// export async function callBackground(parameters) {
// try {
// const answer = await chrome.runtime.sendMessage(parameters);
// if (answer.status == "error") {
// console.error(`error: ${answer.result}`)
// //TODO: modal/errors
// return null;
// } else {
// return answer.result;
// }
// } catch (e) {
// console.error(e);
// return null;
// }
// }