Seite 1 von 1

Automatische Anmeldung an der DB

Verfasst: Fr 12. Feb 2016, 08:57
von Dami
… um das Thema aus
http://www.libreoffice-forum.de/viewtop ... 10&t=15855
ein wenig anders auszurollen und unabhängig von irgendwelchen Sicherheitsaspekten,
ist es möglich sich mit der DB (zB.: Postgres) durch ein Makro
mit Passwort und Userkennung zu verbinden/anzumelden

Code: Alles auswählen

SUB open_main_form
	oController= ThisDatabaseDocument.CurrentController
	IF oController.DataSource.IsPasswordRequired THEN
	    oController.DataSource.User = "User"
	    oController.DataSource.Password = "Password"
	END IF
	IF NOT ( oController.isConnected() ) THEN
		oController.connect()
	END IF
	ThisDatabaseDocument.formdocuments.getbyname("Start").open
END SUB
... dem Ereigniss "Dokument öffnen" zugewiesen, öffnet es das Formular "Start"
wie hier schon mehrfach beschrieben

Re: Automatische Anmeldung an der DB

Verfasst: Fr 12. Feb 2016, 10:16
von gogo
klar, aber Du musst über die (angemeldete) Datenquelle gehen.

die zentralen Befehle wären:

Code: Alles auswählen

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Datenbankname")
DataSource.GetConnection("MeinName","pAssWoRt")
Ein etwas längeres Listing:

(Wesentlich sind die Zeilen "DataSource.USER = sUser" und "DataSource.Password = sPasswd")
Einen Passwort-Dialog brauchst Du auch noch außer Du möchtest immer mit demselben Benutzernamen und Passwort verbinden, dann kannst Du den ganzen Abschnitt von "' holt zumindest irgendwas aus der Verbindung" bis "DataSource.Password = sPasswd" weglassen und "goConnection = DataSource.GetConnection(sUser,sPasswd)" durch "goConnection = DataSource.GetConnection("Benutzer","geheimesPasswort")" ersetzen.
Die Zuweisung der Connection zur globalen Variable goConnection hat den Vorteil, dass Du diese später nutzen kannst, und ein SQL-Statement dann einfach mit Statement=goConnection.createStatement erzeugt wird.

Code: Alles auswählen

Global goConnection
Global go_Dlg_Passwort

sub DatenbankStarten(optional oEvent)

	if not VerbindungHerstellen("NameDerRegistriertenDatenbank") then
		if not ismissing(oEvent) then 
			on error resume next
				' eigene Sub in einem anderen Modul, das die Datenbank "von aussen" korrekt schliesst
				call SUB_DatenbankSchliessen(oEvent, 1500)
			on error goto EH 
			msgbox "Verbindung zur Datenbank konnte nicht hergestellt werden, die Anwendung wird beendet!"
		else
			msgbox "Verbindung zur Datenbank konnte nicht hergestellt werden! Bitte die Anwendung manuell beenden!"
		end if
	end if

end sub

function VerbindungHerstellen(sMyRegDB)
	on erhror goto EH
	dim DatabaseContext, DataSource, Connection
	dim InteractionHandler
	dim sUser, sPasswd
	
	VerbindungHerstellen = false

	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	if NOT DatabaseContext.hasByName(sMyRegDB) then
		msgbox "Datenquelle " & sMyRegDB & " wurde NICHT gefunden! - daher Abbruch!"
		exit function
	end if
	DataSource = DatabaseContext.getByName(sMyRegDB)
	
	' holt zumindest irgendwas aus der Verbindung1
	sUser=cstr(DataSource.USER)
	sPasswd=cstr(DataSource.Password)
	if sPasswd = "" then sUser=""
	
	PasswortDialog:
	if NOT DLG_Passwort(sUser, sPasswd) Then exit function
	if sUser = "" OR sPasswd = "" then 
		if msgbox("Benutzername und Passwort muessen angegeben werden! - Noch eine Versuch?", 4) = 6 then
			goto PasswortDialog
		else
			exit function
		end if
	end if

	DataSource.USER = sUser
	DataSource.Password = sPasswd
	goConnection = DataSource.GetConnection(sUser,sPasswd)
	
	if DataSource.getConnection(DataSource.USER, DataSource.Password).isClosed = true then
		msgbox sMyRegDB & "-Verbindung ist derzeit - warum auch immer - Schrott!"
		exit function
	end if

	VerbindungHerstellen = true
	exit function
	
	EH:
	call EH
	if msgbox("Verbindung zu " & sMyRegDB & " schliessen?",4) = 6 then Connection.release

