Register/Login Script [AutoIt]

05/11/2013 12:26 sezer0012#1
Hallöchen, ich zeige euch meinen selbst geschriebenen AutoIt Register/Login Script vor.

Erklärung:
Wenn man sich registriert speichert er in den Ordner Spieler 2 Textdateien, ein mal Username und Passwort. Natürlich verschlüsselt es auch den Passwort damit es sicherer ist. Wenn man sich einloggt, fragt es ab ob eine Datei existiert mit den Username, und wenn ja fragt es ab ob alles genau gleich ist.

Wenn ihr den Script nicht downloaded sondern einfach kopiert, müsst ihr einen Ordner namens Spieler erstellen.

Script:
Code:
#RequireAdmin
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <String.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Created by sezer0012", 247, 74, 379, 310)
GUISetBkColor(0x99B4D1)
$Button1 = GUICtrlCreateButton("Login", 128, 32, 99, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Registrieren", 8, 32, 107, 25, $WS_GROUP)
$Label1 = GUICtrlCreateLabel("NEU HIER?", 8, 8, 112, 19)
GUICtrlSetFont(-1, 14, 800, 0, "Tahoma")
$Label2 = GUICtrlCreateLabel("ODER", 136, 8, 59, 19)
GUICtrlSetFont(-1, 14, 800, 0, "Tahoma")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
	  Case $GUI_EVENT_CLOSE
		 Exit
	  Case $Button1
		 Form2()
	  Case $Button2
		 Form3()

	EndSwitch
WEnd

Func Form2()
   
   #Region ### START Koda GUI section ### Form=
   $Form2 = GUICreate("Login", 216, 94, 337, 251)
   GUISetBkColor(0x99B4D1)
   $Label1 = GUICtrlCreateLabel("Username:", 8, 8, 55, 17)
   $Label2 = GUICtrlCreateLabel("Geheimcode:", 8, 32, 67, 17)
   $Input1 = GUICtrlCreateInput("", 80, 8, 121, 21)
   $Input2 = GUICtrlCreateInput("", 80, 32, 121, 21)
   $Button1 = GUICtrlCreateButton("Login", 8, 56, 195, 25, $WS_GROUP)
   GUISetState(@SW_SHOW)
   #EndRegion ### END Koda GUI section ###

   While 1
	   $nMsg = GUIGetMsg()
	   Switch $nMsg
		 Case $GUI_EVENT_CLOSE
			Exit
		 Case $Button1
			Local $datei1, $datei2, $zeile1, $zeile2
			
			Local $username3 = GUICtrlRead($Input1)
			Local $gehcode4 = GUICtrlRead($Input2)
			
			Local $zeile1 = FileRead("S" & $username3)
			Local $zeile2 = FileRead("P" & $gehcode4)
			
			$datei1 = FileOpen(@ScriptDir & "\Spieler\Spieler " & $username3 & "\" & "S" & $username3)
			$datei2 = FileOpen(@ScriptDir & "\Spieler\Spieler " & $username3 & "\" & "P" & $gehcode4)
	  
			If Not FileExists(@ScriptDir & "\Spieler\" & $username3 & "\Username" & ".txt") Then
			   MsgBox(16, "Fehler!", "Account existiert nicht.")
			   Exit
			EndIf
			
			If Not FileExists(@ScriptDir & "\Spieler\" & $username3 & "\Passwort" & ".txt") Then
			   MsgBox(16, "Fehler!", "Passwort falsch angegeben!")
			   Exit
			EndIf
			
			If FileExists(@ScriptDir & "\Spieler\" & $username3 & "\Username" & ".txt") And FileExists(@ScriptDir & "\Spieler\" & $username3 & "\Passwort" & ".txt") Then
			   Form4()
			Else
			   MsgBox(16, "Fehler!", "Es ist ein Unbekannter Fehler aufgetreten!")
			EndIf

	   EndSwitch
   WEnd


EndFunc

Func Form3()

   #Region ### START Koda GUI section ### Form=
   $Form3 = GUICreate("Registrieren", 397, 54, 302, 218)
   GUISetBkColor(0x99B4D1)
   $Label1 = GUICtrlCreateLabel("Username:", 8, 8, 55, 17)
   $Input1 = GUICtrlCreateInput("", 64, 8, 121, 21)
   $Label2 = GUICtrlCreateLabel("Passwort:", 192, 8, 67, 17)
   $Input2 = GUICtrlCreateInput("", 264, 8, 121, 21)
   $Button1 = GUICtrlCreateButton("Registrieren", 64, 32, 323, 17, $WS_GROUP)
   GUISetState(@SW_SHOW)
   #EndRegion ### END Koda GUI section ###

   While 1
	   $nMsg = GUIGetMsg()
	   Switch $nMsg
		 Case $GUI_EVENT_CLOSE
			Exit
		 Case $Button1
			Local $Spieler = "\Spieler\"
			
			$username1 = GUICtrlRead($Input1)
			$gehcode2 = GUICtrlRead($Input2)
			$lvl = 1
			
			If FileExists(@ScriptDir & $Spieler & $username1 & "\" & "S" & $username1 & ".txt") Then
			   MsgBox(16, "Fehler!", "Account existiert schon!" & @CRLF & @CRLF & "Wenn sie ihr Passwort vergessen haben," & @CRLF & "müssen sie sich einen neuen Account" & @CRLF & "mit anderen Daten zulegen.")
			   Exit
			EndIf

			DirCreate(@ScriptDir & "\Spieler\" & $username1)
			FileWrite(@ScriptDir & "\Spieler\" & $username1 & "\" & "Username" & ".txt", $username1 & @CRLF)
			FileWrite(@ScriptDir & "\Spieler\" & $username1 & "\" & "Passwort" & ".txt", _StringEncrypt(1, $gehcode2, $gehcode2, $lvl))
			
			MsgBox(0, "Erfolgreich!", "Sie haben sich erfolgreich Registriert," & @CRLF & "loggen sie sich bitte jetzt ein.")
			Exit
			
			$LOG = FileOpen(@ScriptDir & "\Spieler\" & "Spieler " & $username1 & ".txt", 1 )
			If $LOG = -1 Then
			   MsgBox( 0, "Mist", "Datei konnte nicht geöffnet werden" )
			   Exit
			EndIf
			
	   EndSwitch
   WEnd

EndFunc

Func Form4()
   
   #Region ### START Koda GUI section ### Form=
   $Form4 = GUICreate("Das wars!", 391, 238, 192, 124)
   $Edit1 = GUICtrlCreateEdit("", 0, 0, 385, 233)
   GUICtrlSetData(-1, "Edit1")
   GUISetState(@SW_SHOW)
   #EndRegion ### END Koda GUI section ###

   GUICtrlSetData($Edit1, "Das war das Login - Script.")

   While 1
	   $nMsg = GUIGetMsg()
	   Switch $nMsg
		   Case $GUI_EVENT_CLOSE
			   Exit

	   EndSwitch
   WEnd

   
EndFunc
VirusTotal: [Only registered and activated users can see links. Click Here To Register...]
Download - Link: [Only registered and activated users can see links. Click Here To Register...]

Natürlich müsst ihr noch was ändern, also wenn man sich eingeloggt hat soll ja was passieren, das müsst ihr ändern wie ihr es wollt!
Das ist mein erstes richtiges AutoIt Script :D
wenn es bugs gibt bitte melden
05/11/2013 14:19 WJNeeson#2
Hallo sezer :)
Die Idee von deinem Script ist gut, aber du setzt sie leider nicht richtig um.
Ist nichts schlimmes, man lernt ja aus Fehlern.
Hab mir deinen Script mal angeschaut und abgeändert und nun will ich dir zeigen was man besser machen kann:

PHP Code:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <String.au3>
#include <Array.au3>

#Region ### START Koda GUI section ### Form=
$Form1 GUICreate("Created by sezer0012"24774, -1, -1)
GUISetBkColor(0x99B4D1)
$Button1 GUICtrlCreateButton("Login"128329925$WS_GROUP)
$Button2 GUICtrlCreateButton("Registrieren"83210725$WS_GROUP)
$Label1 GUICtrlCreateLabel("NEU HIER?"8811219)
GUICtrlSetFont(-1148000"Tahoma")
$Label2 GUICtrlCreateLabel("ODER"13685919)
GUICtrlSetFont(-1148000"Tahoma")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form=
$Form2 GUICreate("Login"21694, -1, -1)
GUISetBkColor(0x99B4D1)
$Label3 GUICtrlCreateLabel("Username:"885517)
$Label4 GUICtrlCreateLabel("Geheimcode:"8326717)
$Input1 GUICtrlCreateInput(""80812121)
$Input2 GUICtrlCreateInput(""803212121)
$Button3 GUICtrlCreateButton("Login"85619525$WS_GROUP)
GUISetState(@SW_HIDE)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form=
$Form3 GUICreate("Registrieren"39754, -1, -1)
GUISetBkColor(0x99B4D1)
$Label5 GUICtrlCreateLabel("Username:"885517)
$Input3 GUICtrlCreateInput(""64812121)
$Label6 GUICtrlCreateLabel("Passwort:"19286717)
$Input4 GUICtrlCreateInput(""264812121)
$Button4 GUICtrlCreateButton("Registrieren"643232317$WS_GROUP)
GUISetState(@SW_HIDE)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form=
$Form4 GUICreate("Das wars!"391238, -1, -1)
$Edit1 GUICtrlCreateEdit(""00385233)
GUICtrlSetData(-1"Edit1")
GUISetState(@SW_HIDE)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg 
GUIGetMsg(1)
    Switch 
$nMsg[0]
        Case 
$GUI_EVENT_CLOSE
            
Switch $nMsg[1]
                Case 
$Form1
                    
Exit
                Case 
$Form2
                    GUISetState
(@SW_HIDE$Form2)
                Case 
$Form3
                    GUISetState
(@SW_HIDE$Form3)
                Case 
$Form4
                    GUISetState
(@SW_HIDE$Form4)
            EndSwitch
        Case 
$Button1 ;LoginForm
            GUISetState
(@SW_SHOW$Form2)
        Case 
$Button2 ;RegisterForm
            GUISetState
(@SW_SHOW$Form3)
        Case 
$Button3 ;Login
            $Username 
GUICtrlRead($Input1)
            
$Passwort GUICtrlRead($Input2)
            
$RegUsers IniReadSectionNames(@ScriptDir "/Spieler.ini")
            If 
_ArraySearch($RegUsers$Username) <> -1 Then
                $sPasswort 
_StringEncrypt(0IniRead(@ScriptDir "/Spieler.ini"$Username"password"""), "1337")
                If 
$sPasswort $Passwort Then
                    GUISetState
(@SW_SHOW$Form4)
                Else
                    
MsgBox(16"""Falsches Passwort")
                EndIf
            Else
                
MsgBox(16"""Benutzer existiert nicht")
            EndIf
        Case 
$Button4 ;Register
            $Username 
GUICtrlRead($Input3)
            
$Passwort GUICtrlRead($Input4)
            
$RegUsers IniReadSectionNames(@ScriptDir "/Spieler.ini")
            If 
_ArraySearch($RegUsers$Username) = -1 Then
                IniWrite
(@ScriptDir "/Spieler.ini"$Username"password"_StringEncrypt(1$Passwort"1337"))
                
MsgBox(64"""Erfolgreich registriert")
            Else
                
MsgBox(16"""Benutzer existiert bereits")
            EndIf
    EndSwitch
WEnd 
Wenn du in einem Script mehrere GUIs benutzt, dann setz sie an den Anfang alle untereinander und benutze keine verschiedenen Funktionen dafür.
Der Grund dafür ist ganz einfach: wenn ich zwei Funktionen habe mit jeweils einer GUI und über die GUI in der Funktion1 die Funktion2 aufrufe, dann springe ich automatisch in die While-Schleife der zweiten GUI und kann somit keine Elemente mehr aus der ersten GUI benutzen.
Außerdem schließt sich der gesamte Script, wenn ich das Fenster schließen will.

Lösung: Eine erweiterte GUIGetMsg-Abfrage.
GUIGetMsg(1) gibt eine Array zurück, die unter anderem die Ereignis-ID ($nMsg[0]) und das Fenster-Handle der GUI beinhaltet, in welcher das Ereignis gemeldet wird ($nMsg[1]).

Beim Registrieren ist mir aufgefallen, dass ich mich mehrmals registrieren kann. Wenn der Benutzername schon existiert komm keine Fehlermeldung, sondern das alte Passwort wird einfach mit dem neuen Überschrieben und in der Username.txt stehen dann zwei Zeilen mit dem gleichen Namen.

Lösung: Alle Benutzer in eine Ini-Datei stecken.
Eine Ini-Datei bietet hier viele Vorteile. Einmal ist die Abfrage der Daten leichter und man kann ohne viele Dateien mehr Daten speichern (z.B. ob ein Benutzer gesperrt ist, oder schon eingeloggt).
Hier mal ein Beispiel:
PHP Code:
[Benutzer1]
password=E2B91FAE039A9112B9549524
[Benutzer2]
password=9BBD1ED5 
Der Befehl IniReadSectionNames würde nun eine Array zurückgeben ($aBenutzer[3] = [2, "Benutzer1", "Benutzer2"]) und du musst mit _ArraySearch oder einer For-Schleife nurnoch überprüfen, ob der eingegebene Benutzername in der Array vorhanden ist.
Falls ja, wird das Passwort aus der Section des Benutzers ausgelesen und mit dem eingegebenen Passwort verglichen.

Falls du noch Fragen hast oder Hilfe benötigst, dann melde dich einfach bei mir!
05/11/2013 14:42 Logtetsch#3
Nunja, an sich eine ganz nette Idee, jedoch gibt es eine Menge zu bemengeln.
Die Verschlüsselung ist einfach nur crap und bietet null Sicherheit.
Das Speichern des Benutzernamen und Passwortes in einzelne .txt Dateien macht die Sache ziemlich umständlich und ist auch nicht die eleganteste Möglichkeit. Versuch doch mal das Passwort und den Benutzernamen in die registry mit einem eigenen Verschlüsslungsalgoritmus abzuspeichern. Das macht es um einiges einfacher und Daten aus der registry zu lesen ist schneller als die Textdokumente zu öffnen, lesen und anschließend wieder schließen. Desweitern bleiben die geöffneten Formen (Login, Register) immer im Hintergrund sichtbar, was sich sehr einfach beheben lässt.
Hoffe ich konnte dir soweit helfen, dass du es umsetzen kannst.

PS: Gib deinen Variablen ordentliche Namen - Stichwort: Ungarische Notation ;)
05/11/2013 15:09 sezer0012#4
Code:
#Region ### START Koda GUI section ### Form= 
$Form1 = GUICreate("Created by sezer0012", 247, 74, -1, -1) 
GUISetBkColor(0x99B4D1) 
$Button1 = GUICtrlCreateButton("Login", 128, 32, 99, 25, $WS_GROUP) 
$Button2 = GUICtrlCreateButton("Registrieren", 8, 32, 107, 25, $WS_GROUP) 
$Label1 = GUICtrlCreateLabel("NEU HIER?", 8, 8, 112, 19) 
GUICtrlSetFont(-1, 14, 800, 0, "Tahoma") 
$Label2 = GUICtrlCreateLabel("ODER", 136, 8, 59, 19) 
GUICtrlSetFont(-1, 14, 800, 0, "Tahoma") 
GUISetState(@SW_SHOW) 
#EndRegion ### END Koda GUI section ### 

#Region ### START Koda GUI section ### Form= 
$Form2 = GUICreate("Login", 216, 94, -1, -1) 
GUISetBkColor(0x99B4D1) 
$Label3 = GUICtrlCreateLabel("Username:", 8, 8, 55, 17) 
$Label4 = GUICtrlCreateLabel("Geheimcode:", 8, 32, 67, 17) 
$Input1 = GUICtrlCreateInput("", 80, 8, 121, 21) 
$Input2 = GUICtrlCreateInput("", 80, 32, 121, 21) 
$Button3 = GUICtrlCreateButton("Login", 8, 56, 195, 25, $WS_GROUP) 
GUISetState(@SW_HIDE) 
#EndRegion ### END Koda GUI section ### 

#Region ### START Koda GUI section ### Form= 
$Form3 = GUICreate("Registrieren", 397, 54, -1, -1) 
GUISetBkColor(0x99B4D1) 
$Label5 = GUICtrlCreateLabel("Username:", 8, 8, 55, 17) 
$Input3 = GUICtrlCreateInput("", 64, 8, 121, 21) 
$Label6 = GUICtrlCreateLabel("Passwort:", 192, 8, 67, 17) 
$Input4 = GUICtrlCreateInput("", 264, 8, 121, 21) 
$Button4 = GUICtrlCreateButton("Registrieren", 64, 32, 323, 17, $WS_GROUP) 
GUISetState(@SW_HIDE) 
#EndRegion ### END Koda GUI section ### 

#Region ### START Koda GUI section ### Form= 
$Form4 = GUICreate("Das wars!", 391, 238, -1, -1) 
$Edit1 = GUICtrlCreateEdit("", 0, 0, 385, 233) 
GUICtrlSetData(-1, "Edit1") 
GUISetState(@SW_HIDE) 
#EndRegion ### END Koda GUI section ###
Wenn ich das jetzt einfügen würde, würden dann nicht alle 4 Fenster gleichzeitig geöffnet?
05/11/2013 15:13 WJNeeson#5
Quote:
Originally Posted by sezer0012 View Post
Wenn ich das jetzt einfügen würde, würden dann nicht alle 4 Fenster gleichzeitig geöffnet?
Geöffnet ja, aber du siehst sie nicht.
05/11/2013 15:17 sezer0012#6
Quote:
Originally Posted by #System View Post
Geöffnet ja, aber du siehst sie nicht.
Danke das hab ich jetzt gecheckt,
aber könntest du mir vielleicht noch das mit
nMsg erklären.
05/11/2013 15:28 WJNeeson#7
Wenn du eine While Schleife mit der GUIGetMsg Abfrage hast, also:
PHP Code:
While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
    EndSwitch
WEnd 
Und jetzt etwas in deiner GUI machst, z.b. das rote X zum Schließen drückst, dann gibt GUIGetMsg die Ereignis-ID zurück.
Und je nach dem wie diese lautet schreibst du in die Cases für den Rückgabewert von GUIGetMsg Funktionen.
Wenn die Ereignis-ID $GUI_EVENT_CLOSE ist, dann wird das Programm geschlossen.

Benutzt du aber GUIGetMsg(1), also den Advanced Mode, dann erhälst du mehr als nur die Ereignis-ID.

Quote:
Originally Posted by AutoIt Hilfe
Wird der "advanced"-Parameter verwendet, werden die Informationen in einem Array zurückgegeben:
$array[0] = 0 oder Ereignis-ID oder Control-ID
$array[1] = Der Fenster-Handle des Fensters, von dem das Ereignis gemeldet wird
$array[2] = Der Control-Handle des Controls, von dem das Ereignis gemeldet wird (gegebenenfalls)
$array[3] = Die aktuelle X-Position des Mauszeigers (relativ zum GUI-Fenster)
$array[4] = Die aktuelle Y-Position des Mauszeigers (relativ zum GUI-Fenster)
Wenn die GUIOnEventMode-Option auf 1 gesetzt ist, ist der Rückgabewert von GUIGetMsg immer 0, und @error wurde auf 1 gesetzt.
Heißt, wenn wir mehrere GUIs haben können wir im Advanced Mode abfragen, aus welcher der GUIs das Event gesendet wird:

PHP Code:
While 1
    $nMsg 
GUIGetMsg(1)
    Switch 
$nMsg[0]
        Case 
$GUI_EVENT_CLOSE
            
Switch $nMsg[1]
                Case 
$Form1
                    
Exit
                Case 
$Form2
                    GUISetState
(@SW_HIDE$Form2)
            EndSwitch
    EndSwitch
WEnd 
Wenn wir das rote X drücken (egal in welcher GUI), fragen wir in einer zweiten Switch-Anweisung ab, in welcher GUI das X gedrückt wurde.
Wenn es in $Form1 war wird der Script beendet, und wenn es in $Form2 war wird nur $Form2 unsichtbar gemacht.
05/11/2013 15:43 sezer0012#8
Okey danke :DD
05/15/2013 20:16 Achat#9
Quote:
Originally Posted by sezer0012 View Post
[SIZE="5"]Erklärung:
[I]Wenn man sich registriert speichert er in den Ordner Spieler 2 Textdateien, ein mal Username und Passwort.
Eine offline Registrierung hat bitte welchen Sinn?
Dann vielleicht doch eher Server+ php + mysql?

MfG