Просмотр исходного кода

Allow using empty saved passwords (e.g. useful for embedded Firebird)

Reinier Olislagers 11 лет назад
Родитель
Сommit
7b31bf0114
2 измененных файлов с 42 добавлено и 34 удалено
  1. 20 15
      main.pas
  2. 22 19
      reg.pas

+ 20 - 15
main.pas

@@ -376,12 +376,10 @@ begin
        dmSysTables.sqQuery.ExecSQL;
        dmSysTables.stTrans.Commit;
        MessageDlg('Password has been changed', mtInformation, [mbOk], 0);
-
     except
-    on e: exception do
-      ShowMessage('Error while changing password: ' + e.Message);
+      on e: exception do
+        ShowMessage('Error while changing password: ' + e.Message);
     end;
-
   end;
 end;
 
@@ -393,8 +391,10 @@ var
 begin
   dbIndex:= tvMain.Selected.OverlayIndex;
 
-  if (RegisteredDatabases[dbIndex].RegRec.Password <> '') or
-  ConnectToDBAs(dbIndex) then
+  // Check if password is saved - it may be empty, which can be valid for
+  // e.g. embedded databases
+  if (RegisteredDatabases[dbIndex].RegRec.SavePassword) or
+    ConnectToDBAs(dbIndex) then
   begin
     Title:= RegisteredDatabases[dbIndex].RegRec.Title + ': Database Comparison';
     fmComparison:= FindCustomForm(Title, TfmComparison) as TfmComparison;
@@ -706,23 +706,29 @@ begin
   fmEnterPass.edUser.Text:= Rec.UserName;
   fmEnterPass.edPassword.Clear;
   fmEnterPass.cbRole.Clear;
-  if Rec.Password <> '' then
+  // Use may have saved an empty password, which is valid for embedded dbs
+  // So check SavePassword instead of Password itself.
+  if Rec.SavePassword then
   try
     fmEnterPass.cbRole.Items.CommaText:= dmSysTables.GetDBObjectNames(dbIndex, 9, Count);
     fmEnterPass.cbRole.ItemIndex:= -1;
     fmEnterPass.cbRole.Text:= '';
+    Result:= True; //this works, no need to go through a retry attempt below
   except
+    // We don't particularly care which error occurred; we're trying again below.
+    Result:= False;
   end;
-  if fmEnterPass.ShowModal = mrOk then
+  // Only show form if connection failed before
+  if not(Result) and (fmEnterPass.ShowModal = mrOk) then
   begin
     if fmReg.TestConnection(Rec.DatabaseName, fmEnterPass.edUser.Text, fmEnterPass.edPassword.Text,
       Rec.Charset) then
-      begin
-        RegisteredDatabases[dbIndex].RegRec.UserName:= fmEnterPass.edUser.Text;
-        RegisteredDatabases[dbIndex].RegRec.Password:= fmEnterPass.edPassword.Text;
-        RegisteredDatabases[dbIndex].RegRec.Role:= fmEnterPass.cbRole.Text;
-        Result:= True;
-      end;
+    begin
+      RegisteredDatabases[dbIndex].RegRec.UserName:= fmEnterPass.edUser.Text;
+      RegisteredDatabases[dbIndex].RegRec.Password:= fmEnterPass.edPassword.Text;
+      RegisteredDatabases[dbIndex].RegRec.Role:= fmEnterPass.cbRole.Text;
+      Result:= True;
+    end;
   end;
 end;
 
@@ -4025,7 +4031,6 @@ begin
           CNode.SelectedIndex:= 23;
 
           Inc(i);
-
         end;
       end;
       CloseFile(F);

+ 22 - 19
reg.pas

@@ -50,10 +50,11 @@ type
     procedure bbTestClick(Sender: TObject);
     procedure btBrowseClick(Sender: TObject);
   private
+    { private declarations }
     function EditRegisteration(Index: Integer; Title, DatabaseName, UserName, Password, Charset, Role: string;
       SavePassword: Boolean): Boolean;
-    { private declarations }
   public
+    { public declarations }
     NewReg: Boolean;
     RecPos: Integer;
     function RegisterDatabase(Title, DatabaseName, UserName, Password, Charset, Role: string;
@@ -62,8 +63,7 @@ type
     function GetEmptyRec: Integer;
     function SaveRegistrations: Boolean;
     procedure Sort;
-    { public declarations }
-  end; 
+  end;
 
 var
   fmReg: TfmReg;
@@ -80,13 +80,13 @@ begin
     ShowMessage('You should fill all fields')
   else
   if TestConnection(edDatabaseName.Text, edUserName.Text, edPassword.Text, cbCharset.Text) then
-  if NewReg then  // New regisration
+  if NewReg then  // New registration
   begin
     if RegisterDatabase(edTitle.Text, edDatabaseName.Text, edUserName.Text, edPassword.Text, cbCharset.Text,
       edRole.Text, cxSavePassword.Checked) then
-       ModalResult:= mrOK
-  end // if NewReg, edit registration
-  else
+       ModalResult:= mrOK;
+  end
+  else // if not NewReg, edit registration
     if EditRegisteration(RecPos, edTitle.Text, edDatabaseName.Text, edUserName.Text, edPassword.Text,
       cbCharset.Text, edRole.Text, cxSavePassword.Checked) then
       MOdalResult:= mrOk;
@@ -207,13 +207,18 @@ begin
     IBConnection1.Open;
     IBConnection1.Close;
     Result:= True;
-
   except
-  on e: exception do
-  begin
-    Result:= False;
-    ShowMessage('Unable to connect: ' + e.Message);
-  end;
+    on d: EIBDatabaseError do
+    begin
+      Result:= False;
+      ShowMessage('Unable to connect: '+ d.Message + LineEnding +
+        'Details: GDS error code: '+inttostr(d.GDSErrorCode));
+    end;
+    on e: exception do
+    begin
+      Result:= False;
+      ShowMessage('Unable to connect: ' + e.Message);
+    end;
   end;
 end;
 
@@ -262,14 +267,12 @@ begin
       Write(F, fmMain.RegisteredDatabases[i].OrigRegRec);
     CloseFile(F);
     Result:= True;
-
   except
-  on e: exception do
-  begin
-    Result:= False;
-  end;
+    on e: exception do
+    begin
+      Result:= False;
+    end;
   end;
-
 end;
 
 procedure TfmReg.Sort;