end function

Function DLG_Passwort(sUser, sPasswd, optional sDatenquelle)
	dim DialogWert, i
	DLG_Passwort = false
	i=0
	If (Not ThisComponent.DialogLibraries.isLibraryLoaded("Standard")) Then 
	    ThisComponent.DialogLibraries.LoadLibrary("Standard")
	End If
	
	go_Dlg_Passwort = CreateUnoDialog(Dialoglibraries.Standard.Dlg_Passwort)

	' manchmal dauert's	ein bisschen bis der Dialog geladen wurde - daher diese Schleife
	do while (NOT isobject(go_Dlg_Passwort)) AND ( i < 100 )
		i=i+1
		wait 100
	loop

	go_Dlg_Passwort.GetControl("BenName").setText(sUser)
	go_Dlg_Passwort.GetControl("Passwd").setText(sPasswd)
	
	DialogWert = go_Dlg_Passwort.execute()
	if DialogWert = 1 then ' ueberprueft ob ueberhaupt etwas ausgewaehlt wurde
		DLG_Passwort = true
		sUser   = go_Dlg_Passwort.GetControl("BenName").Text
		sPasswd = go_Dlg_Passwort.GetControl("Passwd").Text
	end if
	go_Dlg_Passwort.dispose()
end Function

Re: Automatische Anmeldung an der DB

Verfasst: Fr 12. Feb 2016, 17:00
von RobertG
Hallo *,

das folgende Verfahren geht auch ohne angemeldete Datenbank:

Code: Alles auswählen

oDatasource = thisDatabaseDocument.CurrentController.DataSource
oConnection = oDatasource.getConnection("username","password")
Datenbanken melde ich in der Regel nicht an. Und da sowieso beim Öffnen des Dokumentes noch keine Verbindung für die Base-Datei besteht, kann ich mir eine IF-Abfrage doch sparen, oder?
Abgesehen davon: Wenn ich Nutzername und Passwort bereits in die Datenbank in den Makrocode rein schreibe, dann sollte ich den Makrocode wenigstens durch ein Passwort sichern. Ich weiß nicht, wie das einmal funktioniert hat. Ich habe nur davon gelesen, dass der Passwortschutz zur Zeit defekt ist.
Folgerung: Ich kann mir auch gleich das Passwort für den entsprechenden Nutzer in der Datenbank sparen ...

Gruß

Robert

Re: Automatische Anmeldung an der DB

Verfasst: Fr 12. Feb 2016, 17:40
von gogo
Dem CurrentController vertraue ich nicht - bei falschen Passworteingaben und sonstigen Verbindungsproblemen war das immer zu instabil - kann aber sein, dass er bei der embedded HSQLDB gut funktioniert.

Re: Automatische Anmeldung an der DB

Verfasst: Fr 12. Feb 2016, 19:32
von RobertG
Hallo gogo,

ich habe das mit einer externen MariaDB getestet, die eben so eine Passworteingabe erforderte. Nur einmal getestet, nicht intensiv. Ich würde sowieso keine Passwörter in der Datenbankdatei hinterlegen.

Gruß

Robert

Re: Automatische Anmeldung an der DB

Verfasst: Di 1. Mär 2016, 15:55
von scientific
RobertG hat geschrieben:Hallo gogo,

ich habe das mit einer externen MariaDB getestet, die eben so eine Passworteingabe erforderte. Nur einmal getestet, nicht intensiv. Ich würde sowieso keine Passwörter in der Datenbankdatei hinterlegen.

Gruß

Robert
Ich steh auch grad vor dem Problem, dass ich für ein Skript, welches Outlook- oder auch Google-Calendar-Events bearbeitet irgendwo Credentials hinterlegen muss...

LO-Base ruft ein Python-Skript auf, welches sich dann gegen den Outlook- bzw. Google-Server authentifiziert...

Wie macht man so etwas "richtig"?

Das Eintragen/Ändern von Events auf einen Exchange-Server klappt schon. In die Google-Api arbeite ich mich gerade ein.

Aber ich hab echt keine Ahnung, wie ich das in LO korrekterweise mit der Authentifizierung löse, sodass ich die Login-Credentials nicht im Klartext hinterlegen muss (derzeit liegen die probehalber in einer Tabelle in der hsqldb)

lg scientific