Skip to content

Commit 9de83ae

Browse files
committed
onedrive support
1 parent 6bd906d commit 9de83ae

File tree

12 files changed

+471
-42
lines changed

12 files changed

+471
-42
lines changed

manifest-chrome.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,10 @@
5656
"https://www.google.com/",
5757
"https://*.dropboxapi.com/*",
5858
"https://www.googleapis.com/*",
59-
"https://accounts.google.com/o/oauth2/revoke"
59+
"https://accounts.google.com/o/oauth2/revoke",
60+
"https://graph.microsoft.com/me/*",
61+
"https://login.microsoftonline.com/common/oauth2/v2.0/token"
6062
],
6163
"offline_enabled": true,
62-
"content_security_policy": "script-src 'self'; font-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; connect-src https://www.google.com/ https://*.dropboxapi.com https://www.googleapis.com/ https://accounts.google.com/o/oauth2/revoke ; default-src 'none'"
64+
"content_security_policy": "script-src 'self'; font-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; connect-src https://www.google.com/ https://*.dropboxapi.com https://www.googleapis.com/ https://accounts.google.com/o/oauth2/revoke https://login.microsoftonline.com/common/oauth2/v2.0/token https://graph.microsoft.com/; default-src 'none'"
6365
}

manifest-firefox.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@
4848
"https://www.google.com/",
4949
"https://*.dropboxapi.com/*",
5050
"https://www.googleapis.com/*",
51-
"https://accounts.google.com/o/oauth2/revoke"
51+
"https://accounts.google.com/o/oauth2/revoke",
52+
"https://graph.microsoft.com/me/*",
53+
"https://login.microsoftonline.com/common/oauth2/v2.0/token"
5254
],
53-
"content_security_policy": "script-src 'self'; font-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; connect-src https://www.google.com/ https://*.dropboxapi.com https://www.googleapis.com/ https://accounts.google.com/o/oauth2/revoke ; default-src 'none'"
55+
"content_security_policy": "script-src 'self'; font-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; connect-src https://www.google.com/ https://*.dropboxapi.com https://www.googleapis.com/ https://accounts.google.com/o/oauth2/revoke https://login.microsoftonline.com/common/oauth2/v2.0/token https://graph.microsoft.com/; default-src 'none'"
5456
}

package-lock.json

Lines changed: 11 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/background.ts

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import QRCode from "qrcode-reader";
44
import { getCredentials } from "./models/credentials";
55
import { Encryption } from "./models/encryption";
66
import { EntryStorage, ManagedStorage } from "./models/storage";
7-
import { Dropbox, Drive } from "./models/backup";
7+
import { Dropbox, Drive, OneDrive } from "./models/backup";
88
import * as uuid from "uuid/v4";
99

1010
let cachedPassphrase = "";
@@ -30,7 +30,7 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
3030
setAutolock();
3131
} else if (message.action === "passphrase") {
3232
sendResponse(cachedPassphrase);
33-
} else if (["dropbox", "drive"].indexOf(message.action) > -1) {
33+
} else if (["dropbox", "drive", "onedrive"].indexOf(message.action) > -1) {
3434
getBackupToken(message.action);
3535
} else if (message.action === "lock") {
3636
cachedPassphrase = "";
@@ -257,6 +257,11 @@ function getBackupToken(service: string) {
257257
getCredentials().drive.client_id +
258258
"&scope=https%3A//www.googleapis.com/auth/drive.file&prompt=consent&redirect_uri=" +
259259
redirUrl;
260+
} else if (service === "onedrive") {
261+
redirUrl = encodeURIComponent(chrome.identity.getRedirectURL());
262+
authUrl = `https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${
263+
getCredentials().onedrive.client_id
264+
}&response_type=code&redirect_uri=${redirUrl}&scope=https%3A%2F%2Fgraph.microsoft.com%2FFiles.ReadWrite.AppFolder%20https%3A%2F%2Fgraph.microsoft.com%2FUser.Read%20offline_access&response_mode=query&prompt=consent`;
260265
}
261266
chrome.identity.launchWebAuthFlow(
262267
{ url: authUrl, interactive: true },
@@ -267,7 +272,10 @@ function getBackupToken(service: string) {
267272
let hashMatches = url.split("#");
268273
if (service === "drive") {
269274
hashMatches = url.slice(0, -1).split("?");
275+
} else if (service === "onedrive") {
276+
hashMatches = url.split("?");
270277
}
278+
271279
if (hashMatches.length < 2) {
272280
return;
273281
}
@@ -340,6 +348,54 @@ function getBackupToken(service: string) {
340348
}
341349
);
342350
uploadBackup("drive");
351+
} else if (service === "onedrive") {
352+
const xhr = new XMLHttpRequest();
353+
// Need to trade code we got from launchWebAuthFlow for a
354+
// token & refresh token
355+
await new Promise(
356+
(
357+
resolve: (value: boolean) => void,
358+
reject: (reason: Error) => void
359+
) => {
360+
xhr.open(
361+
"POST",
362+
"https://login.microsoftonline.com/common/oauth2/v2.0/token"
363+
);
364+
xhr.setRequestHeader("Accept", "application/json");
365+
xhr.setRequestHeader(
366+
"Content-Type",
367+
"application/x-www-form-urlencoded"
368+
);
369+
xhr.onreadystatechange = () => {
370+
if (xhr.readyState === 4) {
371+
try {
372+
const res = JSON.parse(xhr.responseText);
373+
if (res.error) {
374+
console.error(res.error_description);
375+
resolve(false);
376+
} else {
377+
localStorage.oneDriveToken = res.access_token;
378+
localStorage.oneDriveRefreshToken =
379+
res.refresh_token;
380+
resolve(true);
381+
}
382+
} catch (error) {
383+
console.error(error);
384+
reject(error);
385+
}
386+
}
387+
return;
388+
};
389+
xhr.send(
390+
`client_id=${
391+
getCredentials().onedrive.client_id
392+
}&grant_type=authorization_code&scope=https%3A%2F%2Fgraph.microsoft.com%2FFiles.ReadWrite.AppFolder%20https%3A%2F%2Fgraph.microsoft.com%2FUser.Read%20offline_access&code=${value}&redirect_uri=${redirUrl}&client_secret=${encodeURIComponent(
393+
getCredentials().onedrive.client_secret
394+
)}`
395+
);
396+
}
397+
);
398+
uploadBackup("onedrive");
343399
}
344400
}
345401
}
@@ -364,6 +420,11 @@ async function uploadBackup(service: string) {
364420
await drive.upload(encryption);
365421
break;
366422

423+
case "onedrive":
424+
const onedrive = new OneDrive();
425+
await onedrive.upload(encryption);
426+
break;
427+
367428
default:
368429
break;
369430
}

src/components/Popup/MainHeader.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
v-bind:style="{
2727
left: encryption.getEncryptionStatus() ? '70px' : '45px'
2828
}"
29-
v-show="(dropboxToken || driveToken) && !style.isEditing"
29+
v-show="
30+
(dropboxToken || driveToken || oneDriveToken) && !style.isEditing
31+
"
3032
>
3133
<IconSync />
3234
</div>
@@ -76,7 +78,7 @@ import IconCheck from "../../../svg/check.svg";
7678
const computedPrototype = [
7779
mapState("style", ["style"]),
7880
mapState("accounts", ["encryption"]),
79-
mapState("backup", ["driveToken", "dropboxToken"])
81+
mapState("backup", ["driveToken", "dropboxToken", "oneDriveToken"])
8082
];
8183
8284
let computed = {};

0 commit comments

Comments
 (0)