From 6d2fe962d700be9db7cd4b4eb8f8bc3f21c42f80 Mon Sep 17 00:00:00 2001 From: Remy Lebeau Date: Wed, 1 Jun 2022 11:20:47 -0700 Subject: [PATCH 1/8] Adding APort parameter to SASL authentications. Needed for OAUTH10A and OAUTHBEARER. --- Lib/Protocols/IdDICT.pas | 2 +- Lib/Protocols/IdIMAP4.pas | 8 +- Lib/Protocols/IdPOP3.pas | 2 +- Lib/Protocols/IdSASL.pas | 32 ++++- Lib/Protocols/IdSASLCollection.pas | 71 +++++++--- Lib/Protocols/IdSASLOAuth.pas | 203 +++++++++++++++++++++++++++++ Lib/Protocols/IdSMTP.pas | 4 +- 7 files changed, 289 insertions(+), 33 deletions(-) create mode 100644 Lib/Protocols/IdSASLOAuth.pas diff --git a/Lib/Protocols/IdDICT.pas b/Lib/Protocols/IdDICT.pas index 601127c79..bcd38d62f 100644 --- a/Lib/Protocols/IdDICT.pas +++ b/Lib/Protocols/IdDICT.pas @@ -178,7 +178,7 @@ procedure TIdDICT.Connect; end; end; end else begin - FSASLMechanisms.LoginSASL('SASLAUTH',FHost, 'dict', ['230'], ['330'], Self, FCapabilities, ''); {do not localize} + FSASLMechanisms.LoginSASL('SASLAUTH', FHost, FPort, 'dict', ['230'], ['330'], Self, FCapabilities, ''); {do not localize} end; if FTryMIME and IsCapaSupported('MIME') then begin {do not localize} SendCmd('OPTION MIME'); {do not localize} diff --git a/Lib/Protocols/IdIMAP4.pas b/Lib/Protocols/IdIMAP4.pas index de2db6382..48e404fc0 100644 --- a/Lib/Protocols/IdIMAP4.pas +++ b/Lib/Protocols/IdIMAP4.pas @@ -1390,7 +1390,7 @@ function PerformSASLLogin_IMAP(ASASL: TIdSASL; AEncoder: TIdEncoder; // TODO: use UTF-8 when base64-encoding strings... if AClient.IsCapabilityListed('SASL-IR') then begin {Do not localize} - if ASASL.TryStartAuthenticate(AClient.Host, IdGSKSSN_imap, S) then begin + if ASASL.TryStartAuthenticate(AClient.Host, AClient.Port, IdGSKSSN_imap, S) then begin AClient.SendCmd(AClient.NewCmdCounter, 'AUTHENTICATE ' + String(ASASL.ServiceName) + ' ' + AEncoder.Encode(S), [], True); {Do not Localize} if CheckStrFail(AClient.LastCmdResult.Code, AOkReplies, AContinueReplies) then begin ASASL.FinishAuthenticate; @@ -1415,7 +1415,7 @@ function PerformSASLLogin_IMAP(ASASL: TIdSASL; AEncoder: TIdEncoder; // must be a continue reply... if not AuthStarted then begin S := ADecoder.DecodeString(TrimRight(TIdReplyIMAP4(AClient.LastCmdResult).Extra.Text)); - S := ASASL.StartAuthenticate(S, AClient.Host, IdGSKSSN_imap); + S := ASASL.StartAuthenticate(S, AClient.Host, AClient.Port, IdGSKSSN_imap); AClient.IOHandler.WriteLn(AEncoder.Encode(S)); AClient.GetInternalResponse(AClient.LastCmdCounter, [], True); if CheckStrFail(AClient.LastCmdResult.Code, AOkReplies, AContinueReplies) then @@ -1426,7 +1426,7 @@ function PerformSASLLogin_IMAP(ASASL: TIdSASL; AEncoder: TIdEncoder; end; while PosInStrArray(AClient.LastCmdResult.Code, AContinueReplies) > -1 do begin S := ADecoder.DecodeString(TrimRight(TIdReplyIMAP4(AClient.LastCmdResult).Extra.Text)); - S := ASASL.ContinueAuthenticate(S, AClient.Host, IdGSKSSN_imap); + S := ASASL.ContinueAuthenticate(S, AClient.Host, AClient.Port, IdGSKSSN_imap); AClient.IOHandler.WriteLn(AEncoder.Encode(S)); AClient.GetInternalResponse(AClient.LastCmdCounter, [], True); if CheckStrFail(AClient.LastCmdResult.Code, AOkReplies, AContinueReplies) then @@ -2426,7 +2426,7 @@ procedure TIdIMAP4.Login; if not FHasCapa then begin Capability; end; - // FSASLMechanisms.LoginSASL('AUTHENTICATE', FHost, IdGSKSSN_imap, [IMAP_OK], [IMAP_CONT], Self, FCapabilities, 'AUTH', IsCapabilityListed('SASL-IR')); {Do not Localize} + // FSASLMechanisms.LoginSASL('AUTHENTICATE', FHost, FPort, IdGSKSSN_imap, [IMAP_OK], [IMAP_CONT], Self, FCapabilities, 'AUTH', IsCapabilityListed('SASL-IR')); {Do not Localize} TIdSASLEntriesIMAP4(FSASLMechanisms).LoginSASL_IMAP(Self); end; FConnectionState := csAuthenticated; diff --git a/Lib/Protocols/IdPOP3.pas b/Lib/Protocols/IdPOP3.pas index 24d6e7158..906decfb3 100644 --- a/Lib/Protocols/IdPOP3.pas +++ b/Lib/Protocols/IdPOP3.pas @@ -340,7 +340,7 @@ procedure TIdPOP3.Login; // (which was formalized in RFC 5034). So, until we can handle that // descrepency better, we will simply disable Initial-Response for now. - FSASLMechanisms.LoginSASL('AUTH', FHost, IdGSKSSN_pop, [ST_OK], [ST_SASLCONTINUE], Self, Capabilities, 'SASL'); {do not localize} + FSASLMechanisms.LoginSASL('AUTH', FHost, FPort, IdGSKSSN_pop, [ST_OK], [ST_SASLCONTINUE], Self, Capabilities, 'SASL'); {do not localize} end; end; end; diff --git a/Lib/Protocols/IdSASL.pas b/Lib/Protocols/IdSASL.pas index 71ec241e9..1177edc49 100644 --- a/Lib/Protocols/IdSASL.pas +++ b/Lib/Protocols/IdSASL.pas @@ -86,9 +86,13 @@ TIdSASL = class(TIdBaseComponent) which can remove an unnecessary round-trip if both parties support it. } //SASL AProtocolName must be a name from "http://www.iana.org/assignments/gssapi-service-names" - function TryStartAuthenticate(const AHost, AProtocolName : string; var VInitialResponse: string): Boolean; virtual; - function StartAuthenticate(const AChallenge, AHost, AProtocolName : string): string; virtual; abstract; - function ContinueAuthenticate(const ALastResponse, AHost, AProtocolName : string): string; virtual; + function TryStartAuthenticate(const AHost, AProtocolName : string; var VInitialResponse: string): Boolean; virtual; overload; {$IFDEF HAS_DEPRECATED}deprecated{$IFDEF HAS_DEPRECATED_MSG} 'Use overload with APort parameter'{$ENDIF};{$ENDIF} + function StartAuthenticate(const AChallenge, AHost, AProtocolName : string): string; virtual; overload; {$IFDEF HAS_DEPRECATED}deprecated{$IFDEF HAS_DEPRECATED_MSG} 'Use overload with APort parameter'{$ENDIF};{$ENDIF} + function ContinueAuthenticate(const ALastResponse, AHost, AProtocolName : string): string; virtual; overload; {$IFDEF HAS_DEPRECATED}deprecated{$IFDEF HAS_DEPRECATED_MSG} 'Use overload with APort parameter'{$ENDIF};{$ENDIF} + + function TryStartAuthenticate(const AHost: string; const APort: TIdPort; const AProtocolName : string; var VInitialResponse: string): Boolean; virtual; overload; + function StartAuthenticate(const AChallenge, AHost: string; const APort: TIdPort; const AProtocolName : string): string; virtual; overload; + function ContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort; const AProtocolName : string): string; virtual; overload; { For cleaning up after Authentication } procedure FinishAuthenticate; virtual; @@ -163,9 +167,29 @@ function TIdSASL.TryStartAuthenticate(const AHost, AProtocolName : string; var V Result := False; end; +function TIdSASL.TryStartAuthenticate(const AHost: string; const APort: TIdPort; const AProtocolName : string; var VInitialResponse: string): Boolean; +begin + Result := TryStartAuthenticate(AHost, AProtocolName, VInitialResponse); +end; + +function TIdSASL.StartAuthenticate(const AChallenge, AHost, AProtocolName : string): string; +begin + Result := ''; +end; + +function TIdSASL.StartAuthenticate(const AChallenge, AHost: string; const APort: TIdPort; const AProtocolName : string): string; +begin + Result := StartAuthenticate(AChallenge, AHost, AProtocolName); +end; + function TIdSASL.ContinueAuthenticate(const ALastResponse, AHost, AProtocolName : string): string; begin - // intentionally empty + Result := ''; +end; + +function TIdSASL.ContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort; const AProtocolName : string): string; +begin + Result := ContinueAuthenticate(ALastResponse, AHost, AProtocolName); end; procedure TIdSASL.FinishAuthenticate; diff --git a/Lib/Protocols/IdSASLCollection.pas b/Lib/Protocols/IdSASLCollection.pas index 5dc79139d..8f33c93e7 100644 --- a/Lib/Protocols/IdSASLCollection.pas +++ b/Lib/Protocols/IdSASLCollection.pas @@ -80,10 +80,18 @@ TIdSASLEntries = class ( TOwnedCollection ) constructor Create ( AOwner : TPersistent ); reintroduce; function Add: TIdSASLListEntry; procedure LoginSASL(const ACmd, AHost, AProtocolName: String; + const AOkReplies, AContinueReplies: array of string; AClient : TIdTCPConnection; + ACapaReply : TStrings; const AAuthString : String = 'AUTH'; {Do not Localize} + ACanAttemptIR: Boolean = True); overload; {$IFDEF HAS_DEPRECATED}deprecated{$IFDEF HAS_DEPRECATED_MSG} 'Use overload with APort parameter'{$ENDIF};{$ENDIF} + procedure LoginSASL(const ACmd, AHost; const APort: TIdPort; const AProtocolName: String; const AOkReplies, AContinueReplies: array of string; AClient : TIdTCPConnection; ACapaReply : TStrings; const AAuthString : String = 'AUTH'; {Do not Localize} ACanAttemptIR: Boolean = True); overload; procedure LoginSASL(const ACmd, AHost, AProtocolName, AServiceName: String; + const AOkReplies, AContinueReplies: array of string; AClient : TIdTCPConnection; + ACapaReply : TStrings; const AAuthString : String = 'AUTH'; {Do not Localize} + ACanAttemptIR: Boolean = True); overload; {$IFDEF HAS_DEPRECATED}deprecated{$IFDEF HAS_DEPRECATED_MSG} 'Use overload with APort parameter'{$ENDIF};{$ENDIF} + procedure LoginSASL(const ACmd, AHost; const APort: TIdPort; const AProtocolName, AServiceName: String; const AOkReplies, AContinueReplies: array of string; AClient : TIdTCPConnection; ACapaReply : TStrings; const AAuthString : String = 'AUTH'; {Do not Localize} ACanAttemptIR: Boolean = True); overload; @@ -188,8 +196,8 @@ function CheckStrFail(const AStr : String; const AOk, ACont: array of string) : (PosInStrArray(AStr, ACont) = -1); end; -function PerformSASLLogin(const ACmd, AHost, AProtocolName: String; ASASL: TIdSASL; - AEncoder: TIdEncoder; ADecoder: TIdDecoder; const AOkReplies, AContinueReplies: array of string; +function PerformSASLLogin(const ACmd, AHost: string; const APort: TIdPort; const AProtocolName: String; + ASASL: TIdSASL; AEncoder: TIdEncoder; ADecoder: TIdDecoder; const AOkReplies, AContinueReplies: array of string; AClient : TIdTCPConnection; ACanAttemptIR: Boolean): Boolean; var S: String; @@ -220,8 +228,10 @@ function PerformSASLLogin(const ACmd, AHost, AProtocolName: String; ASASL: TIdSA // fails here for POP3 then re-attempt without Initial-Response before // exiting with a failure. + // TODO: use UTF-8 when base64-encoding strings... + if ACanAttemptIR then begin - if ASASL.TryStartAuthenticate(AHost, AProtocolName, S) then begin + if ASASL.TryStartAuthenticate(AHost, APort, AProtocolName, S) then begin AClient.SendCmd(ACmd + ' ' + String(ASASL.ServiceName) + ' ' + AEncoder.Encode(S), []);//[334, 504]); if CheckStrFail(AClient.LastCmdResult.Code, AOkReplies, AContinueReplies) then begin if not TextIsSame(AProtocolName, IdGSKSSN_pop) then begin @@ -249,7 +259,7 @@ function PerformSASLLogin(const ACmd, AHost, AProtocolName: String; ASASL: TIdSA // must be a continue reply... if not AuthStarted then begin S := ADecoder.DecodeString(TrimRight(AClient.LastCmdResult.Text.Text)); - S := ASASL.StartAuthenticate(S, AHost, AProtocolName); + S := ASASL.StartAuthenticate(S, AHost, APort, AProtocolName); AClient.SendCmd(AEncoder.Encode(S)); if CheckStrFail(AClient.LastCmdResult.Code, AOkReplies, AContinueReplies) then begin @@ -259,7 +269,7 @@ function PerformSASLLogin(const ACmd, AHost, AProtocolName: String; ASASL: TIdSA end; while PosInStrArray(AClient.LastCmdResult.Code, AContinueReplies) > -1 do begin S := ADecoder.DecodeString(TrimRight(AClient.LastCmdResult.Text.Text)); - S := ASASL.ContinueAuthenticate(S, AHost, AProtocolName); + S := ASASL.ContinueAuthenticate(S, AHost, APort, AProtocolName); AClient.SendCmd(AEncoder.Encode(S)); if CheckStrFail(AClient.LastCmdResult.Code, AOkReplies, AContinueReplies) then begin @@ -335,9 +345,18 @@ function TIdSASLEntries.Insert(Index: Integer): TIdSASLListEntry; TIdSASLList = TList; {$ENDIF} +{$I IdDeprecatedImplBugOff.inc} procedure TIdSASLEntries.LoginSASL(const ACmd, AHost, AProtocolName: String; const AOkReplies, AContinueReplies: array of string; AClient: TIdTCPConnection; ACapaReply: TStrings; const AAuthString: String; ACanAttemptIR: Boolean); +{$I IdDeprecatedImplBugOn.inc} +begin + LoginSASL(ACmd, AHost, 0, AProtocolName, AOkReplies, AContinueReplies, AClient, ACapaReply, AAuthString, ACanAttemptIR); +end; + +procedure TIdSASLEntries.LoginSASL(const ACmd, AHost; const APort: TIdPort; const AProtocolName: String; + const AOkReplies, AContinueReplies: array of string; AClient: TIdTCPConnection; + ACapaReply: TStrings; const AAuthString: String; ACanAttemptIR: Boolean); var i : Integer; LE : TIdEncoderMIME; @@ -360,23 +379,23 @@ procedure TIdSASLEntries.LoginSASL(const ACmd, AHost, AProtocolName: String; con //create a list of mechanisms that both parties support LSASLList := TIdSASLList.Create; try - LSupportedSASL := TStringList.Create; - try - ParseCapaReplyToList(ACapaReply, LSupportedSASL, AAuthString); - for i := Count-1 downto 0 do begin - LSASL := Items[i].SASL; - if LSASL <> nil then begin - if not LSASL.IsAuthProtocolAvailable(LSupportedSASL) then begin - Continue; - end; - if LSASLList.IndexOf(LSASL) = -1 then begin - LSASLList.Add(LSASL); + LSupportedSASL := TStringList.Create; + try + ParseCapaReplyToList(ACapaReply, LSupportedSASL, AAuthString); + for i := Count-1 downto 0 do begin + LSASL := Items[i].SASL; + if LSASL <> nil then begin + if not LSASL.IsAuthProtocolAvailable(LSupportedSASL) then begin + Continue; + end; + if LSASLList.IndexOf(LSASL) = -1 then begin + LSASLList.Add(LSASL); + end; end; end; + finally + FreeAndNil(LSupportedSASL); end; - finally - FreeAndNil(LSupportedSASL); - end; if LSASLList.Count = 0 then begin raise EIdSASLNotSupported.Create(RSSASLNotSupported); @@ -400,7 +419,7 @@ procedure TIdSASLEntries.LoginSASL(const ACmd, AHost, AProtocolName: String; con if not Assigned(LD) then begin LD := TIdDecoderMIME.Create(nil); end; - if PerformSASLLogin(ACmd, AHost, AProtocolName, LSASL, LE, LD, AOkReplies, AContinueReplies, AClient, ACanAttemptIR) then begin + if PerformSASLLogin(ACmd, AHost, APort, AProtocolName, LSASL, LE, LD, AOkReplies, AContinueReplies, AClient, ACanAttemptIR) then begin Exit; end; if not Assigned(LError) then begin @@ -426,9 +445,19 @@ procedure TIdSASLEntries.LoginSASL(const ACmd, AHost, AProtocolName: String; con end; end; +{$I IdDeprecatedImplBugOff.inc} procedure TIdSASLEntries.LoginSASL(const ACmd, AHost, AProtocolName, AServiceName: String; const AOkReplies, AContinueReplies: array of string; AClient: TIdTCPConnection; ACapaReply: TStrings; const AAuthString: String; ACanAttemptIR: Boolean); +{$I IdDeprecatedImplBugOn.inc} +begin + LoginSASL(ACmd, AHost, 0, AProtocolName, AServiceName, AOkReplies, AContinueReplies, AClient, ACapaReply, AAuthString, ACanAttemptIR); +end; + +procedure TIdSASLEntries.LoginSASL(const ACmd, AHost: string; const APort: TIdPort; + const AProtocolName, AServiceName: String; + const AOkReplies, AContinueReplies: array of string; AClient: TIdTCPConnection; + ACapaReply: TStrings; const AAuthString: String; ACanAttemptIR: Boolean); var LE : TIdEncoderMIME; LD : TIdDecoderMIME; @@ -463,7 +492,7 @@ procedure TIdSASLEntries.LoginSASL(const ACmd, AHost, AProtocolName, AServiceNam try LD := TIdDecoderMIME.Create(nil); try - if not PerformSASLLogin(ACmd, AHost, AProtocolName, LSASL, LE, LD, AOkReplies, AContinueReplies, AClient, ACanAttemptIR) then begin + if not PerformSASLLogin(ACmd, AHost, APort, AProtocolName, LSASL, LE, LD, AOkReplies, AContinueReplies, AClient, ACanAttemptIR) then begin AClient.RaiseExceptionForLastCmdResult; end; finally diff --git a/Lib/Protocols/IdSASLOAuth.pas b/Lib/Protocols/IdSASLOAuth.pas new file mode 100644 index 000000000..eca6be876 --- /dev/null +++ b/Lib/Protocols/IdSASLOAuth.pas @@ -0,0 +1,203 @@ +{ + $Project$ + $Workfile$ + $Revision$ + $DateUTC$ + $Id$ + + This file is part of the Indy (Internet Direct) project, and is offered + under the dual-licensing agreement described on the Indy website. + (http://www.indyproject.org/) + + Copyright: + (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved. +} +{ + $Log$ +} + +unit IdSASLOAuth; + +interface + +{$i IdCompilerDefines.inc} + +uses + IdGlobal, + IdSASL, + IdSASLUserPass; + +type + TIdSASLOAuth2BearerTokenEvent = procedure(Sender: TObject; var AccessToken: String) of object; + + { + Implements RFC 7628 + A Set of Simple Authentication and Security Layer (SASL) Mechanisms for OAuth + } + + TIdSASLOAuth2Base = class(TIdSASLUserPass) + protected + FOnGetAccessToken: TIdSASLOAuth2BearerTokenEvent; + + function DoStartAuthenticate(const AHost: string; const APort: TIdPort; const AAccessToken: string): String; virtual; abstract; + function DoContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort): String; virtual; abstract; + + public + function TryStartAuthenticate(const AHost: string; const APort: TIdPort; const AProtocolName : string; var VInitialResponse: String): Boolean; override; + function StartAuthenticate(const AChallenge, AHost: string; const APort: TIdPort; const AProtocolName : string) : String; override; + function ContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort; const AProtocolName : String): String; override; + + function IsReadyToStart: Boolean; override; + + published + property OnGetAccessToken: TIdSASLOAuth2BearerTokenEvent read FOnGetAccessToken write FOnGetAccessToken; + end; + + TIdSASLOAuth2Bearer = class(TIdSASLOAuth2Base) + protected + function DoStartAuthenticate(const AHost: string; const APort: TIdPort; const AAccessToken: string): String; override; + function DoContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort): String; override; + public + class function ServiceName: TIdSASLServiceName; override; + end; + + TIdSASLOAuth10ATokenEvent = procedure(Sender: TObject; var ARealm, AConsumerKey, AAccessToken, ASignatureMethod, ATimestamp, ANonce, ASignature: String) of object; + + TIdSASLOAuth10A = class(TIdSASLUserPass) + protected + FOnGetAccessToken: TIdSASLOAuth10ATokenEvent; + + public + class function ServiceName: TIdSASLServiceName; override; + + function TryStartAuthenticate(const AHost: string; const APort: TIdPort; const AProtocolName : string; var VInitialResponse: String): Boolean; override; + function StartAuthenticate(const AChallenge, AHost: string; const APort: TIdPort; const AProtocolName : string) : String; override; + function ContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort; const AProtocolName : String): String; override; + + function IsReadyToStart: Boolean; override; + + published + property OnGetAccessToken: TIdSASLOAuth10ATokenEvent read FOnGetAccessToken write FOnGetAccessToken; + end; + + { + Implements Google's XOAUTH2 extension + } + + TIdSASLXOAuth2 = class(TIdSASLOAuth2Base) + protected + function DoStartAuthenticate(const AHost: string; const APort: TIdPort; const AAccessToken: string): String; override; + function DoContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort): String; override; + public + class function ServiceName: TIdSASLServiceName; override; + end; + +implementation + +uses + SysUtils; + +{ TIdSASLOAuth2BearerBase } + +function TIdSASLOAuth2Base.TryStartAuthenticate(const AHost: string; const APort: TIdPort; const AProtocolName : string; var VInitialResponse: String): Boolean; +var + LToken: String; +begin + LToken := GetPassword; + if (LToken = '') and Assigned(FOnGetAccessToken) then begin + FOnGetAccessToken(Self, LToken); + end; + VInitialResponse := DoStartAuthenticate(AHost, APort, LToken); + Result := True; +end; + +function TIdSASLOAuth2Base.StartAuthenticate(const AChallenge, AHost: string; const APort: TIdPort; const AProtocolName : string) : String; +begin + TryStartAuthenticate(AHost, APort, AProtocolName, Result); +end; + +function TIdSASLOAuth2Base.ContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort; const AProtocolName : String): String; +begin + // TODO: parse response JSON for 'status', 'scope', and 'openid-configuration' values... + Result := DoContinueAuthenticate(ALastResponse, AHost, APort); +end; + +function TIdSASLOAuth2Base.IsReadyToStart: Boolean; +begin + Result := (GetUsername <> '') and ((GetPassword <> '') or Assigned(FOnGetAccessToken)); +end; + +{ TIdSASLOAuthBearer } + +class function TIdSASLOAuth2Bearer.ServiceName: TIdSASLServiceName; +begin + Result := 'OAUTHBEARER'; {do not localize} +end; + +function TIdSASLOAuth2Bearer.DoStartAuthenticate(const AHost: string; const APort: TIdPort; const AAccessToken: string): String; +begin + Result := Format('n,a=%s,'#1'host=%s'#1'port=%d'#1'auth=Bearer %s'#1#1, [GetUserName(), AHost, APort, AAccessToken]); +end; + +function TIdSASLOAuth2Bearer.DoContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort): String; +begin + Result := #1; +end; + +{ TIdSASLOAuth10A } + +class function TIdSASLOAuth10A.ServiceName: TIdSASLServiceName; +begin + Result := 'OAUTH10A'; {do not localize} +end; + +function TIdSASLOAuth10A.TryStartAuthenticate(const AHost: string; const APort: TIdPort; const AProtocolName : string; + var VInitialResponse: String): Boolean; +var + LRealm, LKey, LToken, LMethod, LTimestamp, LNonce, LSignature: string; +begin + // TODO: add properties for these values... + if Assigned(FOnGetAccessToken) then begin + FOnGetAccessToken(Self, LRealm, LKey, LToken, LMethod, LTimestamp, LNonce, LSignature); + end; + VInitialResponse := Format( + 'n,a=%s,'#1'host=%s'#1'port=%d'#1'auth=OAuth realm="%s",oauth_consumer_key="%s",oauth_token="%s",oauth_signature_method="%s",oauth_timestamp="%s",oauth_nonce="%s",oauth_signature="%s"'#1#1, {do not localize} + [GetUsername, AHost, APort, LRealm, LKey, LToken, LMethod, LTimestamp, LNonce, LSignature] + ); + Result := True; +end; + +function TIdSASLOAuth10A.StartAuthenticate(const AChallenge, AHost: string; const APort: TIdPort; const AProtocolName : string) : String; +begin + TryStartAuthenticate(AHost, APort, AProtocolName, Result); +end; + +function TIdSASLOAuth10A.ContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort; const AProtocolName : String): String; +begin + // TODO: parse response JSON for 'status', 'scope', and 'openid-configuration' values... + Result := #1; +end; + +function TIdSASLOAuth10A.IsReadyToStart: Boolean; +begin + Result := (GetUsername <> '') and Assigned(FOnGetAccessToken); +end; + +{ TIdSASLXOAuth2 } + +class function TIdSASLXOAuth2.ServiceName: TIdSASLServiceName; +begin + Result := 'XOAUTH2'; {do not localize} +end; + +function TIdSASLXOAuth2.DoStartAuthenticate(const AHost: string; const APort: TIdPort; const AAccessToken : string): String; +begin + Result := Format('user=%s'#1'auth=Bearer %s'#1#1, [GetUsername, AAccessToken]); {do not localize} +end; + +function TIdSASLXOAuth2.DoContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort): String; +begin + Result := ''; +end; + +end. \ No newline at end of file diff --git a/Lib/Protocols/IdSMTP.pas b/Lib/Protocols/IdSMTP.pas index 87b9095aa..7988db1d1 100644 --- a/Lib/Protocols/IdSMTP.pas +++ b/Lib/Protocols/IdSMTP.pas @@ -326,7 +326,7 @@ function TIdSMTP.Authenticate : Boolean; RLebeau: TODO - implement the following code in the future instead of the code below. This way, TIdSASLLogin can be utilized here. - SASLMechanisms.LoginSASL('AUTH', FHost, IdGSKSSN_smtp, 'LOGIN', ['235'], ['334'], Self, Capabilities); + SASLMechanisms.LoginSASL('AUTH', FHost, FPort, IdGSKSSN_smtp, 'LOGIN', ['235'], ['334'], Self, Capabilities); FDidAuthenticate := True; Or better, if the SASLMechanisms is empty, put some default entries @@ -363,7 +363,7 @@ function TIdSMTP.Authenticate : Boolean; end; satSASL: begin - SASLMechanisms.LoginSASL('AUTH', FHost, IdGSKSSN_smtp, ['235'], ['334'], Self, Capabilities); {do not localize} + SASLMechanisms.LoginSASL('AUTH', FHost, FPort, IdGSKSSN_smtp, ['235'], ['334'], Self, Capabilities); {do not localize} FDidAuthenticate := True; end; end; From 45226136f6044cd2aef523715040d9889f2ae48f Mon Sep 17 00:00:00 2001 From: Remy Lebeau Date: Wed, 1 Jun 2022 12:14:52 -0700 Subject: [PATCH 2/8] Removing 'deprecated' from TIdSASL methods --- Lib/Protocols/IdSASL.pas | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/Protocols/IdSASL.pas b/Lib/Protocols/IdSASL.pas index 1177edc49..999a5de43 100644 --- a/Lib/Protocols/IdSASL.pas +++ b/Lib/Protocols/IdSASL.pas @@ -86,9 +86,9 @@ TIdSASL = class(TIdBaseComponent) which can remove an unnecessary round-trip if both parties support it. } //SASL AProtocolName must be a name from "http://www.iana.org/assignments/gssapi-service-names" - function TryStartAuthenticate(const AHost, AProtocolName : string; var VInitialResponse: string): Boolean; virtual; overload; {$IFDEF HAS_DEPRECATED}deprecated{$IFDEF HAS_DEPRECATED_MSG} 'Use overload with APort parameter'{$ENDIF};{$ENDIF} - function StartAuthenticate(const AChallenge, AHost, AProtocolName : string): string; virtual; overload; {$IFDEF HAS_DEPRECATED}deprecated{$IFDEF HAS_DEPRECATED_MSG} 'Use overload with APort parameter'{$ENDIF};{$ENDIF} - function ContinueAuthenticate(const ALastResponse, AHost, AProtocolName : string): string; virtual; overload; {$IFDEF HAS_DEPRECATED}deprecated{$IFDEF HAS_DEPRECATED_MSG} 'Use overload with APort parameter'{$ENDIF};{$ENDIF} + function TryStartAuthenticate(const AHost, AProtocolName : string; var VInitialResponse: string): Boolean; virtual; overload; + function StartAuthenticate(const AChallenge, AHost, AProtocolName : string): string; virtual; overload; + function ContinueAuthenticate(const ALastResponse, AHost, AProtocolName : string): string; virtual; overload; function TryStartAuthenticate(const AHost: string; const APort: TIdPort; const AProtocolName : string; var VInitialResponse: string): Boolean; virtual; overload; function StartAuthenticate(const AChallenge, AHost: string; const APort: TIdPort; const AProtocolName : string): string; virtual; overload; From 2b93830fda75692146225f58b3105bfa7a2a1bcd Mon Sep 17 00:00:00 2001 From: Remy Lebeau Date: Mon, 25 Jul 2022 08:42:35 -0700 Subject: [PATCH 3/8] Fixes for compiler errors --- Lib/Protocols/IdSASL.pas | 12 ++++++------ Lib/Protocols/IdSASLCollection.pas | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Lib/Protocols/IdSASL.pas b/Lib/Protocols/IdSASL.pas index 999a5de43..8a9d16ff3 100644 --- a/Lib/Protocols/IdSASL.pas +++ b/Lib/Protocols/IdSASL.pas @@ -86,13 +86,13 @@ TIdSASL = class(TIdBaseComponent) which can remove an unnecessary round-trip if both parties support it. } //SASL AProtocolName must be a name from "http://www.iana.org/assignments/gssapi-service-names" - function TryStartAuthenticate(const AHost, AProtocolName : string; var VInitialResponse: string): Boolean; virtual; overload; - function StartAuthenticate(const AChallenge, AHost, AProtocolName : string): string; virtual; overload; - function ContinueAuthenticate(const ALastResponse, AHost, AProtocolName : string): string; virtual; overload; + function TryStartAuthenticate(const AHost, AProtocolName : string; var VInitialResponse: string): Boolean; overload; virtual; + function StartAuthenticate(const AChallenge, AHost, AProtocolName : string): string; overload; virtual; + function ContinueAuthenticate(const ALastResponse, AHost, AProtocolName : string): string; overload; virtual; - function TryStartAuthenticate(const AHost: string; const APort: TIdPort; const AProtocolName : string; var VInitialResponse: string): Boolean; virtual; overload; - function StartAuthenticate(const AChallenge, AHost: string; const APort: TIdPort; const AProtocolName : string): string; virtual; overload; - function ContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort; const AProtocolName : string): string; virtual; overload; + function TryStartAuthenticate(const AHost: string; const APort: TIdPort; const AProtocolName : string; var VInitialResponse: string): Boolean; overload; virtual; + function StartAuthenticate(const AChallenge, AHost: string; const APort: TIdPort; const AProtocolName : string): string; overload; virtual; + function ContinueAuthenticate(const ALastResponse, AHost: string; const APort: TIdPort; const AProtocolName : string): string; overload; virtual; { For cleaning up after Authentication } procedure FinishAuthenticate; virtual; diff --git a/Lib/Protocols/IdSASLCollection.pas b/Lib/Protocols/IdSASLCollection.pas index 8f33c93e7..0f34ff10b 100644 --- a/Lib/Protocols/IdSASLCollection.pas +++ b/Lib/Protocols/IdSASLCollection.pas @@ -49,6 +49,7 @@ interface IdBaseComponent, IdCoder, IdException, + IdGlobal, IdSASL, IdTCPConnection; @@ -83,7 +84,7 @@ TIdSASLEntries = class ( TOwnedCollection ) const AOkReplies, AContinueReplies: array of string; AClient : TIdTCPConnection; ACapaReply : TStrings; const AAuthString : String = 'AUTH'; {Do not Localize} ACanAttemptIR: Boolean = True); overload; {$IFDEF HAS_DEPRECATED}deprecated{$IFDEF HAS_DEPRECATED_MSG} 'Use overload with APort parameter'{$ENDIF};{$ENDIF} - procedure LoginSASL(const ACmd, AHost; const APort: TIdPort; const AProtocolName: String; + procedure LoginSASL(const ACmd, AHost: String; const APort: TIdPort; const AProtocolName: String; const AOkReplies, AContinueReplies: array of string; AClient : TIdTCPConnection; ACapaReply : TStrings; const AAuthString : String = 'AUTH'; {Do not Localize} ACanAttemptIR: Boolean = True); overload; @@ -91,7 +92,7 @@ TIdSASLEntries = class ( TOwnedCollection ) const AOkReplies, AContinueReplies: array of string; AClient : TIdTCPConnection; ACapaReply : TStrings; const AAuthString : String = 'AUTH'; {Do not Localize} ACanAttemptIR: Boolean = True); overload; {$IFDEF HAS_DEPRECATED}deprecated{$IFDEF HAS_DEPRECATED_MSG} 'Use overload with APort parameter'{$ENDIF};{$ENDIF} - procedure LoginSASL(const ACmd, AHost; const APort: TIdPort; const AProtocolName, AServiceName: String; + procedure LoginSASL(const ACmd, AHost: String; const APort: TIdPort; const AProtocolName, AServiceName: String; const AOkReplies, AContinueReplies: array of string; AClient : TIdTCPConnection; ACapaReply : TStrings; const AAuthString : String = 'AUTH'; {Do not Localize} ACanAttemptIR: Boolean = True); overload; @@ -118,7 +119,6 @@ implementation {$ENDIF} IdAssignedNumbers, IdCoderMIME, - IdGlobal, IdGlobalProtocols, IdReply, IdResourceStringsProtocols, @@ -354,7 +354,7 @@ procedure TIdSASLEntries.LoginSASL(const ACmd, AHost, AProtocolName: String; con LoginSASL(ACmd, AHost, 0, AProtocolName, AOkReplies, AContinueReplies, AClient, ACapaReply, AAuthString, ACanAttemptIR); end; -procedure TIdSASLEntries.LoginSASL(const ACmd, AHost; const APort: TIdPort; const AProtocolName: String; +procedure TIdSASLEntries.LoginSASL(const ACmd, AHost: String; const APort: TIdPort; const AProtocolName: String; const AOkReplies, AContinueReplies: array of string; AClient: TIdTCPConnection; ACapaReply: TStrings; const AAuthString: String; ACanAttemptIR: Boolean); var @@ -454,7 +454,7 @@ procedure TIdSASLEntries.LoginSASL(const ACmd, AHost, AProtocolName, AServiceNam LoginSASL(ACmd, AHost, 0, AProtocolName, AServiceName, AOkReplies, AContinueReplies, AClient, ACapaReply, AAuthString, ACanAttemptIR); end; -procedure TIdSASLEntries.LoginSASL(const ACmd, AHost: string; const APort: TIdPort; +procedure TIdSASLEntries.LoginSASL(const ACmd, AHost: String; const APort: TIdPort; const AProtocolName, AServiceName: String; const AOkReplies, AContinueReplies: array of string; AClient: TIdTCPConnection; ACapaReply: TStrings; const AAuthString: String; ACanAttemptIR: Boolean); From c405d195fc0748c80c1aebf4cfa0af8c6d9f505e Mon Sep 17 00:00:00 2001 From: Remy Lebeau Date: Tue, 16 Aug 2022 09:32:00 -0700 Subject: [PATCH 4/8] Adding Tool Palette registrations for OAuth SASL components. Still need to update DCR file for RAD Studio --- Lib/Protocols/IconsDotNet/TIdSASLOAuth10A.bmp | Bin 0 -> 822 bytes Lib/Protocols/IconsDotNet/TIdSASLOAuth2Bearer.bmp | Bin 0 -> 822 bytes Lib/Protocols/IconsDotNet/TIdSASLXOAuth2.bmp | Bin 0 -> 822 bytes Lib/Protocols/IdRegister.pas | 10 ++++++++++ 4 files changed, 10 insertions(+) create mode 100644 Lib/Protocols/IconsDotNet/TIdSASLOAuth10A.bmp create mode 100644 Lib/Protocols/IconsDotNet/TIdSASLOAuth2Bearer.bmp create mode 100644 Lib/Protocols/IconsDotNet/TIdSASLXOAuth2.bmp diff --git a/Lib/Protocols/IconsDotNet/TIdSASLOAuth10A.bmp b/Lib/Protocols/IconsDotNet/TIdSASLOAuth10A.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cb23677bcbd3f045b0c17ed2cb12b2b46768886c GIT binary patch literal 822 zcma))F%E(-6o#L1VPtfK4K^o2N7*#-0J<43;A&hX7$?FBh^rIcK#$-N@ElI~w-1{J z5NTdt{=R$!I;ztkUdPho+Fy5I@SBU;2a<0-Sy3ZiYa)hVctsOp&f zr7e!FSceSR=Qg8eLM=e7a7#^y0?cQR0rN0&4D|M<3DbsAgX5BxydOk4{> ztT%Kxvcuj2zFaIR&m_;}yOJb$HD*)M;BnE48DO~l^C7dke_hvZ7yr7KP*Pe-2b~pxQaVjMfOf_U*cuxN#)@zPVrzvr&?9&RJckwj-NAJN zm=MX|$?WW#zXKs!_(Rf@86naf*HH~z@`h2*!RMhiVRb_Yak844eReO#d nWsJMBG!H_g4S#*D4j`e=Bw-M$Z`8$02a{{IgU2iP6n_3U_#{DD literal 0 HcmV?d00001 diff --git a/Lib/Protocols/IdRegister.pas b/Lib/Protocols/IdRegister.pas index 2e92e3243..e1c6a9aeb 100644 --- a/Lib/Protocols/IdRegister.pas +++ b/Lib/Protocols/IdRegister.pas @@ -273,6 +273,7 @@ implementation IdSASLDigest, IdSASLExternal, IdSASLLogin, + IdSASLOAuth, IdSASLOTP, IdSASLPlain, IdSASLSKey, @@ -411,9 +412,12 @@ implementation {$R IconsDotNet\TIdSASLExternal.bmp} {$R IconsDotNet\TIdSASLList.bmp} {$R IconsDotNet\TIdSASLLogin.bmp} + {$R IconsDotNet\TIdSASLOAuth2Bearer.bmp} + {$R IconsDotNet\TIdSASLOAuth10A.bmp} {$R IconsDotNet\TIdSASLOTP.bmp} {$R IconsDotNet\TIdSASLPlain.bmp} {$R IconsDotNet\TIdSASLSKey.bmp} + {$R IconsDotNet\TIdSASLXOAuth2.bmp} {$R IconsDotNet\TIdServerCompressionIntercept.bmp} {$R IconsDotNet\TIdServerInterceptLogEvent.bmp} {$R IconsDotNet\TIdServerInterceptLogFile.bmp} @@ -588,9 +592,12 @@ procedure Register; TIdSASLDigest, TIdSASLExternal, TIdSASLLogin, + TIdSASLOAuth10A, + TIdSASLOAuth2Bearer, TIdSASLOTP, TIdSASLPlain, TIdSASLSKey, + TIdSASLXOAuth2, TIdUserPassProvider ]); @@ -738,9 +745,12 @@ procedure Register; TIdSASLDigest, TIdSASLExternal, TIdSASLLogin, + TIdSASLOAuth10A, + TIdSASLOAuth2Bearer, TIdSASLOTP, TIdSASLPlain, TIdSASLSKey, + TIdSASLXOAuth2, TIdUserPassProvider ]); From 87b1d090518192f4069da57be25e4ed73c54371e Mon Sep 17 00:00:00 2001 From: Remy Lebeau Date: Thu, 25 Aug 2022 09:41:27 -0700 Subject: [PATCH 5/8] Adding SASLCanAttemptInitialResponse property to TIdPOP3 --- Lib/Protocols/IdPOP3.pas | 44 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/Lib/Protocols/IdPOP3.pas b/Lib/Protocols/IdPOP3.pas index 08e9fee6b..47eb03fc2 100644 --- a/Lib/Protocols/IdPOP3.pas +++ b/Lib/Protocols/IdPOP3.pas @@ -221,6 +221,7 @@ TIdPOP3 = class(TIdMessageClient) FHasAPOP: Boolean; FHasCAPA: Boolean; FSASLMechanisms : TIdSASLEntries; + FSASLCanAttemptIR: Boolean; // function GetReplyClass:TIdReplyClass; override; function GetSupportsTLS: Boolean; override; @@ -260,6 +261,7 @@ TIdPOP3 = class(TIdMessageClient) property Password; property Port default IdPORT_POP3; property SASLMechanisms : TIdSASLEntries read FSASLMechanisms write SetSASLMechanisms; + property SASLCanAttemptInitialResponse: Boolean read FSASLCanAttemptIR write FSASLCanAttemptIR default True; end; type @@ -297,6 +299,22 @@ procedure TIdPOP3.Login; var S: String; LMD5: TIdHashMessageDigest5; + + function IsSASLSupported: Boolean; + var + i : Integer; + LBuf : String; + begin + Result := False; + for i := 0 to FCapabilities.Count -1 do begin + LBuf := TrimLeft(FCapabilities[i]); + if TextIsSame(Fetch(LBuf), 'SASL') then begin {do not localize} + Result := True; + Exit; + end; + end; + end; + begin if UseTLS in ExplicitTLSVals then begin if SupportsTLS then begin @@ -339,10 +357,27 @@ procedure TIdPOP3.Login; // in RFC 2449 along with the CAPA command. If a server supports the CAPA // command then it *should* also support Initial-Response as well, however // many POP3 servers support CAPA but do not support Initial-Response - // (which was formalized in RFC 5034). So, until we can handle that - // descrepency better, we will simply disable Initial-Response for now. - - FSASLMechanisms.LoginSASL('AUTH', FHost, FPort, IdGSKSSN_pop, [ST_OK], [ST_SASLCONTINUE], Self, Capabilities, 'SASL'); {do not localize} + // (which was formalized in RFC 5034). + // + // RFC 5034 says: + // + // "If a server either does not support the CAPA command or does not + // advertise the SASL capability, clients SHOULD NOT attempt the AUTH + // command. If a client does attempt the AUTH command in such a + // situation, it MUST NOT supply the client initial response + // parameter (for backwards compatibility with [RFC1734])." + // + // So, as most modern POP3 servers do support Initial-Response now, we + // will attempt Initial-Response by default, unless told not to. For + // instance, Microsoft Office 365 does not support Initial-Response + // when using XOAuth2 authentication (why?)... + + // TODO: look in the SASLMechanisms if XOAuth2 is enabled, and if so + // then disable Initial-Response... + + FSASLMechanisms.LoginSASL('AUTH', FHost, IdGSKSSN_pop, [ST_OK], [ST_SASLCONTINUE], Self, Capabilities, 'SASL', {do not localize} + FSASLCanAttemptIR and HasCAPA and IsSASLSupported + ); end; end; end; @@ -352,6 +387,7 @@ procedure TIdPOP3.InitComponent; inherited; FAutoLogin := True; FSASLMechanisms := TIdSASLEntries.Create(Self); + FSASLCanAttemptIR := True; FRegularProtPort := IdPORT_POP3; FImplicitTLSProtPort := IdPORT_POP3S; FExplicitTLSProtPort := IdPORT_POP3; From 4acaceb5e61ba34eb7c7f6b5eff756c4c438b17b Mon Sep 17 00:00:00 2001 From: Remy Lebeau Date: Mon, 29 Aug 2022 09:34:42 -0700 Subject: [PATCH 6/8] Updating TIdPOP3.Login() to add missing Port parameter to SASLMechanisms.LoginSASL() --- Lib/Protocols/IdPOP3.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/Protocols/IdPOP3.pas b/Lib/Protocols/IdPOP3.pas index 47eb03fc2..93bfd0430 100644 --- a/Lib/Protocols/IdPOP3.pas +++ b/Lib/Protocols/IdPOP3.pas @@ -375,7 +375,7 @@ procedure TIdPOP3.Login; // TODO: look in the SASLMechanisms if XOAuth2 is enabled, and if so // then disable Initial-Response... - FSASLMechanisms.LoginSASL('AUTH', FHost, IdGSKSSN_pop, [ST_OK], [ST_SASLCONTINUE], Self, Capabilities, 'SASL', {do not localize} + FSASLMechanisms.LoginSASL('AUTH', FHost, FPort, IdGSKSSN_pop, [ST_OK], [ST_SASLCONTINUE], Self, Capabilities, 'SASL', {do not localize} FSASLCanAttemptIR and HasCAPA and IsSASLSupported ); end; From 22ff38082534094fe14c0f191cb70991cc13e5cf Mon Sep 17 00:00:00 2001 From: Remy Lebeau Date: Mon, 27 Mar 2023 10:05:55 -0700 Subject: [PATCH 7/8] Adding IdSASLOAuth.pas unit to IndyProtocols package files. --- Lib/Protocols/IndyProtocols100.dpk | 1 + Lib/Protocols/IndyProtocols100Net.dpk | 1 + Lib/Protocols/IndyProtocols110.dpk | 1 + Lib/Protocols/IndyProtocols110Net.dpk | 1 + Lib/Protocols/IndyProtocols120.dpk | 1 + Lib/Protocols/IndyProtocols120Net.dpk | 1 + Lib/Protocols/IndyProtocols130.dpk | 1 + Lib/Protocols/IndyProtocols130Net.dpk | 1 + Lib/Protocols/IndyProtocols140.dpk | 1 + Lib/Protocols/IndyProtocols150.dpk | 1 + Lib/Protocols/IndyProtocols150.dproj | 1 + Lib/Protocols/IndyProtocols160.dpk | 1 + Lib/Protocols/IndyProtocols160.dproj | 1 + Lib/Protocols/IndyProtocols170.dpk | 1 + Lib/Protocols/IndyProtocols170.dproj | 1 + Lib/Protocols/IndyProtocols180.dpk | 1 + Lib/Protocols/IndyProtocols180.dproj | 1 + Lib/Protocols/IndyProtocols190.dpk | 1 + Lib/Protocols/IndyProtocols190.dproj | 1 + Lib/Protocols/IndyProtocols200.dpk | 1 + Lib/Protocols/IndyProtocols200.dproj | 1 + Lib/Protocols/IndyProtocols210.dpk | 1 + Lib/Protocols/IndyProtocols210.dproj | 1 + Lib/Protocols/IndyProtocols220.dpk | 1 + Lib/Protocols/IndyProtocols220.dproj | 1 + Lib/Protocols/IndyProtocols230.dpk | 1 + Lib/Protocols/IndyProtocols230.dproj | 1 + Lib/Protocols/IndyProtocols240.dpk | 1 + Lib/Protocols/IndyProtocols240.dproj | 1 + Lib/Protocols/IndyProtocols250.dpk | 1 + Lib/Protocols/IndyProtocols250.dproj | 1 + Lib/Protocols/IndyProtocols260.dpk | 1 + Lib/Protocols/IndyProtocols260.dproj | 1 + Lib/Protocols/IndyProtocols270.dpk | 1 + Lib/Protocols/IndyProtocols270.dproj | 1 + Lib/Protocols/IndyProtocols280.dpk | 1 + Lib/Protocols/IndyProtocols280.dproj | 1 + Lib/Protocols/IndyProtocols40.dpk | 1 + Lib/Protocols/IndyProtocols50.dpk | 1 + Lib/Protocols/IndyProtocols60.dpk | 1 + Lib/Protocols/IndyProtocols70.dpk | 1 + Lib/Protocols/IndyProtocols80.dpk | 1 + Lib/Protocols/IndyProtocols80Net.dpk | 1 + Lib/Protocols/IndyProtocols90.dpk | 1 + Lib/Protocols/IndyProtocols90Net.dpk | 1 + Lib/Protocols/IndyProtocolsK3.dpk | 1 + 46 files changed, 46 insertions(+) diff --git a/Lib/Protocols/IndyProtocols100.dpk b/Lib/Protocols/IndyProtocols100.dpk index 30c4f3f51..513fabeb5 100644 --- a/Lib/Protocols/IndyProtocols100.dpk +++ b/Lib/Protocols/IndyProtocols100.dpk @@ -210,6 +210,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols100Net.dpk b/Lib/Protocols/IndyProtocols100Net.dpk index c9683372f..d5f5fc82f 100644 --- a/Lib/Protocols/IndyProtocols100Net.dpk +++ b/Lib/Protocols/IndyProtocols100Net.dpk @@ -203,6 +203,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols110.dpk b/Lib/Protocols/IndyProtocols110.dpk index fd6caf801..57772e99a 100644 --- a/Lib/Protocols/IndyProtocols110.dpk +++ b/Lib/Protocols/IndyProtocols110.dpk @@ -210,6 +210,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols110Net.dpk b/Lib/Protocols/IndyProtocols110Net.dpk index 812b68a74..0a4498312 100644 --- a/Lib/Protocols/IndyProtocols110Net.dpk +++ b/Lib/Protocols/IndyProtocols110Net.dpk @@ -203,6 +203,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols120.dpk b/Lib/Protocols/IndyProtocols120.dpk index 3fe090d11..0eb28468b 100644 --- a/Lib/Protocols/IndyProtocols120.dpk +++ b/Lib/Protocols/IndyProtocols120.dpk @@ -210,6 +210,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols120Net.dpk b/Lib/Protocols/IndyProtocols120Net.dpk index 048834973..ed2b52a45 100644 --- a/Lib/Protocols/IndyProtocols120Net.dpk +++ b/Lib/Protocols/IndyProtocols120Net.dpk @@ -203,6 +203,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols130.dpk b/Lib/Protocols/IndyProtocols130.dpk index cabd0b730..8ce61e9d1 100644 --- a/Lib/Protocols/IndyProtocols130.dpk +++ b/Lib/Protocols/IndyProtocols130.dpk @@ -210,6 +210,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols130Net.dpk b/Lib/Protocols/IndyProtocols130Net.dpk index fbee133c9..8c7fd3f33 100644 --- a/Lib/Protocols/IndyProtocols130Net.dpk +++ b/Lib/Protocols/IndyProtocols130Net.dpk @@ -203,6 +203,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols140.dpk b/Lib/Protocols/IndyProtocols140.dpk index daf3d851a..9f8884330 100644 --- a/Lib/Protocols/IndyProtocols140.dpk +++ b/Lib/Protocols/IndyProtocols140.dpk @@ -211,6 +211,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols150.dpk b/Lib/Protocols/IndyProtocols150.dpk index bbe4bc8b8..5464f95f4 100644 --- a/Lib/Protocols/IndyProtocols150.dpk +++ b/Lib/Protocols/IndyProtocols150.dpk @@ -211,6 +211,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols150.dproj b/Lib/Protocols/IndyProtocols150.dproj index f0149c84a..baf135f9c 100644 --- a/Lib/Protocols/IndyProtocols150.dproj +++ b/Lib/Protocols/IndyProtocols150.dproj @@ -238,6 +238,7 @@ + diff --git a/Lib/Protocols/IndyProtocols160.dpk b/Lib/Protocols/IndyProtocols160.dpk index b1782d4f2..3739187b4 100644 --- a/Lib/Protocols/IndyProtocols160.dpk +++ b/Lib/Protocols/IndyProtocols160.dpk @@ -229,6 +229,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols160.dproj b/Lib/Protocols/IndyProtocols160.dproj index a91f3ac7c..95d65c09f 100644 --- a/Lib/Protocols/IndyProtocols160.dproj +++ b/Lib/Protocols/IndyProtocols160.dproj @@ -301,6 +301,7 @@ + diff --git a/Lib/Protocols/IndyProtocols170.dpk b/Lib/Protocols/IndyProtocols170.dpk index 60e81fd24..fde59c541 100644 --- a/Lib/Protocols/IndyProtocols170.dpk +++ b/Lib/Protocols/IndyProtocols170.dpk @@ -231,6 +231,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols170.dproj b/Lib/Protocols/IndyProtocols170.dproj index ec80ef7ba..08b09f281 100644 --- a/Lib/Protocols/IndyProtocols170.dproj +++ b/Lib/Protocols/IndyProtocols170.dproj @@ -261,6 +261,7 @@ + diff --git a/Lib/Protocols/IndyProtocols180.dpk b/Lib/Protocols/IndyProtocols180.dpk index 8ae6dc4a9..7c6a22a3b 100644 --- a/Lib/Protocols/IndyProtocols180.dpk +++ b/Lib/Protocols/IndyProtocols180.dpk @@ -240,6 +240,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols180.dproj b/Lib/Protocols/IndyProtocols180.dproj index 9b5f0cb40..a213aae8e 100644 --- a/Lib/Protocols/IndyProtocols180.dproj +++ b/Lib/Protocols/IndyProtocols180.dproj @@ -288,6 +288,7 @@ + diff --git a/Lib/Protocols/IndyProtocols190.dpk b/Lib/Protocols/IndyProtocols190.dpk index 3f229cbda..ddfde6419 100644 --- a/Lib/Protocols/IndyProtocols190.dpk +++ b/Lib/Protocols/IndyProtocols190.dpk @@ -240,6 +240,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols190.dproj b/Lib/Protocols/IndyProtocols190.dproj index 4220e1935..5a1e5aa8e 100644 --- a/Lib/Protocols/IndyProtocols190.dproj +++ b/Lib/Protocols/IndyProtocols190.dproj @@ -322,6 +322,7 @@ + diff --git a/Lib/Protocols/IndyProtocols200.dpk b/Lib/Protocols/IndyProtocols200.dpk index 686aee33b..f7ecff590 100644 --- a/Lib/Protocols/IndyProtocols200.dpk +++ b/Lib/Protocols/IndyProtocols200.dpk @@ -240,6 +240,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols200.dproj b/Lib/Protocols/IndyProtocols200.dproj index d959bb568..aaec9a93a 100644 --- a/Lib/Protocols/IndyProtocols200.dproj +++ b/Lib/Protocols/IndyProtocols200.dproj @@ -306,6 +306,7 @@ + diff --git a/Lib/Protocols/IndyProtocols210.dpk b/Lib/Protocols/IndyProtocols210.dpk index 11860385e..bed16da80 100644 --- a/Lib/Protocols/IndyProtocols210.dpk +++ b/Lib/Protocols/IndyProtocols210.dpk @@ -240,6 +240,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols210.dproj b/Lib/Protocols/IndyProtocols210.dproj index 1a5c5d720..fd378e486 100644 --- a/Lib/Protocols/IndyProtocols210.dproj +++ b/Lib/Protocols/IndyProtocols210.dproj @@ -334,6 +334,7 @@ + diff --git a/Lib/Protocols/IndyProtocols220.dpk b/Lib/Protocols/IndyProtocols220.dpk index 985897eac..5ae23487f 100644 --- a/Lib/Protocols/IndyProtocols220.dpk +++ b/Lib/Protocols/IndyProtocols220.dpk @@ -240,6 +240,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols220.dproj b/Lib/Protocols/IndyProtocols220.dproj index a5879503d..ecf1cabe6 100644 --- a/Lib/Protocols/IndyProtocols220.dproj +++ b/Lib/Protocols/IndyProtocols220.dproj @@ -368,6 +368,7 @@ + diff --git a/Lib/Protocols/IndyProtocols230.dpk b/Lib/Protocols/IndyProtocols230.dpk index 6c0c5d5d2..28d355630 100644 --- a/Lib/Protocols/IndyProtocols230.dpk +++ b/Lib/Protocols/IndyProtocols230.dpk @@ -240,6 +240,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols230.dproj b/Lib/Protocols/IndyProtocols230.dproj index c155f409a..dc8ac0276 100644 --- a/Lib/Protocols/IndyProtocols230.dproj +++ b/Lib/Protocols/IndyProtocols230.dproj @@ -368,6 +368,7 @@ + diff --git a/Lib/Protocols/IndyProtocols240.dpk b/Lib/Protocols/IndyProtocols240.dpk index f877398c2..972ec5433 100644 --- a/Lib/Protocols/IndyProtocols240.dpk +++ b/Lib/Protocols/IndyProtocols240.dpk @@ -240,6 +240,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols240.dproj b/Lib/Protocols/IndyProtocols240.dproj index c396eb4d2..d582444a5 100644 --- a/Lib/Protocols/IndyProtocols240.dproj +++ b/Lib/Protocols/IndyProtocols240.dproj @@ -276,6 +276,7 @@ + diff --git a/Lib/Protocols/IndyProtocols250.dpk b/Lib/Protocols/IndyProtocols250.dpk index fd4318b44..18e57f9dc 100644 --- a/Lib/Protocols/IndyProtocols250.dpk +++ b/Lib/Protocols/IndyProtocols250.dpk @@ -240,6 +240,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols250.dproj b/Lib/Protocols/IndyProtocols250.dproj index ba29da164..3a9046887 100644 --- a/Lib/Protocols/IndyProtocols250.dproj +++ b/Lib/Protocols/IndyProtocols250.dproj @@ -276,6 +276,7 @@ + diff --git a/Lib/Protocols/IndyProtocols260.dpk b/Lib/Protocols/IndyProtocols260.dpk index ef8f457ea..26962a2c4 100644 --- a/Lib/Protocols/IndyProtocols260.dpk +++ b/Lib/Protocols/IndyProtocols260.dpk @@ -240,6 +240,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols260.dproj b/Lib/Protocols/IndyProtocols260.dproj index 37b7a576e..b52547a8c 100644 --- a/Lib/Protocols/IndyProtocols260.dproj +++ b/Lib/Protocols/IndyProtocols260.dproj @@ -276,6 +276,7 @@ + diff --git a/Lib/Protocols/IndyProtocols270.dpk b/Lib/Protocols/IndyProtocols270.dpk index d2f294325..05d3cbec9 100644 --- a/Lib/Protocols/IndyProtocols270.dpk +++ b/Lib/Protocols/IndyProtocols270.dpk @@ -240,6 +240,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols270.dproj b/Lib/Protocols/IndyProtocols270.dproj index 0479f0b0f..8c31d2f28 100644 --- a/Lib/Protocols/IndyProtocols270.dproj +++ b/Lib/Protocols/IndyProtocols270.dproj @@ -276,6 +276,7 @@ + diff --git a/Lib/Protocols/IndyProtocols280.dpk b/Lib/Protocols/IndyProtocols280.dpk index 57b4ed665..d3fdbe182 100644 --- a/Lib/Protocols/IndyProtocols280.dpk +++ b/Lib/Protocols/IndyProtocols280.dpk @@ -240,6 +240,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols280.dproj b/Lib/Protocols/IndyProtocols280.dproj index 7d00abad7..858d821cb 100644 --- a/Lib/Protocols/IndyProtocols280.dproj +++ b/Lib/Protocols/IndyProtocols280.dproj @@ -365,6 +365,7 @@ + diff --git a/Lib/Protocols/IndyProtocols40.dpk b/Lib/Protocols/IndyProtocols40.dpk index 235a50cf4..bcac696ab 100644 --- a/Lib/Protocols/IndyProtocols40.dpk +++ b/Lib/Protocols/IndyProtocols40.dpk @@ -216,6 +216,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols50.dpk b/Lib/Protocols/IndyProtocols50.dpk index d21345ffa..dd7c7a24c 100644 --- a/Lib/Protocols/IndyProtocols50.dpk +++ b/Lib/Protocols/IndyProtocols50.dpk @@ -209,6 +209,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols60.dpk b/Lib/Protocols/IndyProtocols60.dpk index 3dce59ebd..418495c2d 100644 --- a/Lib/Protocols/IndyProtocols60.dpk +++ b/Lib/Protocols/IndyProtocols60.dpk @@ -210,6 +210,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols70.dpk b/Lib/Protocols/IndyProtocols70.dpk index 2371e2c18..64ad398c6 100644 --- a/Lib/Protocols/IndyProtocols70.dpk +++ b/Lib/Protocols/IndyProtocols70.dpk @@ -210,6 +210,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols80.dpk b/Lib/Protocols/IndyProtocols80.dpk index 227fb08fa..343826d36 100644 --- a/Lib/Protocols/IndyProtocols80.dpk +++ b/Lib/Protocols/IndyProtocols80.dpk @@ -210,6 +210,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols80Net.dpk b/Lib/Protocols/IndyProtocols80Net.dpk index 2ef44cd6f..b85797068 100644 --- a/Lib/Protocols/IndyProtocols80Net.dpk +++ b/Lib/Protocols/IndyProtocols80Net.dpk @@ -203,6 +203,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols90.dpk b/Lib/Protocols/IndyProtocols90.dpk index bc88dd200..0e08f699e 100644 --- a/Lib/Protocols/IndyProtocols90.dpk +++ b/Lib/Protocols/IndyProtocols90.dpk @@ -211,6 +211,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols90Net.dpk b/Lib/Protocols/IndyProtocols90Net.dpk index eb5886ed3..17e81e3c9 100644 --- a/Lib/Protocols/IndyProtocols90Net.dpk +++ b/Lib/Protocols/IndyProtocols90Net.dpk @@ -203,6 +203,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocolsK3.dpk b/Lib/Protocols/IndyProtocolsK3.dpk index 859876bf3..5a309ea13 100644 --- a/Lib/Protocols/IndyProtocolsK3.dpk +++ b/Lib/Protocols/IndyProtocolsK3.dpk @@ -207,6 +207,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', From 321bf5d7386b2222352ac9d226184da0d06c3b14 Mon Sep 17 00:00:00 2001 From: Remy Lebeau Date: Thu, 7 Mar 2024 09:10:06 -0800 Subject: [PATCH 8/8] Adding IdSASLOAuth.pas to Delphi 12 project --- Lib/Protocols/IndyProtocols290.dpk | 1 + Lib/Protocols/IndyProtocols290.dproj | 1 + 2 files changed, 2 insertions(+) diff --git a/Lib/Protocols/IndyProtocols290.dpk b/Lib/Protocols/IndyProtocols290.dpk index bf9627699..00bfb54e5 100644 --- a/Lib/Protocols/IndyProtocols290.dpk +++ b/Lib/Protocols/IndyProtocols290.dpk @@ -241,6 +241,7 @@ contains IdSASLDigest in 'IdSASLDigest.pas', IdSASLExternal in 'IdSASLExternal.pas', IdSASLLogin in 'IdSASLLogin.pas', + IdSASLOAuth in 'IdSASLOAuth.pas', IdSASLOTP in 'IdSASLOTP.pas', IdSASLPlain in 'IdSASLPlain.pas', IdSASLSKey in 'IdSASLSKey.pas', diff --git a/Lib/Protocols/IndyProtocols290.dproj b/Lib/Protocols/IndyProtocols290.dproj index b2e3026a7..a2eccbc76 100644 --- a/Lib/Protocols/IndyProtocols290.dproj +++ b/Lib/Protocols/IndyProtocols290.dproj @@ -286,6 +286,7 @@ +