Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier

Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Passwortabfrage

Moderator: Moderatoren

Antworten
Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Passwortabfrage

Beitrag von Jojo » Mi, 23. Sep 2015 22:02

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?

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11051
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Passwortabfrage

Beitrag von AUGE_OHR » Do, 24. Sep 2015 5:34

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

Code: Alles auswählen

@ 13, 5 say len( "123456789" )
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
gruss by OHR
Jimmy

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Passwortabfrage

Beitrag von Jojo » Do, 24. Sep 2015 13:01

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 :angry6: . 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

Code: Alles auswählen

private master_pw := space( 4 )
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

Code: Alles auswählen

private master_pw
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

Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2031
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Kontaktdaten:

Re: Passwortabfrage

Beitrag von Koverhage » Do, 24. Sep 2015 13:18

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
Gruß
Klaus

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7039
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Passwortabfrage

Beitrag von Tom » Do, 24. Sep 2015 13:25

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:

Code: Alles auswählen

if memo_pw == master_pw 
gegen:

Code: Alles auswählen

IF AllTrim(memo_pw) == AllTrim(master_pw)
Vielleicht sogar noch ergänzt um Upper() oder Lower(), je nach Gusto.
Herzlich,
Tom

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Passwortabfrage

Beitrag von Jojo » Fr, 25. Sep 2015 21:55

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. :angry4:
Das eingegebene Passwort, master_pw mit vier Zeichen...

HELP!

PLEASE!!

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Passwortabfrage

Beitrag von Jojo » Fr, 25. Sep 2015 23:11

@ 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! :blob8:
Er "verschluckt" zwar noch den ersten Buchstaben der Eingabe, aber das bekomme ich vielleicht auch noch hin.
Herzlichen Dank dafür =D>

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11051
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Passwortabfrage

Beitrag von AUGE_OHR » Sa, 26. Sep 2015 2:42

Jojo hat geschrieben:Er zeigt mir in memo_pw das vier Zeichen lange Passwort aus der Datei mit fünf Zeichen an. :angry4:
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
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14181
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Passwortabfrage

Beitrag von brandelh » So, 27. Sep 2015 14:24

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 !) ?
Gruß
Hubert

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Passwortabfrage

Beitrag von Jojo » So, 27. Sep 2015 20:31

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

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11051
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Passwortabfrage

Beitrag von AUGE_OHR » So, 27. Sep 2015 20:37

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'
gruss by OHR
Jimmy

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Passwortabfrage

Beitrag von Jojo » So, 27. Sep 2015 20:52

Hallo Jimmy,

ich schäme mich... :(
Wenn mir das nochmal passiert, gebe ich einen aus.
Versprochen! :-)

Grüße
Jojo

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Passwortabfrage

Beitrag von Jojo » So, 27. Sep 2015 22:03

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

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11051
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Passwortabfrage

Beitrag von AUGE_OHR » So, 27. Sep 2015 23:19

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
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14181
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Passwortabfrage

Beitrag von brandelh » Mo, 28. Sep 2015 9:17

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.
Gruß
Hubert

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Passwortabfrage

Beitrag von Jojo » Mo, 28. Sep 2015 21:44

Hallo Jimmy,

auch diese Version schneidet das erste Zeichen ab.
Wenn ich zum Beispiel "1234567" eingebe spuckt das Programm "234567" aus.
#-o

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. :D

Nochmals DANKE für die Tipps!

Grüße
Jojo

@Hubert: Danke für den Hinweis. Habe ich übernommen.

paulberger
Rookie
Rookie
Beiträge: 10
Registriert: Mo, 02. Nov 2015 13:43

Re: Passwortabfrage

Beitrag von paulberger » Mo, 02. Nov 2015 13:58

FlagShip unterstützt auch eine verdeckte Passwort-Eingabe mit der "@P" Picture-Klause, z.B.

Code: Alles auswählen

@ 10,20 SAY "Passwort" GET master_pw PICTURE "@P"
wobei die Eingabe unsichtbar ist, d.h. mit Sternen "*" verdeckt wird. Weitere Details hierzu sind in dem FlagShip-Handbuch Kapitel CMD @..SAY/GET vorhanden.

Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Passwortabfrage

Beitrag von Jojo » Di, 10. Nov 2015 14:16

paulberger hat geschrieben:FlagShip unterstützt auch eine verdeckte Passwort-Eingabe mit der "@P" Picture-Klause, z.B.

Code: Alles auswählen

@ 10,20 SAY "Passwort" GET master_pw PICTURE "@P"
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!

Antworten