From 786468581aa247b405d7e8de191f311ac35eca11 Mon Sep 17 00:00:00 2001 From: Johannes Kreutz Date: Mon, 28 May 2018 13:35:35 +0200 Subject: [PATCH] Initial commit --- .gitignore | 31 +++ README.md | 9 +- systemclient.ico | Bin 0 -> 128895 bytes systemclient.lpi | 134 +++++++++++ systemclient.lpr | 22 ++ ucreatewatchdogthread.pas | 86 +++++++ ugetipadress.pas | 83 +++++++ ugetmacadress.pas | 58 +++++ ulockcaentf.pas | 58 +++++ ulockscreen.lfm | 42 ++++ ulockscreen.pas | 485 ++++++++++++++++++++++++++++++++++++++ upingthread.pas | 98 ++++++++ uvncserverthread.pas | 81 +++++++ 13 files changed, 1184 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 systemclient.ico create mode 100644 systemclient.lpi create mode 100644 systemclient.lpr create mode 100644 ucreatewatchdogthread.pas create mode 100644 ugetipadress.pas create mode 100644 ugetmacadress.pas create mode 100644 ulockcaentf.pas create mode 100644 ulockscreen.lfm create mode 100644 ulockscreen.pas create mode 100644 upingthread.pas create mode 100644 uvncserverthread.pas diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..95de12e --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# ---> Lazarus +# Lazarus compiler-generated binaries (safe to delete) +*.exe +*.so +*.dylib +*.lrs +*.res +*.compiled +*.dbg +*.ppu +*.o +*.or +*.a + +# Lazarus autogenerated files (duplicated info) +*.rst +*.rsj +*.lrt + +# Lazarus local files (user-specific info) +*.lps + +# Lazarus backups and unit output folders. +# These can be changed by user in Lazarus/project options. +backup/ +*.bak +lib/ + +# Application bundle for Mac OS +*.app/ + diff --git a/README.md b/README.md index 7f63e21..10b5c9a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # Systemclient -This is the background client application for student machines of PhilleConnect +This is the background client application for student machines of PhilleConnect. It waites for requests from a teacher machine and will lock the monitor or shutdown the workstation if required. It also controls the VNC server and submitts a screenshot if requested. -# Placeholder repository -At the moment, this repository is a placeholder. This application is part of the Abitur 2018, so the source code will be published in may 2018. +# How to use this? +This is a part of the PhilleConnect system. To use this application, you'll need at least a PhilleConect Server. We recommend to use the Installer ([Windows](https://github.com/philleconnect/ClientSetup-Windows/releases), [Linux](https://github.com/philleconnect/ClientSetup-Linux/releases)) if you want to use PhilleConnect in a productive environment. + +# How to compile this? +Follow the instructions here: [http://philleconnect.org/entwickler/HowToCompile](http://philleconnect.org/entwickler/HowToCompile) diff --git a/systemclient.ico b/systemclient.ico new file mode 100644 index 0000000000000000000000000000000000000000..5ffe2f38cd0cea6ab29ba532ceb24398c1f2fe5d GIT binary patch literal 128895 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

