2017-07-18 20:21:03 +02:00
import { _ } from 'lib/locale.js'
2017-07-06 20:58:01 +02:00
const tcpPortUsed = require ( 'tcp-port-used' ) ;
const http = require ( "http" ) ;
const urlParser = require ( "url" ) ;
const FormData = require ( 'form-data' ) ;
const enableServerDestroy = require ( 'server-destroy' ) ;
class OneDriveApiNodeUtils {
constructor ( api ) {
this . api _ = api ;
}
api ( ) {
return this . api _ ;
}
possibleOAuthDancePorts ( ) {
2017-07-28 20:13:07 +02:00
return [ 9967 , 8967 , 8867 ] ;
2017-07-06 20:58:01 +02:00
}
2017-07-26 23:07:27 +02:00
makePage ( message ) {
const header = `
< ! doctype html >
< html > < head > < meta charset = "utf-8" > < / h e a d > < b o d y > ` ;
const footer = `
< / b o d y > < / h t m l >
` ;
return header + message + footer ;
}
2017-07-06 20:58:01 +02:00
async oauthDance ( targetConsole = null ) {
if ( targetConsole === null ) targetConsole = console ;
this . api ( ) . setAuth ( null ) ;
2017-07-26 23:07:27 +02:00
2017-07-06 20:58:01 +02:00
let ports = this . possibleOAuthDancePorts ( ) ;
let port = null ;
for ( let i = 0 ; i < ports . length ; i ++ ) {
let inUse = await tcpPortUsed . check ( ports [ i ] ) ;
if ( ! inUse ) {
port = ports [ i ] ;
break ;
}
}
2017-07-18 20:49:47 +02:00
if ( ! port ) throw new Error ( _ ( 'All potential ports are in use - please report the issue at %s' , 'https://github.com/laurent22/joplin' ) ) ;
2017-07-06 20:58:01 +02:00
let authCodeUrl = this . api ( ) . authCodeUrl ( 'http://localhost:' + port ) ;
return new Promise ( ( resolve , reject ) => {
let server = http . createServer ( ) ;
let errorMessage = null ;
server . on ( 'request' , ( request , response ) => {
const query = urlParser . parse ( request . url , true ) . query ;
2017-07-26 23:07:27 +02:00
const writeResponse = ( code , message ) => {
2017-07-06 20:58:01 +02:00
response . writeHead ( code , { "Content-Type" : "text/html" } ) ;
2017-07-26 23:07:27 +02:00
response . write ( this . makePage ( message ) ) ;
2017-07-06 20:58:01 +02:00
response . end ( ) ;
}
if ( ! query . code ) return writeResponse ( 400 , '"code" query parameter is missing' ) ;
2017-07-06 21:29:09 +02:00
this . api ( ) . execTokenRequest ( query . code , 'http://localhost:' + port . toString ( ) ) . then ( ( ) => {
2017-07-18 20:21:03 +02:00
writeResponse ( 200 , _ ( 'The application has been authorised - you may now close this browser tab.' ) ) ;
2017-07-06 21:29:09 +02:00
targetConsole . log ( '' ) ;
2017-07-18 20:21:03 +02:00
targetConsole . log ( _ ( 'The application has been successfully authorised.' ) ) ;
2017-07-06 21:29:09 +02:00
server . destroy ( ) ;
} ) . catch ( ( error ) => {
writeResponse ( 400 , error . message ) ;
targetConsole . log ( '' ) ;
targetConsole . log ( error . message ) ;
server . destroy ( ) ;
2017-07-06 20:58:01 +02:00
} ) ;
} ) ;
server . on ( 'close' , ( ) => {
if ( errorMessage ) {
reject ( new Error ( errorMessage ) ) ;
} else {
resolve ( this . api ( ) . auth ( ) ) ;
}
} ) ;
server . listen ( port ) ;
enableServerDestroy ( server ) ;
2017-08-05 00:15:08 +02:00
targetConsole . log ( _ ( 'Please open the following URL in your browser to authenticate the application. The application will create a directory in "Apps/Joplin" and will only read and write files in this directory. It will have no access to any files outside this directory nor to any other personal data. No data will be shared with any third party.' ) ) ;
2017-07-06 20:58:01 +02:00
targetConsole . log ( '' ) ;
targetConsole . log ( authCodeUrl ) ;
} ) ;
}
}
export { OneDriveApiNodeUtils } ;