From c36919073910a98ddf1b8008227e0f5ede1a53bb Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sat, 3 Oct 2009 20:08:12 +0200 Subject: Parse out password from URI entered in the Quick Connect dialog and reuse it on first password prompt --- UConnectionManager.pas | 7 ++++--- UCore.pas | 4 +++- UCoreUtils.pas | 24 ++++++++++++++++++++++++ UQuickConnect.pas | 6 ++++-- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/UConnectionManager.pas b/UConnectionManager.pas index 9adcf4f..f7c2993 100644 --- a/UConnectionManager.pas +++ b/UConnectionManager.pas @@ -66,7 +66,7 @@ type Thread: TOpenConnectionThread; SourcePanelEngine: TPanelEngine; ConnectedEngine: TVFSEngine; - function DoConnectInternal(const URI: string; Engine: TVFSEngine; VFSDialogsParentWindow: PGtkWidget): boolean; + function DoConnectInternal(const URI: string; Engine: TVFSEngine; VFSDialogsParentWindow: PGtkWidget; VFSQuickConnectMode: boolean): boolean; end; var @@ -586,7 +586,7 @@ begin Engine.Password := FActiveConnInfo.Password; Engine.PasswordUsed := False; - if not DoConnectInternal(UTF8ToStr(FActiveConnInfo.GetURI(False)), Engine, FWidget) then begin + if not DoConnectInternal(UTF8ToStr(FActiveConnInfo.GetURI(False)), Engine, FWidget, False) then begin if not FSilenceError then Application.MessageBox(PGtkWindow(FWidget), LANGCouldntOpenURI, [mbOK], mbError, mbOK, mbOK); ListViewTable.Enabled := True; CloseButton.Enabled := True; @@ -606,13 +606,14 @@ begin ModalResult := mbOK; end; -function TFConnectionManager.DoConnectInternal(const URI: string; Engine: TVFSEngine; VFSDialogsParentWindow: PGtkWidget): boolean; +function TFConnectionManager.DoConnectInternal(const URI: string; Engine: TVFSEngine; VFSDialogsParentWindow: PGtkWidget; VFSQuickConnectMode: boolean): boolean; begin Result := False; FSilenceError := False; Thread := TOpenConnectionThread.Create; try Thread.VFSConnectionManagerMode := VFSDialogsParentWindow = FWidget; + Thread.VFSQuickConnectMode := VFSQuickConnectMode; Thread.VFSDialogsParentWindow := VFSDialogsParentWindow; Thread.AEngine := Engine; Thread.URI := URI; diff --git a/UCore.pas b/UCore.pas index cb80927..50f705f 100644 --- a/UCore.pas +++ b/UCore.pas @@ -60,6 +60,7 @@ type TVFSCallbackThread = class(TThread) VFSCallbackCancelled: boolean; VFSConnectionManagerMode: boolean; + VFSQuickConnectMode: boolean; VFSDialogsParentWindow: PGtkWidget; FCancelRequested: boolean; @@ -276,6 +277,7 @@ begin VFSAskPassword_Display := False; VFSCallbackCancelled := False; VFSConnectionManagerMode := False; + VFSQuickConnectMode := False; VFSDialogsParentWindow := FMain.FWidget; FCancelRequested := False; end; @@ -365,7 +367,7 @@ begin // Use stored password, if previously set - if (((flags and VFS_ASK_PASSWORD_ARCHIVE_MODE) = VFS_ASK_PASSWORD_ARCHIVE_MODE) or Thread.VFSConnectionManagerMode) and + if (((flags and VFS_ASK_PASSWORD_ARCHIVE_MODE) = VFS_ASK_PASSWORD_ARCHIVE_MODE) or Thread.VFSConnectionManagerMode or Thread.VFSQuickConnectMode) and (password <> nil) and (Thread.AEngine is TVFSEngine) and (Length((Thread.AEngine as TVFSEngine).Password) > 0) then begin if not (Thread.AEngine as TVFSEngine).PasswordUsed then begin diff --git a/UCoreUtils.pas b/UCoreUtils.pas index d82f657..f3617f6 100644 --- a/UCoreUtils.pas +++ b/UCoreUtils.pas @@ -99,6 +99,7 @@ function ConstructURI(IncludePasswd, HidePasswd: boolean; Protocol, Server, User function URIHidePassword(const SrcURI: string): string; function UnEscapeURI(const Str: string): string; function EscapeURI(const Str: string; const IllegalChars: string): string; +function URIRipPassword(var URI: string; const RemovePassword: boolean): string; function StrTotimetDef(const S: string; const Default: time_t): time_t; @@ -1091,6 +1092,29 @@ begin end; end; +function URIRipPassword(var URI: string; const RemovePassword: boolean): string; +var p: integer; + s: string; + SchemeStart, LoginEnd, PasswordStart: integer; +begin + Result := ''; + SchemeStart := Pos('://', URI); + if SchemeStart < 1 then Exit; + s := Copy(URI, SchemeStart + 3, Length(URI) - SchemeStart - 3); + p := Pos('/', s); + if p < 1 then p := Length(s); + Delete(s, p, Length(s) - p + 1); + p := PosEnd('@', s); + if p < 1 then Exit; + LoginEnd := p + SchemeStart + 2; + Delete(s, p, Length(s) - p + 1); + p := Pos(':', s); + if p < 1 then Exit; + PasswordStart := p + SchemeStart + 2; + Result := Copy(URI, PasswordStart + 1, LoginEnd - PasswordStart - 1); + if RemovePassword then Delete(URI, PasswordStart, LoginEnd - PasswordStart); +end; + (********************************************************************************************************************************) procedure DebugMsg(Params: array of const); var diff --git a/UQuickConnect.pas b/UQuickConnect.pas index 8234edd..7533bd4 100644 --- a/UQuickConnect.pas +++ b/UQuickConnect.pas @@ -268,7 +268,7 @@ procedure TFQuickConnect.DoConnect; var Engine: TVFSEngine; i, j: integer; VFSPlugin: TVFSPlugin; - Scheme: string; + URI, Scheme: string; begin if ConnectionManager <> nil then AFConnectionManager := ConnectionManager else AFConnectionManager := TFConnectionManager.Create(Self); @@ -321,8 +321,10 @@ begin Engine.SavePath := SourcePanelEngine.Path; Engine.OpenedFromQuickConnect := True; Engine.CustomPluginIDSave := ConfQuickConnectPluginID; + URI := URIComboBox.Entry.Text; + Engine.Password := URIRipPassword(URI, True); - if not AFConnectionManager.DoConnectInternal(URIComboBox.Entry.Text, Engine, FWidget) then begin + if not AFConnectionManager.DoConnectInternal(URI, Engine, FWidget, True) then begin if not AFConnectionManager.FSilenceError then Application.MessageBox(PGtkWindow(FWidget), LANGCouldntOpenURI, [mbOK], mbError, mbOK, mbOK); Table.Enabled := True; CloseButton.Enabled := True; -- cgit v1.2.3