@@ -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 = "" ;
@@ -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 }
0 commit comments