-
Notifications
You must be signed in to change notification settings - Fork 1
/
background.js
137 lines (119 loc) · 3.98 KB
/
background.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
var uploads = new Map();
var now = new Date();
date = now.toLocaleString().replaceAll("/","-").replaceAll(":","-").replaceAll(",","")
async function getURLs(accountId) {
let accountInfo = await browser.storage.local.get([accountId]);
if (!accountInfo[accountId] || !("private_url" in accountInfo[accountId])) {
throw new Error("No URLs found.");
}
return accountInfo[accountId];
}
browser.cloudFile.onFileUpload.addListener(async (account, { id, name, data }) => {
let urls = await getURLs(account.id);
var filename;
try{
filename = encodeURIComponent(name).split(".")
filename = filename[0] + " " + date
} catch (err){
filename = encodeURIComponent(name)
}
var private_url = urls.private_url + `webdav/$mail_attachments/${filename}/`;
let url = private_url + encodeURIComponent(name);
let uploadInfo = {
id,
name,
url,
abortController: new AbortController(),
};
uploads.set(id, uploadInfo);
let headers = {
"Content-Type": "application/octet-stream",
};
var id_pass = urls.id + ":" + urls.pass
headers.Authorization = "Basic " + window.btoa(id_pass);
let fetchInfo = {
method: "PUT",
headers,
body: data,
signal: uploadInfo.abortController.signal,
};
let createFolder = {
method: "GET",
headers,
};
var getDynamicLink;
var downloadLink;
let response;
var folderID;
getDynamicLink = await fetch(urls.private_url + "api/folders?action=getAll",createFolder)
getDynamicLink = await getDynamicLink.json()
getDynamicLink = getDynamicLink["ResultSet"]["Result"]
getDynamicLink.forEach((folder)=> {
if (folder.internalName=="$mail_attachments"){
folderID = folder.resourceURL
folderID = folderID.split("files/")[1]
}
});
if (!folderID) {
await fetch(urls.private_url + `api/folders?action=create&name=$mail_attachments`, createFolder);
getDynamicLink = await fetch(urls.private_url + "api/folders?action=getAll",createFolder)
getDynamicLink = await getDynamicLink.json()
getDynamicLink = getDynamicLink["ResultSet"]["Result"]
getDynamicLink.forEach((folder)=> {
if (folder.internalName=="$mail_attachments"){
folderID = folder.resourceURL
folderID = folderID.split("files/")[1]
}
});
}
createSubDir = await fetch(urls.private_url + `api/folders/${folderID}?action=createSubdir&dirName=${filename}`,createFolder);
response = await fetch(url, fetchInfo);
downloadLink = await fetch(urls.private_url + `api/filelink/${folderID}/${filename}/${encodeURIComponent(name)}?action=createLink`,createFolder);
downloadLink = await downloadLink.json();
downloadLink = downloadLink["ResultSet"]["Result"][0].downloadUrl;
delete uploadInfo.abortController;
if (response.status > 299) {
throw new Error("response was not ok");
}
if (urls.public_url) {
return { url: downloadLink };
}
return { url: downloadLink };
});
browser.cloudFile.onFileUploadAbort.addListener((account, id) => {
let uploadInfo = uploads.get(id);
if (uploadInfo && uploadInfo.abortController) {
uploadInfo.abortController.abort();
}
});
browser.cloudFile.onFileDeleted.addListener(async (account, id) => {
let uploadInfo = uploads.get(id);
if (!uploadInfo) {
return;
}
let urls = await getURLs(account.id);
let url = uploadInfo.url;
let headers = {};
var id_pass = urls.id + ":" + urls.pass;
headers.Authorization = "Basic " + window.btoa(id_pass);
let fetchInfo = {
headers,
method: "DELETE",
};
let response = await fetch(url, fetchInfo);
uploads.delete(id);
if (response.status > 299) {
throw new Error("response was not ok");
}
});
browser.cloudFile.getAllAccounts().then(async (accounts) => {
let allAccountsInfo = await browser.storage.local.get();
for (let account of accounts) {
await browser.cloudFile.updateAccount(account.id, {
configured: account.id in allAccountsInfo,
});
}
});
browser.cloudFile.onAccountDeleted.addListener((accountId) => {
browser.storage.local.remove(accountId);
});