!2_%%^aLWfsfQs$MuEa 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 literal 0 HcmV?d00001 diff --git a/systemclient.lpi b/systemclient.lpi new file mode 100644 index 0000000..52d25ca --- /dev/null +++ b/systemclient.lpi @@ -0,0 +1,134 @@ + + + + + + + + + + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + <Icon Value="0"/> + </General> + <i18n> + <EnableI18N LFM="False"/> + </i18n> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + </local> + </RunParams> + <RequiredPackages Count="2"> + <Item1> + <PackageName Value="laz_synapse"/> + </Item1> + <Item2> + <PackageName Value="LCL"/> + </Item2> + </RequiredPackages> + <Units Count="11"> + <Unit0> + <Filename Value="systemclient.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + <Unit1> + <Filename Value="ulockscreen.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Lockscreen"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="ULockscreen"/> + </Unit1> + <Unit2> + <Filename Value="ucreatewatchdogthread.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="UCreateWatchdogThread"/> + </Unit2> + <Unit3> + <Filename Value="ugetipadress.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="UGetIPAdress"/> + </Unit3> + <Unit4> + <Filename Value="ugetmacadress.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="UGetMacAdress"/> + </Unit4> + <Unit5> + <Filename Value="uvncserverthread.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="UVNCServerThread"/> + </Unit5> + <Unit6> + <Filename Value="ulockcaentf.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="ULockCAENTF"/> + </Unit6> + <Unit7> + <Filename Value="upingthread.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="UPingThread"/> + </Unit7> + <Unit8> + <Filename Value="..\..\..\Downloads\synapse-trunk\ssl_openssl.pas"/> + <IsPartOfProject Value="True"/> + </Unit8> + <Unit9> + <Filename Value="..\..\..\Downloads\synapse-trunk\ssl_openssl_lib.pas"/> + <IsPartOfProject Value="True"/> + </Unit9> + <Unit10> + <Filename Value="uxinitthreads.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="UXInitThreads"/> + </Unit10> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="systemclient"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\..\Downloads\synapse-trunk"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/systemclient.lpr b/systemclient.lpr new file mode 100644 index 0000000..ddb7533 --- /dev/null +++ b/systemclient.lpr @@ -0,0 +1,22 @@ +program systemclient; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX} + cthreads, + {$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, ULockscreen, ULockCAENTF + { you can add units after this }; + +{$R *.res} + +begin + RequireDerivedFormResource:=True; + Application.Initialize; + Application.ShowMainForm:=False; + Application.CreateForm(TLockscreen, Lockscreen); + Application.Run; +end. + diff --git a/ucreatewatchdogthread.pas b/ucreatewatchdogthread.pas new file mode 100644 index 0000000..f52608b --- /dev/null +++ b/ucreatewatchdogthread.pas @@ -0,0 +1,86 @@ +unit UCreateWatchdogThread; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Process, jwatlhelp32, Windows; + +type + TCreateWatchdogThread = class(TThread) + private + givenPid: integer; + protected + procedure execute; override; + public + constructor create(given: string); + end; + +implementation + +constructor TCreateWatchdogThread.create(given: string); +begin + FreeOnTerminate:=true; + if (given = '') then begin + givenPid:=0; + end + else begin + givenPid:=StrToInt(given); + end; + inherited create(false); +end; + +procedure TCreateWatchdogThread.execute; +var + ContinueLoop: boolean; + FSnapshotHandle: THandle; + FProcessEntry32: TProcessEntry32; + foundProcess: boolean; + myProcess: TProcess; + DKMPPID: integer; +begin + if (givenPid = 0) then begin + myProcess:=TProcess.create(nil); + myProcess.executable:='C:\Program Files\PhilleConnect\DKMP.exe'; + myProcess.parameters.add('startWatchdogAndKill'); + myProcess.showWindow:=swoHIDE; + myProcess.execute; + myProcess.waitOnExit; + DKMPPID:=myProcess.exitStatus; + myProcess.free; + end + else begin + DKMPPID:=givenPid; + end; + while true do begin + FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + FProcessEntry32.dwSize := SizeOf(FProcessEntry32); + ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); + foundProcess:=false; + while ContinueLoop do + begin + if (FProcessEntry32.th32ProcessId = DKMPPID) then + begin + foundProcess:=true; + end; + ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); + end; + CloseHandle(FSnapshotHandle); + if not(foundProcess) then begin + myProcess:=TProcess.create(nil); + myProcess.executable:='C:\Program Files\PhilleConnect\DKMP.exe'; + myProcess.parameters.add('startWatchdogAndKill'); + myProcess.parameters.add(IntToStr(getProcessId)); + myProcess.showWindow:=swoHIDE; + myProcess.execute; + myProcess.waitOnExit; + DKMPPID:=myProcess.exitStatus; + myProcess.free; + end; + sleep(50); + end; +end; + +end. + diff --git a/ugetipadress.pas b/ugetipadress.pas new file mode 100644 index 0000000..467c6db --- /dev/null +++ b/ugetipadress.pas @@ -0,0 +1,83 @@ +unit UGetIPAdress; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Process; + +type + TGetIPAdress = class + public + function getIP: string; + private + {$IFDEF WINDOWS} + function GetIpAddrList: string; + {$ENDIF} + end; + +implementation + +function TGetIPAdress.getIP: string; +var + response: TStringList; + {$IFDEF LINUX} + process: TProcess; + {$ENDIF} +begin + {$IFDEF WINDOWS} + response:=TStringList.create; + response.delimiter:=' '; + response.delimitedText:=GetIpAddrList; + result:=response[1]; + {$ENDIF} + {$IFDEF LINUX} + process:=TProcess.create(nil); + process.executable:='sh'; + process.parameters.add('-c'); + process.parameters.add('hostname -I | awk ''{print $1}'''); + process.options:=process.options + [poWaitOnExit, poUsePipes]; + process.showWindow:=swoHIDE; + process.execute; + response:=TStringList.create; + response.LoadFromStream(process.output); + process.free; + result:=trim(response[0]); + response.free; + {$ENDIF} +end; + +{$IFDEF WINDOWS} +function TGetIPAdress.GetIpAddrList: string; +var + AProcess: TProcess; + s: string; + sl: TStringList; + i, n: integer; +begin + Result:=''; + sl:=TStringList.Create(); + AProcess:=TProcess.Create(nil); + AProcess.CommandLine := 'ipconfig.exe'; + AProcess.Options := AProcess.Options + [poUsePipes, poNoConsole]; + try + AProcess.Execute(); + Sleep(500); // poWaitOnExit don't work as expected + sl.LoadFromStream(AProcess.Output); + finally + AProcess.Free(); + end; + for i:=0 to sl.Count-1 do + begin + if (Pos('IPv4', sl[i])=0) and (Pos('IP-', sl[i])=0) and (Pos('IP Address', sl[i])=0) then Continue; + s:=sl[i]; + s:=Trim(Copy(s, Pos(':', s)+1, 999)); + if Pos(':', s)>0 then Continue; // IPv6 + Result:=Result+s+' '; + end; + sl.Free(); +end; +{$ENDIF} + +end. diff --git a/ugetmacadress.pas b/ugetmacadress.pas new file mode 100644 index 0000000..f1c40b2 --- /dev/null +++ b/ugetmacadress.pas @@ -0,0 +1,58 @@ +unit UGetMacAdress; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Process; + +type + TGetMacAdress = class + public + function getMac: string; + end; + +implementation + +function TGetMacAdress.getMac: string; +var + process: TProcess; + response: TStringList; + address: TStringList; +begin + {$IFDEF WINDOWS} + process:=TProcess.create(nil); + process.executable:='cmd.exe'; + process.parameters.add('/C getmac -fo csv'); + process.options:=process.options + [poWaitOnExit, poUsePipes]; + process.showWindow:=swoHIDE; + process.execute; + response:=TStringList.create; + response.LoadFromStream(process.output); + process.free; + address:=TStringList.create; + address.delimiter:=','; + address.delimitedText:=response[1]; + response.free; + result:=StringReplace(address[0], '-', ':', [rfReplaceAll]); + address.free; + {$ENDIF} + {$IFDEF LINUX} + process:=TProcess.create(nil); + process.executable:='sh'; + process.parameters.add('-c'); + process.parameters.add('cat /sys/class/net/$(ip route show default | awk ''/default/ {print $5}'')/address'); + process.options:=process.options + [poWaitOnExit, poUsePipes]; + process.showWindow:=swoHIDE; + process.execute; + response:=TStringList.create; + response.LoadFromStream(process.output); + process.free; + result:=UpperCase(response[0]); + response.free; + {$ENDIF} +end; + +end. + diff --git a/ulockcaentf.pas b/ulockcaentf.pas new file mode 100644 index 0000000..3d66b51 --- /dev/null +++ b/ulockcaentf.pas @@ -0,0 +1,58 @@ +unit ULockCAENTF; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Registry; + +type + TLockCAENTF = class + public + constructor create; + procedure disable; + end; + +implementation + +constructor TLockCAENTF.create; +var + registry: TRegistry; +begin + registry:=TRegistry.create; + registry.RootKey:=HKEY_CURRENT_USER; + registry.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\System', true); + registry.writeInteger('DisableLockWorkstation', 1); + registry.writeInteger('HideFastUserSwitching', 1); + registry.writeInteger('DisableChangePassword', 1); + registry.writeInteger('DisableTaskMgr', 1); + registry.free; + registry:=TRegistry.create; + registry.RootKey:=HKEY_CURRENT_USER; + registry.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', true); + registry.writeInteger('NoLogoff', 1); + registry.free; +end; + +procedure TLockCAENTF.disable; +var + registry: TRegistry; +begin + registry:=TRegistry.create; + registry.RootKey:=HKEY_CURRENT_USER; + registry.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\System', true); + registry.writeInteger('DisableLockWorkstation', 0); + registry.writeInteger('HideFastUserSwitching', 0); + registry.writeInteger('DisableChangePassword', 0); + registry.writeInteger('DisableTaskMgr', 0); + registry.free; + registry:=TRegistry.create; + registry.RootKey:=HKEY_CURRENT_USER; + registry.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', true); + registry.writeInteger('NoLogoff', 0); + registry.free; +end; + +end. + diff --git a/ulockscreen.lfm b/ulockscreen.lfm new file mode 100644 index 0000000..71d7632 --- /dev/null +++ b/ulockscreen.lfm @@ -0,0 +1,42 @@ +object Lockscreen: TLockscreen + Cursor = crNone + Left = 67 + Height = 240 + Top = 672 + Width = 955 + BorderStyle = bsNone + Caption = 'Lockscreen' + ClientHeight = 240 + ClientWidth = 955 + Color = clBlack + FormStyle = fsSystemStayOnTop + OnCloseQuery = FormCloseQuery + OnCreate = FormCreate + LCLVersion = '1.8.2.0' + WindowState = wsMaximized + object lockLabel: TLabel + Cursor = crNone + Left = 8 + Height = 55 + Top = 8 + Width = 813 + Caption = 'Der PC wurde durch die Lehrkraft gesperrt.' + Font.Color = clRed + Font.Height = -40 + ParentColor = False + ParentFont = False + end + object reloadTimer: TTimer + Enabled = False + OnTimer = reloadTimerTimer + left = 52 + top = 95 + end + object lockscreenTimer: TTimer + Enabled = False + Interval = 100 + OnTimer = lockscreenTimerTimer + left = 128 + top = 95 + end +end diff --git a/ulockscreen.pas b/ulockscreen.pas new file mode 100644 index 0000000..c498cd4 --- /dev/null +++ b/ulockscreen.pas @@ -0,0 +1,485 @@ +unit ULockscreen; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, + ExtCtrls, fphttpserver, UGetMacAdress, UGetIpAdress, fpjson, jsonparser, + HTTPSend, Process, ssl_openssl, UVNCServerThread, LCLIntf, LCLType, base64, + {$IFDEF WINDOWS} + UCreateWatchdogThread, ULockCAENTF, + {$ENDIF} + UPingThread, resolve; + +type + + { TLockscreen } + + TLockscreen = class(TForm) + lockLabel: TLabel; + reloadTimer: TTimer; + lockscreenTimer: TTimer; + procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); + procedure FormCreate(Sender: TObject); + procedure reloadTimerTimer(Sender: TObject); + procedure lockscreenTimerTimer(Sender: TObject); + private + //System herunterfahren + procedure shutdown; + //Netzwerkverbindung prüfen + procedure checkNetworkConnection; + procedure networkConnectionResult(result: boolean; return: string); + procedure trueNetworkResult; + procedure falseNetworkResult; + //Konfiguration laden + procedure loadConfig; + function createScreenshot: TStringStream; + function randomString(wantedLength: integer): string; + function sendRequest(url, params: string): string; + function MemStreamToString(Strm: TMemoryStream): AnsiString; + function ValidateIP(IP4: string): Boolean; + public + procedure DoHandleRequest(Sender:TObject; var ARequest:TFPHTTPConnectionRequest; var AResponse:TFPHTTPConnectionResponse); + end; + + THTTPServerThread = class(TThread) + private + Fserver : TFPHTTPServer; + public + constructor Create(APort:Word; const OnRequest:THTTPServerRequestHandler); + procedure Execute; override; + procedure DoTerminate; override; + property Server : TFPHTTPServer read FServer; + end; + //DLL-Funktionen + {$IFDEF WINDOWS} + function InstallHook(Hwnd: THandle; strictParam: boolean): boolean; stdcall; external 'hook.dll'; + function UninstallHook: boolean; stdcall; external 'hook.dll'; + function ControlHook(mode: boolean): boolean; stdcall; external 'hook.dll'; + function InstallMouseHook(Hwnd: THandle): boolean; stdcall; external 'mhook.dll'; + function UninstallMouseHook: boolean; stdcall; external 'mhook.dll'; + function ControlMouseHook(mode: boolean): boolean; stdcall; external 'mhook.dll'; + {$ENDIF} + +var + Lockscreen: TLockscreen; + FServerThread: THTTPServerThread; + room, machinename, serverURL, globalPW, mac, ip, response, os, + cleanServerURL: string; + MacAddr: TGetMacAdress; + IPAddr: TGetIPAdress; + config, value: TStringList; + c: integer; + jData: TJSONData; + VNCServer: TVNCServerThread; + {$IFDEF WINDOWS} + watchdog: TCreateWatchdogThread; + lockCA: TLockCAENTF; + {$ENDIF} + pingthread: TPingThread; + locked, isOnline, lockscreenIsVisible: boolean; + +implementation + +{$R *.lfm} + +{ TLockscreen } + +procedure TLockscreen.FormCreate(Sender: TObject); +begin + {$IFDEF LINUX} + if (ParamStr(1) = 'screenshot') then begin + WriteLn(EncodeStringBase64(createScreenshot().dataString)); + halt; + end + else begin + {$ENDIF} + locked:=false; + {$IFDEF WINDOWS} + watchdog:=TCreateWatchdogThread.create(ParamStr(1)); + lockscreen.windowState:=wsMaximized; + {$ENDIF} + {$IFDEF LINUX} + lockscreen.windowState:=wsFullScreen; + {$ENDIF} + config:=TStringList.create; + isOnline:=false; + {$IFDEF WINDOWS} + InstallHook(handle, true); + InstallMouseHook(handle); + config.loadFromFile('C:\Program Files\PhilleConnect\pcconfig.jkm'); + {$ENDIF} + {$IFDEF LINUX} + config.loadFromFile('/etc/pcconfig.jkm'); + {$ENDIF} + c:=0; + while (c < config.count) do begin + if (pos('#', config[c]) = 0) then begin + value:=TStringList.create; + value.clear; + value.strictDelimiter:=true; + value.delimiter:='='; + value.delimitedText:=config[c]; + case value[0] of + 'server': + serverURL:=value[1]; + 'global': + globalPW:=value[1]; + end; + end; + c:=c+1; + end; + checkNetworkConnection; + {$IFDEF LINUX} + end; + {$ENDIF} +end; + +procedure TLockscreen.FormCloseQuery(Sender: TObject; var CanClose: boolean); +begin + {$IFDEF WINDOWS} + UninstallHook; + UninstallMouseHook; + {$ENDIF} +end; + +procedure TLockscreen.checkNetworkConnection; +var + noPort: TStringList; + cache: string; +begin + if (pos(':', serverURL) > 0) then begin + noPort:=TStringList.create; + noPort.delimiter:=':'; + noPort.strictDelimiter:=true; + noPort.delimitedText:=serverURL; + cache:=noPort[0]; + end + else begin + cache:=serverURL; + end; + cleanServerURL:=cache; + pingthread:=TPingThread.create(cache); + pingthread.OnShowStatus:=@networkConnectionResult; + pingthread.resume; +end; + +procedure TLockscreen.networkConnectionResult(result: boolean; return: string); +var + host: THostResolver; +begin + if (result) then begin + if (ValidateIP(cleanServerURL)) then begin + if (cleanServerURL = return) then begin + trueNetworkResult; + end + else begin + falseNetworkResult; + end; + end + else begin + host:=THostResolver.create(nil); + host.clearData(); + if (host.NameLookup(cleanServerURL)) then begin + if (host.AddressAsString = return) then begin + trueNetworkResult; + end + else begin + falseNetworkResult; + end; + end + else begin + falseNetworkResult; + end; + end; + end + else begin + falseNetworkResult; + end; +end; + +procedure TLockscreen.trueNetworkResult; +begin + reloadTimer.enabled:=false; + if not(isOnline) then begin + loadConfig; + end; + isOnline:=true; +end; + +procedure TLockscreen.falseNetworkResult; +begin + reloadTimer.enabled:=true; +end; + +procedure TLockscreen.loadConfig; +begin + MacAddr:=TGetMacAdress.create; + mac:=MacAddr.getMac; + MacAddr.free; + IPAddr:=TGetIPAdress.create; + ip:=IPAddr.getIP; + IPAddr.free; + {$IFDEF WINDOWS} + os:='win'; + {$ENDIF} + {$IFDEF LINUX} + os:='linux'; + {$ENDIF} + response:=SendRequest('https://'+serverURL+'/client.php', 'usage=config&globalpw='+globalPW+'&machine='+mac+'&ip='+ip+'&os='+os); + if (response = '!') then begin + showMessage('Konfigurationsfehler'); + end + else if (response = 'nomachine') then begin + showMessage('Rechner nicht registriert'); + end + else if (response <> '') then begin + reloadTimer.Enabled:=false; + jData:=GetJSON(response); + c:=0; + while (c < jData.count) do begin + case jData.FindPath(IntToStr(c)+'[0]').AsString of + 'machinename': + machinename:=jData.FindPath(IntToStr(c)+'[1]').AsString; + 'room': + room:=jData.FindPath(IntToStr(c)+'[1]').AsString; + end; + c:=c+1; + end; + FServerThread:=THTTPServerThread.Create(34567, @DoHandleRequest); + FServerThread.Start; + end + else begin + reloadTimer.enabled:=true; + end; +end; + +procedure TLockscreen.reloadTimerTimer(Sender: TObject); +begin + checkNetworkConnection; +end; + +procedure TLockscreen.lockscreenTimerTimer(Sender: TObject); +begin + if (lockscreenIsVisible) then begin + lockscreen.visible:=true; + end + else begin + lockscreen.visible:=false; + end; + lockscreenTimer.enabled:=false; +end; + +procedure TLockscreen.DoHandleRequest(Sender: TObject; + var ARequest: TFPHTTPConnectionRequest; var AResponse: TFPHTTPConnectionResponse); +var + params: TStringList; + response, vncpassword: string; + {$IFDEF LINUX} + scProcess: TProcess; + scResponse: TStringList; + {$ENDIF} +begin + params:=TStringList.create; + params.delimiter:='/'; + params.delimitedText:=ARequest.url; + response:=SendRequest('https://'+serverURL+'/client.php', 'usage=checkteacher&globalpw='+globalPW+'&machine='+mac+'&ip='+ip+'&os='+os+'&req='+ARequest.remoteAddress); + if (params[1] = 'online') then begin + AResponse.content:='online'; + end + else if (params[1] = room) and (params[2] = machinename) and (response = 'success') then begin + if (params[3] = 'lock') then begin + if (locked = false) then begin + {$IFDEF WINDOWS} + lockscreen.Visible:=true; + ControlHook(true); + ControlMouseHook(true); + lockCA:=TLockCAENTF.create; + {$ENDIF} + {$IFDEF LINUX} + lockscreenIsVisible:=true; + lockscreenTimer.enabled:=true; + {$ENDIF} + end; + locked:=true; + AResponse.content:='locked'; + end + else if (params[3] = 'unlock') then begin + if (locked = true) then begin + {$IFDEF WINDOWS} + lockscreen.visible:=false; + ControlHook(false); + ControlMouseHook(false); + lockCA.disable; + lockCA.free; + {$ENDIF} + {$IFDEF LINUX} + lockscreenIsVisible:=false; + lockscreenTimer.enabled:=true; + {$ENDIF} + end; + locked:=false; + AResponse.content:='unlocked'; + end + else if (params[3] = 'shutdown') then begin + AResponse.content:='shutdown'; + shutDown; + end + else if (params[3] = 'screenshot') then begin + {$IFDEF WINDOWS} + AResponse.content:=EncodeStringBase64(createScreenshot().dataString); + {$ENDIF} + {$IFDEF LINUX} + scProcess:=TProcess.create(nil); + scProcess.executable:='sh'; + scProcess.parameters.add('-c'); + scProcess.parameters.add('systemclient screenshot'); + scProcess.options:=scProcess.options + [poWaitOnExit, poUsePipes]; + scProcess.execute; + scResponse:=TStringList.create; + scResponse.loadFromStream(scProcess.output); + AResponse.content:=scResponse.commaText; + scProcess.free; + scResponse.free; + {$ENDIF} + end + else if (params[3] = 'requestcontrol') then begin + vncpassword:=randomString(8); + AResponse.content:=vncpassword; + VNCServer:=TVNCServerThread.create(vncpassword, randomString(8)); + end + else if (params[3] = 'cancelcontrol') then begin + VNCServer.kill; + AResponse.content:='success'; + end; + end + else if (params[1] = 'lockstate') then begin + if (locked = true) then begin + AResponse.content:='locked'; + end + else begin + AResponse.content:='unlocked'; + end; + end; +end; + +procedure TLockscreen.shutdown; +var + shutdownProcess: TProcess; +begin + shutdownProcess:=TProcess.create(nil); + shutdownProcess.executable:='cmd'; + shutdownProcess.parameters.add('/C shutdown /s /f /t 0'); + shutdownProcess.showWindow:=swoHIDE; + shutdownProcess.execute; + shutdownProcess.free; +end; + +function TLockscreen.createScreenshot: TStringStream; +var + SBitmap: TBitmap; + Image: TJPEGImage; + ScreenDC: HDC; +begin + SBitmap:=TBitmap.create; + ScreenDC:=GetDC(0); + SBitmap.setSize(Screen.width, Screen.height); + SBitmap.loadFromDevice(ScreenDC); + ReleaseDC(0, ScreenDC); + Image:=TJPEGImage.create; + Image.CompressionQuality:=5; + Image.Assign(SBitmap); + SBitmap.free; + Result:=TStringStream.create(''); + Image.saveToStream(Result); + Image.free; +end; + +function TLockscreen.randomString(wantedLength: integer): string; +var + str: string; +begin + randomize; + str:='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789?=+-~@'; + result:=''; + repeat + result:=result + str[random(Length(str)) + 1]; + until(Length(result) = wantedLength) +end; + +function TLockscreen.sendRequest(url, params: string): string; +var + Response: TMemoryStream; +begin + Response := TMemoryStream.Create; + try + if HttpPostURL(url, params, Response) then + result:=MemStreamToString(Response); + finally + Response.Free; + end; +end; + +function TLockscreen.MemStreamToString(Strm: TMemoryStream): AnsiString; +begin + if Strm <> nil then begin + Strm.Position := 0; + SetString(Result, PChar(Strm.Memory), Strm.Size); + end; +end; + +function TLockscreen.ValidateIP(IP4: string): Boolean; // Coding by Dave Sonsalla +var + Octet : String; + Dots, I : Integer; +begin + IP4 := IP4+'.'; //add a dot. We use a dot to trigger the Octet check, so need the last one + Dots := 0; + Octet := '0'; + for I := 1 to length(IP4) do begin + if IP4[I] in ['0'..'9','.'] then begin + if IP4[I] = '.' then begin //found a dot so inc dots and check octet value + Inc(Dots); + if (length(Octet) =1) Or (StrToInt(Octet) > 255) then Dots := 5; //Either there's no number or it's higher than 255 so push dots out of range + Octet := '0'; // Reset to check the next octet + end // End of IP4[I] is a dot + else // Else IP4[I] is not a dot so + Octet := Octet + IP4[I]; // Add the next character to the octet + end // End of IP4[I] is not a dot + else // Else IP4[I] Is not in CheckSet so + Dots := 5; // Push dots out of range + end; + result := (Dots = 4) // The only way that Dots will equal 4 is if we passed all the tests +end; + +constructor THTTPServerThread.Create(APort: Word; + const OnRequest: THTTPServerRequestHandler); +begin + inherited create(true); + FreeAndNil(FServer); + FServer:=TFPHTTPServer.Create(nil); + FServer.Threaded:=true; + FServer.Port:=APort; + FServer.OnRequest:=OnRequest; +end; + +procedure THTTPServerThread.Execute; +begin + try + FServer.Active:=true; + while not terminated do sleep(10); + finally + FreeAndNil(FServer); + end; +end; + +procedure THTTPServerThread.DoTerminate; +begin + inherited DoTerminate; + FServer.Active:=false; +end; + +end. + diff --git a/upingthread.pas b/upingthread.pas new file mode 100644 index 0000000..111c371 --- /dev/null +++ b/upingthread.pas @@ -0,0 +1,98 @@ +unit UPingThread; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, + {$IFDEF WINDOWS} + pingsend; + {$ENDIF} + {$IFDEF LINUX} + fpjson, jsonparser, process, Dialogs; + {$ENDIF} + +type + TShowStatusEvent = procedure(status: boolean; return: string) of Object; + TPingThread = class(TThread) + private + fResult: boolean; + fStatusText: string; + FOnShowStatus: TShowStatusEvent; + host: string; + procedure showStatus; + protected + procedure execute; override; + public + constructor create(hostC: string); + property OnShowStatus: TShowStatusEvent read FOnShowStatus write FOnShowStatus; + end; + +implementation + +constructor TPingThread.create(hostC: string); +begin + host:=hostC; + FreeOnTerminate:=true; + inherited create(true); +end; + +procedure TPingThread.showStatus; +begin + if Assigned(FOnShowStatus) then + begin + FOnShowStatus(fResult, fStatusText); + end; +end; + +procedure TPingThread.execute; +var + {$IFDEF WINDOWS} + ping: TPingSend; + {$ENDIF} + {$IFDEF LINUX} + ping: TProcess; + response: TStringList; + jData: TJSONData; + {$ENDIF} +begin + {$IFDEF WINDOWS} + ping:=TPingSend.create(); + if (ping.ping(host)) then begin + fResult:=true; + fStatusText:=ping.replyFrom; + end + else begin + fResult:=false; + fStatusText:=ping.replyErrorDesc; + end; + {$ENDIF} + {$IFDEF LINUX} + ping:=TProcess.create(nil); + ping.executable:='sh'; + ping.parameters.add('-c'); + ping.parameters.add('sudo PhilleConnectOnlineChecker '+host); + ping.showWindow:=swoHIDE; + ping.options:=ping.options + [poWaitOnExit, poUsePipes]; + ping.execute; + response:=TStringList.create; + response.LoadFromStream(ping.output); + ping.free; + jData:=GetJSON(response[0]); + fStatusText:=jData.AsJSON; + response.free; + if (jData.FindPath('[0]').AsString = 'true') then begin + fResult:=true; + fStatusText:=jData.FindPath('[1]').AsString; + end + else begin + fResult:=false; + fStatusText:=jData.FindPath('[1]').AsString; + end; + {$ENDIF} + Synchronize(@ShowStatus); +end; + +end. + diff --git a/uvncserverthread.pas b/uvncserverthread.pas new file mode 100644 index 0000000..dd3cab6 --- /dev/null +++ b/uvncserverthread.pas @@ -0,0 +1,81 @@ +unit UVNCServerThread; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Process + {$IFDEF WINDOWS} + , jwatlhelp32, Windows + {$ENDIF} + ; + +type + TVNCServerThread = class(TThread) + private + passwd, passwd2: string; + shouldTerminate: boolean; + protected + procedure execute; override; + public + constructor create(cpasswd, cpasswd2: string); + procedure kill; + end; + +implementation + +constructor TVNCServerThread.create(cpasswd, cpasswd2: string); +begin + passwd:=cpasswd; + passwd2:=cpasswd2; + shouldTerminate:=false; + FreeOnTerminate:=true; + inherited create(false); +end; + +procedure TVNCServerThread.kill; +begin + shouldTerminate:=true; +end; + +procedure TVNCServerThread.execute; +var + myProcess: TProcess; +begin + {$IFDEF WINDOWS} + myProcess:=TProcess.create(nil); + myProcess.executable:='C:\Program Files\PhilleConnect\vnc\winvncstartup.exe'; + myProcess.parameters.add(passwd); + myProcess.parameters.add(passwd2); + myProcess.showWindow:=swoHIDE; + myProcess.execute; + myProcess.waitOnExit; + myProcess.free; + myProcess:=TProcess.create(nil); + myProcess.executable:='C:\Program Files\PhilleConnect\vnc\winvnc.exe'; + myProcess.execute; + {$ENDIF} + {$IFDEF LINUX} + myProcess:=TProcess.create(nil); + myProcess.executable:='sh'; + myProcess.parameters.add('-c'); + myProcess.parameters.add('x11vnc -o /tmp/x11vnc.log -storepasswd '+passwd+' /tmp/philleconnectpasswd'); + myProcess.execute; + myProcess.waitOnExit; + myProcess.free; + myProcess:=TProcess.create(nil); + myProcess.executable:='sh'; + myProcess.parameters.add('-c'); + myProcess.parameters.add('x11vnc -rfbauth /tmp/philleconnectpasswd -o /tmp/x11vnc.log'); + myProcess.execute; + {$ENDIF} + while (not shouldTerminate) do begin + sleep(10); + end; + myProcess.terminate(0); + myProcess.free; +end; + +end. +