@@ -4,7 +4,7 @@ import QRCode from "qrcode-reader";
44import { getCredentials } from "./models/credentials" ;
55import { Encryption } from "./models/encryption" ;
66import { EntryStorage , ManagedStorage } from "./models/storage" ;
7- import { Dropbox , Drive } from "./models/backup" ;
7+ import { Dropbox , Drive , OneDrive } from "./models/backup" ;
88import * as uuid from "uuid/v4" ;
99
1010let 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 = "" ;
@@ -272,6 +272,11 @@ function getBackupToken(service: string) {
272272 getCredentials ( ) . drive . client_id +
273273 "&scope=https%3A//www.googleapis.com/auth/drive.file&prompt=consent&redirect_uri=" +
274274 redirUrl ;
275+ } else if ( service === "onedrive" ) {
276+ redirUrl = encodeURIComponent ( chrome . identity . getRedirectURL ( ) ) ;
277+ authUrl = `https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${
278+ getCredentials ( ) . onedrive . client_id
279+ } &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`;
275280 }
276281 chrome . identity . launchWebAuthFlow (
277282 { url : authUrl , interactive : true } ,
@@ -282,7 +287,10 @@ function getBackupToken(service: string) {
282287 let hashMatches = url . split ( "#" ) ;
283288 if ( service === "drive" ) {
284289 hashMatches = url . slice ( 0 , - 1 ) . split ( "?" ) ;
290+ } else if ( service === "onedrive" ) {
291+ hashMatches = url . split ( "?" ) ;
285292 }
293+
286294 if ( hashMatches . length < 2 ) {
287295 return ;
288296 }
@@ -355,6 +363,54 @@ function getBackupToken(service: string) {
355363 }
356364 ) ;
357365 uploadBackup ( "drive" ) ;
366+ } else if ( service === "onedrive" ) {
367+ const xhr = new XMLHttpRequest ( ) ;
368+ // Need to trade code we got from launchWebAuthFlow for a
369+ // token & refresh token
370+ await new Promise (
371+ (
372+ resolve : ( value : boolean ) => void ,
373+ reject : ( reason : Error ) => void
374+ ) => {
375+ xhr . open (
376+ "POST" ,
377+ "https://login.microsoftonline.com/common/oauth2/v2.0/token"
378+ ) ;
379+ xhr . setRequestHeader ( "Accept" , "application/json" ) ;
380+ xhr . setRequestHeader (
381+ "Content-Type" ,
382+ "application/x-www-form-urlencoded"
383+ ) ;
384+ xhr . onreadystatechange = ( ) => {
385+ if ( xhr . readyState === 4 ) {
386+ try {
387+ const res = JSON . parse ( xhr . responseText ) ;
388+ if ( res . error ) {
389+ console . error ( res . error_description ) ;
390+ resolve ( false ) ;
391+ } else {
392+ localStorage . oneDriveToken = res . access_token ;
393+ localStorage . oneDriveRefreshToken =
394+ res . refresh_token ;
395+ resolve ( true ) ;
396+ }
397+ } catch ( error ) {
398+ console . error ( error ) ;
399+ reject ( error ) ;
400+ }
401+ }
402+ return ;
403+ } ;
404+ xhr . send (
405+ `client_id=${
406+ getCredentials ( ) . onedrive . client_id
407+ } &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 (
408+ getCredentials ( ) . onedrive . client_secret
409+ ) } `
410+ ) ;
411+ }
412+ ) ;
413+ uploadBackup ( "onedrive" ) ;
358414 }
359415 }
360416 }
@@ -379,6 +435,11 @@ async function uploadBackup(service: string) {
379435 await drive . upload ( encryption ) ;
380436 break ;
381437
438+ case "onedrive" :
439+ const onedrive = new OneDrive ( ) ;
440+ await onedrive . upload ( encryption ) ;
441+ break ;
442+
382443 default :
383444 break ;
384445 }
0 commit comments