Seite 1 von 1
Passwortabfrage
Verfasst: Mi, 23. Sep 2015 22:02
von Jojo
Hallo zusammen,
ich möchte eine Passwortabfrage einbauen.
Diese sollte beim Programmstart einmalig am Tag abgefragt werden.
Dazu habe ich bis jetzt folgendes...
Code: Alles auswählen
FUNCTION master_pw
private master_pw := space( 20 )
cls
do while .t.
@ 18,3 say ' Bitte Passwort eingeben: '
@ 18,28 get master_pw
read
memo_pw := memoread( 'master.txt' ) && in der Datei master.txt steht das Passwort
memo_pw := substr( alltrim( memo_pw ) ,1,9) && Alle Leerzeichen am Ende oder Anfang löschen
* memo_pw = substr( ltrim( memo_pw ),4) && war ein Test, der auch nicht funktionierte :-(
@ 10, 5 say len( 'memo_pw' ) && zur Kontrolle, wie lang die Variable memo_pw ist
@ 12, 5 say len( 'master_pw' ) && zur Kontrolle, wie lang die Variable master_pw ist
wait (1)
if memo_pw == master_pw && Gibt falschen Wert aus! :angry4:
cls
setcolor(mbnorm) && würde die Farben wieder auf "normal" setzten
exit
else
cls
k_warn( ' Falsches Passwort ! ' ) && k_warn setzt die Farben auf rot und gelb
cls
do master_pw && wenn's falsch war zurück zum Anfang
return
endif
enddo
Obwohl ich in der Datei master.txt und im Kennwort den selben Text habe (test) lässt er mich nicht weiter und gibt bei den zwei "len()" (Danke Hubert
) auch unterschiedliche Werte aus.
Komischerweise übrigens immer 7 und 9, egal was ich als Passwort eingebe???
Hat jemand eine Idee, wie ich das lösen kann?
Bin wie immer für jedweden Tipp dankbar.
Grüße
Jojo
P.S.: Hat jemand eine Idee, wie ich die Tastaureingabe beim get "unsichtbar" mache und in Sternchen umwandle?
Re: Passwortabfrage
Verfasst: Do, 24. Sep 2015 5:34
von AUGE_OHR
Jojo hat geschrieben:ich möchte eine Passwortabfrage einbauen.
Dazu habe ich bis jetzt folgendes...
Code: Alles auswählen
FUNCTION master_pw
private master_pw := space( 20 )
@ 18,28 get master_pw
read
ok, also mit 20 Zeichen vorbelegt
Jojo hat geschrieben:Code: Alles auswählen
memo_pw := memoread( 'master.txt' ) && in der Datei master.txt steht das Passwort
memo_pw := substr( alltrim( memo_pw ) ,1,9) && Alle Leerzeichen am Ende oder Anfang löschen
was soll das SUBSTR() ? und wieso 9 ?
Jojo hat geschrieben:
Code: Alles auswählen
@ 10, 5 say len( 'memo_pw' ) && zur Kontrolle, wie lang die Variable memo_pw ist
@ 12, 5 say len( 'master_pw' ) && zur Kontrolle, wie lang die Variable master_pw ist
wait (1)
der "Klassiker" ... was kommt wohl hier raus
also wenn du den "Inhalt" der Variablen meinst dann OHNE die ' ' den sonst ist es ein String !
dann wirst du auch dahinter kommen das "master_pw", welches du mit SPACE(20) angelegt hast, immer noch 20 lang ist ...
Jojo hat geschrieben:P.S.: Hat jemand eine Idee, wie ich die Tastaureingabe beim get "unsichtbar" mache und in Sternchen umwandle?
wenn es sich um ein Windows Control handeln würde gäbe es den Flag ES_PASSWORD.
unter Cl*pper und vermutlich auch bei Flagship hast du ja das GET System was kein "*" als Passwort vorsieht.
man muss sich also seinen eigenen "hidden Reader" schreiben.
Code: Alles auswählen
@ nRow, nCol GET cPasswort SEND READER := { | o | HiddenReader( o ) }
/***********************************************************
*
* hidden Reader mit INKEY() -> "*" als Anzeige
*
***********************************************************/
#define GE_NOEXIT 0 // READ fortsetzen
#define GE_UP 1 // Nächstes Get nach oben
#define GE_DOWN 2 // Nächstes Get nach unten
#define GE_TOP 3 // Erstes Get
#define GE_BOTTOM 4 // Letztes Get
#define GE_ENTER 5 // Enter-Taste wurde gedrückt, nächstes Get
#define GE_WRITE 6 // READ abbrechen mit schreiben
#define GE_ESCAPE 7 // READ abbrechen ohne schreiben
#define GE_WHEN 8 // WHEN-Bedingung nicht erfüllt (oGet:preBlock)
#define GE_MOUSE 9 // Maus-Klick hat Get beendet
#define GE_LASTGET 10 // Fokus auf Get zurücksetzen, das zuletzt den Fokus hatte.
PROCEDURE HiddenReader( oGet )
LOCAL cBuffer, cChar, nKey
IF GetPreValidate( oGet )
oGet:setFocus()
cBuffer := oGet:buffer
cChar := REPLICATE( "*", LEN( TRIM( cBuffer ) ) )
oGet:varPut( PADR( cChar, LEN( cBuffer ) ) )
oGet:updateBuffer()
DO WHILE oGet:exitState == GE_NOEXIT
IF oGet:typeOut
oGet:exitState := GE_ENTER
ENDIF
DO WHILE oGet:exitState == GE_NOEXIT
// Taste per INKEY()
nKey := INKEY( 0 )
DO CASE
CASE nKey == K_DEL .OR. nKey == K_BS
GetApplykey( oGet, nKey )
cBuffer := STUFF( cBuffer, oGet:pos, 1, "" )
CASE nKey >= 32 .AND. nKey <= 255
// hier die "*" ausgeben
GetApplykey( oGet, ASC( "*" ) )
cChar := CHR( nKey )
IF oGet:typeOut
ELSEIF SET( _SET_INSERT )
cBuffer := STUFF( cBuffer, oGet:pos - 1, 0, cChar )
ELSE
cBuffer := STUFF( cBuffer, oGet:pos - 1, 1, cChar )
ENDIF
OTHERWISE
GetApplykey( oGet, nKey )
ENDCASE
ENDDO
IF !GetPostValidate( oGet )
oGet:exitState := GE_NOEXIT
ENDIF
ENDDO
oGet:killFocus()
oGet:varPut( cBuffer )
ENDIF
RETURN
die GE_* Konstanten musst du evtl. auf Flagship anpassen
Re: Passwortabfrage
Verfasst: Do, 24. Sep 2015 13:01
von Jojo
Hallo Jimmy,
vielen Dank für Deine ausführliche Antwort.
Ich komme gerade nicht dazu das alles auszuprobieren, aber der Hinweis mit den falschen Anführungszeichen war Gold wert
. Danke!
Jetzt bekomme ich natürlich auch die tatsächliche Länge angezeigt.
Was mich zum nächsten Punkt bringt...
Wenn ich die Variable mit
fülle und mit ltrim die memo_pw auf 4 Zeichen beschneide, klappt es (das Passwort in der Datei ist
test, also vier Zeichen lang ).
Bei space( 20 ) klappt es nicht, weil die Variable natürlich 20 Zeichen lang ist.
Gebe ich aber nur
ein, bekomme ich eine Fehlermeldung "illegal data type. get:type is 'U' not C,N,L,D,I,F"
Hat jemand eine Idee, wie ich die Variable master_pw definieren muss, wenn ich nicht weiß wie lang das Passwort später ist?
Oder bin ich (mal wieder) völlig auf dem Holzweg?
Grüße
Jojo
Re: Passwortabfrage
Verfasst: Do, 24. Sep 2015 13:18
von Koverhage
Du kannst die 20 schon nehmen,
musst dann aber die Leerzeichen abschneiden
master_pw := Rtrim(master_pw)
So kannt Du auch Leerzeichen als Teil des PW verwenden, allerdings nur am Anfang und zwischendrin
Re: Passwortabfrage
Verfasst: Do, 24. Sep 2015 13:25
von Tom
Ich würde mir auch mal anschauen, was bei der Trimmerei und Kapperei von "master_pw" eigentlich rauskommt, also wie genau das "master_pw" danach aussieht. Ansonsten kann das Eingabefeld natürlich beliebig lang sein (das sollte es auch, damit man nicht schon die zu erratende Länge weiß), nur muss man dann beim Vergleich aufpassen:
gegen:
Vielleicht sogar noch ergänzt um Upper() oder Lower(), je nach Gusto.
Re: Passwortabfrage
Verfasst: Fr, 25. Sep 2015 21:55
von Jojo
Bin am verzweifeln!
Egal wie ich die Beiden beschneide, ob mit alltrim, oder "rtrim (master_pw/memo_pw)".
Er zeigt mir in memo_pw das vier Zeichen lange Passwort aus der Datei mit fünf Zeichen an.
Das eingegebene Passwort, master_pw mit vier Zeichen...
HELP!
PLEASE!!
Re: Passwortabfrage
Verfasst: Fr, 25. Sep 2015 23:11
von Jojo
@ Jimmy:
Weil ich gerade sowieso nicht weiterkomme, habe ich Deinen Code für den "hidden reader", also die Sternchen während der Passworteingabe ausprobiert.
Was soll ich sagen... Es funktioniert!
Er "verschluckt" zwar noch den ersten Buchstaben der Eingabe, aber das bekomme ich
vielleicht auch noch hin.
Herzlichen Dank dafür =D>
Re: Passwortabfrage
Verfasst: Sa, 26. Sep 2015 2:42
von AUGE_OHR
Jojo hat geschrieben:Er zeigt mir in memo_pw das vier Zeichen lange Passwort aus der Datei mit fünf Zeichen an.
gehe mal in den Explorer mit der Detail Ansicht und siehe dir die Datei 'master.txt' an wie gross die ist ... 4,5 oder 6 Byte ?
wenn > 4 "könnte" auch ein CHR(13) oder CHR(10) am Ende sein ...
Code: Alles auswählen
memo_pw := memoread( 'master.txt' )
memo_pw := ALLTRIM(memo_pw)
? nLen := LEN(memo_pw)
IF nLen > 4
// alle Zeichen > 4
cCHR := SUBSTR(memo_pw, 5, nLen-4)
// wenn du wissen willst welche Zeichen
iMax := LEN(cCHR)
FOR i := 1 TO iMax
? ASC( SUBSTR(cCHR, i, 1) )
NEXT
ENDIF
WAIT
RETURN
Re: Passwortabfrage
Verfasst: So, 27. Sep 2015 14:24
von brandelh
memo_pw := memoread( 'master.txt' )
wenn du memowrit() zum Schreiben verwendest, dann wird immer in seltsames Dateiendezeichen angehängt !
besser mit fopen() etc. die Sachen speichern, wobei legst du Passwörter im Klartext auf die Festplatte (ein absolutes NO GO !) ?
Re: Passwortabfrage
Verfasst: So, 27. Sep 2015 20:31
von Jojo
Servus Hubert,
ich merke auch, dass ich mit der Version mit einer Textdatei nicht glücklich werde, weil der eingelesene String immer ein Zeichen länger ist.
Deshalb bin ich gerade dabei zu testen, wie ich das mit einer .dbf-Datei hinbekomme.
Dazu habe ich eine master.dbf angelegt, die unter der Spalte "Passwort" den Inhalt "test" enthält.
Im Programm habe ich folgendes:
Code: Alles auswählen
FUNCTION passwort_abfrage
PRIVATE master_pw := space( 10 )
PRIVATE memo_pw := space( 10 )
do while .t.
@ 18,3 say ' Bitte Passwort eingeben: '
@ 18,28 get master_pw
read
master_pw := ALLTRIM( master_pw ) && hier wird das eingegebene Passwort von evtl. Leerzeichen "befreit"
USE master
SET INDEX TO passwort && muss ich tatsächlich immer einen Index angeben?
memo_pw := master->passwort
memo_pw := alltrim( memo_pw ) && hier wird das PW aus der dbf beschnitten
@ 10, 5 say 'memo_pw='
@ 10, 15 say len( memo_pw )
@ 11, 15 say memo_pw
@ 12, 5 say 'master_pw='
@ 12,15 say len( master_pw )
@ 13, 15 say master_pw
wait (1)
IF ( 'memo_pw' ) == ( 'master_pw' )
exit
ELSE
k_warn( 'Passwort falsch!' )
do passwort_abfrage
RETURN
ENDIF
ENDDO
Obwohl ich nach Eingabe des Passwortes "test" die Ausgabe:
memo_pw = 4
= test
master_pw = 4
= test
Press any key to continue...
erhalte, also beide Variablen den selben Inhalt enthalten, zeigt er gleich anschließend "Passwort falsch!"
Warum?
Grüße
Jojo
Re: Passwortabfrage
Verfasst: So, 27. Sep 2015 20:37
von AUGE_OHR
Jojo hat geschrieben:Code: Alles auswählen
FUNCTION passwort_abfrage
IF ( 'memo_pw' ) == ( 'master_pw' )
weil du schon wieder den selben Fehler machst ... 'das_ist_ein_String'
Re: Passwortabfrage
Verfasst: So, 27. Sep 2015 20:52
von Jojo
Hallo Jimmy,
ich schäme mich...
Wenn mir das nochmal passiert, gebe ich einen aus.
Versprochen!
Grüße
Jojo
Re: Passwortabfrage
Verfasst: So, 27. Sep 2015 22:03
von Jojo
Hallo Jimmy,
wenn Du noch den Nerv hast...
Hast Du eine Idee, weshalb Dein "hidden Reader" beim Kompillieren die ersten zehn Define´s mit
Warning, redefinition of GE_NOEXIT, etc. bemängelt?
Nur beim "'#define GE_LASTGET 10" meckert er nicht.
Wenn ich die Define´s auskommentiere geht es aber trotzdem.
Nur das Problem, dass er das erste eingegebene Zeichen nicht erkennt habe ich noch nicht gelöst.
Wenn ich test eingebe kommt "falsches Passwort".
Wenn ich aber z.B. 1test eingebe, komme ich weiter...
Grüße
Jojo
Re: Passwortabfrage
Verfasst: So, 27. Sep 2015 23:19
von AUGE_OHR
Jojo hat geschrieben:Hast Du eine Idee, weshalb Dein "hidden Reader" beim Kompillieren die ersten zehn Define´s mit
Warning, redefinition of GE_NOEXIT, etc. bemängelt?
Nur beim "'#define GE_LASTGET 10" meckert er nicht.
Wenn ich die Define´s auskommentiere geht es aber trotzdem.
wie ich schrieb
die GE_* Konstanten musst du evtl. auf Flagship anpassen
da ich nicht wusste ob Flagship die selben verwendet was wohl der Fall ist.
p.s. eine "Warnung" ist nur eine Warnung ...
Jojo hat geschrieben:Nur das Problem, dass er das erste eingegebene Zeichen nicht erkennt habe ich noch nicht gelöst.
Wenn ich test eingebe kommt "falsches Passwort".
Wenn ich aber z.B. 1test eingebe, komme ich weiter...
hm ... versuche mal das
Code: Alles auswählen
#include "INKEY.CH"
PROCEDURE MAIN()
LOCAL cPasswort := space( 20 )
cls
@ 10, 10 GET cPasswort SEND READER := { | o | HiddenReader( o ) }
READ
CLEAR GETS
? cPasswort
WAIT
RETURN
PROCEDURE HiddenReader( oGet )
// hier der Rest
RETURN
Re: Passwortabfrage
Verfasst: Mo, 28. Sep 2015 9:17
von brandelh
Grundsätzlich bei Vergleichen von Texten aus DBF (mit Blanks aufgefüllt) und Strings (je nach Eingabe auch aufgefüllt aber andere Länge ?)
sollte man alltrim(cTxt1) == alltrim(cTxt2) vergleichen. Bei Benutzernamen würde ich auch UPPER() noch verwenden um Groß-/Klein auszuschalten.
In Kennwörtern sollte aber Groß-/Klein schon unterschiedlich sein.
Re: Passwortabfrage
Verfasst: Mo, 28. Sep 2015 21:44
von Jojo
Hallo Jimmy,
auch diese Version schneidet das erste Zeichen ab.
Wenn ich zum Beispiel "1234567" eingebe spuckt das Programm "234567" aus.
Habe dann ein bisschen mit den Zahlen herumgespielt und hatte Erfolg!
Code: Alles auswählen
...
GetApplykey( oGet, ASC( "*" ) )
cChar := CHR( nKey )
IF oGet:typeOut
ELSEIF SET( _SET_INSERT )
cBuffer := STUFF( cBuffer, oGet:pos - 0, 0, cChar ) && war -1, 0,
ELSE
cBuffer := STUFF( cBuffer, oGet:pos - 0, 1, cChar ) && war -1, 1,
ENDIF
...
Bin zwar noch am Testen, aber es schaut so aus als ob es damit funktioniert.
Nochmals DANKE für die Tipps!
Grüße
Jojo
@Hubert: Danke für den Hinweis. Habe ich übernommen.
Re: Passwortabfrage
Verfasst: Mo, 02. Nov 2015 13:58
von paulberger
FlagShip unterstützt auch eine verdeckte Passwort-Eingabe mit der "@P" Picture-Klause, z.B.
wobei die Eingabe unsichtbar ist, d.h. mit Sternen "*" verdeckt wird. Weitere Details hierzu sind in dem FlagShip-Handbuch Kapitel CMD @..SAY/GET vorhanden.
Re: Passwortabfrage
Verfasst: Di, 10. Nov 2015 14:16
von Jojo
paulberger hat geschrieben:FlagShip unterstützt auch eine verdeckte Passwort-Eingabe mit der "@P" Picture-Klause, z.B.
wobei die Eingabe unsichtbar ist, d.h. mit Sternen "*" verdeckt wird. Weitere Details hierzu sind in dem FlagShip-Handbuch Kapitel CMD @..SAY/GET vorhanden.
Wer (FSman) lesen kann, ist klar im Vorteil...
Genial einfach. Einfach genial! =D>
Danke!