summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2009-10-03 20:08:12 +0200
committerTomas Bzatek <tbzatek@users.sourceforge.net>2009-10-03 20:08:12 +0200
commitc36919073910a98ddf1b8008227e0f5ede1a53bb (patch)
treef3972bc56a710c9bf02dbe3a89b776a6a37bed51
parent8fb18e8b91f9d0fe4c7d7df34989554c905fcfa8 (diff)
downloadtuxcmd-c36919073910a98ddf1b8008227e0f5ede1a53bb.tar.xz
Parse out password from URI entered in the Quick Connect dialog and reuse it on first password prompt
-rw-r--r--UConnectionManager.pas7
-rw-r--r--UCore.pas4
-rw-r--r--UCoreUtils.pas24
-rw-r--r--UQuickConnect.pas6
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;