|
@@ -12,7 +12,7 @@ unit uDropBoxClient;
|
|
interface
|
|
interface
|
|
|
|
|
|
uses
|
|
uses
|
|
- Classes, SysUtils, Generics.Collections, DateUtils,
|
|
|
|
|
|
+ Classes, SysUtils, syncobjs, Generics.Collections, DateUtils,
|
|
CocoaAll, uMiniCocoa,
|
|
CocoaAll, uMiniCocoa,
|
|
uMiniHttpClient, uMiniUtil;
|
|
uMiniHttpClient, uMiniUtil;
|
|
|
|
|
|
@@ -89,7 +89,7 @@ type
|
|
{ TDropBoxAuthPKCESession }
|
|
{ TDropBoxAuthPKCESession }
|
|
|
|
|
|
TDropBoxAuthPKCESession = class
|
|
TDropBoxAuthPKCESession = class
|
|
- private
|
|
|
|
|
|
+ strict private
|
|
_config: TDropBoxConfig;
|
|
_config: TDropBoxConfig;
|
|
_codeVerifier: String;
|
|
_codeVerifier: String;
|
|
_state: String;
|
|
_state: String;
|
|
@@ -97,6 +97,7 @@ type
|
|
_token: TDropBoxToken;
|
|
_token: TDropBoxToken;
|
|
_accountID: String;
|
|
_accountID: String;
|
|
_alert: NSAlert;
|
|
_alert: NSAlert;
|
|
|
|
+ _lockObject: TCriticalSection;
|
|
private
|
|
private
|
|
procedure requestAuthorization;
|
|
procedure requestAuthorization;
|
|
procedure waitAuthorizationAndPrompt;
|
|
procedure waitAuthorizationAndPrompt;
|
|
@@ -562,42 +563,59 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
function TDropBoxAuthPKCESession.getAccessToken: String;
|
|
function TDropBoxAuthPKCESession.getAccessToken: String;
|
|
-begin
|
|
|
|
- try
|
|
|
|
- if NOT _token.isValidAccessToken then begin
|
|
|
|
- if _token.isValidFreshToken then begin
|
|
|
|
- self.refreshToken;
|
|
|
|
- end else begin
|
|
|
|
|
|
+ procedure checkToken;
|
|
|
|
+ begin
|
|
|
|
+ try
|
|
|
|
+ if NOT _token.isValidAccessToken then begin
|
|
|
|
+ if _token.isValidFreshToken then begin
|
|
|
|
+ self.refreshToken;
|
|
|
|
+ end else begin
|
|
|
|
+ self.authorize;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ except
|
|
|
|
+ on e: EDropBoxTokenException do begin
|
|
|
|
+ TLogUtil.log( 6, 'Token Error: ' + e.ClassName + ': ' + e.Message );
|
|
|
|
+ _token.invalid;
|
|
self.authorize;
|
|
self.authorize;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
- except
|
|
|
|
- on e: EDropBoxTokenException do begin
|
|
|
|
- TLogUtil.log( 6, 'Token Error: ' + e.ClassName + ': ' + e.Message );
|
|
|
|
- _token.invalid;
|
|
|
|
- self.authorize;
|
|
|
|
- end;
|
|
|
|
end;
|
|
end;
|
|
- Result:= _token.access;
|
|
|
|
|
|
+
|
|
|
|
+begin
|
|
|
|
+ _lockObject.Acquire;
|
|
|
|
+ try
|
|
|
|
+ checkToken;
|
|
|
|
+ Result:= _token.access;
|
|
|
|
+ finally
|
|
|
|
+ _lockObject.Release;
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
constructor TDropBoxAuthPKCESession.Create(const config: TDropBoxConfig);
|
|
constructor TDropBoxAuthPKCESession.Create(const config: TDropBoxConfig);
|
|
begin
|
|
begin
|
|
_config:= config;
|
|
_config:= config;
|
|
_token:= TDropBoxToken.Create;
|
|
_token:= TDropBoxToken.Create;
|
|
|
|
+ _lockObject:= TCriticalSection.Create;
|
|
end;
|
|
end;
|
|
|
|
|
|
destructor TDropBoxAuthPKCESession.Destroy;
|
|
destructor TDropBoxAuthPKCESession.Destroy;
|
|
begin
|
|
begin
|
|
FreeAndNil( _token );
|
|
FreeAndNil( _token );
|
|
|
|
+ FreeAndNil( _lockObject );
|
|
end;
|
|
end;
|
|
|
|
|
|
function TDropBoxAuthPKCESession.authorize: Boolean;
|
|
function TDropBoxAuthPKCESession.authorize: Boolean;
|
|
begin
|
|
begin
|
|
- requestAuthorization;
|
|
|
|
- TThread.Synchronize( TThread.CurrentThread, @waitAuthorizationAndPrompt );
|
|
|
|
- requestToken;
|
|
|
|
- Result:= (_token.access <> EmptyStr);
|
|
|
|
|
|
+ _lockObject.Acquire;
|
|
|
|
+ try
|
|
|
|
+ requestAuthorization;
|
|
|
|
+ TThread.Synchronize( TThread.CurrentThread, @waitAuthorizationAndPrompt );
|
|
|
|
+ requestToken;
|
|
|
|
+ Result:= (_token.access <> EmptyStr);
|
|
|
|
+ finally
|
|
|
|
+ _lockObject.Release;
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TDropBoxAuthPKCESession.setAuthHeader(http: TMiniHttpClient);
|
|
procedure TDropBoxAuthPKCESession.setAuthHeader(http: TMiniHttpClient);
|