browser-extension/extension/background.js

228 lines
5.4 KiB
JavaScript
Raw Normal View History

/*
extension background script listening for events
*/
console.log("running background.js");
let browserType = getBrowser();
// boilerplate to dedect browser type api
function getBrowser() {
if (typeof chrome !== "undefined") {
if (typeof browser !== "undefined") {
return browser;
} else {
return chrome;
}
} else {
console.log("failed to dedect browser");
throw "browser detection error"
};
}
// send get request to API backend
2022-06-20 11:40:17 +00:00
async function sendGet(path) {
2022-06-20 11:40:17 +00:00
let access = await getAccess();
const url = `${access.url}:${access.port}/${path}`;
console.log("GET: " + url);
const rawResponse = await fetch(url, {
method: "GET",
headers: {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": "Token " + access.apiKey,
"mode": "no-cors"
}
});
const content = await rawResponse.json();
return content;
}
2022-06-20 23:50:12 +00:00
// send post/put request to API backend
async function sendData(path, payload, method) {
2022-06-20 11:40:17 +00:00
let access = await getAccess();
const url = `${access.url}:${access.port}/${path}`;
2022-06-20 23:50:12 +00:00
console.log(`${method}: ${url}`);
console.log(`${method}: ${JSON.stringify(payload)}`);
2022-11-24 08:39:05 +00:00
try {
const rawResponse = await fetch(url, {
method: method,
headers: {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": "Token " + access.apiKey,
"mode": "no-cors"
},
body: JSON.stringify(payload)
});
const content = await rawResponse.json();
return content;
} catch (e) {
console.error(e);
return null
}
}
// read access details from storage.local
async function getAccess() {
var storage = await browserType.storage.local.get("access");
return storage.access
}
2022-06-25 13:15:19 +00:00
// check if cookie is valid
async function getCookieState() {
const path = "api/cookie/";
let response = await sendGet(path)
console.log("cookie state: " + JSON.stringify(response));
return response
}
// send ping to server, return response
async function verifyConnection() {
const path = "api/ping/";
2022-06-20 11:40:17 +00:00
let response = await sendGet(path)
console.log("verify connection: " + JSON.stringify(response));
return response
}
2022-11-24 01:36:22 +00:00
// send youtube link from injected buttons
async function youtubeLink(youtubeMessage) {
let path;
let payload;
if (youtubeMessage.action === "download") {
path = "api/download/";
payload = {
"data": [
{
"youtube_id": youtubeMessage.url,
"status": "pending",
}
]
}
} else if (youtubeMessage.action === "subscribe") {
path = "api/channel/";
payload = {
"data": [
{
"channel_id": youtubeMessage.url,
"channel_subscribed": true,
}
]
}
}
2022-06-20 23:50:12 +00:00
let response = await sendData(path, payload, "POST");
2022-05-30 11:02:42 +00:00
return response
}
2022-06-22 12:46:37 +00:00
async function cookieStr(cookieLines) {
const path = "api/cookie/";
let payload = {
2022-06-25 13:15:19 +00:00
"cookie": cookieLines.join("\n")
2022-06-22 12:46:37 +00:00
}
let response = await sendData(path, payload, "PUT");
return response
}
2022-06-20 10:35:57 +00:00
function buildCookieLine(cookie) {
return [
cookie.domain,
2022-06-22 12:46:37 +00:00
"TRUE",
2022-06-20 10:35:57 +00:00
cookie.path,
cookie.httpOnly.toString().toUpperCase(),
Math.trunc(cookie.expirationDate) || 0,
2022-06-20 10:35:57 +00:00
cookie.name,
cookie.value,
].join("\t");
}
async function sendCookies() {
console.log("function sendCookies");
let cookieStores = await browserType.cookies.getAllCookieStores();
var cookieLines = [
2022-06-20 11:37:02 +00:00
"# Netscape HTTP Cookie File",
"# https://curl.haxx.se/rfc/cookie_spec.html",
"# This is a generated file! Do not edit.\n"
2022-06-20 10:35:57 +00:00
];
for (let i = 0; i < cookieStores.length; i++) {
const cookieStore = cookieStores[i];
var allCookiesStore = await browserType.cookies.getAll({
domain: ".youtube.com",
storeId: cookieStore["id"]
});
for (let j = 0; j < allCookiesStore.length; j++) {
const cookie = allCookiesStore[j];
cookieLines.push(buildCookieLine(cookie));
}
}
2022-06-22 12:46:37 +00:00
let response = cookieStr(cookieLines);
return response
2022-06-20 10:35:57 +00:00
}
// process and return message if needed
function handleMessage(request, sender, sendResponse) {
console.log("message background.js listener: " + JSON.stringify(request));
if (request.verify === true) {
let response = verifyConnection();
response.then(message => {
sendResponse(message);
})
} else if (request.youtube) {
2022-11-24 01:36:22 +00:00
let response = youtubeLink(request.youtube);
2022-05-30 11:02:42 +00:00
response.then(message => {
sendResponse(message)
})
2022-06-25 13:15:19 +00:00
} else if (request.cookieState) {
let response = getCookieState();
response.then(message => {
sendResponse(message)
})
} else if (request.sendCookie) {
2022-06-20 10:35:57 +00:00
console.log("backgound: " + JSON.stringify(request));
let response = sendCookies();
2022-06-22 12:46:37 +00:00
response.then(message => {
sendResponse(message)
})
}
return true;
}
browserType.runtime.onMessage.addListener(handleMessage);