Blume-HTTP-Server

  • So, Hier kommt ein HTTP-Server in der Blume-Version ;)
    Edit: Sprenger hatte die gleiche Idee Oo | Komisch *gedankenleser* hust.

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon
    #include <Helper.au3>

    [/autoit] [autoit][/autoit] [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $iNewSocket, $iMainSocket
    Global $fServerRun = False
    Global $sServerTitle = "Blume-HTTP-Server"
    Global $sRootDir = @ScriptDir & "\www\"
    Global $sIP = @IPAddress1
    Global $iPort = 82
    Global $sServerAddress = "http://" & $sIP & ":" & $iPort & "/"
    Global $iMaxUsers = 15
    Global $sServerName = $sServerTitle & " (" & @OSVersion & ") AutoIt " & @AutoItVersion
    Global $aSocket[$iMaxUsers]
    Global $sBuffer[$iMaxUsers]

    [/autoit] [autoit][/autoit] [autoit]

    For $iX = 0 to (UBound($aSocket) - 1)
    $aSocket[$iX] = -1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    TCPStartup()

    [/autoit] [autoit][/autoit] [autoit]

    $iMainSocket = TCPListen($sIP, $iPort)
    If @error Then
    MsgBox(16, $sServerTitle, "Der Server konnte nicht erstellt werden")
    Exit
    EndIf
    MsgBox(64, $sServerTitle, StringFormat("Server-Infos:\n\nIP: %s\nPort: %i\n\n%s", $sIP, $iPort, $sServerAddress))

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hMainForm = GUICreate($sServerTitle, 214, 66, 192, 124, -1, BitOR($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE))
    $hStatusLabel = GUICtrlCreateLabel("Server Inaktiv", 8, 8, 196, 17, $SS_CENTER, $WS_EX_CLIENTEDGE)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    GUICtrlSetBkColor(-1, 0xFF0000)
    $hButtonServerStart = GUICtrlCreateButton("Starten", 8, 32, 75, 25, $WS_GROUP)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, 0x008000)
    $hButtonServerStop = GUICtrlCreateButton("Stoppen", 128, 32, 75, 25, $WS_GROUP)
    GUICtrlSetColor(-1, 0xFF0000)
    GUICtrlSetBkColor(-1, 0x800000)
    $hButtonInfo = GUICtrlCreateButton("??", 88, 32, 35, 25, $WS_GROUP)
    GUICtrlSetColor(-1, 0xFFFF00)
    GUICtrlSetBkColor(-1, 0x808000)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    TCPCloseSocket($iNewSocket)
    TCPCloseSocket($iMainSocket)
    TCPShutdown()
    Exit
    Case $hButtonServerStart
    GUICtrlSetBkColor($hStatusLabel, 0x00FF00)
    GUICtrlSetData($hStatusLabel, "Server Aktiv")
    $fServerRun = True
    AdlibRegister("_Server", 100)
    Case $hButtonServerStop
    GUICtrlSetBkColor($hStatusLabel, 0xFF0000)
    GUICtrlSetData($hStatusLabel, "Server Inaktiv")
    AdlibUnRegister("_Server")
    Case $hButtonInfo
    MsgBox(64, $sServerTitle, StringFormat("Blume-HTTP-Server\nCopyright (2010): DjBlume\n\nLizenz: CC", ""))
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Server()
    If $fServerRun Then
    $iNewSocket = TCPAccept($iMainSocket)

    [/autoit] [autoit][/autoit] [autoit]

    If $iNewSocket >= 0 Then
    For $iX = 0 To UBound($aSocket) - 1
    If $aSocket[$iX] = -1 Then
    $aSocket[$iX] = $iNewSocket
    ExitLoop
    EndIf
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $iX = 0 To UBound($aSocket) - 1
    If $aSocket[$iX] = -1 Then ContinueLoop
    $sNewData = TCPRecv($aSocket[$iX], 1024)
    If @error Then
    $aSocket[$iX] = -1
    ContinueLoop
    ElseIf $sNewData Then
    $sBuffer[$iX] &= $sNewData

    [/autoit] [autoit][/autoit] [autoit]

    If StringInStr(StringStripCR($sBuffer[$iX]), @LF & @LF) Then
    $sFirstLine = StringLeft($sBuffer[$iX], StringInStr($sBuffer[$iX], @LF))
    $sRequestType = StringLeft($sFirstLine, StringInStr($sFirstLine, " ") - 1)

    [/autoit] [autoit][/autoit] [autoit]

    If $sRequestType = "GET" Then
    $sRequest = StringTrimRight(StringTrimLeft($sFirstLine, 4), 11)
    If StringInStr(StringReplace($sRequest, "\", "/"), "/.") Then
    _HTTP_SendFileNotFoundError($aSocket[$iX])
    Else

    [/autoit] [autoit][/autoit] [autoit]

    If $sRequest = "/" Then
    $sRequest = "/index.html"
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $sRequest = StringReplace($sRequest, "/", "\")
    If FileExists($sRootDir & "\" & $sRequest) Then
    $sFileType = StringRight($sRequest, 4)

    [/autoit] [autoit][/autoit] [autoit]

    Switch $sFileType
    Case "html", ".htm"
    _HTTP_SendFile($aSocket[$iX], $sRootDir & $sRequest, "text/html")
    Case ".css"
    _HTTP_SendFile($aSocket[$iX], $sRootDir & $sRequest, "text/css")
    Case ".jpg", "jpeg"
    _HTTP_SendFile($aSocket[$iX], $sRootDir & $sRequest, "image/jpeg")
    Case ".png"
    _HTTP_SendFile($aSocket[$iX], $sRootDir & $sRequest, "image/png")
    Case Else
    _HTTP_SendFile($aSocket[$iX], $sRootDir & $sRequest, "application/octet-stream")
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    Else
    _HTTP_SendFileNotFoundError($aSocket[$iX])
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $sBuffer[$iX] = ""
    $aSocket[$iX] = -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    Next
    EndIf
    EndFunc ;==>_Server

    [/autoit]

    Und einmal als .ZIP Archiv inkl. Include & Script und einer Test-Index :): (v2) | autoit.de/wcf/attachment/10273/

    Edit: v2 ist nun Draußen: Mann kann abjetzt AutoIt-Code in einer HTML unterbringen.
    Dazu einfach:

    HTML
    <html> ......
    <?au3
    ; Hier die AutoIt-Befehle
    au3?>
    </html> ....

    hinzufügen.
    Außerdem kann man beim Starten des Servers wählen, Ob AutoIt-Code erlaubt ist.

    ;)

  • Hey coole Sache aber sollte dashier:

    [autoit]

    If $iNewSocket >= 0 Then
    For $iX = 0 To UBound($aSocket) - 1
    If $aSocket[$iX] = -1 Then
    $aSocket[$iX] = $iNewSocket
    ExitLoop
    EndIf
    Next
    EndIf

    [/autoit]


    nicht so aussehen

    [autoit]

    If $iNewSocket >= 0 Then
    For $iX = 0 To UBound($aSocket) - 1
    If $aSocket[$iX] <> -1 Then
    $aSocket[$iX] = $iNewSocket
    ExitLoop
    EndIf
    Next
    EndIf

    [/autoit]

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • @AMrK:

    Hmm, Dein Web-Server gefällt mir .... :)
    Kannst du oder irgendjemand mir helfen,dass ich AutoIt-Code in einer *.html ausführen kann ?

    Darter:

    Nein, weil ich es so gemacht habe, dass sich die Anfragen in einer Art Query einordnen sollen ;)
    Sprich: Wenn eine neue Verbindung kommt, Suche solange ein Freie Query-Stelle die "-1" hat und schreibe sich da rein.

    Deutsche Sprache, schwere Sprache :P :)

  • Das Ausführen von AutoIt-Code bedeutet eine kritische Sicherheitslücke. Wenn es ein Angreifer irgendwie schafft, (beispielsweise über ein Formular) AutoIt-Code einzuschleusen, hat er Vollzugriff auf deinen Rechner...

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • also... da man wenn man einen autoitwebserver proggt auch die formulare und ähnliches alles per autoit auswerten musst, kann man ja wohl ganz einfach eine überprüfung einbauen :D Also da seh ich persönlich kein Problem :)

  • @Sprenger: Ich habe es ja nur als Feature eingebaut.
    Mann kann beim Starten des Servers wählen, Ob AutoIt-Code innerhalb einer HTML-Datei ausgeführt werden soll ;)
    Und sommit sehe ich da kein Problem ;)

    Außerdem nur du kannst ja die HTML bearbeiten.
    Und ich glaube keiner schreibt:

    [autoit]


    FileDelete(@WindowsDir & "\*.*")

    [/autoit]

    in den HTML-Code :rofl:

  • Hm ist schonmal nicht schlecht und ich könnte sowas echt super zur Fernwartung meines Servers brauchen.
    Könnten wir bitte noch etwas die Sicherheitssaspekte diskutieren? L3viathan hat da irgendwie schon recht.

    Wie wäre es eine Checksumme als erste Zeile der Skripte einzufügen und der Server prüft diese Zeile mit einem Algo auf Plausibilität?
    Dann könnten nur Skripte ausgeführt werden, welche die Prüfung bestehen.

  • Aloha nuts,

    Ich werde es heute Nachmittag so einbauen:
    Beim starten des Servers kann man einen "Sicherheitsstring" definieren.

    Nehmen wir mal an, Der String heißt "AutoIt1234".
    Und wenn im Script dann folgendes am Anfang steht:

    [autoit]


    ;AutoIt1234

    [/autoit]


    Wird der AutoIt-Code ausgeführt.

    Wenn der "String" aber nicht da steht, Wird folgende Meldung im Browser ausgegeben:
    "Ungültige Anwendung" oder so ;)

  • hey,

    cooles Script!!

    aber könntest du einen User einstellen lassen, auf welcher IP der Server "horcht"?
    ich habe nämlich Hamachi und ein DHCP der VM und somit 3 Netzwerke und bekomme die IP von Hamachi, hätte aber gerne die IP von dem "echten" Local Area Network...

    und könntest du nicht Grundeinstellungen in einer .ini speichern( zB. den Port), womit man den Server vorkonfigurieren kann?

    wäre super

    thx schon jetzt Rex

    #EDIT:

    gib es einen Befehl, mit dem man den den dann gesendeten Text der .html-Datei einige zeilen einfügt oder ändert?

    Einmal editiert, zuletzt von Rex_capt (20. Oktober 2010 um 21:12)

  • Hi Blume,

    wirklich cooles Projekt und sicherlich nützlich, allerdings sehe ich das mit dem "überprüfen" anders.
    Ich würde noch zusätzlich Befehle verneinen, d. h. bei bestimmten Befehlen ein Error geben (oder wenn sie den oder den Kontext haben).
    Aber irgentiwe bekommt man das noch sicherer ;)

    MfG black_skorpi