From 2c967484b8d9d81390ffd7fd5045427f856a0bd2 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Mon, 30 Dec 2019 22:43:03 +0100 Subject: [PATCH 01/34] Installer ... first try. --- INDEPENDENCE | 8 + LICENSE | 24 + installer/IDP_1.5.1/COPYING.txt | 11 + installer/IDP_1.5.1/ansi/idp.dll | Bin 0 -> 221184 bytes installer/IDP_1.5.1/ansi/idplang/default.iss | 42 ++ installer/IDP_1.5.1/idp.iss | 662 ++++++++++++++++++ installer/IDP_1.5.1/unicode/idp.dll | Bin 0 -> 237568 bytes .../IDP_1.5.1/unicode/idplang/default.iss | 42 ++ installer/theonionpack.iss | 390 +++++++++++ setup.ini | 13 + 10 files changed, 1192 insertions(+) create mode 100644 INDEPENDENCE create mode 100644 LICENSE create mode 100644 installer/IDP_1.5.1/COPYING.txt create mode 100644 installer/IDP_1.5.1/ansi/idp.dll create mode 100644 installer/IDP_1.5.1/ansi/idplang/default.iss create mode 100644 installer/IDP_1.5.1/idp.iss create mode 100644 installer/IDP_1.5.1/unicode/idp.dll create mode 100644 installer/IDP_1.5.1/unicode/idplang/default.iss create mode 100644 installer/theonionpack.iss create mode 100644 setup.ini diff --git a/INDEPENDENCE b/INDEPENDENCE new file mode 100644 index 0000000..0ee20f9 --- /dev/null +++ b/INDEPENDENCE @@ -0,0 +1,8 @@ +Statement of Independence + +The Onion Pack +Copyright (c) 2019 - 2020 Ralph Wetzel + +This product is produced independently from the Tor(R) anonymity software and +carries no guarantee from The Tor Project about quality, suitability or anything +else. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..277f258 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +The MIT License (MIT) + +The Onion Pack +Copyright (c) 2019 - 2020 Ralph Wetzel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + diff --git a/installer/IDP_1.5.1/COPYING.txt b/installer/IDP_1.5.1/COPYING.txt new file mode 100644 index 0000000..c62795c --- /dev/null +++ b/installer/IDP_1.5.1/COPYING.txt @@ -0,0 +1,11 @@ +Copyright (c) 2013-2015 Mitrich Software + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. \ No newline at end of file diff --git a/installer/IDP_1.5.1/ansi/idp.dll b/installer/IDP_1.5.1/ansi/idp.dll new file mode 100644 index 0000000000000000000000000000000000000000..96a35312650e602baf8a3a08bed6e9c2767792d5 GIT binary patch literal 221184 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 A7ytkO literal 0 HcmV?d00001 diff --git a/installer/IDP_1.5.1/ansi/idplang/default.iss b/installer/IDP_1.5.1/ansi/idplang/default.iss new file mode 100644 index 0000000..e965c88 --- /dev/null +++ b/installer/IDP_1.5.1/ansi/idplang/default.iss @@ -0,0 +1,42 @@ +[CustomMessages] +IDP_FormCaption =Downloading additional files +IDP_FormDescription =Please wait while Setup is downloading additional files... +IDP_TotalProgress =Total progress +IDP_CurrentFile =Current file +IDP_File =File: +IDP_Speed =Speed: +IDP_Status =Status: +IDP_ElapsedTime =Elapsed time: +IDP_RemainingTime =Remaining time: +IDP_DetailsButton =Details +IDP_HideButton =Hide +IDP_RetryButton =Retry +IDP_IgnoreButton =Ignore +IDP_KBs =KB/s +IDP_MBs =MB/s +IDP_X_of_X =%.2f of %.2f +IDP_KB =KB +IDP_MB =MB +IDP_GB =GB +IDP_Initializing =Initializing... +IDP_GettingFileInformation=Getting file information... +IDP_StartingDownload =Starting download... +IDP_Connecting =Connecting... +IDP_Downloading =Downloading... +IDP_DownloadComplete =Download complete +IDP_DownloadFailed =Download failed +IDP_CannotConnect =Cannot connect +IDP_CancellingDownload =Cancelling download... +IDP_Unknown =Unknown +IDP_DownloadCancelled =Download cancelled +IDP_RetryNext =Check your connection and click 'Retry' to try downloading the files again, or click 'Next' to continue installing anyway. +IDP_RetryCancel =Check your connection and click 'Retry' to try downloading the files again, or click 'Cancel' to terminate setup. +IDP_FilesNotDownloaded =The following files were not downloaded: +IDP_HTTPError_X =HTTP error %d +IDP_400 =Bad request (400) +IDP_401 =Access denied (401) +IDP_404 =File not found (404) +IDP_407 =Proxy authentication required (407) +IDP_500 =Server internal error (500) +IDP_502 =Bad gateway (502) +IDP_503 =Service temporaily unavailable (503) diff --git a/installer/IDP_1.5.1/idp.iss b/installer/IDP_1.5.1/idp.iss new file mode 100644 index 0000000..580d5a8 --- /dev/null +++ b/installer/IDP_1.5.1/idp.iss @@ -0,0 +1,662 @@ +; Inno Download Plugin +; (c)2013-2014 Mitrich Software +; http://mitrichsoftware.wordpress.com/ +; https://code.google.com/p/inno-download-plugin/ + +#define IDPROOT ExtractFilePath(__PATHFILENAME__) + +#ifdef UNICODE + #pragma include __INCLUDE__ + ";" + IDPROOT + "\unicode" +#else + #pragma include __INCLUDE__ + ";" + IDPROOT + "\ansi" +#endif + +; If IDP_DEBUG is defined before including idp.iss, script will use debug version of idp.dll (not included, you need to build it yourself). +; Debug dll messages can be viewed with SysInternals DebugView (http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx) +#ifdef IDP_DEBUG + #define DBGSUFFIX " debug" +#else + #define DBGSUFFIX +#endif + +#ifdef UNICODE + #define IDPDLLDIR IDPROOT + "\unicode" + DBGSUFFIX +#else + #define IDPDLLDIR IDPROOT + "\ansi" + DBGSUFFIX +#endif + +#define IDP_VER_MAJOR +#define IDP_VER_MINOR +#define IDP_VER_REV +#define IDP_VER_BUILD + +#expr ParseVersion(IDPDLLDIR + "\idp.dll", IDP_VER_MAJOR, IDP_VER_MINOR, IDP_VER_REV, IDP_VER_BUILD) +#define IDP_VER EncodeVer(IDP_VER_MAJOR, IDP_VER_MINOR, IDP_VER_REV, IDP_VER_BUILD) + +#define IDP_VER_STR GetFileVersion(IDPDLLDIR + "\idp.dll") + +[Files] +Source: "{#IDPDLLDIR}\idp.dll"; Flags: dontcopy; + +[Code] +procedure idpAddFile(url, filename: String); external 'idpAddFile@files:idp.dll cdecl'; +procedure idpAddFileComp(url, filename, components: String); external 'idpAddFileComp@files:idp.dll cdecl'; +procedure idpAddMirror(url, mirror: String); external 'idpAddMirror@files:idp.dll cdecl'; +procedure idpAddFtpDir(url, mask, destdir: String; recursive: Boolean); external 'idpAddFtpDir@files:idp.dll cdecl'; +procedure idpAddFtpDirComp(url, mask, destdir: String; recursive: Boolean; components: String); external 'idpAddFtpDirComp@files:idp.dll cdecl'; +procedure idpClearFiles; external 'idpClearFiles@files:idp.dll cdecl'; +function idpFilesCount: Integer; external 'idpFilesCount@files:idp.dll cdecl'; +function idpFtpDirsCount: Integer; external 'idpFtpDirsCount@files:idp.dll cdecl'; +function idpFileDownloaded(url: String): Boolean; external 'idpFileDownloaded@files:idp.dll cdecl'; +function idpFilesDownloaded: Boolean; external 'idpFilesDownloaded@files:idp.dll cdecl'; +function idpDownloadFile(url, filename: String): Boolean; external 'idpDownloadFile@files:idp.dll cdecl'; +function idpDownloadFiles: Boolean; external 'idpDownloadFiles@files:idp.dll cdecl'; +function idpDownloadFilesComp: Boolean; external 'idpDownloadFilesComp@files:idp.dll cdecl'; +function idpDownloadFilesCompUi: Boolean; external 'idpDownloadFilesCompUi@files:idp.dll cdecl'; +procedure idpStartDownload; external 'idpStartDownload@files:idp.dll cdecl'; +procedure idpStopDownload; external 'idpStopDownload@files:idp.dll cdecl'; +procedure idpSetLogin(login, password: String); external 'idpSetLogin@files:idp.dll cdecl'; +procedure idpSetProxyMode(mode: String); external 'idpSetProxyMode@files:idp.dll cdecl'; +procedure idpSetProxyName(name: String); external 'idpSetProxyName@files:idp.dll cdecl'; +procedure idpSetProxyLogin(login, password: String); external 'idpSetProxyLogin@files:idp.dll cdecl'; +procedure idpConnectControl(name: String; Handle: HWND); external 'idpConnectControl@files:idp.dll cdecl'; +procedure idpAddMessage(name, message: String); external 'idpAddMessage@files:idp.dll cdecl'; +procedure idpSetInternalOption(name, value: String); external 'idpSetInternalOption@files:idp.dll cdecl'; +procedure idpSetDetailedMode(mode: Boolean); external 'idpSetDetailedMode@files:idp.dll cdecl'; +procedure idpSetComponents(components: String); external 'idpSetComponents@files:idp.dll cdecl'; +procedure idpReportError; external 'idpReportError@files:idp.dll cdecl'; +procedure idpTrace(text: String); external 'idpTrace@files:idp.dll cdecl'; + +#if defined(UNICODE) && (Ver >= 0x05050300) +procedure idpAddFileSize(url, filename: String; size: Int64); external 'idpAddFileSize@files:idp.dll cdecl'; +procedure idpAddFileSizeComp(url, filename: String; size: Int64; components: String); external 'idpAddFileSize@files:idp.dll cdecl'; +function idpGetFileSize(url: String; var size: Int64): Boolean; external 'idpGetFileSize@files:idp.dll cdecl'; +function idpGetFilesSize(var size: Int64): Boolean; external 'idpGetFilesSize@files:idp.dll cdecl'; +#else +procedure idpAddFileSize(url, filename: String; size: Dword); external 'idpAddFileSize32@files:idp.dll cdecl'; +procedure idpAddFileSizeComp(url, filename: String; size: Dword; components: String); external 'idpAddFileSize32@files:idp.dll cdecl'; +function idpGetFileSize(url: String; var size: Dword): Boolean; external 'idpGetFileSize32@files:idp.dll cdecl'; +function idpGetFilesSize(var size: Dword): Boolean; external 'idpGetFilesSize32@files:idp.dll cdecl'; +#endif + +type TIdpForm = record + Page : TWizardPage; + TotalProgressBar : TNewProgressBar; + FileProgressBar : TNewProgressBar; + TotalProgressLabel: TNewStaticText; + CurrentFileLabel : TNewStaticText; + TotalDownloaded : TNewStaticText; + FileDownloaded : TNewStaticText; + FileNameLabel : TNewStaticText; + SpeedLabel : TNewStaticText; + StatusLabel : TNewStaticText; + ElapsedTimeLabel : TNewStaticText; + RemainingTimeLabel: TNewStaticText; + FileName : TNewStaticText; + Speed : TNewStaticText; + Status : TNewStaticText; + ElapsedTime : TNewStaticText; + RemainingTime : TNewStaticText; + DetailsButton : TNewButton; + GIDetailsButton : HWND; //Graphical Installer + DetailsVisible : Boolean; + InvisibleButton : TNewButton; + end; + + TIdpOptions = record + DetailedMode : Boolean; + NoDetailsButton: Boolean; + NoRetryButton : Boolean; + NoSkinnedButton: Boolean; //Graphical Installer + end; + +var IDPForm : TIdpForm; + IDPOptions: TIdpOptions; + +function StrToBool(value: String): Boolean; +var s: String; +begin + s := LowerCase(value); + + if s = 'true' then result := true + else if s = 't' then result := true + else if s = 'yes' then result := true + else if s = 'y' then result := true + else if s = 'false' then result := false + else if s = 'f' then result := false + else if s = 'no' then result := false + else if s = 'n' then result := false + else result := StrToInt(value) > 0; +end; + +function WizardVerySilent: Boolean; +var i: Integer; +begin + for i := 1 to ParamCount do + begin + if UpperCase(ParamStr(i)) = '/VERYSILENT' then + begin + result := true; + exit; + end; + end; + + result := false; +end; + +function WizardSupressMsgBoxes: Boolean; +var i: Integer; +begin + for i := 1 to ParamCount do + begin + if UpperCase(ParamStr(i)) = '/SUPPRESSMSGBOXES' then + begin + result := true; + exit; + end; + end; + + result := false; +end; + +procedure idpSetOption(name, value: String); +var key: String; +begin + key := LowerCase(name); + + if key = 'detailedmode' then IDPOptions.DetailedMode := StrToBool(value) + else if key = 'detailsvisible' then IDPOptions.DetailedMode := StrToBool(value) //alias + else if key = 'detailsbutton' then IDPOptions.NoDetailsButton := not StrToBool(value) + else if key = 'skinnedbutton' then IDPOptions.NoSkinnedButton := not StrToBool(value) + else if key = 'retrybutton' then + begin + IDPOptions.NoRetryButton := StrToInt(value) = 0; + idpSetInternalOption('RetryButton', value); + end + else + idpSetInternalOption(name, value); +end; + +procedure idpShowDetails(show: Boolean); +begin + IDPForm.FileProgressBar.Visible := show; + IDPForm.CurrentFileLabel.Visible := show; + IDPForm.FileDownloaded.Visible := show; + IDPForm.FileNameLabel.Visible := show; + IDPForm.SpeedLabel.Visible := show; + IDPForm.StatusLabel.Visible := show; + IDPForm.ElapsedTimeLabel.Visible := show; + IDPForm.RemainingTimeLabel.Visible := show; + IDPForm.FileName.Visible := show; + IDPForm.Speed.Visible := show; + IDPForm.Status.Visible := show; + IDPForm.ElapsedTime.Visible := show; + IDPForm.RemainingTime.Visible := show; + + IDPForm.DetailsVisible := show; + + if IDPForm.DetailsVisible then + begin + IDPForm.DetailsButton.Caption := ExpandConstant('{cm:IDP_HideButton}'); + IDPForm.DetailsButton.Top := ScaleY(184); + end + else + begin + IDPForm.DetailsButton.Caption := ExpandConstant('{cm:IDP_DetailsButton}'); + IDPForm.DetailsButton.Top := ScaleY(44); + end; + + idpSetDetailedMode(show); +end; + +procedure idpDetailsButtonClick(Sender: TObject); +begin + idpShowDetails(not IDPForm.DetailsVisible); +end; + +#ifdef GRAPHICAL_INSTALLER_PROJECT +procedure idpGIDetailsButtonClick(hButton: HWND); +begin + idpShowDetails(not IDPForm.DetailsVisible); + + if IDPForm.DetailsVisible then + begin + ButtonSetText(IDPForm.GIDetailsButton, PAnsiChar(ExpandConstant('{cm:IDP_HideButton}'))); + ButtonSetPosition(IDPForm.GIDetailsButton, IDPForm.DetailsButton.Left-ScaleX(5), ScaleY(184), ButtonWidth, ButtonHeight); + end + else + begin + ButtonSetText(IDPForm.GIDetailsButton, PAnsiChar(ExpandConstant('{cm:IDP_DetailsButton}'))); + ButtonSetPosition(IDPForm.GIDetailsButton, IDPForm.DetailsButton.Left-ScaleX(5), ScaleY(44), ButtonWidth, ButtonHeight); + end; + + ButtonRefresh(hButton); +end; + +procedure idpCreateGIDetailsButton; +var swButtonNormalColor : TColor; + swButtonFocusedColor : TColor; + swButtonPressedColor : TColor; + swButtonDisabledColor: TColor; +begin + swButtonNormalColor := SwitchColorFormat(ExpandConstant('{#ButtonNormalColor}')); + swButtonFocusedColor := SwitchColorFormat(ExpandConstant('{#ButtonFocusedColor}')); + swButtonPressedColor := SwitchColorFormat(ExpandConstant('{#ButtonPressedColor}')); + swButtonDisabledColor := SwitchColorFormat(ExpandConstant('{#ButtonDisabledColor}')); + + with IDPForm.DetailsButton do + begin + IDPForm.GIDetailsButton := ButtonCreate(IDPForm.Page.Surface.Handle, Left-ScaleX(5), Top, ButtonWidth, ButtonHeight, + ExpandConstant('{tmp}\{#ButtonPicture}'), coButtonShadow, False); + + ButtonSetEvent(IDPForm.GIDetailsButton, ButtonClickEventID, WrapButtonCallback(@idpGIDetailsButtonClick, 1)); + ButtonSetFont(IDPForm.GIDetailsButton, ButtonFont.Handle); + ButtonSetFontColor(IDPForm.GIDetailsButton, swButtonNormalColor, swButtonFocusedColor, swButtonPressedColor, swButtonDisabledColor); + ButtonSetText(IDPForm.GIDetailsButton, PAnsiChar(Caption)); + ButtonSetVisibility(IDPForm.GIDetailsButton, true); + ButtonSetEnabled(IDPForm.GIDetailsButton, true); + end; +end; +#endif + +procedure idpFormActivate(Page: TWizardPage); +begin + if WizardSilent then + idpSetOption('RetryButton', '0'); + + if WizardSupressMsgBoxes then + idpSetInternalOption('ErrorDialog', 'none'); + + if not IDPOptions.NoRetryButton then + WizardForm.BackButton.Caption := ExpandConstant('{cm:IDP_RetryButton}'); + + idpShowDetails(IDPOptions.DetailedMode); + IDPForm.DetailsButton.Visible := not IDPOptions.NoDetailsButton; + +#ifdef GRAPHICAL_INSTALLER_PROJECT + idpSetInternalOption('RedrawBackground', '1'); + idpConnectControl('GIBackButton', hBackButton); + idpConnectControl('GINextButton', hNextButton); + + if not IDPOptions.NoSkinnedButton then + begin + IDPForm.DetailsButton.Visible := false; + if IDPForm.GIDetailsButton = 0 then + idpCreateGIDetailsButton; + end; + + if IDPOptions.NoRetryButton then + WizardForm.BackButton.Enabled := false + else + WizardForm.BackButton.Visible := false; + + WizardForm.NextButton.Enabled := false; +#endif + idpSetComponents(WizardSelectedComponents(false)); + + if WizardVerySilent then + idpDownloadFilesComp + else if WizardSilent then + begin + WizardForm.Show; + WizardForm.Repaint; + idpDownloadFilesCompUi; + WizardForm.Hide; + end + else + idpStartDownload; +end; + +function idpShouldSkipPage(Page: TWizardPage): Boolean; +begin + idpSetComponents(WizardSelectedComponents(false)); + Result := ((idpFilesCount = 0) and (idpFtpDirsCount = 0)) or idpFilesDownloaded; +end; + +function idpBackButtonClick(Page: TWizardPage): Boolean; +begin + if not IDPOptions.NoRetryButton then // Retry button clicked + begin + idpStartDownload; + Result := False; + end + else + Result := true; +end; + +function idpNextButtonClick(Page: TWizardPage): Boolean; +begin + Result := True; +end; + +procedure idpCancelButtonClick(Page: TWizardPage; var Cancel, Confirm: Boolean); +begin + if ExitSetupMsgBox then + begin + IDPForm.Status.Caption := ExpandConstant('{cm:IDP_CancellingDownload}'); + WizardForm.Repaint; + idpStopDownload; + Cancel := true; + Confirm := false; + end + else + Cancel := false; +end; + +procedure idpReportErrorHelper(Sender: TObject); +begin + idpReportError; //calling idpReportError in main thread for compatibility with VCL Styles for IS +end; + +function idpCreateDownloadForm(PreviousPageId: Integer): Integer; +begin + IDPForm.Page := CreateCustomPage(PreviousPageId, ExpandConstant('{cm:IDP_FormCaption}'), ExpandConstant('{cm:IDP_FormDescription}')); + + IDPForm.TotalProgressBar := TNewProgressBar.Create(IDPForm.Page); + with IDPForm.TotalProgressBar do + begin + Parent := IDPForm.Page.Surface; + Left := ScaleX(0); + Top := ScaleY(16); + Width := ScaleX(410); + Height := ScaleY(20); + Min := 0; + Max := 100; + end; + + IDPForm.TotalProgressLabel := TNewStaticText.Create(IDPForm.Page); + with IDPForm.TotalProgressLabel do + begin + Parent := IDPForm.Page.Surface; + Caption := ExpandConstant('{cm:IDP_TotalProgress}'); + Left := ScaleX(0); + Top := ScaleY(0); + Width := ScaleX(200); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 1; + end; + + IDPForm.CurrentFileLabel := TNewStaticText.Create(IDPForm.Page); + with IDPForm.CurrentFileLabel do + begin + Parent := IDPForm.Page.Surface; + Caption := ExpandConstant('{cm:IDP_CurrentFile}'); + Left := ScaleX(0); + Top := ScaleY(48); + Width := ScaleX(200); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 2; + end; + + IDPForm.FileProgressBar := TNewProgressBar.Create(IDPForm.Page); + with IDPForm.FileProgressBar do + begin + Parent := IDPForm.Page.Surface; + Left := ScaleX(0); + Top := ScaleY(64); + Width := ScaleX(410); + Height := ScaleY(20); + Min := 0; + Max := 100; + end; + + IDPForm.TotalDownloaded := TNewStaticText.Create(IDPForm.Page); + with IDPForm.TotalDownloaded do + begin + Parent := IDPForm.Page.Surface; + Caption := ''; + Left := ScaleX(290); + Top := ScaleY(0); + Width := ScaleX(120); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 4; + end; + + IDPForm.FileDownloaded := TNewStaticText.Create(IDPForm.Page); + with IDPForm.FileDownloaded do + begin + Parent := IDPForm.Page.Surface; + Caption := ''; + Left := ScaleX(290); + Top := ScaleY(48); + Width := ScaleX(120); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 5; + end; + + IDPForm.FileNameLabel := TNewStaticText.Create(IDPForm.Page); + with IDPForm.FileNameLabel do + begin + Parent := IDPForm.Page.Surface; + Caption := ExpandConstant('{cm:IDP_File}'); + Left := ScaleX(0); + Top := ScaleY(100); + Width := ScaleX(116); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 6; + end; + + IDPForm.SpeedLabel := TNewStaticText.Create(IDPForm.Page); + with IDPForm.SpeedLabel do + begin + Parent := IDPForm.Page.Surface; + Caption := ExpandConstant('{cm:IDP_Speed}'); + Left := ScaleX(0); + Top := ScaleY(116); + Width := ScaleX(116); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 7; + end; + + IDPForm.StatusLabel := TNewStaticText.Create(IDPForm.Page); + with IDPForm.StatusLabel do + begin + Parent := IDPForm.Page.Surface; + Caption := ExpandConstant('{cm:IDP_Status}'); + Left := ScaleX(0); + Top := ScaleY(132); + Width := ScaleX(116); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 8; + end; + + IDPForm.ElapsedTimeLabel := TNewStaticText.Create(IDPForm.Page); + with IDPForm.ElapsedTimeLabel do + begin + Parent := IDPForm.Page.Surface; + Caption := ExpandConstant('{cm:IDP_ElapsedTime}'); + Left := ScaleX(0); + Top := ScaleY(148); + Width := ScaleX(116); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 9; + end; + + IDPForm.RemainingTimeLabel := TNewStaticText.Create(IDPForm.Page); + with IDPForm.RemainingTimeLabel do + begin + Parent := IDPForm.Page.Surface; + Caption := ExpandConstant('{cm:IDP_RemainingTime}'); + Left := ScaleX(0); + Top := ScaleY(164); + Width := ScaleX(116); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 10; + end; + + IDPForm.FileName := TNewStaticText.Create(IDPForm.Page); + with IDPForm.FileName do + begin + Parent := IDPForm.Page.Surface; + Caption := ''; + Left := ScaleX(120); + Top := ScaleY(100); + Width := ScaleX(280); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 11; + end; + + IDPForm.Speed := TNewStaticText.Create(IDPForm.Page); + with IDPForm.Speed do + begin + Parent := IDPForm.Page.Surface; + Caption := ''; + Left := ScaleX(120); + Top := ScaleY(116); + Width := ScaleX(280); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 12; + end; + + IDPForm.Status := TNewStaticText.Create(IDPForm.Page); + with IDPForm.Status do + begin + Parent := IDPForm.Page.Surface; + Caption := ''; + Left := ScaleX(120); + Top := ScaleY(132); + Width := ScaleX(280); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 13; + end; + + IDPForm.ElapsedTime := TNewStaticText.Create(IDPForm.Page); + with IDPForm.ElapsedTime do + begin + Parent := IDPForm.Page.Surface; + Caption := ''; + Left := ScaleX(120); + Top := ScaleY(148); + Width := ScaleX(280); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 14; + end; + + IDPForm.RemainingTime := TNewStaticText.Create(IDPForm.Page); + with IDPForm.RemainingTime do + begin + Parent := IDPForm.Page.Surface; + Caption := ''; + Left := ScaleX(120); + Top := ScaleY(164); + Width := ScaleX(280); + Height := ScaleY(14); + AutoSize := False; + TabOrder := 15; + end; + + IDPForm.DetailsButton := TNewButton.Create(IDPForm.Page); + with IDPForm.DetailsButton do + begin + Parent := IDPForm.Page.Surface; + Caption := ExpandConstant('{cm:IDP_DetailsButton}'); + Left := ScaleX(336); + Top := ScaleY(184); + Width := ScaleX(75); + Height := ScaleY(23); + TabOrder := 16; + OnClick := @idpDetailsButtonClick; + end; + + IDPForm.InvisibleButton := TNewButton.Create(IDPForm.Page); + with IDPForm.InvisibleButton do + begin + Parent := IDPForm.Page.Surface; + Caption := ExpandConstant('You must not see this button'); + Left := ScaleX(0); + Top := ScaleY(0); + Width := ScaleX(10); + Height := ScaleY(10); + TabOrder := 17; + Visible := False; + OnClick := @idpReportErrorHelper; + end; + + with IDPForm.Page do + begin + OnActivate := @idpFormActivate; + OnShouldSkipPage := @idpShouldSkipPage; + OnBackButtonClick := @idpBackButtonClick; + OnNextButtonClick := @idpNextButtonClick; + OnCancelButtonClick := @idpCancelButtonClick; + end; + + Result := IDPForm.Page.ID; +end; + +procedure idpConnectControls; +begin + idpConnectControl('TotalProgressLabel', IDPForm.TotalProgressLabel.Handle); + idpConnectControl('TotalProgressBar', IDPForm.TotalProgressBar.Handle); + idpConnectControl('FileProgressBar', IDPForm.FileProgressBar.Handle); + idpConnectControl('TotalDownloaded', IDPForm.TotalDownloaded.Handle); + idpConnectControl('FileDownloaded', IDPForm.FileDownloaded.Handle); + idpConnectControl('FileName', IDPForm.FileName.Handle); + idpConnectControl('Speed', IDPForm.Speed.Handle); + idpConnectControl('Status', IDPForm.Status.Handle); + idpConnectControl('ElapsedTime', IDPForm.ElapsedTime.Handle); + idpConnectControl('RemainingTime', IDPForm.RemainingTime.Handle); + idpConnectControl('InvisibleButton', IDPForm.InvisibleButton.Handle); + idpConnectControl('WizardPage', IDPForm.Page.Surface.Handle); + idpConnectControl('WizardForm', WizardForm.Handle); + idpConnectControl('BackButton', WizardForm.BackButton.Handle); + idpConnectControl('NextButton', WizardForm.NextButton.Handle); + idpConnectControl('LabelFont', IDPForm.TotalDownloaded.Font.Handle); +end; + +procedure idpInitMessages; +begin + idpAddMessage('Total progress', ExpandConstant('{cm:IDP_TotalProgress}')); + idpAddMessage('KB/s', ExpandConstant('{cm:IDP_KBs}')); + idpAddMessage('MB/s', ExpandConstant('{cm:IDP_MBs}')); + idpAddMessage('%.2f of %.2f', ExpandConstant('{cm:IDP_X_of_X}')); + idpAddMessage('KB', ExpandConstant('{cm:IDP_KB}')); + idpAddMessage('MB', ExpandConstant('{cm:IDP_MB}')); + idpAddMessage('GB', ExpandConstant('{cm:IDP_GB}')); + idpAddMessage('Initializing...', ExpandConstant('{cm:IDP_Initializing}')); + idpAddMessage('Getting file information...', ExpandConstant('{cm:IDP_GettingFileInformation}')); + idpAddMessage('Starting download...', ExpandConstant('{cm:IDP_StartingDownload}')); + idpAddMessage('Connecting...', ExpandConstant('{cm:IDP_Connecting}')); + idpAddMessage('Downloading...', ExpandConstant('{cm:IDP_Downloading}')); + idpAddMessage('Download complete', ExpandConstant('{cm:IDP_DownloadComplete}')); + idpAddMessage('Download failed', ExpandConstant('{cm:IDP_DownloadFailed}')); + idpAddMessage('Cannot connect', ExpandConstant('{cm:IDP_CannotConnect}')); + idpAddMessage('Unknown', ExpandConstant('{cm:IDP_Unknown}')); + idpAddMessage('Download cancelled', ExpandConstant('{cm:IDP_DownloadCancelled}')); + idpAddMessage('HTTP error %d', ExpandConstant('{cm:IDP_HTTPError_X}')); + idpAddMessage('400', ExpandConstant('{cm:IDP_400}')); + idpAddMessage('401', ExpandConstant('{cm:IDP_401}')); + idpAddMessage('404', ExpandConstant('{cm:IDP_404}')); + idpAddMessage('407', ExpandConstant('{cm:IDP_407}')); + idpAddMessage('500', ExpandConstant('{cm:IDP_500}')); + idpAddMessage('502', ExpandConstant('{cm:IDP_502}')); + idpAddMessage('503', ExpandConstant('{cm:IDP_503}')); + idpAddMessage('Retry', ExpandConstant('{cm:IDP_RetryButton}')); + idpAddMessage('Ignore', ExpandConstant('{cm:IDP_IgnoreButton}')); + idpAddMessage('Cancel', SetupMessage(msgButtonCancel)); + idpAddMessage('The following files were not downloaded:', ExpandConstant('{cm:IDP_FilesNotDownloaded}')); + idpAddMessage('Check your connection and click ''Retry'' to try downloading the files again, or click ''Next'' to continue installing anyway.', ExpandConstant('{cm:IDP_RetryNext}')); + idpAddMessage('Check your connection and click ''Retry'' to try downloading the files again, or click ''Cancel'' to terminate setup.', ExpandConstant('{cm:IDP_RetryCancel}')); +end; + +procedure idpDownloadAfter(PageAfterId: Integer); +begin + idpCreateDownloadForm(PageAfterId); + idpConnectControls; + idpInitMessages; +end; + +#include diff --git a/installer/IDP_1.5.1/unicode/idp.dll b/installer/IDP_1.5.1/unicode/idp.dll new file mode 100644 index 0000000000000000000000000000000000000000..ce7b5da9f6c414be8f8df91c9443b5b93cd7d7da GIT binary patch literal 237568 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 + +; The Python version to be used is configured via an INI file. +; This ensures that compatibility can be tested ... to avoid side effects. +#define INIFile RemoveBackslash(SourcePath) + "\..\setup.ini" + +; The license file +#define LicenseFile RemoveBackslash(SourcePath) + "\..\LICENSE" + +; Statement of Independence +#define IndependenceFile RemoveBackslash(SourcePath) + "\..\INDEPENDENCE" + +; py shall become something like '3.7.6' +#define py ReadIni(INIFile, "python", "version") +; for pth we extract the first two digits of py +#define pth Copy(StringChange(py, '.', ''), 1, 2) + +; Tor Download page +#define tor ReadIni(INIFile, "tor", "download") + +[ThirdParty] +UseRelativePaths=True + +[Setup] +AppName={# ReadIni(INIFile, "theonionpack", "title")} +AppVersion={# ReadIni(INIFile, "theonionpack", "version")} +AppCopyright={# ReadIni(INIFile, "theonionpack", "copyright")} +AppId={{9CF06087-6B33-44B0-B9EE-24A3EE0678C9} +UsePreviousAppDir=No +DefaultDirName=TheOnionPack +DisableWelcomePage=False +UninstallLogMode=new +PrivilegesRequired=lowest +; There's a 'bug' (better an annoyance) in Inno Script Studio that limits +; ExtraDiskSpaceRequired to 10000000 in the dialog window. +; It yet doesn't overwrite the value here - as long as we don't touch it. +ExtraDiskSpaceRequired=83693568 +MinVersion=0,6.0 +LicenseFile={# LicenseFile} +WizardImageFile=compiler:WizModernImage-IS.bmp +WizardSmallImageFile=compiler:WizModernSmallImage-IS.bmp +OutputBaseFilename=TheOnionPackInstaller + +[Files] +Source: "{tmp}\Python\*"; DestDir: "{app}\Python"; Flags: external recursesubdirs +Source: "{tmp}\Tor\*"; DestDir: "{app}\Tor"; Flags: external recursesubdirs +Source: "{tmp}\get-pip.py"; DestDir: "{app}\Python"; Flags: external deleteafterinstall +Source: "{# IndependenceFile}"; DestName: "INDEPENDENCE"; Flags: dontcopy + +[Run] +Filename: "{app}\Python\python.exe"; Parameters: "get-pip.py ""pip>18"" --no-warn-script-location"; Flags: runhidden; StatusMsg: "Preparing the Python runtime environment..."; BeforeInstall: SetupRunConfig; AfterInstall: SetMarqueeProgress(False) +Filename: "{app}\Python\python.exe"; Parameters: "-m pip install --no-warn-script-location --upgrade theonionbox"; Flags: runhidden; StatusMsg: "Now installing The Onion Box. This may take some time, as a number of additional packages most probably have to be collected from the Internet..."; BeforeInstall: SetupRunConfig; AfterInstall: SetMarqueeProgress(False) +Filename: "{app}\Python\Scripts\theonionbox.exe"; Flags: postinstall; Description: "Run The Onion Box..." + +[UninstallRun] +Filename: "{cmd}"; Parameters: """{cmd}"" /S /C """"{app}\Python\Scripts\pip.exe"" freeze > ""{app}\unins.req"""""; Flags: runhidden +Filename: "{cmd}"; Parameters: """{cmd}"" /S /C """"{app}\Python\Scripts\pip.exe"" uninstall -y -r ""{app}\unins.req"""""; Flags: runhidden +Filename: "{app}\Python\python.exe"; Parameters: "-m pip uninstall -y pip setuptools wheel"; Flags: runhidden + +[UninstallDelete] +Type: files; Name: "{app}\uninst.req" +Type: dirifempty; Name: "{app}\Python\Lib\site-packages" +Type: dirifempty; Name: "{app}\Python\Lib" +Type: dirifempty; Name: "{app}\Python\service" +Type: dirifempty; Name: "{app}\Python\support\osxtemp" +Type: dirifempty; Name: "{app}\Python\support" +Type: dirifempty; Name: "{app}\Python\theonionbox\tob\system\windows" +Type: dirifempty; Name: "{app}\Python\theonionbox\tob\system" +Type: dirifempty; Name: "{app}\Python\theonionbox\tob" +Type: dirifempty; Name: "{app}\Python\theonionbox" + + +[Code] + +var + // Custom page showing progress while extracting the Tor Download Link + TorDownloadLinkPage: TOutputProgressWizardPage; + + // Independence Statement Acknowledgement Page + IndependencePage: TOutputMsgMemoWizardPage; + IndependenceAcceptedRadio: TRadioButton; + IndependenceNotAcceptedRadio: TRadioButton; + +procedure CreateIndependencePage(); forward; +procedure CheckIndependenceAccepted(Sender: TObject); forward; + +procedure InitializeWizard(); +begin + + // the target file shall end with '.zip' ... to later support unzipping! + idpAddFile('https://www.python.org/ftp/python/{#py}/python-{#py}-embed-win32.zip', ExpandConstant('{tmp}\python.zip')); + idpAddFile('https://bootstrap.pypa.io/get-pip.py', ExpandConstant('{tmp}\get-pip.py')); + + idpDownloadAfter(wpPreparing); + + // Initialize the custom page + // The Tor Download Link (if found) will later (@ PrepareToInstall) be added + // to the files to be downloaded => becoming {tmp}\tor.zip + TorDownloadLinkPage:= CreateOutputProgressPage('Extracting Download Link for current Tor version', ''); + + // Create the page to acknowledge the Statement of Independence + CreateIndependencePage(); + +end; + + +// pastebin.com/STcQLfKR +Function SplitString(const Value: string; Delimiter: string; Strings: TStrings): Boolean; +var + S: string; +begin + S := Value; + if StringChangeEx(S, Delimiter, #13#10, True) > 0 then begin + Strings.text := S; + Result := True; + Exit; + end; + Result := False; +end; + + +// To unzip a file; based on an answer by willw @ 20160107 +// https://stackoverflow.com/questions/6065364/how-to-get-inno-setup-to-unzip-a-file-it-installed-all-as-part-of-the-one-insta +const + SHCONTCH_NOPROGRESSBOX = 4; + SHCONTCH_RESPONDYESTOALL = 16; + +procedure UnZip(ZipPath, TargetPath: string); +var + Shell: Variant; + ZipFile: Variant; + TargetFolder: Variant; +begin + Shell := CreateOleObject('Shell.Application'); + + ZipFile := Shell.NameSpace(ZipPath); + if VarIsClear(ZipFile) then + RaiseException(Format('ZIP file "%s" does not exist or cannot be opened', [ZipPath])); + + TargetFolder := Shell.NameSpace(TargetPath); + if VarIsClear(TargetFolder) then + if CreateDir(TargetPath) <> True then + RaiseException(Format('Target path "%s" does not exist', [TargetPath])) + else + TargetFolder := Shell.NameSpace(TargetPath); + + TargetFolder.CopyHere(ZipFile.Items, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL); + +end; + + +// Extract the Tor Package Download Link +// html: array of string, each string representing one line of the source code of www.torproject.org/download/tor +// pbar: reference to the progressbar on the wizards page - to provide feedback +// Result: Download Link (if found), otherwize '' +function ExtractDownloadLink(const html: array of string; const pbar: TOutputProgressWizardPage): string; +var + line, tag, address: string; + linesplit, tagsplit: TStringList; + i, ii, iii: Integer; + +begin + Result:= ''; + + for i := 0 to GetArrayLength(html) - 1 do begin + line := html[i]; + pbar.SetProgress(pbar.ProgressBar.Position + 1, pbar.ProgressBar.Max); + // find line with "class='downloadLink'" + if StringChangeEx(line, 'downloadLink', 'found', True) > 0 then begin + // split this line @ ' ' + linesplit := TStringList.Create; + if SplitString(line, ' ', linesplit) = True then begin + for ii := 0 to linesplit.Count - 1 do begin + // find a tag that has a 'zip' in it + tag := linesplit.Strings[ii]; + if StringChangeEx(tag, 'zip', 'xxx', True) > 0 then begin + // split this tag @ '"' ... to extract the address portion + tagsplit := TStringList.Create; + if SplitString(tag, '"', tagsplit) = True then begin + for iii := 0 to tagsplit.Count - 1 do begin + // check if it's in a expected format + // ToDo: add more checks? + address := tagsplit.Strings[iii]; + if Length(address) > 3 then begin + if Copy(address, Length(address) - 2, 3) = 'xxx' then begin + // convert back to original; found! + StringChangeEx(address, 'xxx', 'zip', True); + Result := address; + Break; + end; + end; + end; + end; + tagsplit.Free(); + end; + end; + end; + linesplit.Free(); + end; + end; +end; + + +procedure CurStepChanged(CurStep: TSetupStep); + +var + pth: String; + +begin + if CurStep = ssInstall then begin + // Unzip downloaded files; will be copied by Inno to the target directory + // Thus we support propper uninstalling later. + UnZip(ExpandConstant('{tmp}\tor.zip'), ExpandConstant('{tmp}\Tor')); + UnZip(ExpandConstant('{tmp}\python.zip'), ExpandConstant('{tmp}\Python')); + + // Patch Python ... + // This enables pip operations later! + pth := ExpandConstant('{tmp}\Python\python{#pth}._pth'); + SaveStringsToFile(pth, ['', '# by TheOnionPack', '.\Lib\site-packages', 'import site'], true); + + end; + if CurStep = ssPostInstall then + begin + end; +end; + +{ +function NextButtonClick(CurPageID: Integer): Boolean; +begin + LOG('NextButtonClick') + Result:= True; + if CurPageID = wpLicense then begin + // Create the page to acknowledge the Statement of Independence + CreateIndependencePage(); + end; +end; +} + +procedure CurPageChanged(CurPageID: Integer); +begin + + // Update Next button when user gets to second license page + if CurPageID = IndependencePage.ID then + begin + CheckIndependenceAccepted(nil); + end; + +end; + + +function PrepareToInstall(var NeedsRestart: Boolean): String; +var + html: array of string; + tor, link: string; + check: Boolean; + +begin + + // Extract the Tor Download Link from the Tor Website + // This serves as well to verify that an internet connection is present. + + TorDownloadLinkPage.SetText('Fetching Tor Download Webpage...', ''); + TorDownloadLinkPage.SetProgress(0, 1); + TorDownloadLinkPage.Show; + try + // Download the website + check := idpDownloadFile('{#tor}', ExpandConstant('{tmp}\tor.check')); + if check = False then begin + // if this failed, we cannot continue. + Result := 'Failed to fetch the Tor Download Webpage @ {#tor}' + #13#10 + + #13#10 +'Please verify that you''re connected to the Internet.'; + WizardForm.PreparingLabel.WordWrap := True; + Exit; + end; + + // Now extract the link + TorDownloadLinkPage.SetText('Extracting Download Link...', ''); + LoadStringsFromFile(ExpandConstant('{tmp}\tor.check'), html); + TorDownloadLinkPage.SetProgress(1, GetArrayLength(html)); + link := ExtractDownloadLink(html, TorDownloadLinkPage); + // This is a very (very very) simplistic check that we found it. + if Length(link) < 3 then begin + // if not: ... we've got a problem! + Result := 'Failed to extract the Tor Download Link from ' + tor + #13#10 + #13#10 + + 'Most probably the page layout has been altered recently.'#13#10 + + 'Please ckeck for an updated version of The Onion Pack or raise an issue at our GitHub page.'; + WizardForm.PreparingLabel.WordWrap := True; + // ToDo: Add link to github & a procedure: + // https://stackoverflow.com/questions/38934332/how-can-i-make-a-button-or-a-text-in-inno-setup-that-opens-web-page-when-clicked + Exit; + end else begin + // We have a link! Let's append it to the download queue: + idpAddFile('https://www.torproject.org' + link, ExpandConstant('{tmp}\tor.zip')); + + end; + finally + TorDownloadLinkPage.Hide; + end; +end; + + +procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); +begin + if CurUninstallStep = usUninstall then begin + end; +end; + + +// Used while installing the python packages +// https://stackoverflow.com/questions/34336466/inno-setup-how-to-manipulate-progress-bar-on-run-section +procedure SetMarqueeProgress(Marquee: Boolean); +begin + if Marquee then begin + WizardForm.ProgressGauge.Style := npbstMarquee; + end else begin + WizardForm.ProgressGauge.Style := npbstNormal; + end; +end; + + +// To be used for the lengthy status messages in the [Run] section +procedure SetupRunConfig(); +begin + SetMarqueeProgress(True); + + WizardForm.StatusLabel.WordWrap := True; + WizardForm.StatusLabel.AdjustHeight(); +end; + + +// Additional page to acknowledge Statement of Independence +// https://stackoverflow.com/questions/34592002/how-to-create-two-licensefile-pages-in-inno-setup +procedure CheckIndependenceAccepted(Sender: TObject); +begin + { Update Next button when user (un)accepts the license } + WizardForm.NextButton.Enabled := IndependenceAcceptedRadio.Checked; +end; + + +function CloneLicenseRadioButton(Source: TRadioButton): TRadioButton; +begin + Result := TRadioButton.Create(WizardForm); + Result.Parent := IndependencePage.Surface; + Result.Caption := Source.Caption; + Result.Left := Source.Left; + Result.Top := Source.Top; + Result.Width := Source.Width; + Result.Height := Source.Height; + Result.OnClick := @CheckIndependenceAccepted; +end; + +procedure CreateIndependencePage(); +var + IndependenceFileName: string; + IndependenceFilePath: string; + +begin + + IndependencePage := + CreateOutputMsgMemoPage( + wpLicense, 'Statement of Independence', SetupMessage(msgLicenseLabel), + 'Please read the following Statement of Independence. You must ' + + 'acknowledge this statement before continuing with the installation.', ''); + + // Shrink memo box to make space for radio buttons + IndependencePage.RichEditViewer.Height := WizardForm.LicenseMemo.Height; + + // Load SoI + // Loading ex-post, as Lines.LoadFromFile supports UTF-8, + // contrary to LoadStringFromFile. + IndependenceFileName := 'INDEPENDENCE'; + ExtractTemporaryFile(IndependenceFileName); + IndependenceFilePath := ExpandConstant('{tmp}\' + IndependenceFileName); + IndependencePage.RichEditViewer.Lines.LoadFromFile(IndependenceFilePath); + DeleteFile(IndependenceFilePath); + + // Clone accept/do not accept radio buttons for the second license + IndependenceAcceptedRadio := + CloneLicenseRadioButton(WizardForm.LicenseAcceptedRadio); + IndependenceNotAcceptedRadio := + CloneLicenseRadioButton(WizardForm.LicenseNotAcceptedRadio); + + // Customize captions + IndependenceAcceptedRadio.Caption := 'I acknowledge this statement.' + IndependenceNotAcceptedRadio.Caption := 'I do not acknowledge this statement.' + + // Initially not accepted + IndependenceNotAcceptedRadio.Checked := True; + +end; \ No newline at end of file diff --git a/setup.ini b/setup.ini new file mode 100644 index 0000000..28f2d57 --- /dev/null +++ b/setup.ini @@ -0,0 +1,13 @@ +[theonionpack] +title="The Onion Pack" +description="Tor Relay Bundle for Windows" +version=19.1.a1 +copyright="2019 - 2020 Ralph Wetzel" + +[python] +version=3.7.6 + +[tor] +download="https://www.torproject.org/download/tor/" + + From 9adf41fd9fcd9802db8bf24844229986d1459c30 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Mon, 30 Dec 2019 23:02:36 +0100 Subject: [PATCH 02/34] Action for Installer --- .github/workflows/installer.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/installer.yml diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml new file mode 100644 index 0000000..2e530ef --- /dev/null +++ b/.github/workflows/installer.yml @@ -0,0 +1,17 @@ +name: Create installer + +on: [release] + +jobs: + build: + + runs-on: windows + + steps: + - uses: actions/checkout@v1 + - name: Run a one-line script + run: echo Hello, world! + - name: Run a multi-line script + run: | + echo Add other actions to build, + echo test, and deploy your project. \ No newline at end of file From a0b62ca3cbaf63875a86a8165684e36add590472 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Mon, 30 Dec 2019 23:32:06 +0100 Subject: [PATCH 03/34] Update installer.yml --- .github/workflows/installer.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index 2e530ef..be17cd0 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -1,4 +1,4 @@ -name: Create installer +name: CreateInstaller on: [release] @@ -14,4 +14,4 @@ jobs: - name: Run a multi-line script run: | echo Add other actions to build, - echo test, and deploy your project. \ No newline at end of file + echo test, and deploy your project. From 7acfe517a3f470aba1ffd693238dd62b688b0de8 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Mon, 30 Dec 2019 23:35:55 +0100 Subject: [PATCH 04/34] Update installer.yml --- .github/workflows/installer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index be17cd0..eace4f0 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -5,7 +5,7 @@ on: [release] jobs: build: - runs-on: windows + runs-on: windows-latest steps: - uses: actions/checkout@v1 From 3b54e6ffac62d056c80c41e3713aa7c3d9b9012d Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Mon, 30 Dec 2019 23:42:03 +0100 Subject: [PATCH 05/34] Update installer.yml --- .github/workflows/installer.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index eace4f0..ed7c853 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -9,9 +9,5 @@ jobs: steps: - uses: actions/checkout@v1 - - name: Run a one-line script - run: echo Hello, world! - - name: Run a multi-line script - run: | - echo Add other actions to build, - echo test, and deploy your project. + - name: Run Inno Compiler + run: iscc "theonionpack/installer/theonionpack.iss" From 763b400b1b89258d5fd53250a8b96a7af2186129 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Mon, 30 Dec 2019 23:45:13 +0100 Subject: [PATCH 06/34] Update installer.yml --- .github/workflows/installer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index ed7c853..c66421f 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -10,4 +10,4 @@ jobs: steps: - uses: actions/checkout@v1 - name: Run Inno Compiler - run: iscc "theonionpack/installer/theonionpack.iss" + run: iscc "theonionpack\installer\theonionpack.iss" From ab29c80dba1621f21535821e4c64583546da068d Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Mon, 30 Dec 2019 23:49:10 +0100 Subject: [PATCH 07/34] Update installer.yml --- .github/workflows/installer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index c66421f..8692ebc 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -10,4 +10,4 @@ jobs: steps: - uses: actions/checkout@v1 - name: Run Inno Compiler - run: iscc "theonionpack\installer\theonionpack.iss" + run: iscc "installer\theonionpack.iss" From 15d399e6bb1e05b9c45caf5980e2468fc510489c Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Tue, 31 Dec 2019 00:03:08 +0100 Subject: [PATCH 08/34] Update installer.yml --- .github/workflows/installer.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index 8692ebc..120c697 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -1,4 +1,4 @@ -name: CreateInstaller +name: Create Installer for The Onion Pack on: [release] @@ -11,3 +11,10 @@ jobs: - uses: actions/checkout@v1 - name: Run Inno Compiler run: iscc "installer\theonionpack.iss" + + - name: Upload to release + uses: JasonEtco/upload-to-release@master + with: + args: TheOnionPackInstaller.exe application/vnd.microsoft.portable-executable + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 097e72c225f1f2bef15f5afe41f8a9f0a41c8547 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Tue, 31 Dec 2019 00:17:19 +0100 Subject: [PATCH 09/34] Update installer.yml --- .github/workflows/installer.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index 120c697..4532534 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -8,13 +8,18 @@ jobs: runs-on: windows-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@master - name: Run Inno Compiler run: iscc "installer\theonionpack.iss" - + - name: Upload to release - uses: JasonEtco/upload-to-release@master - with: - args: TheOnionPackInstaller.exe application/vnd.microsoft.portable-executable + id: upload-release-asset + uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: TheOnionPackInstaller.exe + asset_path: ./TheOnionPackInstaller.exe + asset_name: TheOnionPackInstaller.exe + asset_content_type: application/vnd.microsoft.portable-executable + From 2e856594765830748a9e5906806383bb2032d284 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Tue, 31 Dec 2019 00:19:15 +0100 Subject: [PATCH 10/34] Update installer.yml --- .github/workflows/installer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index 4532534..318afd2 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -19,7 +19,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: TheOnionPackInstaller.exe - asset_path: ./TheOnionPackInstaller.exe + asset_path: TheOnionPackInstaller.exe asset_name: TheOnionPackInstaller.exe asset_content_type: application/vnd.microsoft.portable-executable From 483d58cbe04e8e05c4fc2743a43a02d8d0ad4991 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Tue, 31 Dec 2019 00:22:04 +0100 Subject: [PATCH 11/34] Update installer.yml --- .github/workflows/installer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index 318afd2..92dd81d 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -18,7 +18,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: TheOnionPackInstaller.exe + upload_url: installer\Output\TheOnionPackInstaller.exe asset_path: TheOnionPackInstaller.exe asset_name: TheOnionPackInstaller.exe asset_content_type: application/vnd.microsoft.portable-executable From 907442b16a205397fee75074cd90c71956dcdc9f Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Tue, 31 Dec 2019 00:39:19 +0100 Subject: [PATCH 12/34] Update installer.yml --- .github/workflows/installer.yml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index 92dd81d..e9b7fc7 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -12,14 +12,11 @@ jobs: - name: Run Inno Compiler run: iscc "installer\theonionpack.iss" - - name: Upload to release - id: upload-release-asset - uses: actions/upload-release-asset@v1.0.1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Upload files to a GitHub release + uses: svenstaro/upload-release-action@1.0.1 with: - upload_url: installer\Output\TheOnionPackInstaller.exe - asset_path: TheOnionPackInstaller.exe + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: installer\Output\TheOnionPackInstaller.exe asset_name: TheOnionPackInstaller.exe - asset_content_type: application/vnd.microsoft.portable-executable - + tag: ${{ github.ref }} + overwrite: true From 5849f3c278a6a5b1e7c545e648cf0a0676a344a1 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Tue, 31 Dec 2019 00:51:46 +0100 Subject: [PATCH 13/34] Update installer.yml --- .github/workflows/installer.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index e9b7fc7..ccc0d88 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -1,7 +1,8 @@ name: Create Installer for The Onion Pack -on: [release] - +on: release: + types: [published] + jobs: build: From 347a72036661d4f7b13ed599a7dce1b43a66d3fc Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Tue, 31 Dec 2019 00:54:01 +0100 Subject: [PATCH 14/34] Update installer.yml --- .github/workflows/installer.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index ccc0d88..326cc4c 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -1,7 +1,8 @@ name: Create Installer for The Onion Pack -on: release: - types: [published] +on: + release: + types: [published] jobs: build: From bdf186d90f6a520c60781c2ec4ff22e292baaa96 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Mon, 6 Jan 2020 21:16:49 +0100 Subject: [PATCH 15/34] 20.1 - the initial release! --- .github/workflows/installer.yml | 1 + .gitignore | 3 + installer/theonionpack.iss | 54 +++- setup.ini | 13 - setup.py | 367 +++++++++++++++++++++++++++ theonionpack/__init__.py | 1 + theonionpack/__main__.py | 28 ++ theonionpack/icons/top16.ico | Bin 0 -> 1150 bytes theonionpack/setup.ini | 12 + theonionpack/theonionpack.py | 63 +++++ theonionpack/top/__init__.py | 0 theonionpack/top/box.py | 57 +++++ theonionpack/top/pack.py | 210 +++++++++++++++ theonionpack/top/simplecontroller.py | 87 +++++++ theonionpack/top/tor.py | 117 +++++++++ theonionpack/top/torhasher.py | 55 ++++ theonionpack/top/util.py | 41 +++ 17 files changed, 1091 insertions(+), 18 deletions(-) create mode 100644 .gitignore delete mode 100644 setup.ini create mode 100644 setup.py create mode 100644 theonionpack/__init__.py create mode 100644 theonionpack/__main__.py create mode 100644 theonionpack/icons/top16.ico create mode 100644 theonionpack/setup.ini create mode 100644 theonionpack/theonionpack.py create mode 100644 theonionpack/top/__init__.py create mode 100644 theonionpack/top/box.py create mode 100644 theonionpack/top/pack.py create mode 100644 theonionpack/top/simplecontroller.py create mode 100644 theonionpack/top/tor.py create mode 100644 theonionpack/top/torhasher.py create mode 100644 theonionpack/top/util.py diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index 326cc4c..87dd1f9 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -11,6 +11,7 @@ jobs: steps: - uses: actions/checkout@master + - name: Run Inno Compiler run: iscc "installer\theonionpack.iss" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e1be76b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/theonionpack.egg-info/ +/installer/Output +/dist \ No newline at end of file diff --git a/installer/theonionpack.iss b/installer/theonionpack.iss index c828821..6b0b559 100644 --- a/installer/theonionpack.iss +++ b/installer/theonionpack.iss @@ -2,7 +2,7 @@ ; The Python version to be used is configured via an INI file. ; This ensures that compatibility can be tested ... to avoid side effects. -#define INIFile RemoveBackslash(SourcePath) + "\..\setup.ini" +#define INIFile RemoveBackslash(SourcePath) + "\..\theonionpack\setup.ini" ; The license file #define LicenseFile RemoveBackslash(SourcePath) + "\..\LICENSE" @@ -46,11 +46,35 @@ Source: "{tmp}\Python\*"; DestDir: "{app}\Python"; Flags: external recursesubdir Source: "{tmp}\Tor\*"; DestDir: "{app}\Tor"; Flags: external recursesubdirs Source: "{tmp}\get-pip.py"; DestDir: "{app}\Python"; Flags: external deleteafterinstall Source: "{# IndependenceFile}"; DestName: "INDEPENDENCE"; Flags: dontcopy +; Source: "torrc-defaults"; Flags: dontcopy +; Source: "{tmp}\torrc-defaults"; DestDir: "{app}\Tor\Data\"; Flags: external; BeforeInstall: CreateTorrcDefaults +; local package of TheOnionBox +Source: "{src}\{param:tob}"; DestDir: "{app}\Python"; DestName: "{param:tob}"; Flags: external; Check: FileExists(ExpandConstant('{src}\{param:tob}')) +; local package of TheOnionPack +Source: "{src}\{param:top}"; DestDir: "{app}\Python"; DestName: "{param:top}"; Flags: external; Check: FileExists(ExpandConstant('{src}\{param:top}')) + +[Dirs] +Name: "{app}\Data"; Flags: uninsneveruninstall +Name: "{app}\Data\torrc"; Flags: uninsneveruninstall + +[Icons] +Name: "{app}\TheOnionPack"; Filename: "{app}\Python\Scripts\theonionpack.exe"; WorkingDir: "{app}"; Parameters: "--tor: ""{app}\Tor"""; Comment: "Launching The Onion Pack..." [Run] Filename: "{app}\Python\python.exe"; Parameters: "get-pip.py ""pip>18"" --no-warn-script-location"; Flags: runhidden; StatusMsg: "Preparing the Python runtime environment..."; BeforeInstall: SetupRunConfig; AfterInstall: SetMarqueeProgress(False) -Filename: "{app}\Python\python.exe"; Parameters: "-m pip install --no-warn-script-location --upgrade theonionbox"; Flags: runhidden; StatusMsg: "Now installing The Onion Box. This may take some time, as a number of additional packages most probably have to be collected from the Internet..."; BeforeInstall: SetupRunConfig; AfterInstall: SetMarqueeProgress(False) -Filename: "{app}\Python\Scripts\theonionbox.exe"; Flags: postinstall; Description: "Run The Onion Box..." +; We pip theonionbox as individual package - despite it's as well defined as dependency for theonionpack. +; This ensures that we can upgrade to the latest tob by simply re-running this (unmodified) installer. +; We can pip from a local package using /tob! +Filename: "{app}\Python\python.exe"; Parameters: "-m pip install --no-warn-script-location --upgrade ""{param:tob|theonionbox}"""; StatusMsg: "Now installing The Onion Pack. This may take some time, as a number of additional packages most probably have to be collected from the Internet..."; BeforeInstall: SetupRunConfig; AfterInstall: SetMarqueeProgress(False) +;The next line implements command line parameter /top (e.g. /top="theonionpack.tar.gz") to pip from a local package. +;Default value pips from PyPi. Using path relative to installer directory! +Filename: "{app}\Python\python.exe"; Parameters: "-m pip install --no-warn-script-location --upgrade ""{param:top|theonionpack}"""; StatusMsg: "Now installing The Onion Pack. This may take some time, as a number of additional packages most probably have to be collected from the Internet..."; BeforeInstall: SetupRunConfig; AfterInstall: SetMarqueeProgress(False) +Filename: "{app}\TheOnionPack.lnk"; WorkingDir: "{app}"; Flags: postinstall shellexec; Description: "Run The Onion Pack..."; Verb: "open" + +[InstallDelete] +; To remove local pip packages +Type: files; Name: "{app}\Python\{param:tob}"; Check: FileExists(ExpandConstant('{app}\Python\{param:tob}')) +Type: files; Name: "{app}\Python\{param:top}"; Check: FileExists(ExpandConstant('{app}\Python\{param:top}')) [UninstallRun] Filename: "{cmd}"; Parameters: """{cmd}"" /S /C """"{app}\Python\Scripts\pip.exe"" freeze > ""{app}\unins.req"""""; Flags: runhidden @@ -58,7 +82,7 @@ Filename: "{cmd}"; Parameters: """{cmd}"" /S /C """"{app}\Python\Scripts\pip.exe Filename: "{app}\Python\python.exe"; Parameters: "-m pip uninstall -y pip setuptools wheel"; Flags: runhidden [UninstallDelete] -Type: files; Name: "{app}\uninst.req" +Type: files; Name: "{app}\unins.req" Type: dirifempty; Name: "{app}\Python\Lib\site-packages" Type: dirifempty; Name: "{app}\Python\Lib" Type: dirifempty; Name: "{app}\Python\service" @@ -68,10 +92,10 @@ Type: dirifempty; Name: "{app}\Python\theonionbox\tob\system\windows" Type: dirifempty; Name: "{app}\Python\theonionbox\tob\system" Type: dirifempty; Name: "{app}\Python\theonionbox\tob" Type: dirifempty; Name: "{app}\Python\theonionbox" +Type: files; Name: "{app}\Tor\Data\torrc-defaults" [Code] - var // Custom page showing progress while extracting the Tor Download Link TorDownloadLinkPage: TOutputProgressWizardPage; @@ -387,4 +411,24 @@ begin // Initially not accepted IndependenceNotAcceptedRadio.Checked := True; +end; + +procedure CreateTorrcDefaults(); +var + torrcFileName: string; + lines: array of string; + i: integer; +begin + torrcFileName := 'torrc-defaults'; + ExtractTemporaryFile(torrcFileName); + LoadStringsFromFile(ExpandConstant('{tmp}\' + torrcFileName), lines); + for i := 0 to GetArrayLength(lines) - 1 do begin + lines[i] := ExpandConstant(lines[i]); + end; + SaveStringsToFile(ExpandConstant('{tmp}\' + torrcFileName), lines, false); +end; + +function CheckIfExists(const FileName: string): Boolean; +begin + Result:=FileExists(CurrentFileName); end; \ No newline at end of file diff --git a/setup.ini b/setup.ini deleted file mode 100644 index 28f2d57..0000000 --- a/setup.ini +++ /dev/null @@ -1,13 +0,0 @@ -[theonionpack] -title="The Onion Pack" -description="Tor Relay Bundle for Windows" -version=19.1.a1 -copyright="2019 - 2020 Ralph Wetzel" - -[python] -version=3.7.6 - -[tor] -download="https://www.torproject.org/download/tor/" - - diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..bb51a07 --- /dev/null +++ b/setup.py @@ -0,0 +1,367 @@ +from setuptools import setup +import os +import sys +import fnmatch +import setuptools.command.build_ext +import setuptools.command.sdist +import setuptools.command.install +# from theonionbox.stamp import __version__, __description__ + +import configparser + +config = configparser.ConfigParser() +config.read('theonionpack/setup.ini') +__version__ = config['theonionpack']['version'] +__description__ = config['theonionpack']['description'] + +from distutils.extension import Extension + +# Custom command to compile the latest README.html +# BTW: grip is quite cool! +def CompileREADME(): + + # https://stackoverflow.com/questions/3431825/generating-an-md5-checksum-of-a-file + def get_hash(filename): + + import hashlib + + def hash_bytestr_iter(bytesiter, hasher, ashexstr=False): + for block in bytesiter: + hasher.update(block) + return (hasher.hexdigest() if ashexstr else hasher.digest()) + + def file_as_blockiter(afile, blocksize=65536): + with afile: + block = afile.read(blocksize) + while len(block) > 0: + yield block + block = afile.read(blocksize) + + return hash_bytestr_iter(file_as_blockiter(open(filename, 'rb')), hashlib.sha256(), True) + + # tor.1.txt production + try: + from xtor import TorTxt + tt = TorTxt(force=False) + if tt.run() is True: + tt.copy(os.path.join('theonionbox','tor')) + except: + pass + + old_md_hash = '' + old_html_hash = '' + old_rst_hash = '' + + current_md_hash = 'doit' + current_html_hash = 'doit' + current_rst_hash = 'doit' + + try: + with open('readme/README.hash', 'r') as f: + lines = f.readlines() + if len(lines) == 3: + old_md_hash = lines[0].strip() + old_html_hash = lines[1].strip() + old_rst_hash = lines[2].strip() + except Exception as e: + # raise e + pass + + try: + current_md_hash = get_hash('README.md') + current_html_hash = get_hash('readme/README.html') + current_rst_hash = get_hash('readme/README.rst') + except Exception as e: + # raise e + pass + + hash_changed = False + + if (old_md_hash != current_md_hash) or (old_html_hash != current_html_hash): + from grip import export + export(path='README.md', out_filename='readme/README.html', title='The Onion Box v{}'.format(__version__)) + hash_changed = True + else: + print('Skiping generation of README.html; files unchanged!') + + do_rst = False + if do_rst is True: + if (old_md_hash != current_md_hash) or (old_rst_hash != current_rst_hash): + # path defined by: brew install pandoc + # os.environ.setdefault('PYPANDOC_PANDOC', '/usr/local/Cellar/pandoc/2.1') + from pypandoc import convert_file + print('Generating README.rst') + convert_file('README.md', 'rst', outputfile="readme/README.rst") + hash_changed = True + else: + print('Skiping generation of README.rst; files unchanged!') + else: + print('Generation of README.rst intentionally deactivated!') + + if hash_changed is True: + with open('readme/README.hash', 'w') as f: + f.write(current_md_hash+'\n'+current_html_hash+'\n'+current_rst_hash) + + +# class PostInstallCommand(setuptools.command.install.install): +# +# def run(self): +# import os +# # start with standard staff... +# setuptools.command.install.install.run(self) +# +# # post install activities +# # http://stackoverflow.com/a/1883251/1286571 +# import sys +# if hasattr(sys, 'real_prefix'): +# os.chmod('theonionbox/theonionbox/run.sh', int('755', 8)) +# else: +# print("No real_prefix") + + +# def CompileOSXTemp(): +# +# from subprocess import call +# from Cython.Build import cythonize +# from setuptools.extension import Extension +# +# osxtemp_path = 'support/osxtemp' +# libsmc_path = os.path.join(osxtemp_path, 'libsmc') +# +# libsmc_clean = ['make', +# '--directory={}'.format(libsmc_path), +# 'clean'] +# +# libsmc_cmd = ['make', +# '--directory={}'.format(libsmc_path), +# 'dynamic'] +# +# print("Compiling '{}'".format(libsmc_path)) +# # call(libsmc_clean) +# call(libsmc_cmd) +# +# pth = os.path.join(osxtemp_path, '*.pyx') +# osxt = cythonize(pth, force=True) +# +# print(osxt) +# pass +# pass + + +# Linking custom command into the sdist chain +# https://seasonofcode.com/posts/how-to-add-custom-build-steps-and-commands-to-setuppy.html +class sdist(setuptools.command.sdist.sdist): + + def run(self): + + # CompileOSXTemp() + # CompileREADME() + + # continue with standard staff... + setuptools.command.sdist.sdist.run(self) + + +def generate_package_data(package_data, package_dir=None): + """ + :param package_data: package_data as expected by setup.py, recursive dir wildcards + :type package_data: dict + :param package_dir: package_dir as expected by setup.py + :type package_dir: dict + :return: package_data as expected by setup.py, recursive directories expanded + :rtype: dict + """ + + out = {} + + package_dir = package_dir or {} + + for key, paths in package_data.items(): + out_path = [] + + base_path = package_dir[key] if key in package_dir else '' + + for path_item in paths: + root = os.path.join(base_path, path_item) + + if os.path.isfile(root): + out_path.append(path_item) + continue + + root_dir, root_file = os.path.split(root) + + for (dirpath, dirnames, filenames) in os.walk(root_dir): + out_path.append(os.path.relpath(os.path.join(dirpath, root_file), base_path)) + + out[key] = out_path + + return out + + +def generate_data_files(data_files): + """ + :param data_files: data_files as expected by setup.py, recursive dir wildcards + :type package_data: list + :return: data_files as expected by setup.py, recursive files expanded + :rtype: list + """ + + out = {} + + for target, sources in data_files: + + if target not in out: + out[target] = [] + + for source in sources: + + if os.path.isfile(source): + out[target].append(source) + continue + + source_dir, source_match = os.path.split(source) + + for (dirpath, dirnames, filenames) in os.walk(source_dir): + for file in filenames: + if fnmatch.fnmatch(file, source_match): + file_rel_target = os.path.relpath(dirpath, source_dir) + file_target = os.path.join(target, file_rel_target) + + if file_target not in out: + out[file_target] = [] + + out[file_target].append(os.path.join(dirpath, file)) + + retval = [] + for key, items in out.items(): + retval.append((key, items)) + + return retval + + +packages = [ + 'theonionpack', + 'theonionpack.top' +] + +package_dir = { + 'theonionpack': 'theonionpack', + 'theonionpack.top': 'theonionpack/top' +} + +package_data = { + # 'theonionbox': ['config/*', + # 'css/*', + # 'font/*', + # 'libs/*', + # 'pages/*', + # 'scripts/*', + # 'sections/*', + # 'tor/*', + # 'uptime/*', + # ] + 'theonionpack': ['icons/top16.ico' + , 'setup.ini' + ] +} + +data_files = [ + # ('docs', ['docs/*.*']), + # ('', ['readme/README.html']), + # ('config', ['theonionbox/config/*.*']), + # ('service', []), + # ('service/FreeBSD', ['FreeBSD/theonionbox.sh']), + # ('service/init.d', ['init.d/theonionbox.sh']), + # ('service/systemd', ['systemd/theonionbox.service']), + # ('support', []), + # ('support/osxtemp', []), + # ('support/osxtemp/libsmc', ['support/osxtemp/libsmc/LICENSE', 'support/osxtemp/libsmc/Makefile']), + # ('support/osxtemp/libsmc/include', ['support/osxtemp/libsmc/include/smc.h']), + # ('support/osxtemp/libsmc/src', ['support/osxtemp/libsmc/src/smc.c']), +] +# print(generate_data_files(data_files)) + +# import platform +# +# def extensions(system=platform.system()): +# +# run_cythonize = False +# try: +# from Cython.Build import cythonize +# run_cythonize = True +# except ImportError: +# pass +# +# ext = [] +# if system == 'Darwin' and True is False: # disabled 20180417 +# +# # 'osxtemp' +# path = 'support/osxtemp' +# +# sf = '*.pyx' if run_cythonize is True else '*.c' +# source_files = os.path.join(path, sf) +# +# # path to the libsmc library +# libsmc_path = os.path.join(path, 'libsmc') +# +# ext.append(Extension(name='theonionbox.tob.osxtemp', +# include_dirs=[path, libsmc_path], +# depends=[os.path.join(libsmc_path, 'include', 'smc.h')], +# sources=[source_files, +# os.path.join(libsmc_path, 'src', 'smc.c')] +# ) +# ) +# +# if run_cythonize is True: +# try: +# ext = cythonize(ext) +# except: +# ext = [] +# +# return ext + + +setup( + cmdclass={'sdist': sdist, + }, + name='theonionpack', + version=__version__, + # py_modules=['theonionbox.py'], + packages=packages, + package_dir=package_dir, + package_data=generate_package_data(package_data, package_dir), + data_files=generate_data_files(data_files), + url='https://github.com/ralphwetzel/theonionpack', + license='MIT', + author='Ralph Wetzel', + author_email='theonionbox@gmx.com', + description=__description__, + # long_description=open('docs/description.rst').read(), + entry_points={ + 'console_scripts': [ + 'theonionpack = theonionpack.__main__:main'] + }, + install_requires=[ + 'theonionbox==20.1a2', + 'pystray', + 'shelljob' + ], + long_description_content_type='text/x-rst; charset=UTF-8', + classifiers=[ + # https://pypi.python.org/pypi?%3Aaction=list_classifiers + 'Development Status :: 4 - Beta', + 'Environment :: Console', + 'Environment :: Web Environment', + 'Framework :: Bottle', + 'Intended Audience :: End Users/Desktop', + 'Intended Audience :: Information Technology', + 'License :: OSI Approved :: MIT License', + 'Natural Language :: English', + 'Operating System :: Microsoft :: Windows', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.7', + 'Topic :: System :: Networking :: Monitoring', + 'Topic :: Utilities', + ], + platforms=['Windows'], + # ext_modules=extensions(), +) diff --git a/theonionpack/__init__.py b/theonionpack/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/theonionpack/__init__.py @@ -0,0 +1 @@ + diff --git a/theonionpack/__main__.py b/theonionpack/__main__.py new file mode 100644 index 0000000..15213f2 --- /dev/null +++ b/theonionpack/__main__.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +import importlib +import pathlib +import site + + +def main(): + + # Per definition, __main__.__file__ is the only __file__, that could carry a relative path! + # => https://docs.python.org/3.4/whatsnew/3.4.html#other-language-changes + # So we resolve it here! + path = pathlib.Path(__file__).resolve() + + # If run as 'python -m xy', '.' is not part of sys.path. + # __package__ as well is either '' or None. + # Therefore any import from our package fails. + # Solution: Add the path of __main__.py (this file) to sys.path + if __name__ == '__main__' and __package__ in ['', None]: + site.addsitedir(str(path.parent)) + from theonionpack import main as packmain + else: + from .theonionpack import main as packmain + + packmain() + + +if __name__ == '__main__': + main() diff --git a/theonionpack/icons/top16.ico b/theonionpack/icons/top16.ico new file mode 100644 index 0000000000000000000000000000000000000000..373c71e10bbb8dd6bbcf10bf5c2f30cc717fd6d6 GIT binary patch literal 1150 zcmbu9!A-+J5Je||6vP4L#2G1<&_YgJeV_ptEp-{*=*J-F&X0Pc6^u z`o^E|9p0AM(OBKQbwZzU!adr@+B>*__IET^H*Z~{>vz6}_R}*jcRMe!y7|5bsfD`z z+Oc?>GVb(}Zw&|Lm-HWce(zBXz5h$!zu(cI@6Wpx_^ZwuOpn4|)z-OxqPY*xlJ~*% e57f<1_pXQy!4lT6j}gLE?f*v)2=z6-al|jur9lP& literal 0 HcmV?d00001 diff --git a/theonionpack/setup.ini b/theonionpack/setup.ini new file mode 100644 index 0000000..702a708 --- /dev/null +++ b/theonionpack/setup.ini @@ -0,0 +1,12 @@ +[theonionpack] +title=The Onion Pack +description=Tor Relay Bundle for Windows +version=20.1 +copyright=2019 - 2020 Ralph Wetzel + +[python] +version=3.7.6 + +[tor] +download=https://www.torproject.org/download/tor/ + diff --git a/theonionpack/theonionpack.py b/theonionpack/theonionpack.py new file mode 100644 index 0000000..deed771 --- /dev/null +++ b/theonionpack/theonionpack.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +import click +import pathlib +import site + +# theonionpack.py -d/-t --tor --data + +import configparser + +cwd = pathlib.Path(__file__).resolve() +cwd = cwd.parent +assert cwd.exists() + +config = configparser.ConfigParser() +config.read(str(cwd / 'setup.ini')) +__title__ = config['theonionpack']['title'] +__version__ = config['theonionpack']['version'] +__description__ = config['theonionpack']['description'] + + +# @click.group(chain=True, invoke_without_command=True) +@click.command() +@click.option('--debug', is_flag=True, flag_value=True, + help='Switch on DEBUG mode.') +@click.option('--trace', is_flag=True, flag_value=True, + help='Switch on TRACE mode (which is more verbose than DEBUG mode).') +@click.option('-t', '--tor', default='.\Tor', show_default=True, + type=click.Path(exists=True, file_okay=False, dir_okay=True, readable=True, + resolve_path=True, allow_dash=False), + help="Search directory for 'tor.exe'.") +@click.option('-d', '--data', default='.\Data', show_default=True, + type=click.Path(exists=True, file_okay=False, dir_okay=True, readable=True, + resolve_path=True, allow_dash=False), + help="Tor's DataDirectory.") +@click.version_option(prog_name=f'{__title__}: {__description__}', + version=__version__, message='%(prog)s\nVersion %(version)s') + +@click.pass_context +def main(ctx, debug, trace, tor, data): + + params = { + 'debug': debug, + 'trace': trace, + 'tor': tor, + 'data': data, + 'cwd': str(cwd) + } + + if __name__ == '__main__' or __package__ in [None, '']: + site.addsitedir(str(cwd)) + from top.pack import Pack + else: + from .top.pack import Pack + + top = Pack(params) + top.run() + + +if __name__ == '__main__': + main() + + +__all__ = ['main'] diff --git a/theonionpack/top/__init__.py b/theonionpack/top/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/theonionpack/top/box.py b/theonionpack/top/box.py new file mode 100644 index 0000000..89c19c5 --- /dev/null +++ b/theonionpack/top/box.py @@ -0,0 +1,57 @@ +import importlib +import os +import pathlib +import signal +import sys +import subprocess + +from .util import MBox + + +class TheOnionBox(): + + def __init__(self, config): + + self.config = config + + tob = importlib.util.find_spec('theonionbox') + if tob is None: + MBox("Error: Failed to locate Python package 'theonionbox'.", style=0x10) + sys.exit(0) + + self.name = tob.name + + self.tob = None + self.password = None + + def run(self, password: str = None): + + params = [sys.executable, '-m', self.name] + + if self.config['trace']: + params.extend(['--trace']) + elif self.config['debug']: + params.extend(['--debug']) + + params.extend(['box', '--host', '127.0.0.1']) + if password is not None: + params.extend(['tor', '--password', password]) + self.password = password + + if self.config['trace'] or self.config['debug']: + self.tob = subprocess.Popen(params, creationflags=subprocess.CREATE_NEW_CONSOLE) + else: + self.tob = subprocess.Popen(params) + + return self.tob + + def stop(self): + # if the subprocess is still running... + if self.poll() is None: + # ... terminate it. + pid = self.tob.pid + os.kill(pid, signal.SIGINT) + self.tob.wait() + + def poll(self): + return self.tob.poll() \ No newline at end of file diff --git a/theonionpack/top/pack.py b/theonionpack/top/pack.py new file mode 100644 index 0000000..2946b79 --- /dev/null +++ b/theonionpack/top/pack.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python +import os +import pathlib +import subprocess +import sys +import tempfile +from time import sleep +import threading +import webbrowser +import winreg + +from filelock import FileLock, Timeout +from PIL import Image +import pystray + +from . import tor +from . import box +from .simplecontroller import SimplePort +from .util import MBox + + +class Pack(): + + def __init__(self, config): + self.config = config + + self.cwd = pathlib.WindowsPath(self.config['cwd']) + + self.status = 0 + + # Prepare Tor + self.password = 'test' + self.relay = tor.Tor(self.config['tor'], self.config['data']) + + # torrc + torrc = pathlib.Path(config['data']) / 'torrc/torrc' + self.torrc = torrc.resolve() + + # The Onion Box + self.box = box.TheOnionBox(config) + + # Stop signal, to terminate our run_loop + self.stop = threading.Event() + + # the Tray icon + self.tray = pystray.Icon('theonionpack', title='The Onion Pack') + + self.tray.icon = Image.open(str(self.cwd / 'icons' / 'top16.ico')) + + self.tray.menu = pystray.Menu( + pystray.MenuItem( + 'Monitor...', + action=self.on_monitor, + default=True + ), + pystray.Menu.SEPARATOR, + pystray.MenuItem( + 'Relay Control', + pystray.Menu( + pystray.MenuItem( + 'Edit configuration file...', + action=self.on_open_torrc + ), + pystray.MenuItem( + 'Show logfile...', + action=self.on_show_messages + ), + pystray.Menu.SEPARATOR, + pystray.MenuItem( + 'Reload relay configuration', + action=self.on_reload_config + ) + ) + ), + pystray.Menu.SEPARATOR, + pystray.MenuItem( + 'Stop!', + action=self.on_quit + ) + ) + + def run(self): + + self.lock = FileLock(str(self.cwd / 'theonionpack.lock')) + running = False + + try: + with self.lock.acquire(timeout=0): + + # run The Onion Box + tob = self.box.run(password=self.password) + + # run Tor + self.relay.run(password=self.password) + + running = True + + # run the Tray icon + # !! This is a blocking call !! + self.tray.run(self.run_loop) + + # the block may be released by self.on_quit, issued by an operator via the Tray + # ... or by a system command (like SIGTERM). + + except Timeout: + MBox("It seems like another instance of The Onion Pack is already running. Aborting launch procedure...", + style=0x10) + + finally: + self.lock.release() + + if running: + + # Stop theonionbox + self.box.stop() + + # Tor has OwningControllerProcess defined ... thus will terminate as soon as we're done. + + if self.status == 1: + MBox("Our instance of TheOnionBox terminated.\r\nThus we have to terminate as well! Sorry...", + style=0x10) + + sys.exit(0) + + def run_loop(self, icon: pystray.Icon): + + icon.visible = True + + while self.stop.is_set() is False: + + # quit if TheOnionBox died! + if self.box.poll() is not None: + + # indicate that the Box terminated! + self.status += 1 + self.do_quit() + return + + self.relay.collect_messages() + sleep(1) + + # Tray menu actions + def on_monitor(self, icon, item): + webbrowser.open_new_tab('http://127.0.0.1:8080/') + + def on_quit(self, icon, item): + self.do_quit() + + def do_quit(self): + + # Stop the run_loop + self.stop.set() + + # Stop the Tray + self.tray.stop() + + # cleanup is being performed in self.run() + + def get_tor_messages(self): + while True: + self.relay.collect_messages() + sleep(5) + + def on_show_messages(self, icon, item): + fd, name = tempfile.mkstemp(prefix="Tor_", suffix='.html', text=True) + with open(fd, 'w') as tmp: + tmp.write('
'.join(self.relay.messages)) + webbrowser.open_new_tab(name) + + def on_open_torrc(self): + + def get_default_windows_app(suffix): + + class_root = winreg.QueryValue(winreg.HKEY_CLASSES_ROOT, suffix) + with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, r'{}\shell\open\command'.format(class_root)) as key: + command = winreg.QueryValueEx(key, '')[0] + return command.split(' ')[0] + + path = get_default_windows_app('.txt') + subprocess.Popen([os.path.expandvars(path), str(self.torrc)]) + + def on_reload_config(self): + + controller = None + try: + controller = SimplePort('127.0.0.1', 9051) + except Exception: + MBox('Failed to connect to the local Tor relay.', style=0x10) + + if controller is None: + return + + ok = '' + try: + ok = controller.msg(f'AUTHENTICATE "{self.password}"') + except: + if ok != '250 OK': + MBox('Failed to authenticate against local Tor relay.', style=0x10) + controller.shutdown() + return + + ok = '' + try: + ok = controller.msg("SIGNAL RELOAD") + except: + if ok != '250 OK': + MBox('Failed to reload the Tor relay configuration.', style=0x10) + + controller.shutdown() + return diff --git a/theonionpack/top/simplecontroller.py b/theonionpack/top/simplecontroller.py new file mode 100644 index 0000000..f13aa9c --- /dev/null +++ b/theonionpack/top/simplecontroller.py @@ -0,0 +1,87 @@ +import threading +# from socks import socksocket +from socket import socket, AF_INET, SOCK_STREAM + +# "Thanks" to stem! +try: + # Added in 3.x + import queue +except ImportError: + import Queue as queue + + +class SimpleController(object): + + _socket = None + + def __init__(self): + + assert (self._socket is not None), 'SimpleController is not initialized!' + + self.msg_queue = queue.Queue() + self._is_alive = True + self._msg_lock = threading.RLock() + + self._reader_thread = threading.Thread(target=self._reader, name='TOB') + self._reader_thread.setDaemon(True) + self._reader_thread.start() + + def _reader(self): + while self._is_alive: + try: + control_message = self._socket.recv(4096) + self.msg_queue.put(control_message) + except Exception as exc: + pass + + def shutdown(self): + self._socket.close() + self._is_alive = False + + def msg(self, message): + + message += '\r\n' + + with self._msg_lock: + + while not self.msg_queue.empty(): + try: + response = self.msg_queue.get_nowait() + except queue.Empty: + break + + try: + self._socket.send(str.encode(message)) + response = self.msg_queue.get() + return response.decode('UTF-8') + + except Exception: + self.shutdown() + raise + + +class SimplePort(SimpleController): + + def __init__(self, host, port): + self._socket = socket(AF_INET, SOCK_STREAM) + self._socket.settimeout(2) + + # This could raise an exception ... + # ... which is intended! + self._socket.connect((host, port)) + + super(SimplePort, self).__init__() + + +class SimpleSocket(SimpleController): + + def __init__(self, socket_path): + from socket import AF_UNIX + self._socket = socket(AF_UNIX, SOCK_STREAM) + self._socket.settimeout(2) + + # This could raise an exception ... + # ... which is intended! + self._socket.connect(socket_path) + + super(SimpleSocket, self).__init__() \ No newline at end of file diff --git a/theonionpack/top/tor.py b/theonionpack/top/tor.py new file mode 100644 index 0000000..2b22b2e --- /dev/null +++ b/theonionpack/top/tor.py @@ -0,0 +1,117 @@ +import collections +import os +import pathlib +import subprocess +import threading +import typing +import uuid + +from shelljob import proc + +from .torhasher import hash_password + +class Tor(): + + def __init__(self, tor: str = '.\Tor', data: str = '.\Data'): + + def find(filename: str, start_at: str = '.') -> typing.Optional[str]: + found = None + p = pathlib.Path(start_at).resolve() + for root, dirs, files in os.walk(str(p)): + if filename in files: + found = os.path.join(root, filename) + break + + return found + + self.process = None + self.owner = None + + self.path = find('tor.exe', tor) + + if self.path is None: + raise FileNotFoundError("Could not find tor.exe.") + + self.geoIP = find('geoip', tor) + self.geoIP6 = find('geoip6', tor) + # self.torrc_defaults = find('torrc-defaults', tor) + self.data = data + + self._messages = collections.deque(maxlen=400) + self.lock = threading.RLock() + + def run(self, owner_pid: int = os.getpid(), password: str = None, additional_command_line: typing.List[str] = None): + + if self.process is not None: + raise OSError('Already running...') + + if self.path is None: + return False + + # pwd = uuid.uuid4().hex + self.password = hash_password(password) if password is not None else None + # print(self.password) + # check = subprocess.run([str(self.path), '--hash-password', pwd], stdout=subprocess.PIPE) + # print(check.stdout.decode('utf-8')) + # print(check.stdout) + + # return + + self.owner = owner_pid + params = [str(self.path)] + + if self.owner > 0: + params.extend(['__OwningControllerProcess', str(owner_pid)]) + + if self.geoIP: + params.extend(['GeoIPFile', self.geoIP]) + if self.geoIP6: + params.extend(['GeoIPv6File', self.geoIP6]) + + params.extend(['+__ControlPort', '9051']) + + if self.password is not None: + params.extend(['__HashedControlSessionPassword', self.password]) + + params.extend(['DataDirectory', self.data]) + + params.extend(['-f', str((pathlib.Path(self.data) / 'torrc/torrc').resolve())]) + params.extend(['--defaults-torrc', str((pathlib.Path(self.data) / 'torrc/torrc-defaults').resolve())]) + params.extend(['--ignore-missing-torrc']) + + # params = [str(self.path)] + + # params.extend(['--hash-password', 'test']) + + # params.extend(['| more']) + + # print(subprocess.list2cmdline(params)) + # self.process = subprocess.Popen(params, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + if additional_command_line is not None: + params.extend(additional_command_line) + + # self.process = subprocess.Popen(params, stderr=subprocess.PIPE) + # print(self.process) + + self.process = proc.Group() + self.process.run(params) + + return self.process + + def collect_messages(self): + if self.process.is_pending(): + self.lock.acquire() + lines = self.process.readlines(timeout=0.25) + for proc, line in lines: + l = line.decode('utf-8').rstrip('\r\n') + if len(l) > 0: + self._messages.append(l) + self.lock.release() + + @property + def messages(self): + self.lock.acquire() + retval = list(self._messages) + self.lock.release() + return retval diff --git a/theonionpack/top/torhasher.py b/theonionpack/top/torhasher.py new file mode 100644 index 0000000..55025c2 --- /dev/null +++ b/theonionpack/top/torhasher.py @@ -0,0 +1,55 @@ +# Based on +# https://gist.github.com/jamesacampbell/2f170fc17a328a638322078f42e04cbc +# 20191225 RDW: adapted to work with Python3 str-type Strings + +import os +import hashlib + + +def hash_password(password: str) -> str: + + # supply password + secret = password.encode('utf-8') + + # static 'count' value later referenced as "c" + indicator = bytes(chr(96), 'ascii') + + # generate salt and append indicator value so that it + salt = os.urandom(8) + salt += indicator + + # That's just the way it is. It's always prefixed with 16 + prefix = '16:' + + # swap variables just so I can make it look exactly like the RFC example + c = salt[8] + + # generate an even number that can be divided in subsequent sections. (Thanks Roman) + EXPBIAS = 6 + count = (16 + (c & 15)) << ((c >> 4) + EXPBIAS) + + d = hashlib.sha1() + + # take the salt and append the password + tmp = salt[:8] + secret + + # hash the salty password as many times as the length of + # the password divides into the count value + slen = len(tmp) + while count: + if count > slen: + d.update(tmp) + count -= slen + else: + d.update(tmp[:count]) + count = 0 + hashed = d.digest() + + # Convert to hex + salt = bytes.hex(salt[:8]).upper() + indicator = bytes.hex(indicator).upper() + torhash = bytes.hex(hashed).upper() + + # Put it all together into the proprietary Tor format. + retval = f'{prefix}{salt}{indicator}{torhash}' + return retval diff --git a/theonionpack/top/util.py b/theonionpack/top/util.py new file mode 100644 index 0000000..3113dfc --- /dev/null +++ b/theonionpack/top/util.py @@ -0,0 +1,41 @@ +import ctypes # An included library with Python install. +import os +import pathlib +import typing +import sys + +## Styles: +## 0 : OK +## 1 : OK | Cancel +## 2 : Abort | Retry | Ignore +## 3 : Yes | No | Cancel +## 4 : Yes | No +## 5 : Retry | No +## 6 : Cancel | Try Again | Continue +# MB_HELP = 0x4000 +# ICON_EXLAIM=0x30 +# ICON_INFO = 0x40 +# ICON_STOP = 0x10 + + +def MBox(text: str, title: str = 'The Onion Pack', style: int = 0): + return ctypes.windll.user32.MessageBoxW(0, text, title, style) + + +def find_file(filename: str, start_at: str = '.') -> typing.Optional[str]: + + def raiser(err): + raise err + + found = None + # print(start_at) + # p = pathlib.WindowsPath(start_at).resolve() + for root, dirs, files in os.walk(start_at, onerror=raiser): + if filename in files: + found = os.path.join(root, filename) + break + + + + + return found From 0aa9b41caaab6a9cfb0b878c7849a537b7673dcf Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Tue, 7 Jan 2020 22:01:15 +0100 Subject: [PATCH 16/34] Major refinement of the installer script - mostly to improve error handling. --- installer/theonionpack.iss | 307 ++++++++++++++++++++++++++++++------- 1 file changed, 253 insertions(+), 54 deletions(-) diff --git a/installer/theonionpack.iss b/installer/theonionpack.iss index 6b0b559..ac84159 100644 --- a/installer/theonionpack.iss +++ b/installer/theonionpack.iss @@ -1,5 +1,30 @@ #include <.\IDP_1.5.1\idp.iss> +; The Onion Pack +; Definition file for the Inno Setup compiler. +; Copyright 2019 - 2020 Ralph Wetzel +; License MIT +; https://www.github.com/ralphwetzel/theonionpack + +; ===== +; Supported COMPILER command line parameter: +; "/Dtheonionpack=": To include a locally (at installer compilation time) +; provided package of theonionpack into the installer. + +; ===== +; Supported INSTALLER command line parameters: +; /tob="theonionbox-xx.x.tag.gz": To install from a locally (at setup time) provided packache of The Onion Box +; (rather then pip'ing this from online). +; /top="theonionpack-xx.x.tag.gz": To install a locally (at setup time) provided packache of The Onion Pack +; (rather then using the one from this installer or pip'ing it from online). + +; All default INSTALLER commandline options are supported as well. +; In case of trouble - to enable logging - use: +; /LOG Create a log file in the user's TEMP directory +; /LOG="filename" Create a log file at the specified path. +; For further reference: http://www.jrsoftware.org/ishelp/index.php?topic=setupcmdline + +; ===== ; The Python version to be used is configured via an INI file. ; This ensures that compatibility can be tested ... to avoid side effects. #define INIFile RemoveBackslash(SourcePath) + "\..\theonionpack\setup.ini" @@ -40,59 +65,165 @@ LicenseFile={# LicenseFile} WizardImageFile=compiler:WizModernImage-IS.bmp WizardSmallImageFile=compiler:WizModernSmallImage-IS.bmp OutputBaseFilename=TheOnionPackInstaller +DefaultGroupName=The Onion Pack [Files] +; The statement of Independence; only used by the installer. +Source: "{# IndependenceFile}"; DestName: "INDEPENDENCE"; Flags: dontcopy +; +; Those file were downloaded & unziped into the {tmp} directory. +; Will be copied to {app} now. Inno keeps record of these files for later uninstall. Source: "{tmp}\Python\*"; DestDir: "{app}\Python"; Flags: external recursesubdirs Source: "{tmp}\Tor\*"; DestDir: "{app}\Tor"; Flags: external recursesubdirs Source: "{tmp}\get-pip.py"; DestDir: "{app}\Python"; Flags: external deleteafterinstall -Source: "{# IndependenceFile}"; DestName: "INDEPENDENCE"; Flags: dontcopy -; Source: "torrc-defaults"; Flags: dontcopy -; Source: "{tmp}\torrc-defaults"; DestDir: "{app}\Tor\Data\"; Flags: external; BeforeInstall: CreateTorrcDefaults -; local package of TheOnionBox -Source: "{src}\{param:tob}"; DestDir: "{app}\Python"; DestName: "{param:tob}"; Flags: external; Check: FileExists(ExpandConstant('{src}\{param:tob}')) -; local package of TheOnionPack -Source: "{src}\{param:top}"; DestDir: "{app}\Python"; DestName: "{param:top}"; Flags: external; Check: FileExists(ExpandConstant('{src}\{param:top}')) +; +; The next line supports a CommandLine parameter for the Inno Setup COMPILER! +; This can be invoked by "/Dtheonionpack=" +; If defined, this package will become part of the installer. +; If not, we'll pip the package - either local or from PyPI +#ifdef theonionpack + #if FileExists(theonionpack) + #pragma message "TheOnionPack package @ " + theonionpack + " will be included in this installer." + Source: "{# theonionpack}"; DestDir: "{app}\Python"; DestName: "{# ExtractFileName(theonionpack)}" + #else + #pragma error "FileNotFound: TheOnionPack package @ " + theonionpack + "!" + #undef theonionpack + #endif +#endif +; +; local package of TheOnionBox: CommandLine parameter to the INSTALLER +; As the Inno compiler is changing the CurrentWorkingDirectory (due to whatever reason) while processing, +; GetAbsSourcePath was added to work with the absolute path of a file - if the input is relative or absolute. +; CheckIfExists as well calls GetAbsSourcePath to verify file existance. +Source: "{code:GetAbsSourcePath|{param:tob}}"; \ + DestDir: "{app}\Python"; \ + DestName: "{code:ExtractFN|{param:tob}}"; \ + Flags: external; \ + Check: CheckIfExists(ExpandConstant('{param:tob}')); + +; local package of TheOnionPack: CommandLine parameter to the INSTALLER +Source: "{code:GetAbsSourcePath|{param:tob}}"; \ + DestDir: "{app}\Python"; \ + DestName: "{code:ExtractFN|{param:top}}"; \ + Flags: external; \ + Check: CheckIfExists(ExpandConstant('{param:top}')); [Dirs] +; Those two directories hold the data of the Tor relay (e.g. fingerprints). +; We'll never touch them! Name: "{app}\Data"; Flags: uninsneveruninstall Name: "{app}\Data\torrc"; Flags: uninsneveruninstall [Icons] -Name: "{app}\TheOnionPack"; Filename: "{app}\Python\Scripts\theonionpack.exe"; WorkingDir: "{app}"; Parameters: "--tor: ""{app}\Tor"""; Comment: "Launching The Onion Pack..." +; This link gets the path to the Tor as a command line parameter.0 +Name: "{app}\TheOnionPack"; \ + Filename: "{app}\Python\Scripts\theonionpack.exe"; \ + WorkingDir: "{app}"; \ + Parameters: "--tor ""{app}\Tor"""; \ + Comment: "Launching The Onion Pack..." + +[CustomMessages] +MSG_INSTALLING_TOP=Now installing The Onion Pack. This may take some time, as a number of additional packages most probably have to be collected from the Internet... +MSG_FAILED_PIP=Unfortunately we were not able to orderly setup the Python environment. +MSG_FAILED_TOB=We failed to install the necessary packages for The Onion Pack into our Python environment. +MSG_FAILED_TOP=We failed to add The Onion Pack to the Python environment. +MSG_FAILED_FINISHED=Setup failed to install The Onion Pack on your computer. You may run the uninstaller to remove now the obsolete remainders of this procedure. Sorry for this inconvenience! [Run] -Filename: "{app}\Python\python.exe"; Parameters: "get-pip.py ""pip>18"" --no-warn-script-location"; Flags: runhidden; StatusMsg: "Preparing the Python runtime environment..."; BeforeInstall: SetupRunConfig; AfterInstall: SetMarqueeProgress(False) +; Those runners check - parameter AfterInstall - if a dedicated file (that was part of the current step of installation) exists. +; If not, ConfirmInstallation raises a MsgBox and sets the error flag - to abort installation. +; From step two on, ConfirmNoInstallError (parameter Check) confirms that the error flag is down. If raised, this step is skipped. + +; We start by getting pip. +Filename: "{app}\Python\python.exe"; \ + Parameters: "get-pip.py ""pip>18"" --no-warn-script-location"; \ + Flags: runhidden; \ + StatusMsg: "Preparing the Python runtime environment..."; \ + BeforeInstall: SetupRunConfig; \ + AfterInstall: ConfirmInstallation('pip.exe', ExpandConstant('{cm:MSG_FAILED_PIP}')) +; ; We pip theonionbox as individual package - despite it's as well defined as dependency for theonionpack. ; This ensures that we can upgrade to the latest tob by simply re-running this (unmodified) installer. ; We can pip from a local package using /tob! -Filename: "{app}\Python\python.exe"; Parameters: "-m pip install --no-warn-script-location --upgrade ""{param:tob|theonionbox}"""; StatusMsg: "Now installing The Onion Pack. This may take some time, as a number of additional packages most probably have to be collected from the Internet..."; BeforeInstall: SetupRunConfig; AfterInstall: SetMarqueeProgress(False) +Filename: "{app}\Python\python.exe"; \ + Parameters: "{code:create_pip_command|{param:tob|theonionbox}}"; \ + Flags: runhidden; \ + StatusMsg: {cm:MSG_INSTALLING_TOP}; \ + Check: ConfirmNoInstallError; \ + BeforeInstall: SetupRunConfig; \ + AfterInstall: ConfirmInstallation('theonionbox.exe', ExpandConstant('{cm:MSG_FAILED_TOB}')) +; ;The next line implements command line parameter /top (e.g. /top="theonionpack.tar.gz") to pip from a local package. -;Default value pips from PyPi. Using path relative to installer directory! -Filename: "{app}\Python\python.exe"; Parameters: "-m pip install --no-warn-script-location --upgrade ""{param:top|theonionpack}"""; StatusMsg: "Now installing The Onion Pack. This may take some time, as a number of additional packages most probably have to be collected from the Internet..."; BeforeInstall: SetupRunConfig; AfterInstall: SetMarqueeProgress(False) -Filename: "{app}\TheOnionPack.lnk"; WorkingDir: "{app}"; Flags: postinstall shellexec; Description: "Run The Onion Pack..."; Verb: "open" +;There are 2 scenarios - depending on the COMPILER command line parameter 'theonionpack' +; #1) This installer carries a (default) package - thus #ifdef theonionpack: +; In this case, the local package will be installed, if it exists. If not, we'll install the default package. +; #2) This installer carries NO (default) package (#ifndef theonionpack): +; Then we'll pip the local package, if it exists. If not, we'll try to pip from PyPI. +#ifdef theonionpack + Filename: "{app}\Python\python.exe"; \ + Parameters: "{code:create_pip_command|{param:top|{#theonionpack}}}"; \ + Flags: runhidden; \ + StatusMsg: {cm:MSG_INSTALLING_TOP}; \ + Check: ConfirmNoInstallError; \ + BeforeInstall: SetupRunConfig; \ + AfterInstall: ConfirmInstallation('theonionbox.exe', ExpandConstant('{cm:MSG_FAILED_TOP}')) +#else + Filename: "{app}\Python\python.exe"; \ + Parameters: "{code:create_pip_command|{param:top|theonionpack}}"; \ + Flags: runhidden; \ + StatusMsg: {cm:MSG_INSTALLING_TOP}; \ + Check: ConfirmNoInstallError; \ + BeforeInstall: SetupRunConfig; \ + AfterInstall: ConfirmInstallation('theonionpack.exe', ExpandConstant('{cm:MSG_FAILED_TOP}')) +#endif + +; We offer 'Run The Onion Pack...' if there was no install error. +Filename: "{app}\TheOnionPack.lnk"; \ + WorkingDir: "{app}"; \ + Flags: postinstall shellexec; \ + Description: "Run The Onion Pack..."; \ + Verb: "open"; \ + Check: ConfirmNoInstallError; + +; Alternatively, we propose 'Run Uninstaller...' if an error occured! +Filename: "{uninstallexe}"; \ + Flags: postinstall shellexec; \ + Description: "Run Uninstaller..."; \ + Verb: "open"; \ + Check: IfInstallationError; + [InstallDelete] +#ifdef theonionpack + ; Type: files; Name: "{app}\Python\{# ExtractFileName(theonionpack)}" +#endif + ; To remove local pip packages -Type: files; Name: "{app}\Python\{param:tob}"; Check: FileExists(ExpandConstant('{app}\Python\{param:tob}')) -Type: files; Name: "{app}\Python\{param:top}"; Check: FileExists(ExpandConstant('{app}\Python\{param:top}')) +; Type: files; Name: "{app}\Python\{code:ExtractFileName|{param:tob}}"; Check: FileExists(ExpandConstant('{app}\Python\{code:ExtractFileName|{param:tob}}')) +; Type: files; Name: "{app}\Python\{code:ExtractFileName|{param:top}}"; Check: FileExists(ExpandConstant('{app}\Python\{code:ExtractFileName|{param:top}}')) [UninstallRun] +; To uninstall, we freeze the Python environment and write the names of the currently installed packages +; into a dedicated file (unins.req). Filename: "{cmd}"; Parameters: """{cmd}"" /S /C """"{app}\Python\Scripts\pip.exe"" freeze > ""{app}\unins.req"""""; Flags: runhidden +; This done, we ask pip to remove all those packages. Filename: "{cmd}"; Parameters: """{cmd}"" /S /C """"{app}\Python\Scripts\pip.exe"" uninstall -y -r ""{app}\unins.req"""""; Flags: runhidden +; Finally pip may remove itself & it's friends. Filename: "{app}\Python\python.exe"; Parameters: "-m pip uninstall -y pip setuptools wheel"; Flags: runhidden [UninstallDelete] +; Housekeeping... Type: files; Name: "{app}\unins.req" Type: dirifempty; Name: "{app}\Python\Lib\site-packages" Type: dirifempty; Name: "{app}\Python\Lib" Type: dirifempty; Name: "{app}\Python\service" -Type: dirifempty; Name: "{app}\Python\support\osxtemp" -Type: dirifempty; Name: "{app}\Python\support" -Type: dirifempty; Name: "{app}\Python\theonionbox\tob\system\windows" -Type: dirifempty; Name: "{app}\Python\theonionbox\tob\system" -Type: dirifempty; Name: "{app}\Python\theonionbox\tob" -Type: dirifempty; Name: "{app}\Python\theonionbox" -Type: files; Name: "{app}\Tor\Data\torrc-defaults" +; Type: dirifempty; Name: "{app}\Python\support\osxtemp" +; Type: dirifempty; Name: "{app}\Python\support" +; Type: dirifempty; Name: "{app}\Python\theonionbox\tob\system\windows" +; Type: dirifempty; Name: "{app}\Python\theonionbox\tob\system" +; Type: dirifempty; Name: "{app}\Python\theonionbox\tob" +; Type: dirifempty; Name: "{app}\Python\theonionbox" +;Type: files; Name: "{app}\Tor\Data\torrc-defaults" [Code] @@ -105,20 +236,27 @@ var IndependenceAcceptedRadio: TRadioButton; IndependenceNotAcceptedRadio: TRadioButton; + // This is the application wide Error Flag. + error: Boolean; + procedure CreateIndependencePage(); forward; procedure CheckIndependenceAccepted(Sender: TObject); forward; procedure InitializeWizard(); begin - + + // We are going to download Python from python.org... + // ... and get-pip.py from pypa,io. + // the target file shall end with '.zip' ... to later support unzipping! idpAddFile('https://www.python.org/ftp/python/{#py}/python-{#py}-embed-win32.zip', ExpandConstant('{tmp}\python.zip')); idpAddFile('https://bootstrap.pypa.io/get-pip.py', ExpandConstant('{tmp}\get-pip.py')); - + + // Yet we'll do this later - after the preparation stage. idpDownloadAfter(wpPreparing); - // Initialize the custom page - // The Tor Download Link (if found) will later (@ PrepareToInstall) be added + // Initialize the custom page to fetch the Tor Doenload link. + // This Link (if found) will later (@ PrepareToInstall) be added // to the files to be downloaded => becoming {tmp}\tor.zip TorDownloadLinkPage:= CreateOutputProgressPage('Extracting Download Link for current Tor version', ''); @@ -155,6 +293,8 @@ var ZipFile: Variant; TargetFolder: Variant; begin + Log('Unzipping ' + ZipPath + ' -> ' + TargetPath); + Shell := CreateOleObject('Shell.Application'); ZipFile := Shell.NameSpace(ZipPath); @@ -184,6 +324,9 @@ var i, ii, iii: Integer; begin + + Log('Trying to fetch Tor download link...'); + Result:= ''; for i := 0 to GetArrayLength(html) - 1 do begin @@ -222,6 +365,8 @@ begin linesplit.Free(); end; end; + + Log('Tor Download Link: ' + Result); end; @@ -238,7 +383,7 @@ begin UnZip(ExpandConstant('{tmp}\python.zip'), ExpandConstant('{tmp}\Python')); // Patch Python ... - // This enables pip operations later! + // Mandatory to enable pip operations later! pth := ExpandConstant('{tmp}\Python\python{#pth}._pth'); SaveStringsToFile(pth, ['', '# by TheOnionPack', '.\Lib\site-packages', 'import site'], true); @@ -248,17 +393,6 @@ begin end; end; -{ -function NextButtonClick(CurPageID: Integer): Boolean; -begin - LOG('NextButtonClick') - Result:= True; - if CurPageID = wpLicense then begin - // Create the page to acknowledge the Statement of Independence - CreateIndependencePage(); - end; -end; -} procedure CurPageChanged(CurPageID: Integer); begin @@ -269,6 +403,13 @@ begin CheckIndependenceAccepted(nil); end; + // Customize FinishedPage in case of error. + if CurPageID = wpFinished then begin + if error = True then begin + WizardForm.FinishedHeadingLabel.Caption := 'The Onion Pack Setup Error'; + WizardForm.FinishedLabel.Caption := ExpandConstant('{cm:MSG_FAILED_FINISHED}'); + end; + end; end; @@ -284,8 +425,14 @@ begin // This serves as well to verify that an internet connection is present. TorDownloadLinkPage.SetText('Fetching Tor Download Webpage...', ''); - TorDownloadLinkPage.SetProgress(0, 1); + TorDownloadLinkPage.ProgressBar.Style := npbstNormal; + TorDownloadLinkPage.SetProgress(1, 2); TorDownloadLinkPage.Show; + + // Give the page time to setup nicely + // Note: This does not work! :( + Sleep(500); + try // Download the website check := idpDownloadFile('{#tor}', ExpandConstant('{tmp}\tor.check')); @@ -300,7 +447,8 @@ begin // Now extract the link TorDownloadLinkPage.SetText('Extracting Download Link...', ''); LoadStringsFromFile(ExpandConstant('{tmp}\tor.check'), html); - TorDownloadLinkPage.SetProgress(1, GetArrayLength(html)); + TorDownloadLinkPage.ProgressBar.Style := npbstNormal; + TorDownloadLinkPage.SetProgress(2, GetArrayLength(html)+1); link := ExtractDownloadLink(html, TorDownloadLinkPage); // This is a very (very very) simplistic check that we found it. if Length(link) < 3 then begin @@ -356,11 +504,10 @@ end; // https://stackoverflow.com/questions/34592002/how-to-create-two-licensefile-pages-in-inno-setup procedure CheckIndependenceAccepted(Sender: TObject); begin - { Update Next button when user (un)accepts the license } + // Update Next button when user (un)accepts the license WizardForm.NextButton.Enabled := IndependenceAcceptedRadio.Checked; end; - function CloneLicenseRadioButton(Source: TRadioButton): TRadioButton; begin Result := TRadioButton.Create(WizardForm); @@ -413,22 +560,74 @@ begin end; -procedure CreateTorrcDefaults(); +// To get the absolute path for any source file +function GetAbsSourcePath(const path: string): string; var - torrcFileName: string; - lines: array of string; - i: integer; + abs_path: string; + begin - torrcFileName := 'torrc-defaults'; - ExtractTemporaryFile(torrcFileName); - LoadStringsFromFile(ExpandConstant('{tmp}\' + torrcFileName), lines); - for i := 0 to GetArrayLength(lines) - 1 do begin - lines[i] := ExpandConstant(lines[i]); + // check if path is absolute + abs_path := ExpandFileName(path); + if abs_path = path then begin + Result := path; + end else begin + // if not: generate the absolute one. + Result := ExpandConstant('{src}\' + path); end; - SaveStringsToFile(ExpandConstant('{tmp}\' + torrcFileName), lines, false); + Log('AbsPath for ' + path + ' -> ' + Result); end; + function CheckIfExists(const FileName: string): Boolean; +var + abs_path: string; +begin + abs_path := GetAbsSourcePath(FileName); + Result:=FileExists(abs_path); + Log('Does ' + FileName + ' exist? -> ' + IntToStr(Integer(Result))); +end; + +function create_pip_command(const path: string): string; +var + r: string; begin - Result:=FileExists(CurrentFileName); -end; \ No newline at end of file + r := '-m pip install --no-warn-script-location --upgrade ""'; + r := r + ExtractFileName(path); + Result := r + '""'; + Log('pip command: ' + Result); +end; + +function ExtractFN(const path: string): string; +begin + Result:= ExtractFileName(path); + Log('FN of ' + path + ' -> ' + Result); +end; + +// verify that filename exists. If not, emit MsgBox & set Error Flag. +procedure ConfirmInstallation(filename: string; msg: string); +begin + if FileExists(ExpandConstant('{app}\Python\Scripts\' + filename)) = False then begin + SetMarqueeProgress(False); + TaskDialogMsgBox('Error', + msg, + mbCriticalError, + MB_OK, [], 0); + error := True; + Log(filename + ' does NOT exist!'); + end else begin + Log(filename + ' exist!'); + end; +end; + +// Error Flag verification +function ConfirmNoInstallError(): Boolean; +begin + Result := (error = False); + Log('NoInstallError: ' + IntToStr(Integer(Result))); +end; + +function IfInstallationError(): Boolean; +begin + Result := (error = True); + Log('InstallationError: ' + IntToStr(Integer(Result))); +end; From 98efa5220da34fbc47c4746e7b9ce77619b0bebe Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Wed, 8 Jan 2020 20:39:39 +0100 Subject: [PATCH 17/34] Log messages are now prepended by [TOP] marker. --- installer/theonionpack.iss | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/installer/theonionpack.iss b/installer/theonionpack.iss index ac84159..e74641d 100644 --- a/installer/theonionpack.iss +++ b/installer/theonionpack.iss @@ -59,7 +59,7 @@ PrivilegesRequired=lowest ; There's a 'bug' (better an annoyance) in Inno Script Studio that limits ; ExtraDiskSpaceRequired to 10000000 in the dialog window. ; It yet doesn't overwrite the value here - as long as we don't touch it. -ExtraDiskSpaceRequired=83693568 +ExtraDiskSpaceRequired=87439216 MinVersion=0,6.0 LicenseFile={# LicenseFile} WizardImageFile=compiler:WizModernImage-IS.bmp @@ -166,7 +166,7 @@ Filename: "{app}\Python\python.exe"; \ StatusMsg: {cm:MSG_INSTALLING_TOP}; \ Check: ConfirmNoInstallError; \ BeforeInstall: SetupRunConfig; \ - AfterInstall: ConfirmInstallation('theonionbox.exe', ExpandConstant('{cm:MSG_FAILED_TOP}')) + AfterInstall: ConfirmInstallation('theonionpack.exe', ExpandConstant('{cm:MSG_FAILED_TOP}')) #else Filename: "{app}\Python\python.exe"; \ Parameters: "{code:create_pip_command|{param:top|theonionpack}}"; \ @@ -242,6 +242,11 @@ var procedure CreateIndependencePage(); forward; procedure CheckIndependenceAccepted(Sender: TObject); forward; +procedure out(message: string); +begin + Log('[TOP] ' + message; +end; + procedure InitializeWizard(); begin @@ -293,7 +298,7 @@ var ZipFile: Variant; TargetFolder: Variant; begin - Log('Unzipping ' + ZipPath + ' -> ' + TargetPath); + out('Unzipping ' + ZipPath + ' -> ' + TargetPath); Shell := CreateOleObject('Shell.Application'); @@ -325,7 +330,7 @@ var begin - Log('Trying to fetch Tor download link...'); + out('Trying to fetch Tor download link...'); Result:= ''; @@ -366,7 +371,7 @@ begin end; end; - Log('Tor Download Link: ' + Result); + out('Tor Download Link: ' + Result); end; @@ -574,7 +579,7 @@ begin // if not: generate the absolute one. Result := ExpandConstant('{src}\' + path); end; - Log('AbsPath for ' + path + ' -> ' + Result); + out('AbsPath for ' + path + ' -> ' + Result); end; @@ -584,7 +589,7 @@ var begin abs_path := GetAbsSourcePath(FileName); Result:=FileExists(abs_path); - Log('Does ' + FileName + ' exist? -> ' + IntToStr(Integer(Result))); + out('Does ' + FileName + ' exist? -> ' + IntToStr(Integer(Result))); end; function create_pip_command(const path: string): string; @@ -594,13 +599,13 @@ begin r := '-m pip install --no-warn-script-location --upgrade ""'; r := r + ExtractFileName(path); Result := r + '""'; - Log('pip command: ' + Result); + out('pip command: ' + Result); end; function ExtractFN(const path: string): string; begin Result:= ExtractFileName(path); - Log('FN of ' + path + ' -> ' + Result); + out('FN of ' + path + ' -> ' + Result); end; // verify that filename exists. If not, emit MsgBox & set Error Flag. @@ -613,9 +618,9 @@ begin mbCriticalError, MB_OK, [], 0); error := True; - Log(filename + ' does NOT exist!'); + out(filename + ' does NOT exist!'); end else begin - Log(filename + ' exist!'); + out(filename + ' exist!'); end; end; @@ -623,11 +628,11 @@ end; function ConfirmNoInstallError(): Boolean; begin Result := (error = False); - Log('NoInstallError: ' + IntToStr(Integer(Result))); + out('NoInstallError: ' + IntToStr(Integer(Result))); end; function IfInstallationError(): Boolean; begin Result := (error = True); - Log('InstallationError: ' + IntToStr(Integer(Result))); + out('InstallationError: ' + IntToStr(Integer(Result))); end; From 72006a85eedf7c829ca42510136fe602b4a86160 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Wed, 8 Jan 2020 20:40:45 +0100 Subject: [PATCH 18/34] Missing package added; further small changes. --- setup.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index bb51a07..d2b776c 100644 --- a/setup.py +++ b/setup.py @@ -261,6 +261,7 @@ def generate_data_files(data_files): # ] 'theonionpack': ['icons/top16.ico' , 'setup.ini' + , '../README.md' ] } @@ -341,14 +342,15 @@ def generate_data_files(data_files): 'theonionpack = theonionpack.__main__:main'] }, install_requires=[ - 'theonionbox==20.1a2', + 'theonionbox>=20.1', 'pystray', - 'shelljob' + 'shelljob', + 'filelock' ], long_description_content_type='text/x-rst; charset=UTF-8', classifiers=[ # https://pypi.python.org/pypi?%3Aaction=list_classifiers - 'Development Status :: 4 - Beta', + 'Development Status :: 5 - Production/Stable', 'Environment :: Console', 'Environment :: Web Environment', 'Framework :: Bottle', From cc8eab35fb0d8cfb7fa36faf1b909eb876150828 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Thu, 9 Jan 2020 20:15:52 +0100 Subject: [PATCH 19/34] Add python package generation step --- .github/workflows/installer.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index 87dd1f9..3861833 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -12,8 +12,16 @@ jobs: steps: - uses: actions/checkout@master + - uses: actions/setup-python@v1 + with: + python-version: '3.x' # Version range or exact version of a Python version to use, using SemVer's version range syntax + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Run setup.py to create sdist + run: python setup.py sdist --dist-dir installer + - name: Run Inno Compiler - run: iscc "installer\theonionpack.iss" + run: iscc "installer\theonionpack.iss" "/Dtheonionpack=.\" - name: Upload files to a GitHub release uses: svenstaro/upload-release-action@1.0.1 From 1800d45368f3878d0de3f443d7349c438c30cd91 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Thu, 9 Jan 2020 21:04:38 +0100 Subject: [PATCH 20/34] Ensure to add only package with matching version number. --- installer/theonionpack.iss | 41 ++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/installer/theonionpack.iss b/installer/theonionpack.iss index e74641d..7ac2db8 100644 --- a/installer/theonionpack.iss +++ b/installer/theonionpack.iss @@ -10,6 +10,8 @@ ; Supported COMPILER command line parameter: ; "/Dtheonionpack=": To include a locally (at installer compilation time) ; provided package of theonionpack into the installer. +; The installer will only include a package with matching +; version number & adequate labeling! ; ===== ; Supported INSTALLER command line parameters: @@ -43,12 +45,15 @@ ; Tor Download page #define tor ReadIni(INIFile, "tor", "download") +; Version +#define __version__ ReadIni(INIFile, "theonionpack", "version") + [ThirdParty] UseRelativePaths=True [Setup] AppName={# ReadIni(INIFile, "theonionpack", "title")} -AppVersion={# ReadIni(INIFile, "theonionpack", "version")} +AppVersion={# __version__ } AppCopyright={# ReadIni(INIFile, "theonionpack", "copyright")} AppId={{9CF06087-6B33-44B0-B9EE-24A3EE0678C9} UsePreviousAppDir=No @@ -82,11 +87,13 @@ Source: "{tmp}\get-pip.py"; DestDir: "{app}\Python"; Flags: external deleteafter ; If defined, this package will become part of the installer. ; If not, we'll pip the package - either local or from PyPI #ifdef theonionpack - #if FileExists(theonionpack) - #pragma message "TheOnionPack package @ " + theonionpack + " will be included in this installer." + #define top_file ExtractFilePath(theonionpack) + 'theonionpack-' + __version__ + '.tar.gz' + #if FileExists(top_file) + #define theonionpack top_file + #pragma message "TheOnionPack package @ '" + theonionpack + "' will be included in this installer." Source: "{# theonionpack}"; DestDir: "{app}\Python"; DestName: "{# ExtractFileName(theonionpack)}" #else - #pragma error "FileNotFound: TheOnionPack package @ " + theonionpack + "!" + #pragma error "FileNotFound: TheOnionPack package @ '" + theonionpack + "'!" #undef theonionpack #endif #endif @@ -242,9 +249,9 @@ var procedure CreateIndependencePage(); forward; procedure CheckIndependenceAccepted(Sender: TObject); forward; -procedure out(message: string); +procedure debug(message: string); begin - Log('[TOP] ' + message; + Log('[TOP] ' + message); end; procedure InitializeWizard(); @@ -298,7 +305,7 @@ var ZipFile: Variant; TargetFolder: Variant; begin - out('Unzipping ' + ZipPath + ' -> ' + TargetPath); + debug('Unzipping ' + ZipPath + ' -> ' + TargetPath); Shell := CreateOleObject('Shell.Application'); @@ -330,7 +337,7 @@ var begin - out('Trying to fetch Tor download link...'); + debug('Trying to fetch Tor download link...'); Result:= ''; @@ -371,7 +378,7 @@ begin end; end; - out('Tor Download Link: ' + Result); + debug('Tor Download Link: ' + Result); end; @@ -579,7 +586,7 @@ begin // if not: generate the absolute one. Result := ExpandConstant('{src}\' + path); end; - out('AbsPath for ' + path + ' -> ' + Result); + debug('AbsPath for ' + path + ' -> ' + Result); end; @@ -589,7 +596,7 @@ var begin abs_path := GetAbsSourcePath(FileName); Result:=FileExists(abs_path); - out('Does ' + FileName + ' exist? -> ' + IntToStr(Integer(Result))); + debug('Does ' + FileName + ' exist? -> ' + IntToStr(Integer(Result))); end; function create_pip_command(const path: string): string; @@ -599,13 +606,13 @@ begin r := '-m pip install --no-warn-script-location --upgrade ""'; r := r + ExtractFileName(path); Result := r + '""'; - out('pip command: ' + Result); + debug('pip command: ' + Result); end; function ExtractFN(const path: string): string; begin Result:= ExtractFileName(path); - out('FN of ' + path + ' -> ' + Result); + debug('FN of ' + path + ' -> ' + Result); end; // verify that filename exists. If not, emit MsgBox & set Error Flag. @@ -618,9 +625,9 @@ begin mbCriticalError, MB_OK, [], 0); error := True; - out(filename + ' does NOT exist!'); + debug(filename + ' does NOT exist!'); end else begin - out(filename + ' exist!'); + debug(filename + ' exist!'); end; end; @@ -628,11 +635,11 @@ end; function ConfirmNoInstallError(): Boolean; begin Result := (error = False); - out('NoInstallError: ' + IntToStr(Integer(Result))); + debug('NoInstallError: ' + IntToStr(Integer(Result))); end; function IfInstallationError(): Boolean; begin Result := (error = True); - out('InstallationError: ' + IntToStr(Integer(Result))); + debug('InstallationError: ' + IntToStr(Integer(Result))); end; From b3a346eb913aaad2bac8bb1075564a81b708fa37 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Thu, 9 Jan 2020 21:08:52 +0100 Subject: [PATCH 21/34] Fix commandline to include package into installer. --- .github/workflows/installer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index 3861833..25a1715 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -21,7 +21,7 @@ jobs: run: python setup.py sdist --dist-dir installer - name: Run Inno Compiler - run: iscc "installer\theonionpack.iss" "/Dtheonionpack=.\" + run: iscc "installer\theonionpack.iss" "/Dtheonionpack=." - name: Upload files to a GitHub release uses: svenstaro/upload-release-action@1.0.1 From 964a3a6f8522e2df20ea95639ac1da29f5372bd5 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sat, 11 Jan 2020 19:46:44 +0100 Subject: [PATCH 22/34] Hiding console window at launch --- theonionpack/top/pack.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/theonionpack/top/pack.py b/theonionpack/top/pack.py index 2946b79..8354f7c 100644 --- a/theonionpack/top/pack.py +++ b/theonionpack/top/pack.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +import ctypes import os import pathlib import subprocess @@ -18,6 +19,14 @@ from .simplecontroller import SimplePort from .util import MBox +# Hide the console... +kernel32 = ctypes.WinDLL('kernel32') +user32 = ctypes.WinDLL('user32') +SW_HIDE = 0 +hWnd = kernel32.GetConsoleWindow() +if hWnd: + user32.ShowWindow(hWnd, SW_HIDE) + class Pack(): From 841ad1c0872cf990401a58728da2452f99f67065 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sat, 11 Jan 2020 19:50:38 +0100 Subject: [PATCH 23/34] Create StartUp folder entry. Run minimized. --- installer/theonionpack.iss | 83 ++++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/installer/theonionpack.iss b/installer/theonionpack.iss index 7ac2db8..f135c3e 100644 --- a/installer/theonionpack.iss +++ b/installer/theonionpack.iss @@ -45,16 +45,24 @@ ; Tor Download page #define tor ReadIni(INIFile, "tor", "download") +; Name / Title +#define __title__ ReadIni(INIFile, "theonionpack", "title") ; Version #define __version__ ReadIni(INIFile, "theonionpack", "version") +; Description +#define __description__ ReadIni(INIFile, "theonionpack", "description") +; Copyright +#define __copyright__ ReadIni(INIFile, "theonionpack", "copyright") + [ThirdParty] UseRelativePaths=True + [Setup] -AppName={# ReadIni(INIFile, "theonionpack", "title")} -AppVersion={# __version__ } -AppCopyright={# ReadIni(INIFile, "theonionpack", "copyright")} +AppName={# __title__ } +AppVersion={# __version__} +AppCopyright={# __copyright__ } AppId={{9CF06087-6B33-44B0-B9EE-24A3EE0678C9} UsePreviousAppDir=No DefaultDirName=TheOnionPack @@ -71,6 +79,14 @@ WizardImageFile=compiler:WizModernImage-IS.bmp WizardSmallImageFile=compiler:WizModernSmallImage-IS.bmp OutputBaseFilename=TheOnionPackInstaller DefaultGroupName=The Onion Pack +AppPublisher=Ralph Wetzel +AppComments={# __description__} +VersionInfoVersion={# __version__} +VersionInfoDescription={# __description__} +VersionInfoProductName={# __title__} +VersionInfoCopyright={# __copyright__} +DisableProgramGroupPage=yes + [Files] ; The statement of Independence; only used by the installer. @@ -103,17 +119,21 @@ Source: "{tmp}\get-pip.py"; DestDir: "{app}\Python"; Flags: external deleteafter ; GetAbsSourcePath was added to work with the absolute path of a file - if the input is relative or absolute. ; CheckIfExists as well calls GetAbsSourcePath to verify file existance. Source: "{code:GetAbsSourcePath|{param:tob}}"; \ - DestDir: "{app}\Python"; \ - DestName: "{code:ExtractFN|{param:tob}}"; \ - Flags: external; \ - Check: CheckIfExists(ExpandConstant('{param:tob}')); + DestDir: "{app}\Python"; \ + DestName: "{code:ExtractFN|{param:tob}}"; \ + Flags: external; \ + Check: CheckIfExists(ExpandConstant('{param:tob}')) ; local package of TheOnionPack: CommandLine parameter to the INSTALLER Source: "{code:GetAbsSourcePath|{param:tob}}"; \ - DestDir: "{app}\Python"; \ - DestName: "{code:ExtractFN|{param:top}}"; \ - Flags: external; \ - Check: CheckIfExists(ExpandConstant('{param:top}')); + DestDir: "{app}\Python"; \ + DestName: "{code:ExtractFN|{param:top}}"; \ + Flags: external; \ + Check: CheckIfExists(ExpandConstant('{param:top}')) + +; An icon ... +; Source: "..\theonionpack\icons\top256.ico"; DestDir: "{app}"; Attribs: hidden + [Dirs] ; Those two directories hold the data of the Tor relay (e.g. fingerprints). @@ -121,13 +141,27 @@ Source: "{code:GetAbsSourcePath|{param:tob}}"; \ Name: "{app}\Data"; Flags: uninsneveruninstall Name: "{app}\Data\torrc"; Flags: uninsneveruninstall + [Icons] -; This link gets the path to the Tor as a command line parameter.0 -Name: "{app}\TheOnionPack"; \ - Filename: "{app}\Python\Scripts\theonionpack.exe"; \ - WorkingDir: "{app}"; \ - Parameters: "--tor ""{app}\Tor"""; \ - Comment: "Launching The Onion Pack..." +; This link gets the path to the Tor as a command line parameter. +Name: "{app}\The Onion Pack"; \ + Filename: "{app}\Python\Scripts\theonionpack.exe"; \ + WorkingDir: "{app}"; \ + Flags: runminimized; \ + IconFilename: "{app}\top256.ico"; \ + Parameters: "--tor ""{app}\Tor"""; \ + Comment: "Launching The Onion Pack..." + +; This autostart link gets the path to the Tor as a command line parameter. +Name: "{userstartup}\The Onion Pack"; \ + Filename: "{app}\Python\Scripts\theonionpack.exe"; \ + WorkingDir: "{app}"; \ + Flags: runminimized; \ + IconFilename: "{app}\top256.ico"; \ + Parameters: "--tor ""{app}\Tor"""; \ + Comment: "Launching The Onion Pack..."; \ + Tasks: startup + [CustomMessages] MSG_INSTALLING_TOP=Now installing The Onion Pack. This may take some time, as a number of additional packages most probably have to be collected from the Internet... @@ -136,6 +170,7 @@ MSG_FAILED_TOB=We failed to install the necessary packages for The Onion Pack in MSG_FAILED_TOP=We failed to add The Onion Pack to the Python environment. MSG_FAILED_FINISHED=Setup failed to install The Onion Pack on your computer. You may run the uninstaller to remove now the obsolete remainders of this procedure. Sorry for this inconvenience! + [Run] ; Those runners check - parameter AfterInstall - if a dedicated file (that was part of the current step of installation) exists. ; If not, ConfirmInstallation raises a MsgBox and sets the error flag - to abort installation. @@ -185,7 +220,7 @@ Filename: "{app}\Python\python.exe"; \ #endif ; We offer 'Run The Onion Pack...' if there was no install error. -Filename: "{app}\TheOnionPack.lnk"; \ +Filename: "{app}\The Onion Pack.lnk"; \ WorkingDir: "{app}"; \ Flags: postinstall shellexec; \ Description: "Run The Onion Pack..."; \ @@ -202,12 +237,13 @@ Filename: "{uninstallexe}"; \ [InstallDelete] #ifdef theonionpack - ; Type: files; Name: "{app}\Python\{# ExtractFileName(theonionpack)}" + Type: files; Name: "{app}\Python\{# ExtractFileName(theonionpack)}" #endif ; To remove local pip packages -; Type: files; Name: "{app}\Python\{code:ExtractFileName|{param:tob}}"; Check: FileExists(ExpandConstant('{app}\Python\{code:ExtractFileName|{param:tob}}')) -; Type: files; Name: "{app}\Python\{code:ExtractFileName|{param:top}}"; Check: FileExists(ExpandConstant('{app}\Python\{code:ExtractFileName|{param:top}}')) +Type: files; Name: "{app}\Python\{code:ExtractFileName|{param:tob}}"; Check: FileExists(ExpandConstant('{app}\Python\{code:ExtractFileName|{param:tob}}')) +Type: files; Name: "{app}\Python\{code:ExtractFileName|{param:top}}"; Check: FileExists(ExpandConstant('{app}\Python\{code:ExtractFileName|{param:top}}')) + [UninstallRun] ; To uninstall, we freeze the Python environment and write the names of the currently installed packages @@ -218,6 +254,7 @@ Filename: "{cmd}"; Parameters: """{cmd}"" /S /C """"{app}\Python\Scripts\pip.exe ; Finally pip may remove itself & it's friends. Filename: "{app}\Python\python.exe"; Parameters: "-m pip uninstall -y pip setuptools wheel"; Flags: runhidden + [UninstallDelete] ; Housekeeping... Type: files; Name: "{app}\unins.req" @@ -233,6 +270,10 @@ Type: dirifempty; Name: "{app}\Python\service" ;Type: files; Name: "{app}\Tor\Data\torrc-defaults" +[Tasks] +Name: "startup"; Description: "Lauch The Onion Pack with user login"; GroupDescription: "Autostart" + + [Code] var // Custom page showing progress while extracting the Tor Download Link From 042f26f326d8a5212bd218511d40e4cdad3b0064 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sat, 11 Jan 2020 21:29:02 +0100 Subject: [PATCH 24/34] Randomize password --- theonionpack/top/pack.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/theonionpack/top/pack.py b/theonionpack/top/pack.py index 8354f7c..5fd0944 100644 --- a/theonionpack/top/pack.py +++ b/theonionpack/top/pack.py @@ -7,6 +7,7 @@ import tempfile from time import sleep import threading +import uuid import webbrowser import winreg @@ -38,7 +39,7 @@ def __init__(self, config): self.status = 0 # Prepare Tor - self.password = 'test' + self.password = uuid.uuid4().hex self.relay = tor.Tor(self.config['tor'], self.config['data']) # torrc @@ -165,10 +166,10 @@ def do_quit(self): # cleanup is being performed in self.run() - def get_tor_messages(self): - while True: - self.relay.collect_messages() - sleep(5) + # def get_tor_messages(self): + # while True: + # self.relay.collect_messages() + # sleep(5) def on_show_messages(self, icon, item): fd, name = tempfile.mkstemp(prefix="Tor_", suffix='.html', text=True) From 713c15985a75747c660dd4c7c79d87a154326e44 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sat, 11 Jan 2020 21:30:27 +0100 Subject: [PATCH 25/34] Revert customized icon --- installer/theonionpack.iss | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/installer/theonionpack.iss b/installer/theonionpack.iss index f135c3e..30a4d2d 100644 --- a/installer/theonionpack.iss +++ b/installer/theonionpack.iss @@ -141,14 +141,12 @@ Source: "{code:GetAbsSourcePath|{param:tob}}"; \ Name: "{app}\Data"; Flags: uninsneveruninstall Name: "{app}\Data\torrc"; Flags: uninsneveruninstall - [Icons] ; This link gets the path to the Tor as a command line parameter. Name: "{app}\The Onion Pack"; \ Filename: "{app}\Python\Scripts\theonionpack.exe"; \ WorkingDir: "{app}"; \ Flags: runminimized; \ - IconFilename: "{app}\top256.ico"; \ Parameters: "--tor ""{app}\Tor"""; \ Comment: "Launching The Onion Pack..." @@ -157,12 +155,10 @@ Name: "{userstartup}\The Onion Pack"; \ Filename: "{app}\Python\Scripts\theonionpack.exe"; \ WorkingDir: "{app}"; \ Flags: runminimized; \ - IconFilename: "{app}\top256.ico"; \ Parameters: "--tor ""{app}\Tor"""; \ Comment: "Launching The Onion Pack..."; \ Tasks: startup - [CustomMessages] MSG_INSTALLING_TOP=Now installing The Onion Pack. This may take some time, as a number of additional packages most probably have to be collected from the Internet... MSG_FAILED_PIP=Unfortunately we were not able to orderly setup the Python environment. @@ -269,10 +265,8 @@ Type: dirifempty; Name: "{app}\Python\service" ; Type: dirifempty; Name: "{app}\Python\theonionbox" ;Type: files; Name: "{app}\Tor\Data\torrc-defaults" - [Tasks] -Name: "startup"; Description: "Lauch The Onion Pack with user login"; GroupDescription: "Autostart" - +Name: "startup"; Description: "Start The Onion Pack when you start Windows"; GroupDescription: "Autostart" [Code] var From 494a9371d971f20bba0e368b86a6f7131ee515e5 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sat, 11 Jan 2020 21:31:45 +0100 Subject: [PATCH 26/34] Updating README --- documentation/TOPContextMenu.png | Bin 0 -> 22223 bytes documentation/TOPTray.png | Bin 0 -> 32670 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 documentation/TOPContextMenu.png create mode 100644 documentation/TOPTray.png diff --git a/documentation/TOPContextMenu.png b/documentation/TOPContextMenu.png new file mode 100644 index 0000000000000000000000000000000000000000..ac267f4445c4d67c3ae9b2d2fc8326355da2945b GIT binary patch literal 22223 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 THH|@000000NkvXXu0mjfNA-G^ literal 0 HcmV?d00001 diff --git a/documentation/TOPTray.png b/documentation/TOPTray.png new file mode 100644 index 0000000000000000000000000000000000000000..889e956c79db42a5a25d46e79a03f385711f2877 GIT binary patch literal 32670 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%0Dm5N6Bpz~_LJN0NrHj#YaC?Nja{Ish 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 Date: Sun, 12 Jan 2020 00:04:07 +0100 Subject: [PATCH 27/34] Installer name simplified to TheOnionPack.exe --- .github/workflows/installer.yml | 4 ++-- installer/theonionpack.iss | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index 25a1715..a75c9a5 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -27,7 +27,7 @@ jobs: uses: svenstaro/upload-release-action@1.0.1 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: installer\Output\TheOnionPackInstaller.exe - asset_name: TheOnionPackInstaller.exe + file: installer\Output\TheOnionPack.exe + asset_name: TheOnionPack.exe tag: ${{ github.ref }} overwrite: true diff --git a/installer/theonionpack.iss b/installer/theonionpack.iss index 30a4d2d..6f0ab6f 100644 --- a/installer/theonionpack.iss +++ b/installer/theonionpack.iss @@ -77,7 +77,7 @@ MinVersion=0,6.0 LicenseFile={# LicenseFile} WizardImageFile=compiler:WizModernImage-IS.bmp WizardSmallImageFile=compiler:WizModernSmallImage-IS.bmp -OutputBaseFilename=TheOnionPackInstaller +OutputBaseFilename=TheOnionPack DefaultGroupName=The Onion Pack AppPublisher=Ralph Wetzel AppComments={# __description__} From 2e31bdd15dfee73669c9d6766bcd44b41ff3e48b Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sun, 12 Jan 2020 00:04:55 +0100 Subject: [PATCH 28/34] Initial README --- README.md | 92 +++++++++++++++++- ...{TOPContextMenu.png => topcontextmenu.png} | Bin documentation/{TOPTray.png => toptray.png} | Bin 3 files changed, 91 insertions(+), 1 deletion(-) rename documentation/{TOPContextMenu.png => topcontextmenu.png} (100%) rename documentation/{TOPTray.png => toptray.png} (100%) diff --git a/README.md b/README.md index 4424356..2c9cd79 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,92 @@ # The Onion Pack -Tor Relay Bundle for Windows +This is The Onion Pack, a **Tor Relay Bundle** for Windows. +It allows you to install everything you need to run a Tor relay (or a Tor bridge) on your Windows computer system & offers you a smart interface to monitor and control your relay. + +## Installation +To install The Onion Pack on your Windows computer, download & run [TheOnionPack.exe](https://github.com/ralphwetzel/theonionpack/releases/latest) , its installation programm. + +This installation program is going to perform a number of tasks: + +* Locate, download & install the latest Tor *Windows Expert Bundle* from the official sources at [torproject.org](https://www.torproject.org/download/tor/). +* Download & install a version of *Embeddable Python* from the official sources at [python.org](https://www.python.org/downloads/windows/). +* Setup a Python environment. +* Download & install [The Onion Box](www.theonionbox.com) (Dashboard to monitor Tor node operations) from the [Python Package Index](https://pypi.org/project/theonionbox/) . + +and finally + +* Install The Onion Pack - a python script to control the Tor relay as well as The Onion Box. + +## Additional Activities to be performed prior Operation +There's - usually - one additional activity necessary to finish the setup of The Onion Pack & your new personal Tor relay: You need to tell your router / firewall to forward at least one port to your local Windows system: + +Tor - if operated as a relay or bridge - expects that clients can connect to its *ORPort*. If this port is not reachable from the voids of the internet, the relay will not announce it's presence - thus will not be of any use. Therefore you have to ensure that connections can be established to this *ORPort*. + +The default value for the *ORPort* of any Tor relay is **9001**. You may alter this via *torrc*. + +## Operation +When you run The Onion Pack, it launches your Tor relay - setup according to the configuration you defined - and The Onion Box. If both actions have been performed successfully, The Onion Pack puts an icon into the tray of your desktop. + +![image](documentation/toptray.png) + +This icon provides a context menu ... to monitor your Tor relay and to control it: + + +![image](documentation/topcontextmenu.png) + + +| Tray Menu Command | Action | +|---|---| +| **Monitor...** | Open The Onion Box, the dashboard to monitor your relay. Default (right click) action. +| Relay Control | +| Edit configuration file... | Opens *torrc*, the configuration file of your relay. You may edit & save this file to change the setup of your Tor Relay. +| Show logfile... | Show the log messages of your Tor Relay. This might be useful in case of trouble! +| Reload relay configuration...| If you've edited *torrc* to modify the configuration definition of your relay, you need to reload this configuration into the relay. +| Stop! | Terminate The Onion Pack + +## First Steps +By intension the Tor instance **initially** installed by The Onion Pack is **not operating in Relay mode** - yet as a Tor client. + +If you then decide to establish a relay, edit the configuration file: **Tray menu > Relay Control > Edit configuration file...** + +This will open an editor window - showing an empty file. Prerequisite to become a relay is the definition of an *ORPort*: +``` +ORPort 9001 +``` +> Remember to define the port number in accordance to your port forwarding settings established at your router! + +Additionally you should at least give a name to your relay and define the *ContactInfo* parameter. + +``` +ORPort 9001 +Nickname myRelay +ContactInfo mail at mymail dot com +``` + +As it is explicitely discouraged to run an Exit Relay on any computer system at home, you should - equally explicit - express your request to disable the exit functionality: + +``` +ORPort 9001 +Nickname myRelay +ContactInfo mail at mymail dot com +ExitRelay 0 +``` + +> Please make yourself familiar with the official documentation at [torproject.org](www.torproject.org), especially the [Tor Manual](https://2019.www.torproject.org/docs/tor-manual.html.en), to understand the capabilities of a Tor Relay and the meaning of all the configuration parameters! + +You may & should define further configuration parameters ... and if done, save the modified *torrc*. + +To enable this configuration, you need to tell your Tor node to reload it's configuration file: **Tray menu > Relay Control > Reload relay configuration** + +Afterwards you may either + +* check the logfile of your relay: **Tray menu > Relay control > Show logfile...** + +or + +* open the dashboard to monitor your relay: **Tray menu > Monitor...** + +Have fun! + + +## Thank you +I'd like to express my humble respect to @jordanrussel and @martjinlaan for their dedication to [Inno Setup](http://www.jrsoftware.org/isinfo.php). This is an amazing piece of software providing endless opportunities to create powerfull installers. Thanks a lot for your efforts to maintain this gem in code over years, offering it's brilliant capabilities to the community. \ No newline at end of file diff --git a/documentation/TOPContextMenu.png b/documentation/topcontextmenu.png similarity index 100% rename from documentation/TOPContextMenu.png rename to documentation/topcontextmenu.png diff --git a/documentation/TOPTray.png b/documentation/toptray.png similarity index 100% rename from documentation/TOPTray.png rename to documentation/toptray.png From 543043a3aac8d877a0e78f0452c13dfd60ea1d38 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sun, 12 Jan 2020 00:07:25 +0100 Subject: [PATCH 29/34] Initial README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2c9cd79..feb5ba7 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ This installation program is going to perform a number of tasks: * Locate, download & install the latest Tor *Windows Expert Bundle* from the official sources at [torproject.org](https://www.torproject.org/download/tor/). * Download & install a version of *Embeddable Python* from the official sources at [python.org](https://www.python.org/downloads/windows/). -* Setup a Python environment. -* Download & install [The Onion Box](www.theonionbox.com) (Dashboard to monitor Tor node operations) from the [Python Package Index](https://pypi.org/project/theonionbox/) . +* Setup an appropriate Python environment. +* Download & install [The Onion Box](http://www.theonionbox.com) (Dashboard to monitor Tor node operations) from the [Python Package Index](https://pypi.org/project/theonionbox/) . and finally From aaad700e918fcc1ba49779bdbfe3520dcd85cadf Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sun, 12 Jan 2020 00:18:06 +0100 Subject: [PATCH 30/34] Initial README --- README.md | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index feb5ba7..ec7c744 100644 --- a/README.md +++ b/README.md @@ -38,23 +38,23 @@ This icon provides a context menu ... to monitor your Tor relay and to control i |---|---| | **Monitor...** | Open The Onion Box, the dashboard to monitor your relay. Default (right click) action. | Relay Control | -| Edit configuration file... | Opens *torrc*, the configuration file of your relay. You may edit & save this file to change the setup of your Tor Relay. -| Show logfile... | Show the log messages of your Tor Relay. This might be useful in case of trouble! +| Edit configuration file... | Opens *torrc*, the configuration file of your relay. You may edit & save this file to change the setup of your Tor relay. +| Show logfile... | Show the log messages of your Tor relay. This might be useful in case of trouble! | Reload relay configuration...| If you've edited *torrc* to modify the configuration definition of your relay, you need to reload this configuration into the relay. | Stop! | Terminate The Onion Pack ## First Steps -By intension the Tor instance **initially** installed by The Onion Pack is **not operating in Relay mode** - yet as a Tor client. +By intension the Tor instance **initially** installed by The Onion Pack is **not operating in Relay mode** - yet as a Tor client. +If you deliberately decide to establish a relay, edit the configuration file: **Tray menu > Relay Control > Edit configuration file...** +This will open an editor window - showing an empty file. -If you then decide to establish a relay, edit the configuration file: **Tray menu > Relay Control > Edit configuration file...** - -This will open an editor window - showing an empty file. Prerequisite to become a relay is the definition of an *ORPort*: +Prerequisite to become a relay is the definition of an [*ORPort*](https://2019.www.torproject.org/docs/tor-manual.html.en#ORPort) : ``` ORPort 9001 ``` > Remember to define the port number in accordance to your port forwarding settings established at your router! -Additionally you should at least give a name to your relay and define the *ContactInfo* parameter. +Additionally you should at least give a name to your relay and define the [*ContactInfo*](https://2019.www.torproject.org/docs/tor-manual.html.en#ContactInfo) parameter. ``` ORPort 9001 @@ -77,13 +77,7 @@ You may & should define further configuration parameters ... and if done, save t To enable this configuration, you need to tell your Tor node to reload it's configuration file: **Tray menu > Relay Control > Reload relay configuration** -Afterwards you may either - -* check the logfile of your relay: **Tray menu > Relay control > Show logfile...** - -or - -* open the dashboard to monitor your relay: **Tray menu > Monitor...** +Afterwards you may either check the logfile of your relay ( **Tray menu > Relay control > Show logfile...** ) or open the dashboard to monitor your relay: **Tray menu > Monitor...** Have fun! From eb9bc456ca97631b3aebc7c6f1a5dfe69cf6afc5 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sun, 12 Jan 2020 09:37:43 +0100 Subject: [PATCH 31/34] Ensure torrc exists at least as empty file --- theonionpack/top/pack.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/theonionpack/top/pack.py b/theonionpack/top/pack.py index 5fd0944..ddde6f9 100644 --- a/theonionpack/top/pack.py +++ b/theonionpack/top/pack.py @@ -43,7 +43,7 @@ def __init__(self, config): self.relay = tor.Tor(self.config['tor'], self.config['data']) # torrc - torrc = pathlib.Path(config['data']) / 'torrc/torrc' + torrc = pathlib.Path(config['data']) / 'torrc' / 'torrc' self.torrc = torrc.resolve() # The Onion Box @@ -186,6 +186,10 @@ def get_default_windows_app(suffix): command = winreg.QueryValueEx(key, '')[0] return command.split(' ')[0] + if not self.torrc.exists(): + self.torrc.parent.mkdir(parents=True, exist_ok=True) + self.torrc.touch() + path = get_default_windows_app('.txt') subprocess.Popen([os.path.expandvars(path), str(self.torrc)]) From f27a6197f15e1c58ac16dc317fcd358af141f9c1 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sun, 12 Jan 2020 16:48:35 +0100 Subject: [PATCH 32/34] Statement of Independence added. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index ec7c744..bf33189 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,11 @@ This is The Onion Pack, a **Tor Relay Bundle** for Windows. It allows you to install everything you need to run a Tor relay (or a Tor bridge) on your Windows computer system & offers you a smart interface to monitor and control your relay. +> **Statement of Independence** +> This product is produced independently from the Tor(R) anonymity software and +carries no guarantee from [The Tor Project](www.torproject.org) about quality, suitability or anything +else. + ## Installation To install The Onion Pack on your Windows computer, download & run [TheOnionPack.exe](https://github.com/ralphwetzel/theonionpack/releases/latest) , its installation programm. From 1f95f10aeded9f1517b0e71475cecc5a581b7542 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sun, 12 Jan 2020 17:01:16 +0100 Subject: [PATCH 33/34] Minor adaptations. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bf33189..e536bfe 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ This installation program is going to perform a number of tasks: * Locate, download & install the latest Tor *Windows Expert Bundle* from the official sources at [torproject.org](https://www.torproject.org/download/tor/). * Download & install a version of *Embeddable Python* from the official sources at [python.org](https://www.python.org/downloads/windows/). * Setup an appropriate Python environment. -* Download & install [The Onion Box](http://www.theonionbox.com) (Dashboard to monitor Tor node operations) from the [Python Package Index](https://pypi.org/project/theonionbox/) . +* Download & install [The Onion Box](http://www.theonionbox.com) (Dashboard to monitor Tor node operations) from the [Python Package Index](https://pypi.org/project/theonionbox/). and finally @@ -49,7 +49,7 @@ This icon provides a context menu ... to monitor your Tor relay and to control i | Stop! | Terminate The Onion Pack ## First Steps -By intension the Tor instance **initially** installed by The Onion Pack is **not operating in Relay mode** - yet as a Tor client. +By intension the Tor instance **initially** installed by The Onion Pack is **not operating in relay mode** - yet as a Tor client. If you deliberately decide to establish a relay, edit the configuration file: **Tray menu > Relay Control > Edit configuration file...** This will open an editor window - showing an empty file. @@ -76,7 +76,7 @@ ContactInfo mail at mymail dot com ExitRelay 0 ``` -> Please make yourself familiar with the official documentation at [torproject.org](www.torproject.org), especially the [Tor Manual](https://2019.www.torproject.org/docs/tor-manual.html.en), to understand the capabilities of a Tor Relay and the meaning of all the configuration parameters! +> Please make yourself familiar with the official documentation at [torproject.org](www.torproject.org), especially the [Tor Manual](https://2019.www.torproject.org/docs/tor-manual.html.en), to understand the capabilities of a Tor relay and the power of all its configuration parameters! You may & should define further configuration parameters ... and if done, save the modified *torrc*. From 47ed25ddb9493a76be8ade417b137683056b4191 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Sun, 12 Jan 2020 19:17:04 +0100 Subject: [PATCH 34/34] Delete files to pip from locally in \Python after installation --- installer/theonionpack.iss | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/installer/theonionpack.iss b/installer/theonionpack.iss index 6f0ab6f..da436d9 100644 --- a/installer/theonionpack.iss +++ b/installer/theonionpack.iss @@ -15,9 +15,9 @@ ; ===== ; Supported INSTALLER command line parameters: -; /tob="theonionbox-xx.x.tag.gz": To install from a locally (at setup time) provided packache of The Onion Box +; /tob="theonionbox-xx.x.tar.gz": To install from a locally (at setup time) provided packache of The Onion Box ; (rather then pip'ing this from online). -; /top="theonionpack-xx.x.tag.gz": To install a locally (at setup time) provided packache of The Onion Pack +; /top="theonionpack-xx.x.tar.gz": To install a locally (at setup time) provided packache of The Onion Pack ; (rather then using the one from this installer or pip'ing it from online). ; All default INSTALLER commandline options are supported as well. @@ -54,18 +54,15 @@ ; Copyright #define __copyright__ ReadIni(INIFile, "theonionpack", "copyright") - [ThirdParty] UseRelativePaths=True - [Setup] AppName={# __title__ } AppVersion={# __version__} AppCopyright={# __copyright__ } AppId={{9CF06087-6B33-44B0-B9EE-24A3EE0678C9} -UsePreviousAppDir=No -DefaultDirName=TheOnionPack +DefaultDirName={userpf}\TheOnionPack DisableWelcomePage=False UninstallLogMode=new PrivilegesRequired=lowest @@ -107,7 +104,7 @@ Source: "{tmp}\get-pip.py"; DestDir: "{app}\Python"; Flags: external deleteafter #if FileExists(top_file) #define theonionpack top_file #pragma message "TheOnionPack package @ '" + theonionpack + "' will be included in this installer." - Source: "{# theonionpack}"; DestDir: "{app}\Python"; DestName: "{# ExtractFileName(theonionpack)}" + Source: "{# theonionpack}"; DestDir: "{app}\Python"; DestName: "{# ExtractFileName(theonionpack)}"; Flags: deleteafterinstall #else #pragma error "FileNotFound: TheOnionPack package @ '" + theonionpack + "'!" #undef theonionpack @@ -121,14 +118,14 @@ Source: "{tmp}\get-pip.py"; DestDir: "{app}\Python"; Flags: external deleteafter Source: "{code:GetAbsSourcePath|{param:tob}}"; \ DestDir: "{app}\Python"; \ DestName: "{code:ExtractFN|{param:tob}}"; \ - Flags: external; \ + Flags: external deleteafterinstall; \ Check: CheckIfExists(ExpandConstant('{param:tob}')) ; local package of TheOnionPack: CommandLine parameter to the INSTALLER Source: "{code:GetAbsSourcePath|{param:tob}}"; \ DestDir: "{app}\Python"; \ DestName: "{code:ExtractFN|{param:top}}"; \ - Flags: external; \ + Flags: external deleteafterinstall; \ Check: CheckIfExists(ExpandConstant('{param:top}')) ; An icon ... @@ -159,6 +156,14 @@ Name: "{userstartup}\The Onion Pack"; \ Comment: "Launching The Onion Pack..."; \ Tasks: startup +; And finally: A desktop icon... +Name: "{userdesktop}\The Onion Pack"; \ + Filename: "{app}\Python\Scripts\theonionpack.exe"; \ + WorkingDir: "{app}"; \ + Flags: runminimized; \ + Parameters: "--tor ""{app}\Tor"""; \ + Comment: "Launching The Onion Pack..."; + [CustomMessages] MSG_INSTALLING_TOP=Now installing The Onion Pack. This may take some time, as a number of additional packages most probably have to be collected from the Internet... MSG_FAILED_PIP=Unfortunately we were not able to orderly setup the Python environment. @@ -232,13 +237,8 @@ Filename: "{uninstallexe}"; \ [InstallDelete] -#ifdef theonionpack - Type: files; Name: "{app}\Python\{# ExtractFileName(theonionpack)}" -#endif - -; To remove local pip packages -Type: files; Name: "{app}\Python\{code:ExtractFileName|{param:tob}}"; Check: FileExists(ExpandConstant('{app}\Python\{code:ExtractFileName|{param:tob}}')) -Type: files; Name: "{app}\Python\{code:ExtractFileName|{param:top}}"; Check: FileExists(ExpandConstant('{app}\Python\{code:ExtractFileName|{param:top}}')) +; InstallDelete ... deletes files as the first step of installation!! +; Thus it's of no use for us! [UninstallRun]