mirror of
https://github.com/laurent22/joplin.git
synced 2026-10-25 02:47:28 +00:00
Desktop, Cli: Bind OneDrive OAuth and resource servers to loopback and validate OAuth state
This commit is contained in:
1 parent
eba62ede92
commit
c4c49b6d28
3 files changed
+9
-5
No files matched your search
@@ -84,7 +84,7 @@ class ResourceServer {
|
||||
this.logger().error('Resource server:', error);
|
||||
});
|
||||
|
||||
this.server_.listen(this.port_);
|
||||
this.server_.listen(this.port_, '127.0.0.1');
|
||||
|
||||
enableServerDestroy(this.server_);
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import OneDriveApi from './onedrive-api';
|
||||
|
||||
import * as http from 'http';
|
||||
import * as urlParser from 'url';
|
||||
import { randomBytes } from 'crypto';
|
||||
const enableServerDestroy = require('server-destroy');
|
||||
|
||||
interface DestroyableServer extends http.Server {
|
||||
@@ -57,7 +58,8 @@ export class OneDriveApiNodeUtils {
|
||||
const port = await findAvailablePort(require('tcp-port-used'), this.possibleOAuthDancePorts(), 0);
|
||||
if (!port) throw new Error(_('All potential ports are in use - please report the issue at %s', 'https://github.com/laurent22/joplin'));
|
||||
|
||||
const authCodeUrl = this.api().authCodeUrl(`http://localhost:${port}`);
|
||||
const state = randomBytes(32).toString('base64url');
|
||||
const authCodeUrl = this.api().authCodeUrl(`http://localhost:${port}`, state);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
this.oauthServer_ = http.createServer() as DestroyableServer;
|
||||
@@ -91,6 +93,7 @@ export class OneDriveApiNodeUtils {
|
||||
};
|
||||
|
||||
if (!query.code) return writeResponse(400, '"code" query parameter is missing');
|
||||
if (query.state !== state) return writeResponse(400, '"state" query parameter is invalid');
|
||||
|
||||
this.api()
|
||||
.execTokenRequest(query.code as string, `http://localhost:${port.toString()}`)
|
||||
@@ -118,7 +121,7 @@ export class OneDriveApiNodeUtils {
|
||||
}
|
||||
});
|
||||
|
||||
this.oauthServer_.listen(port);
|
||||
this.oauthServer_.listen(port, '127.0.0.1');
|
||||
|
||||
enableServerDestroy(this.oauthServer_);
|
||||
|
||||
|
||||
@@ -92,14 +92,15 @@ export default class OneDriveApi {
|
||||
return `${r.parentReference.path}/${r.name}`;
|
||||
}
|
||||
|
||||
public authCodeUrl(redirectUri: string) {
|
||||
const query = {
|
||||
public authCodeUrl(redirectUri: string, state: string | null = null) {
|
||||
const query: Record<string, string> = {
|
||||
client_id: this.clientId_,
|
||||
scope: 'files.readwrite offline_access sites.readwrite.all',
|
||||
response_type: 'code',
|
||||
redirect_uri: redirectUri,
|
||||
prompt: 'login',
|
||||
};
|
||||
if (state) query.state = state;
|
||||
return `https://login.microsoftonline.com/common/oauth2/v2.0/authorize?${stringify(query)}`;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user