├── .editorconfig ├── .gitattributes ├── .github └── workflows │ ├── automerge.yml │ ├── build-linux.yml │ ├── build-windows.yml │ └── create-release.yml ├── .gitignore ├── App └── AppInfo │ ├── Launcher │ └── LdapAdminPortable.ini │ ├── appicon.ico │ ├── appicon_128.png │ ├── appicon_16.png │ ├── appicon_24.png │ ├── appicon_256.png │ ├── appicon_32.png │ ├── appicon_48.png │ ├── appicon_512.png │ ├── appicon_64.png │ ├── appicon_75.png │ ├── appinfo.ini │ ├── icon.svg │ └── update.ini ├── LICENSE ├── Other ├── Icons │ ├── full_support.svg │ ├── no_data.svg │ ├── no_support.svg │ ├── not_applicable.svg │ └── probably_supported.svg ├── Images │ ├── howto_pa-upgrade.png │ ├── howto_unblock-file.png │ ├── info_defender-protected.png │ ├── install_newapp_dialog.png │ ├── install_newapp_installation.png │ └── install_newapp_menu.png ├── Source │ ├── AppNamePortable.ini │ ├── LauncherLicense.txt │ └── Readme.txt └── Update │ ├── IniConfig.psm1 │ ├── Initialize.ps1 │ ├── PA-Upgrade.ps1 │ ├── PortableAppsCommon.psm1 │ └── Update.ps1 ├── README.adoc └── help.html /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | end_of_line = crlf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | indent_style = space 12 | indent_size = 2 13 | 14 | [*.{ps1,psm1}] 15 | end_of_line = crlf 16 | 17 | [*.sh] 18 | end_of_line = lf 19 | max_line_length = 80 20 | 21 | [*.adoc] 22 | max_line_length = 80 23 | 24 | [Makefile] 25 | indent_style = tab 26 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Globals 2 | text eol=crlf 3 | 4 | # document formats 5 | *.adoc text 6 | *.html text 7 | *.svg text 8 | *.txt text 9 | *.yml text 10 | *.yaml text 11 | *.jsn text 12 | *.json text 13 | *.ini text 14 | 15 | # Git config files 16 | .gitignore text 17 | .gitattributes text 18 | .editorconfig text 19 | 20 | # Source code formats 21 | *.sh text eol=lf 22 | *.ps1 text eol=crlf 23 | *.psm1 text eol=crlf 24 | 25 | # Images formats 26 | *.gif binary 27 | *.ico binary 28 | *.png binary 29 | *.jpg binary 30 | *.jpeg binary 31 | *.webm binary 32 | *.avif binary 33 | 34 | # Binary formats 35 | *.bin binary 36 | *.bpm binary 37 | *.dll binary 38 | *.exe binary 39 | *.lib binary 40 | *.pat binary 41 | bzip2-* binary 42 | bzip2_* binary 43 | lzma-* binary 44 | lzma_* binary 45 | uninst binary 46 | zlib-* binary 47 | zlib_* binary 48 | -------------------------------------------------------------------------------- /.github/workflows/automerge.yml: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------------------- 2 | # Automerge pull requests for PortableApps 3 | # Author: Urs Roesch https://github.com/uroesch 4 | # Version: 0.1.0 5 | # ----------------------------------------------------------------------------- 6 | name: automerge 7 | on: 8 | pull_request: 9 | branches: 10 | - master 11 | - main 12 | check_suite: 13 | types: 14 | - completed 15 | status: {} 16 | jobs: 17 | automerge: 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: automerge pull request 21 | uses: "pascalgn/automerge-action@v0.15.6" 22 | env: 23 | MERGE_FILTER_AUTHOR: uroesch 24 | MERGE_FORKS: false 25 | MERGE_RETRIES: 20 26 | MERGE_RETRY_SLEEP: 60000 27 | MERGE_DELETE_BRANCH: true 28 | MERGE_LABELS: "" 29 | GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" 30 | -------------------------------------------------------------------------------- /.github/workflows/build-linux.yml: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------------------- 2 | # Build workflow for portable apps 3 | # Author: Urs Roesch https://github.com/uroesch 4 | # Version: 0.11.0 5 | # ----------------------------------------------------------------------------- 6 | name: build-linux 7 | 8 | on: 9 | push: 10 | branches: 11 | - workflow/* 12 | pull_request: 13 | branches: 14 | - master 15 | - main 16 | 17 | jobs: 18 | build-linux: 19 | if: endsWith(github.repository, 'Portable') 20 | timeout-minutes: 15 21 | runs-on: ubuntu-latest 22 | container: 23 | image: uroesch/pa-wine:latest 24 | env: 25 | RUN_AS_ROOT: yes 26 | strategy: 27 | fail-fast: false 28 | 29 | steps: 30 | - name: Checkout repository 31 | uses: actions/checkout@v4 32 | 33 | - name: Run build script via docker 34 | shell: bash 35 | run: | 36 | /entrypoint.sh \ 37 | /usr/bin/pwsh -ExecutionPolicy ByPass \ 38 | Other/Update/Update.ps1 -InfraDir /pa-build 39 | timeout-minutes: 10 40 | -------------------------------------------------------------------------------- /.github/workflows/build-windows.yml: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------------------- 2 | # Build workflow for portable apps 3 | # Author: Urs Roesch https://github.com/uroesch 4 | # Version: 0.10.0 5 | # ----------------------------------------------------------------------------- 6 | name: build-windows 7 | 8 | on: 9 | push: 10 | branches: 11 | - workflow/* 12 | pull_request: 13 | branches: 14 | - master 15 | - main 16 | 17 | jobs: 18 | build-windows: 19 | if: endsWith(github.repository, 'Portable') 20 | timeout-minutes: 15 21 | runs-on: windows-latest 22 | strategy: 23 | fail-fast: false 24 | 25 | steps: 26 | - name: Checkout repository 27 | uses: actions/checkout@v4 28 | 29 | - name: Clone PortableApps.comInstaller 30 | uses: actions/checkout@v4 31 | with: 32 | repository: uroesch/PortableApps.comInstaller 33 | ref: main 34 | path: PortableApps.comInstaller 35 | 36 | - name: Clone PortableApps.comLauncher 37 | uses: actions/checkout@v4 38 | with: 39 | repository: uroesch/PortableApps.comLauncher 40 | ref: patched 41 | path: PortableApps.comLauncher 42 | 43 | - name: Move installer and launcher 44 | shell: bash 45 | run: mv ./PortableApps.com{Installer,Launcher} ../ 46 | 47 | - name: Run build script Update.ps1 48 | run: pwsh -ExecutionPolicy ByPass -File Other/Update/Update.ps1 49 | timeout-minutes: 10 50 | 51 | - name: Collect logs on failure 52 | if: failure() 53 | shell: bash 54 | run: | 55 | mkdir ../artifacts 56 | cp ../PortableApps.com*/Data/*Log.txt ../artifacts 57 | 58 | - name: Upload artifacts on failure 59 | if: failure() 60 | uses: actions/upload-artifact@v3 61 | with: 62 | name: logs.zip 63 | path: ../artifacts 64 | -------------------------------------------------------------------------------- /.github/workflows/create-release.yml: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------------------- 2 | # Build workflow for portable apps 3 | # Author: Urs Roesch https://github.com/uroesch 4 | # Version: 0.0.1 5 | # ----------------------------------------------------------------------------- 6 | name: create-release 7 | 8 | on: 9 | pull_request: 10 | branches: 11 | - master 12 | type: 13 | - closed 14 | tag: 15 | - 'v*' 16 | 17 | jobs: 18 | create-release: 19 | runs-on: ubuntu-latest 20 | if: github.event.pull_request.merged 21 | steps: 22 | - name: Checkout repository ${{ github.repository }} 23 | uses: actions/checkout@v2 24 | with: 25 | lfs: true 26 | 27 | - name: Restore release artifact 28 | uses: actions/cache@v1 29 | with: 30 | path: ../release 31 | restore-key: release-${{ hashFiles('App/AppInfo/update.ini') }} 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.exe 2 | Data/ 3 | App/AppInfo/pac_installer_log.ini 4 | App/*.exe 5 | Download 6 | -------------------------------------------------------------------------------- /App/AppInfo/Launcher/LdapAdminPortable.ini: -------------------------------------------------------------------------------- 1 | [Launch] 2 | Name=LdapAdminPortable 3 | ProgramExecutable=LdapAdmin32.exe 4 | ProgramExecutable64=LdapAdmin64.exe 5 | ProgramExecutableWhenParameters= 6 | ProgramExecutableWhenParameters64= 7 | CommandLineArguments= 8 | WorkingDirectory=%PAL:DataDir% 9 | 10 | [FilesMove] 11 | [DirectoriesMove] 12 | [Activate] 13 | Registry=true 14 | 15 | [RegistryKeys] ldapadmin=HKEY_CURRENT_USER\Software\LdapAdmin 16 | 17 | [FileWrite1] 18 | Type=Replace 19 | File=%PAL:DataDir%\settings\ldapadmin.reg 20 | Find=%PAL:LastDrive%%PAL:LastPackagePartialDir:DoubleBackslash%\\ 21 | Replace=%PAL:Drive%%PAL:PackagePartialDir:DoubleBackslash%\\ 22 | 23 | 24 | -------------------------------------------------------------------------------- /App/AppInfo/appicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/App/AppInfo/appicon.ico -------------------------------------------------------------------------------- /App/AppInfo/appicon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/App/AppInfo/appicon_128.png -------------------------------------------------------------------------------- /App/AppInfo/appicon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/App/AppInfo/appicon_16.png -------------------------------------------------------------------------------- /App/AppInfo/appicon_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/App/AppInfo/appicon_24.png -------------------------------------------------------------------------------- /App/AppInfo/appicon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/App/AppInfo/appicon_256.png -------------------------------------------------------------------------------- /App/AppInfo/appicon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/App/AppInfo/appicon_32.png -------------------------------------------------------------------------------- /App/AppInfo/appicon_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/App/AppInfo/appicon_48.png -------------------------------------------------------------------------------- /App/AppInfo/appicon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/App/AppInfo/appicon_512.png -------------------------------------------------------------------------------- /App/AppInfo/appicon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/App/AppInfo/appicon_64.png -------------------------------------------------------------------------------- /App/AppInfo/appicon_75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/App/AppInfo/appicon_75.png -------------------------------------------------------------------------------- /App/AppInfo/appinfo.ini: -------------------------------------------------------------------------------- 1 | [Format] 2 | Type = PortableApps.comFormat 3 | Version = 3.5 4 | 5 | [Details] 6 | Name = LdapAdmin Portable 7 | AppID = LdapAdminPortable 8 | Publisher = Tihomir Karlovic 9 | Homepage = http://www.ldapadmin.org/ 10 | Donate = 11 | Category = Utilities 12 | Description = LDAP directory browser and editor 13 | Language = English 14 | Trademarks = 15 | InstallType = 16 | 17 | [License] 18 | Shareable = True 19 | OpenSource = True 20 | Freeware = True 21 | CommercialUse = False 22 | EULAVersion = 23 | 24 | [Dependencies] 25 | UsesGhostscript = No 26 | UsesJava = No 27 | UsesDotNetVersion = 28 | 29 | [Control] 30 | Icons = 1 31 | Start = LdapAdminPortable.exe 32 | 33 | [Associations] 34 | FileTypes = 35 | FileTypeCommandLine = 36 | FileTypeCommandLine-extension = 37 | Protocols = 38 | ProtocolCommandLine = 39 | ProtocolCommandLine-protocol = 40 | SendTo = 41 | SendToCommandLine = 42 | Shell = 43 | ShellCommand = 44 | 45 | [FileTypeIcons] 46 | 47 | [Version] 48 | PackageVersion = 1.8.3.0 49 | DisplayVersion = 1.8.3-uroesch 50 | -------------------------------------------------------------------------------- /App/AppInfo/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 21 | 23 | 26 | 30 | 34 | 35 | 44 | 45 | 70 | 74 | 75 | 77 | 78 | 80 | image/svg+xml 81 | 83 | 84 | 85 | 86 | 87 | 92 | 94 | 97 | 107 | 110 | 114 | 118 | 122 | 129 | 133 | 137 | 141 | 145 | 146 | 149 | 156 | 160 | 164 | 168 | 172 | 173 | 177 | 184 | 188 | 192 | 196 | 200 | 201 | 205 | 212 | 216 | 220 | 224 | 228 | 229 | 234 | 235 | 236 | 243 | 244 | 245 | 246 | -------------------------------------------------------------------------------- /App/AppInfo/update.ini: -------------------------------------------------------------------------------- 1 | [Version] 2 | Upstream = 1.8.3 3 | Package = 1.8.3.0 4 | Display = 1.8.3-uroesch 5 | 6 | [Archive] 7 | URL1 = https://netcologne.dl.sourceforge.net/project/ldapadmin/ldapadmin/1.8.3/LdapAdminExe-w64-1.8.3.zip 8 | Checksum1 = SHA256::E2E9A3603150D14E2F7AE2CD85878CE187D953FF8FA01FCAA5B73949E573A4DE 9 | TargetName1 = LdapAdmin64.exe 10 | ExtractName1 = LdapAdmin.exe 11 | URL2 = https://netcologne.dl.sourceforge.net/project/ldapadmin/ldapadmin/1.8.3/LdapAdminExe-w32-1.8.3.zip 12 | Checksum2 = SHA256::20343E6B2F85E51FFB9CEEB88804CF1E24DA1B1055A48A4AD0ECD170BDDA7BDC 13 | TargetName2 = LdapAdmin32.exe 14 | ExtractName2 = LdapAdmin.exe 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | LdapAdminPortable Installer License 2 | ----------------------------------- 3 | 4 | GNU GENERAL PUBLIC LICENSE 5 | Version 2, June 1991 6 | 7 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 8 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 9 | Everyone is permitted to copy and distribute verbatim copies 10 | of this license document, but changing it is not allowed. 11 | 12 | Preamble 13 | 14 | The licenses for most software are designed to take away your 15 | freedom to share and change it. By contrast, the GNU General Public 16 | License is intended to guarantee your freedom to share and change free 17 | software--to make sure the software is free for all its users. This 18 | General Public License applies to most of the Free Software 19 | Foundation's software and to any other program whose authors commit to 20 | using it. (Some other Free Software Foundation software is covered by 21 | the GNU Lesser General Public License instead.) You can apply it to 22 | your programs, too. 23 | 24 | When we speak of free software, we are referring to freedom, not 25 | price. Our General Public Licenses are designed to make sure that you 26 | have the freedom to distribute copies of free software (and charge for 27 | this service if you wish), that you receive source code or can get it 28 | if you want it, that you can change the software or use pieces of it 29 | in new free programs; and that you know you can do these things. 30 | 31 | To protect your rights, we need to make restrictions that forbid 32 | anyone to deny you these rights or to ask you to surrender the rights. 33 | These restrictions translate to certain responsibilities for you if you 34 | distribute copies of the software, or if you modify it. 35 | 36 | For example, if you distribute copies of such a program, whether 37 | gratis or for a fee, you must give the recipients all the rights that 38 | you have. You must make sure that they, too, receive or can get the 39 | source code. And you must show them these terms so they know their 40 | rights. 41 | 42 | We protect your rights with two steps: (1) copyright the software, and 43 | (2) offer you this license which gives you legal permission to copy, 44 | distribute and/or modify the software. 45 | 46 | Also, for each author's protection and ours, we want to make certain 47 | that everyone understands that there is no warranty for this free 48 | software. If the software is modified by someone else and passed on, we 49 | want its recipients to know that what they have is not the original, so 50 | that any problems introduced by others will not reflect on the original 51 | authors' reputations. 52 | 53 | Finally, any free program is threatened constantly by software 54 | patents. We wish to avoid the danger that redistributors of a free 55 | program will individually obtain patent licenses, in effect making the 56 | program proprietary. To prevent this, we have made it clear that any 57 | patent must be licensed for everyone's free use or not licensed at all. 58 | 59 | The precise terms and conditions for copying, distribution and 60 | modification follow. 61 | 62 | GNU GENERAL PUBLIC LICENSE 63 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 64 | 65 | 0. This License applies to any program or other work which contains 66 | a notice placed by the copyright holder saying it may be distributed 67 | under the terms of this General Public License. The "Program", below, 68 | refers to any such program or work, and a "work based on the Program" 69 | means either the Program or any derivative work under copyright law: 70 | that is to say, a work containing the Program or a portion of it, 71 | either verbatim or with modifications and/or translated into another 72 | language. (Hereinafter, translation is included without limitation in 73 | the term "modification".) Each licensee is addressed as "you". 74 | 75 | Activities other than copying, distribution and modification are not 76 | covered by this License; they are outside its scope. The act of 77 | running the Program is not restricted, and the output from the Program 78 | is covered only if its contents constitute a work based on the 79 | Program (independent of having been made by running the Program). 80 | Whether that is true depends on what the Program does. 81 | 82 | 1. You may copy and distribute verbatim copies of the Program's 83 | source code as you receive it, in any medium, provided that you 84 | conspicuously and appropriately publish on each copy an appropriate 85 | copyright notice and disclaimer of warranty; keep intact all the 86 | notices that refer to this License and to the absence of any warranty; 87 | and give any other recipients of the Program a copy of this License 88 | along with the Program. 89 | 90 | You may charge a fee for the physical act of transferring a copy, and 91 | you may at your option offer warranty protection in exchange for a fee. 92 | 93 | 2. You may modify your copy or copies of the Program or any portion 94 | of it, thus forming a work based on the Program, and copy and 95 | distribute such modifications or work under the terms of Section 1 96 | above, provided that you also meet all of these conditions: 97 | 98 | a) You must cause the modified files to carry prominent notices 99 | stating that you changed the files and the date of any change. 100 | 101 | b) You must cause any work that you distribute or publish, that in 102 | whole or in part contains or is derived from the Program or any 103 | part thereof, to be licensed as a whole at no charge to all third 104 | parties under the terms of this License. 105 | 106 | c) If the modified program normally reads commands interactively 107 | when run, you must cause it, when started running for such 108 | interactive use in the most ordinary way, to print or display an 109 | announcement including an appropriate copyright notice and a 110 | notice that there is no warranty (or else, saying that you provide 111 | a warranty) and that users may redistribute the program under 112 | these conditions, and telling the user how to view a copy of this 113 | License. (Exception: if the Program itself is interactive but 114 | does not normally print such an announcement, your work based on 115 | the Program is not required to print an announcement.) 116 | 117 | These requirements apply to the modified work as a whole. If 118 | identifiable sections of that work are not derived from the Program, 119 | and can be reasonably considered independent and separate works in 120 | themselves, then this License, and its terms, do not apply to those 121 | sections when you distribute them as separate works. But when you 122 | distribute the same sections as part of a whole which is a work based 123 | on the Program, the distribution of the whole must be on the terms of 124 | this License, whose permissions for other licensees extend to the 125 | entire whole, and thus to each and every part regardless of who wrote it. 126 | 127 | Thus, it is not the intent of this section to claim rights or contest 128 | your rights to work written entirely by you; rather, the intent is to 129 | exercise the right to control the distribution of derivative or 130 | collective works based on the Program. 131 | 132 | In addition, mere aggregation of another work not based on the Program 133 | with the Program (or with a work based on the Program) on a volume of 134 | a storage or distribution medium does not bring the other work under 135 | the scope of this License. 136 | 137 | 3. You may copy and distribute the Program (or a work based on it, 138 | under Section 2) in object code or executable form under the terms of 139 | Sections 1 and 2 above provided that you also do one of the following: 140 | 141 | a) Accompany it with the complete corresponding machine-readable 142 | source code, which must be distributed under the terms of Sections 143 | 1 and 2 above on a medium customarily used for software interchange; or, 144 | 145 | b) Accompany it with a written offer, valid for at least three 146 | years, to give any third party, for a charge no more than your 147 | cost of physically performing source distribution, a complete 148 | machine-readable copy of the corresponding source code, to be 149 | distributed under the terms of Sections 1 and 2 above on a medium 150 | customarily used for software interchange; or, 151 | 152 | c) Accompany it with the information you received as to the offer 153 | to distribute corresponding source code. (This alternative is 154 | allowed only for noncommercial distribution and only if you 155 | received the program in object code or executable form with such 156 | an offer, in accord with Subsection b above.) 157 | 158 | The source code for a work means the preferred form of the work for 159 | making modifications to it. For an executable work, complete source 160 | code means all the source code for all modules it contains, plus any 161 | associated interface definition files, plus the scripts used to 162 | control compilation and installation of the executable. However, as a 163 | special exception, the source code distributed need not include 164 | anything that is normally distributed (in either source or binary 165 | form) with the major components (compiler, kernel, and so on) of the 166 | operating system on which the executable runs, unless that component 167 | itself accompanies the executable. 168 | 169 | If distribution of executable or object code is made by offering 170 | access to copy from a designated place, then offering equivalent 171 | access to copy the source code from the same place counts as 172 | distribution of the source code, even though third parties are not 173 | compelled to copy the source along with the object code. 174 | 175 | 4. You may not copy, modify, sublicense, or distribute the Program 176 | except as expressly provided under this License. Any attempt 177 | otherwise to copy, modify, sublicense or distribute the Program is 178 | void, and will automatically terminate your rights under this License. 179 | However, parties who have received copies, or rights, from you under 180 | this License will not have their licenses terminated so long as such 181 | parties remain in full compliance. 182 | 183 | 5. You are not required to accept this License, since you have not 184 | signed it. However, nothing else grants you permission to modify or 185 | distribute the Program or its derivative works. These actions are 186 | prohibited by law if you do not accept this License. Therefore, by 187 | modifying or distributing the Program (or any work based on the 188 | Program), you indicate your acceptance of this License to do so, and 189 | all its terms and conditions for copying, distributing or modifying 190 | the Program or works based on it. 191 | 192 | 6. Each time you redistribute the Program (or any work based on the 193 | Program), the recipient automatically receives a license from the 194 | original licensor to copy, distribute or modify the Program subject to 195 | these terms and conditions. You may not impose any further 196 | restrictions on the recipients' exercise of the rights granted herein. 197 | You are not responsible for enforcing compliance by third parties to 198 | this License. 199 | 200 | 7. If, as a consequence of a court judgment or allegation of patent 201 | infringement or for any other reason (not limited to patent issues), 202 | conditions are imposed on you (whether by court order, agreement or 203 | otherwise) that contradict the conditions of this License, they do not 204 | excuse you from the conditions of this License. If you cannot 205 | distribute so as to satisfy simultaneously your obligations under this 206 | License and any other pertinent obligations, then as a consequence you 207 | may not distribute the Program at all. For example, if a patent 208 | license would not permit royalty-free redistribution of the Program by 209 | all those who receive copies directly or indirectly through you, then 210 | the only way you could satisfy both it and this License would be to 211 | refrain entirely from distribution of the Program. 212 | 213 | If any portion of this section is held invalid or unenforceable under 214 | any particular circumstance, the balance of the section is intended to 215 | apply and the section as a whole is intended to apply in other 216 | circumstances. 217 | 218 | It is not the purpose of this section to induce you to infringe any 219 | patents or other property right claims or to contest validity of any 220 | such claims; this section has the sole purpose of protecting the 221 | integrity of the free software distribution system, which is 222 | implemented by public license practices. Many people have made 223 | generous contributions to the wide range of software distributed 224 | through that system in reliance on consistent application of that 225 | system; it is up to the author/donor to decide if he or she is willing 226 | to distribute software through any other system and a licensee cannot 227 | impose that choice. 228 | 229 | This section is intended to make thoroughly clear what is believed to 230 | be a consequence of the rest of this License. 231 | 232 | 8. If the distribution and/or use of the Program is restricted in 233 | certain countries either by patents or by copyrighted interfaces, the 234 | original copyright holder who places the Program under this License 235 | may add an explicit geographical distribution limitation excluding 236 | those countries, so that distribution is permitted only in or among 237 | countries not thus excluded. In such case, this License incorporates 238 | the limitation as if written in the body of this License. 239 | 240 | 9. The Free Software Foundation may publish revised and/or new versions 241 | of the General Public License from time to time. Such new versions will 242 | be similar in spirit to the present version, but may differ in detail to 243 | address new problems or concerns. 244 | 245 | Each version is given a distinguishing version number. If the Program 246 | specifies a version number of this License which applies to it and "any 247 | later version", you have the option of following the terms and conditions 248 | either of that version or of any later version published by the Free 249 | Software Foundation. If the Program does not specify a version number of 250 | this License, you may choose any version ever published by the Free Software 251 | Foundation. 252 | 253 | 10. If you wish to incorporate parts of the Program into other free 254 | programs whose distribution conditions are different, write to the author 255 | to ask for permission. For software which is copyrighted by the Free 256 | Software Foundation, write to the Free Software Foundation; we sometimes 257 | make exceptions for this. Our decision will be guided by the two goals 258 | of preserving the free status of all derivatives of our free software and 259 | of promoting the sharing and reuse of software generally. 260 | 261 | NO WARRANTY 262 | 263 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 264 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 265 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 266 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 267 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 268 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 269 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 270 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 271 | REPAIR OR CORRECTION. 272 | 273 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 274 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 275 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 276 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 277 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 278 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 279 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 280 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 281 | POSSIBILITY OF SUCH DAMAGES. 282 | 283 | END OF TERMS AND CONDITIONS 284 | 285 | How to Apply These Terms to Your New Programs 286 | 287 | If you develop a new program, and you want it to be of the greatest 288 | possible use to the public, the best way to achieve this is to make it 289 | free software which everyone can redistribute and change under these terms. 290 | 291 | To do so, attach the following notices to the program. It is safest 292 | to attach them to the start of each source file to most effectively 293 | convey the exclusion of warranty; and each file should have at least 294 | the "copyright" line and a pointer to where the full notice is found. 295 | 296 | 297 | Copyright (C) 298 | 299 | This program is free software; you can redistribute it and/or modify 300 | it under the terms of the GNU General Public License as published by 301 | the Free Software Foundation; either version 2 of the License, or 302 | (at your option) any later version. 303 | 304 | This program is distributed in the hope that it will be useful, 305 | but WITHOUT ANY WARRANTY; without even the implied warranty of 306 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 307 | GNU General Public License for more details. 308 | 309 | You should have received a copy of the GNU General Public License along 310 | with this program; if not, write to the Free Software Foundation, Inc., 311 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 312 | 313 | Also add information on how to contact you by electronic and paper mail. 314 | 315 | If the program is interactive, make it output a short notice like this 316 | when it starts in an interactive mode: 317 | 318 | Gnomovision version 69, Copyright (C) year name of author 319 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 320 | This is free software, and you are welcome to redistribute it 321 | under certain conditions; type `show c' for details. 322 | 323 | The hypothetical commands `show w' and `show c' should show the appropriate 324 | parts of the General Public License. Of course, the commands you use may 325 | be called something other than `show w' and `show c'; they could even be 326 | mouse-clicks or menu items--whatever suits your program. 327 | 328 | You should also get your employer (if you work as a programmer) or your 329 | school, if any, to sign a "copyright disclaimer" for the program, if 330 | necessary. Here is a sample; alter the names: 331 | 332 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 333 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 334 | 335 | , 1 April 1989 336 | Ty Coon, President of Vice 337 | 338 | This General Public License does not permit incorporating your program into 339 | proprietary programs. If your program is a subroutine library, you may 340 | consider it more useful to permit linking proprietary applications with the 341 | library. If this is what you want to do, use the GNU Lesser General 342 | Public License instead of this License. 343 | 344 | 345 | Other licensed work 346 | ------------------- 347 | - LDAP Admin 348 | GPLv2 349 | 350 | - PortableApps.comInstaller & PortableApps.comLauncher 351 | GPL, some MIT, some CC images, trademarks and trade dress not included) 352 | -------------------------------------------------------------------------------- /Other/Icons/full_support.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 22 | image/svg+xml 23 | 25 | 26 | 27 | 28 | 30 | 51 | 56 | 57 | -------------------------------------------------------------------------------- /Other/Icons/no_data.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 22 | image/svg+xml 23 | 25 | 26 | 27 | 28 | 30 | 51 | 55 | 56 | -------------------------------------------------------------------------------- /Other/Icons/no_support.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 22 | image/svg+xml 23 | 25 | 26 | 27 | 28 | 30 | 55 | 60 | 61 | -------------------------------------------------------------------------------- /Other/Icons/not_applicable.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 22 | image/svg+xml 23 | 25 | 26 | 27 | 28 | 30 | 51 | 55 | 59 | 60 | -------------------------------------------------------------------------------- /Other/Icons/probably_supported.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 22 | image/svg+xml 23 | 25 | 26 | 27 | 28 | 30 | 51 | 56 | 57 | -------------------------------------------------------------------------------- /Other/Images/howto_pa-upgrade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/Other/Images/howto_pa-upgrade.png -------------------------------------------------------------------------------- /Other/Images/howto_unblock-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/Other/Images/howto_unblock-file.png -------------------------------------------------------------------------------- /Other/Images/info_defender-protected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/Other/Images/info_defender-protected.png -------------------------------------------------------------------------------- /Other/Images/install_newapp_dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/Other/Images/install_newapp_dialog.png -------------------------------------------------------------------------------- /Other/Images/install_newapp_installation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/Other/Images/install_newapp_installation.png -------------------------------------------------------------------------------- /Other/Images/install_newapp_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uroesch/LdapAdminPortable/673b8db9d3466a9becde7137243771ab5a389dc3/Other/Images/install_newapp_menu.png -------------------------------------------------------------------------------- /Other/Source/AppNamePortable.ini: -------------------------------------------------------------------------------- 1 | AdditionalParameters= 2 | DisableSplashScreen=false 3 | RunLocally=false 4 | 5 | # The above options are explained in the included readme.txt 6 | # This INI file is an example only and is not used unless it is placed as described in the included readme.txt 7 | -------------------------------------------------------------------------------- /Other/Source/LauncherLicense.txt: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /Other/Source/Readme.txt: -------------------------------------------------------------------------------- 1 | The base application's source code is available from the portable app's 2 | homepage listed in the help.html file (if applicable). 3 | 4 | Details of most other things are available there as well. 5 | 6 | LICENSE 7 | ======= 8 | 9 | This package's installer and launcher are released under the GPL. The launcher 10 | is the PortableApps.com Launcher, available with full source and documentation 11 | from http://portableapps.com/development. We request that developers using the 12 | PortableApps.com Launcher please leave this directory intact and unchanged. 13 | 14 | USER CONFIGURATION 15 | ================== 16 | 17 | Some configuration in the PortableApps.com Launcher can be overridden by the 18 | user in an INI file next to **AppID**Portable.exe called **AppID**Portable.ini. 19 | If you are happy with the default options, it is not necessary, though. There 20 | is an example INI included with this package to get you started. To use it, 21 | copy AppNamePortable.ini from this directory to **AppID**Portable.ini next to 22 | **AppID**Portable.exe. The options in the INI file are as follows: 23 | 24 | AdditionalParameters= 25 | DisableSplashScreen=false 26 | RunLocally=false 27 | 28 | (There is no need for an INI header in this file; if you have one, though, it 29 | won't damage anything.) 30 | 31 | The AdditionalParameters entry allows you to pass additional command-line 32 | parameters to the application. 33 | 34 | The DisableSplashScreen entry allows you to run the launcher without the splash 35 | screen showing up. The default is false. 36 | 37 | The RunLocally entry allows you to run the portable application from a read- 38 | only medium. This is known as Live mode. It copies what it needs to to a 39 | temporary directory on the host computer, runs the application, and then 40 | deletes it afterwards, leaving nothing behind. This can be useful for running 41 | the application from a CD or if you work on a computer that may have spyware or 42 | viruses and you'd like to keep your device set to read-only. As a consequence 43 | of this technique, any changes you make during the Live mode session aren't 44 | saved back to your device. The default is false. 45 | 46 | There may be other values also permitted in the user configuration file by the 47 | portable application; refer to help.html for any details of them. 48 | -------------------------------------------------------------------------------- /Other/Update/IniConfig.psm1: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------------------- 2 | # Description: Module to read INI files 3 | # Author: Urs Roesch 4 | # Version: 0.3.0 5 | # ----------------------------------------------------------------------------- 6 | 7 | # ----------------------------------------------------------------------------- 8 | # Classes 9 | # ----------------------------------------------------------------------------- 10 | Class IniConfig { 11 | [String] $File 12 | [Object] $Struct 13 | [Bool] $Verbose = $False 14 | 15 | [String] FormatIni([Int] $Indent = 0) { 16 | $Config = @() 17 | ForEach ($Section in $This.Sections()) { 18 | If ($Config.Length -gt 0) { $Config += "" } 19 | $Config += "[$Section]" 20 | $Items = $This.Section($Section) 21 | $Length = $This.LongestItem($Items.Keys) 22 | ForEach ($Item in $Items.Keys) { 23 | $Config += "{0,$Indent}{1,-$Length} = {2}" -f "", $Item, $Items[$Item] 24 | } 25 | } 26 | Return $Config -Join "`n" 27 | } 28 | 29 | [Object] Sections() { 30 | Return $This.Struct.Keys 31 | } 32 | 33 | [Int] LongestItem([Array] $Items) { 34 | $Length = 0 35 | $Items | ForEach-Object { 36 | If ($_.Length -gt $Length) { 37 | $Length = $_.Length 38 | } 39 | } 40 | Return $Length 41 | } 42 | 43 | [Object] Section([String] $Key) { 44 | Return $This.Struct[$Key] 45 | } 46 | 47 | [Void] Dump() { 48 | Write-Host $This.FormatIni(4) 49 | } 50 | 51 | [Void] InsertSection([String] $Section) { 52 | $This.InsertSection($Section, [Ordered]@{}) 53 | } 54 | 55 | [Void] InsertSection([String] $Section, [Object] $Config) { 56 | $This.Struct.Insert(0, $Section.Trim(), $Config) 57 | } 58 | 59 | [Void] AddSection([String] $Section) { 60 | $This.AddSection($Section.Trim(), [Ordered]@{}) 61 | } 62 | 63 | [Void] AddSection([String] $Section, [Object] $Config) { 64 | $This.Struct.Add($Section.Trim(), $Config) 65 | } 66 | 67 | [Void] RemoveSection([String] $Section) { 68 | $This.Struct.Remove($Section.Trim()) 69 | } 70 | } 71 | 72 | Class WriteIniConfig : IniConfig { 73 | WriteIniConfig([String] $f) { 74 | $This.Init($f, [Ordered]@{}) 75 | } 76 | 77 | WriteIniConfig([String] $f, [Object] $s) { 78 | $This.Init($f, $s) 79 | } 80 | 81 | [Void] Init([String] $File, [Object] $Struct) { 82 | $This.File = $File 83 | $This.Struct = $Struct 84 | } 85 | 86 | [Void] Commit() { 87 | $Content = $This.FormatIni(0) 88 | try { 89 | Set-Content -Path $This.File -Value $Content 90 | } 91 | catch { 92 | Write-Host $_ 93 | } 94 | } 95 | } 96 | 97 | Class ReadIniConfig : IniConfig { 98 | [Bool] $Parsed = $False 99 | 100 | ReadIniConfig( 101 | [String] $f 102 | ) { 103 | $This.File = $f 104 | $This.Parse() 105 | } 106 | 107 | [Void] Parse() { 108 | If ($This.Parsed) { return } 109 | $Content = Get-Content $This.File 110 | $Section = '' 111 | $This.Struct = [Ordered]@{} 112 | Foreach ($Line in $Content) { 113 | Switch -regex ($Line) { 114 | "^\s*;" { 115 | Continue 116 | } 117 | "^\s*\[" { 118 | $Section = $Line -replace "[\[\]]", "" 119 | $This.AddSection($Section) 120 | } 121 | ".*=.*" { 122 | ($Name, $Value) = $Line.split("=") 123 | $This.Struct[$Section] += @{ $Name.Trim() = $Value.Trim() } 124 | } 125 | } 126 | } 127 | $This.Parsed = $True 128 | } 129 | } 130 | # ----------------------------------------------------------------------------- 131 | # Functions 132 | # ----------------------------------------------------------------------------- 133 | Function Read-IniFile { 134 | param( 135 | [Parameter(Mandatory)] 136 | [String] $IniFile 137 | ) 138 | Return [ReadIniConfig]::new($IniFile) 139 | } 140 | 141 | Function Write-IniFile { 142 | param( 143 | [Parameter(Mandatory)] 144 | [String] $IniFile, 145 | [Object] $Struct = [Ordered]@{} 146 | ) 147 | Return [WriteIniConfig]::new($IniFile, $Struct) 148 | } 149 | 150 | # ----------------------------------------------------------------------------- 151 | # Export 152 | # ----------------------------------------------------------------------------- 153 | Export-ModuleMember -Function Read-IniFile 154 | Export-ModuleMember -Function Write-IniFile 155 | -------------------------------------------------------------------------------- /Other/Update/Initialize.ps1: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env pwsh 2 | 3 | # ----------------------------------------------------------------------------- 4 | # Modules 5 | # ----------------------------------------------------------------------------- 6 | Using module ".\PortableAppsCommon.psm1" 7 | 8 | 9 | # ----------------------------------------------------------------------------- 10 | # Globals 11 | # ----------------------------------------------------------------------------- 12 | $Version = "0.0.2-alpha" 13 | $Debug = $True 14 | $Files = @( 15 | (Join-Path $AppRoot help.html) 16 | (Join-Path $AppRoot README.md) 17 | (Join-Path $AppRoot LICENSE) 18 | $AppInfoIni 19 | $UpdateIni 20 | ) 21 | 22 | $Placeholders = @{ 23 | AppName = @{ 24 | Message = 'Application name e.g. "FooPortable"' 25 | Value = '' 26 | } 27 | AppNameSpaced = @{ 28 | Message = 'Application name with spaces e.g. "Foo Portable"' 29 | Value = '' 30 | } 31 | UpstreamPublisher = @{ 32 | Message = 'Publishers name e.g. "ACME Ltd."' 33 | Value = '' 34 | } 35 | UpstreamUrl = @{ 36 | Message = "Upstream project's URL. e.g. `"https://acme.ltd/foo`"" 37 | Value = '' 38 | } 39 | UpstreamName = @{ 40 | Message = 'Upstream name e.g. "Foo"' 41 | Value = '' 42 | } 43 | UpstreamDescription = @{ 44 | Message = 'App description e.g. "Best app ever..."' 45 | Value = '' 46 | } 47 | UpstreamLicense = @{ 48 | Message = 'Upstream license e.g. "GPL2", "MIT", "BSD"...' 49 | Value = '' 50 | } 51 | Category = @{ 52 | Message = 'App category e.g. "Utilities"' 53 | Value = 'Utilities' 54 | } 55 | Language = @{ 56 | Message = 'Installer language e.g. "Multilingual"' 57 | Value = 'Multilingual' 58 | } 59 | PackageVersion = @{ 60 | Message = 'Package version 4 digits delimited by dot e.g. "1.2.3.0"' 61 | Value = '' 62 | } 63 | DisplayVersion = @{ 64 | Message = 'Display version e.g. "1.2.3-beta1-uroesch"' 65 | Value = '' 66 | } 67 | UpstreamVersion = @{ 68 | Message = 'Upstream version e.g. "1.2.3"' 69 | Value = '' 70 | } 71 | AppProjectUrl = @{ 72 | Message = 'App project URL e.g. "https://github.com/uroesch/FooPortable"' 73 | Value = '' 74 | } 75 | GitHubUser = @{ 76 | Message = 'GitHubUser e.g. "uroesch"' 77 | Value = '' 78 | } 79 | } 80 | 81 | # ----------------------------------------------------------------------------- 82 | # Functions 83 | # ----------------------------------------------------------------------------- 84 | Function Assign-Placeholder() { 85 | Param( 86 | [String] $Key, 87 | [String] $Value 88 | ) 89 | Try { 90 | $Placeholders[$Key]['Value'] = $Value 91 | Debug info "Placeholder '$Key' set to '$Value'" 92 | } 93 | Catch { 94 | Debug Error "Failed to assign placeholder '$Key' to '$Value'" 95 | Error 124 96 | } 97 | } 98 | 99 | Function Replace-Placeholder() { 100 | Param( 101 | [String] $Key, 102 | [String] $Content 103 | ) 104 | $Pattern = "{{ $Key }}" 105 | $Value = $Placeholders[$Key].Value 106 | If ($Content -match $Pattern) { 107 | $Content = $Content -replace $Pattern, $Value 108 | Debug info "Replace '$Pattern' with '$Value'" 109 | } 110 | $Content 111 | } 112 | 113 | Function Replace-Placeholders() { 114 | Foreach ($Path in $Files) { 115 | $Content = Get-Content -Path $Path -Raw 116 | $Placeholders.Keys | ForEach { 117 | If ($Placeholders[$_].Value -ne "") { 118 | $Content = Replace-Placeholder -Key $_ -Content $Content 119 | } 120 | } 121 | Set-Content -Value $Content -Path $Path -Encoding utf-8 122 | } 123 | } 124 | 125 | 126 | Function Check-Initial() { 127 | If ($AppName -notmatch 'Portable$') { 128 | Debug error "App directory '$AppName' does not end with 'Portable'" 129 | Exit 123 130 | } 131 | $AppNameSpaced = $AppName -replace "Portable$", " Portable" 132 | $UpstreamName = $AppName -replace "Portable$", "" 133 | Assign-Placeholder -Key AppName -Value $AppName 134 | Assign-Placeholder -Key AppNameSpaced -Value $AppNameSpaced 135 | Assign-Placeholder -Key UpstreamName -Value $UpstreamName 136 | } 137 | 138 | Function Rename-Launcher() { 139 | $DefaultLauncher = Join-Path $LauncherDir Rename-to-AppName.ini 140 | If (Test-Path $DefaultLauncher) { 141 | Debug info "Rename '$DefaultLauncher' to '$LauncherIni'" 142 | Move-Item -Path $DefaultLauncher -Destination $LauncherIni 143 | } 144 | } 145 | 146 | Function Query-GitOrigin() { 147 | $Origin = git config --get remote.origin.url 148 | If ($Origin -match '^http') { 149 | # extract the project url 150 | $Origin = $Origin -replace ".git$", "" 151 | Assign-Placeholder -Key AppProjectUrl -Value $Origin 152 | # extract github user 153 | $GitHubUser = $Origin -replace "/$AppName$", "" -replace ".*/", "" 154 | Assign-Placeholder -Key GitHubUser -Value $GitHubUser 155 | } 156 | } 157 | 158 | Function Ask-Question() { 159 | Param( 160 | [String] $Key 161 | ) 162 | $Value = $Placeholders[$Key].Value 163 | $Prompt = "`nPlaceholer {0} {1}`nDefault [{2}]" -f ` 164 | $Key, $Placeholders[$Key].Message, $Value 165 | $Result = Read-Host -Prompt $Prompt 166 | $Result = $Result.Trim() 167 | If ($Result -ne '') { 168 | Assign-Placeholder -Key $Key -Value $Result 169 | Return 170 | } 171 | ElseIf ($Value -ne '' -and $Result -eq '') { 172 | Return 173 | } 174 | ElseIf ($Value -eq '' -and $Result -eq '') { 175 | Ask-Question -Key $Key 176 | } 177 | } 178 | 179 | Function Questionaire() { 180 | $Placeholders.Keys | Sort-Object | %{ 181 | Ask-Question -Key $_ 182 | } 183 | } 184 | 185 | # ----------------------------------------------------------------------------- 186 | # Functions 187 | # ----------------------------------------------------------------------------- 188 | Check-Initial 189 | Rename-Launcher 190 | Query-GitOrigin 191 | Questionaire 192 | Replace-Placeholders 193 | -------------------------------------------------------------------------------- /Other/Update/PA-Upgrade.ps1: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------------------- 2 | # Description: Generic Update Script for PortableApps 3 | # Author: Urs Roesch 4 | # ----------------------------------------------------------------------------- 5 | 6 | # ----------------------------------------------------------------------------- 7 | # Modules 8 | # ----------------------------------------------------------------------------- 9 | Using module ".\PortableAppsCommon.psm1" 10 | Using module ".\IniConfig.psm1" 11 | 12 | # ----------------------------------------------------------------------------- 13 | # Parameters 14 | # ----------------------------------------------------------------------------- 15 | Param( 16 | [Switch] $Force 17 | ) 18 | 19 | # ----------------------------------------------------------------------------- 20 | # Globals 21 | # ----------------------------------------------------------------------------- 22 | $Version = "0.0.8-alpha" 23 | $Debug = $True 24 | $RestUrl = "https://api.github.com/repos/uroesch/{0}/releases" -f $AppName 25 | $Config = Read-IniFile -IniFile $AppInfoIni 26 | 27 | # ----------------------------------------------------------------------------- 28 | # Functions 29 | # ----------------------------------------------------------------------------- 30 | Function Fetch-InstalledVersion() { 31 | Try { 32 | $Version = $Config.Section("Version")["DisplayVersion"] 33 | If ($Version.Length -eq 0 ) { Throw } 34 | Return $Version 35 | } 36 | Catch { 37 | Debug error "Failed to parse version $AppInfoIni file" 38 | Return '0.0.0' 39 | } 40 | } 41 | 42 | # ----------------------------------------------------------------------------- 43 | Function Fetch-LatestVersion() { 44 | Try { 45 | $Version = (Fetch-LatestRelease).name -replace "^v", "" 46 | If ($Version.Length -eq 0 ) { Throw } 47 | Return $Version 48 | } 49 | Catch { 50 | Debug error "Failed to parse github release version" 51 | exit 121 52 | } 53 | } 54 | 55 | # ----------------------------------------------------------------------------- 56 | Function Fetch-LatestRelease() { 57 | Try { 58 | (Invoke-RestMethod -Uri $RestUrl)[0] 59 | } 60 | Catch { 61 | Debug error "Failed to fetch latest release of '$AppName'" 62 | exit 122 63 | } 64 | } 65 | 66 | # ----------------------------------------------------------------------------- 67 | Function Fetch-InstallerLink() { 68 | Debug info "Fetching installer download URL '$RestUrl'" 69 | Try { 70 | (Fetch-LatestRelease).assets | ForEach-Object { 71 | If ($_.name -Match "$AppName.*.paf.exe$") { 72 | Debug info "Download link is $($_.browser_download_url)" 73 | Return $_.browser_download_url 74 | } 75 | } 76 | } 77 | Catch { 78 | Debug error "Failed to download and parse release information" 79 | Exit 123 80 | } 81 | } 82 | 83 | # ----------------------------------------------------------------------------- 84 | Function Download-Release { 85 | $DownloadDir = "$AppRoot\Download" 86 | $InstallerLink = Fetch-InstallerLink 87 | $InstallerFile = "$DownloadDir\" + ($InstallerLink.split("/"))[-1] 88 | 89 | If (!(Test-Path $DownloadDir)) { 90 | New-Item -Path $DownloadDir -ItemType directory 91 | } 92 | 93 | If (Test-Path $InstallerFile) { 94 | Debug info "File '$InstallerFile' is already present; Skipping" 95 | Return $InstallerFile 96 | } 97 | 98 | Debug info "Downloading Installer from '$InstallerLink'" 99 | Try { 100 | Invoke-WebRequest ` 101 | -Uri $InstallerLink ` 102 | -OutFile "$InstallerFile.part" | Out-Null 103 | Move-Item "$InstallerFile.part" $InstallerFile 104 | } 105 | Catch { 106 | Debug error "Failed to download '$InstallerLink'" 107 | Exit 125 108 | } 109 | 110 | Return $InstallerFile 111 | } 112 | 113 | # ----------------------------------------------------------------------------- 114 | Function Invoke-Installer() { 115 | param( 116 | [string] $Command 117 | ) 118 | Set-Location "$AppRoot\.." 119 | $PARoot = (Get-Location) 120 | $Arguments = @( 121 | "/AUTOCLOSE=true ", 122 | "/DESTINATION=""$(ConvertTo-WindowsPath $PARoot)\\""" 123 | ) 124 | # Addtional Switches for paf.exe 125 | # /HIDEINSTALLER=true 126 | # /SILENT=true 127 | 128 | Switch (Test-Unix) { 129 | $True { 130 | $Arguments = "$Command $($Arguments -join " ")" 131 | $Command = "wine" 132 | break 133 | } 134 | default { } 135 | } 136 | 137 | Debug info "Run PA $Command $Arguments" 138 | Start-Process $Command -ArgumentList $Arguments -NoNewWindow -Wait 139 | } 140 | 141 | # ----------------------------------------------------------------------------- 142 | Function Check-Version { 143 | $CurrentVersion = Fetch-InstalledVersion 144 | $LatestVersion = Fetch-LatestVersion 145 | 146 | If ($CurrentVersion -eq $LatestVersion) { 147 | Debug info "Current version and latest release one are the same." 148 | Exit 124 149 | } 150 | } 151 | 152 | # ----------------------------------------------------------------------------- 153 | Function Find-RunningApps() { 154 | Get-Process | ` 155 | Where-Object { $_.Path -match [Regex]::Escape($AppRoot) } | ` 156 | Select-Object -Property Name, Id 157 | } 158 | 159 | # ----------------------------------------------------------------------------- 160 | Function Shutdown-RunningApps() { 161 | $Running = Find-RunningApps 162 | Debug info $Force 163 | If ($Running.Count -gt 0 -and $Force -eq $False) { 164 | Debug error "Found running $AppName applications, close them first!" 165 | exit 1 166 | } 167 | 168 | $Running | ForEach-Object { 169 | Debug info "Stopping application $($_.Name) with PID $($_.Id)" 170 | Stop-Process -Id $_.Id -ErrorAction SilentlyContinue | Out-Null 171 | Sleep 1 172 | Stop-Process -Force -Id $_.Id -ErrorAction SilentlyContinue | Out-Null 173 | } 174 | } 175 | 176 | # ----------------------------------------------------------------------------- 177 | Function Install-Release() { 178 | $Installer = Download-Release 179 | Invoke-Installer -Command $Installer 180 | } 181 | 182 | # ----------------------------------------------------------------------------- 183 | # Main 184 | # ----------------------------------------------------------------------------- 185 | Check-Version 186 | Shutdown-RunningApps 187 | Install-Release 188 | -------------------------------------------------------------------------------- /Other/Update/PortableAppsCommon.psm1: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------------------- 2 | # Description: Common classes and functions for portable apps powershell 3 | # scripts 4 | # Author: Urs Roesch 5 | # Version: 0.9.5 6 | # ----------------------------------------------------------------------------- 7 | 8 | # ----------------------------------------------------------------------------- 9 | # Globals 10 | # ----------------------------------------------------------------------------- 11 | $AppRoot = $(Convert-Path "$PSScriptRoot\..\..") 12 | $AppName = (Get-Item $AppRoot).Basename 13 | $AppDir = Join-Path $AppRoot App 14 | $DownloadDir = Join-Path $AppRoot Download 15 | $AppInfoDir = Join-Path $AppDir AppInfo 16 | $LauncherDir = Join-Path $AppInfoDir Launcher 17 | $AppInfoIni = Join-Path $AppInfoDir appinfo.ini 18 | $UpdateIni = Join-Path $AppInfoDir update.ini 19 | $LauncherIni = Join-Path $LauncherDir "$AppName.ini" 20 | $InfraDirDefault = $(Convert-Path "$AppRoot\..") 21 | 22 | # ----------------------------------------------------------------------------- 23 | # Classes 24 | # ----------------------------------------------------------------------------- 25 | Class Download { 26 | [string] $URL 27 | [string] $ExtractName 28 | [string] $TargetName 29 | [string] $Checksum 30 | [string] $AppRoot = $(Convert-Path "$PSScriptRoot\..\..") 31 | [string] $DownloadDir = $(Switch-Path "$($This.AppRoot)\Download") 32 | 33 | Download( 34 | [string] $u, 35 | [string] $en, 36 | [string] $tn, 37 | [string] $c 38 | ){ 39 | $This.URL = $u 40 | $This.ExtractName = $en 41 | $This.TargetName = $tn 42 | $This.Checksum = $c 43 | } 44 | 45 | [string] Basename() { 46 | $Elements = ($This.URL.split('?'))[0].split('/') 47 | $Basename = $Elements[$($Elements.Length-1)] 48 | return $Basename 49 | } 50 | 51 | [string] ExtractTo() { 52 | # If Extract name is empty the downloaded archive has all files 53 | # placed in the root of the archive. In that case we use the 54 | # TargetName and and attach it to the script location 55 | If ($This.ExtractName -eq "") { 56 | return $(Switch-Path "$($This.DownloadDir)\$($This.TargetName)") 57 | } 58 | return $This.DownloadDir 59 | } 60 | 61 | [string] MoveFrom() { 62 | If ($This.ExtractName -eq "") { 63 | return $(Switch-Path "$($This.DownloadDir)\$($This.TargetName)") 64 | } 65 | return $(Switch-Path "$($This.DownloadDir)\$($This.ExtractName)") 66 | } 67 | 68 | [string] MoveTo() { 69 | return $(Switch-Path "$($This.AppRoot)\App\$($This.TargetName)") 70 | } 71 | 72 | [string] OutFile() { 73 | return $(Switch-Path "$($This.DownloadDir)\$($This.Basename())") 74 | } 75 | } 76 | 77 | # ----------------------------------------------------------------------------- 78 | # Function 79 | # ----------------------------------------------------------------------------- 80 | Function Test-Unix() { 81 | ($PSScriptRoot)[0] -eq '/' 82 | } 83 | 84 | # ----------------------------------------------------------------------------- 85 | Function ConvertTo-WindowsPath() { 86 | param( [string] $Path ) 87 | If (!(Test-Unix)) { return $Path } 88 | $WinPath = & winepath --windows $Path 2>/dev/null 89 | Return $WinPath 90 | } 91 | 92 | # ----------------------------------------------------------------------------- 93 | Function Switch-Path() { 94 | # Convert Path only Works on Existing Directories :( 95 | Param( [string] $Path ) 96 | Switch (Test-Unix) { 97 | $True { 98 | $From = '\' 99 | $To = '/' 100 | break; 101 | } 102 | default { 103 | $From = '/' 104 | $To = '\' 105 | } 106 | } 107 | $Path = $Path.Replace($From, $To) 108 | Return $Path 109 | } 110 | 111 | # ----------------------------------------------------------------------------- 112 | Function Debug() { 113 | param( 114 | [string] $Severity, 115 | [string] $Message 116 | ) 117 | $Color = 'White' 118 | $Severity = $Severity.ToUpper() 119 | Switch ($Severity) { 120 | 'INFO' { $Color = 'Green'; break } 121 | 'WARN' { $Color = 'Yellow'; break } 122 | 'ERROR' { $Color = 'DarkYellow'; break } 123 | 'FATAL' { $Color = 'Red'; break } 124 | default { $Color = 'White'; break } 125 | } 126 | If (!($Debug)) { return } 127 | Write-Host "$(Get-Date -Format u) - " -NoNewline 128 | Write-Host $Severity": " -NoNewline -ForegroundColor $Color 129 | Write-Host "$AppName - " -NoNewline 130 | Write-Host $Message.Replace($(Switch-Path "$AppRoot\"), '') 131 | } 132 | 133 | # ----------------------------------------------------------------------------- 134 | Function Download-Checksum() { 135 | Param( 136 | [String] $Uri, 137 | [String] $File 138 | ) 139 | Try { 140 | $Pattern = "[A-Fa-f0-9]{32,}" 141 | $OutFile = Join-Path $DownloadDir ($Uri.Split("/"))[-1] 142 | Debug debug "Downloading checksum file from $Uri" 143 | Invoke-WebRequest -Uri $Uri -OutFile $OutFile 144 | Foreach ($Line in (Get-Content -Path $OutFile)) { 145 | $Line = $Line.Trim() 146 | Switch -regex ($Line) { 147 | "^[A-Fa-f0-9 ]{32,}$" { 148 | # Apache Directory Studio 149 | Return $Line -replace "\s+", "" 150 | } 151 | "^$Pattern$" { 152 | # Single line file with checksum only 153 | Return $Line 154 | } 155 | "^$File\s+$Pattern$" { 156 | # Multiline file with file name prefix 157 | Return $Line -replace "$File\s+($Pattern)", "`$1" 158 | } 159 | "^$Pattern\s+\*?$File$" { 160 | # Multiline file with file name suffix 161 | Return $Line -replace "^($Pattern)\s+\*?$File", "`$1" 162 | } 163 | "^$Pattern\s+.+/$File$" { 164 | # Multiline file with multiple entries e.g. putty 165 | # 2f49ec1e6c35e10c.... w32/putty.zip 166 | Return $Line -replace "^($Pattern)\s+.*", "`$1" 167 | } 168 | default { 169 | Debug debug "No match in line '$Line'" 170 | } 171 | } 172 | } 173 | } 174 | Catch { 175 | Debug error "Unable to download checksum from URL '$Uri'" 176 | Exit 124 177 | } 178 | } 179 | 180 | # ----------------------------------------------------------------------------- 181 | 182 | # ----------------------------------------------------------------------------- 183 | Function Compare-Checksum { 184 | param( 185 | [string] $Path, 186 | [string] $Checksum 187 | ) 188 | 189 | Debug debug "Compare-Checksum -> -Path $Path -Checksum $Checksum" 190 | # The somewhat involved split is here to make it compatible with win10 191 | ($Algorithm, $Sum) = ($Checksum -replace '::', "`n").Split("`n") 192 | If ($Sum -like 'http*') { 193 | $Sum = Download-Checksum -Uri $Sum -File (Get-Item $Path).Name 194 | $Checksum = $Algorithm + "::" + $Sum 195 | Debug debug "Checksum from download: $Checksum" 196 | } 197 | Debug debug "Get-Checksum -Path $Path -Algorithm $Algorithm" 198 | $Result = Get-Checksum -Path $Path -Algorithm $Algorithm 199 | Debug info "Checksum of INI ($($Checksum.ToUpper())) and download ($Result)" 200 | Return ($Checksum.ToUpper() -eq $Result) 201 | } 202 | 203 | # ----------------------------------------------------------------------------- 204 | Function Get-Checksum { 205 | Param( 206 | [string] $Path, 207 | [string] $Algorithm 208 | ) 209 | Debug debug "Get-FileHash -Path $Path -Algorithm $Algorithm" 210 | $Hash = (Get-FileHash -Path $Path -Algorithm $Algorithm).Hash 211 | Return ($Algorithm + "::" + $Hash).ToUpper() 212 | } 213 | 214 | # ----------------------------------------------------------------------------- 215 | Function Update-Checksum { 216 | Param( 217 | [string] $Path, 218 | [string] $Checksum 219 | ) 220 | Debug debug "Update-Checksum -> -Path $Path -Checksum $Checksum" 221 | ($Algorithm, $Sum) = ($Checksum -replace '::', "`n").Split("`n") 222 | If ($Sum -like 'http*') { Return $Checksum } 223 | Debug debug "Get-Checksum -Path $Path -Algorithm $Algorithm" 224 | $NewChecksum = Get-Checksum -Path $Path -Algorithm $Algorithm 225 | Get-Content -Path $UpdateIni | ` 226 | Foreach-Object { $_ -Replace $Checksum, $NewChecksum } | ` 227 | Set-Content -Path $UpdateIni 228 | Return $NewChecksum 229 | } 230 | 231 | # ----------------------------------------------------------------------------- 232 | # Export 233 | # ----------------------------------------------------------------------------- 234 | Export-ModuleMember -Function Test-Unix 235 | Export-ModuleMember -Function ConvertTo-WindowsPath 236 | Export-ModuleMember -Function Switch-Path 237 | Export-ModuleMember -Function Compare-Checksum 238 | Export-ModuleMember -Function Get-Checksum 239 | Export-ModuleMember -Function Update-Checksum 240 | Export-ModuleMember -Function Debug 241 | Export-ModuleMember -Variable AppRoot 242 | Export-ModuleMember -Variable AppName 243 | Export-ModuleMember -Variable AppDir 244 | Export-ModuleMember -Variable DownloadDir 245 | Export-ModuleMember -Variable AppInfoDir 246 | Export-ModuleMember -Variable LauncherDir 247 | Export-ModuleMember -Variable AppInfoIni 248 | Export-ModuleMember -Variable UpdateIni 249 | Export-ModuleMember -Variable LauncherIni 250 | Export-ModuleMember -Variable InfraDirDefault 251 | -------------------------------------------------------------------------------- /Other/Update/Update.ps1: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env powershell 2 | # ----------------------------------------------------------------------------- 3 | # Description: Generic Update Script for PortableApps 4 | # Author: Urs Roesch 5 | # ----------------------------------------------------------------------------- 6 | 7 | <# 8 | .SYNOPSIS 9 | Update and build a new release of a PortableApps application installer. 10 | 11 | .DESCRIPTION 12 | A script to automate the tedious process of building the application 13 | installers for PortableApps. 14 | The scripts does get the instructions from the custom ini file 15 | located under /App/AppInfo/update.ini 16 | 17 | .PARAMETER UpdateChecksums 18 | Updates the ini files Checksums with the one of the newly downloaded 19 | upstream version. 20 | 21 | .PARAMETER InfraDir 22 | Override the default directory where the build infrastructure resides. 23 | E.g the Launcher and Installer packages from PortableApps.com. 24 | #> 25 | 26 | 27 | # ----------------------------------------------------------------------------- 28 | # Modules 29 | # ----------------------------------------------------------------------------- 30 | Using module ".\PortableAppsCommon.psm1" 31 | Using module ".\IniConfig.psm1" 32 | 33 | Param( 34 | [Switch] $UpdateChecksums, 35 | [String] $InfraDir = $InfraDirDefault 36 | ) 37 | # ----------------------------------------------------------------------------- 38 | # Globals 39 | # ----------------------------------------------------------------------------- 40 | $Version = "0.0.36-alpha" 41 | $Debug = $True 42 | 43 | # ----------------------------------------------------------------------------- 44 | # Functions 45 | # ----------------------------------------------------------------------------- 46 | Function Which-7Zip() { 47 | $Locations = $env:PATH.Split([IO.Path]::PathSeparator) 48 | $Locations += @( 49 | "$Env:ProgramFiles\7-Zip", 50 | "$Env:ProgramFiles(x86)\7-Zip", 51 | "$AppRoot\..\7-ZipPortable\App\7-Zip", 52 | "$AppRoot\..\PortableApps.comInstaller\App\7zip" 53 | ) 54 | Switch (Test-Unix) { 55 | $True { $Binary = '7z'; break; } 56 | default { $Binary = '7z.exe' } 57 | } 58 | Foreach ($Location in $Locations) { 59 | $Fullpath = Join-Path $Location $Binary 60 | # There is get command but this way it works with relative pathes 61 | If (Test-Path $Fullpath) { 62 | Return $Fullpath 63 | } 64 | } 65 | If (!($Path)) { 66 | Debug fatal "Could not locate $Binary" 67 | Exit 76 68 | } 69 | } 70 | 71 | # ----------------------------------------------------------------------------- 72 | Function Check-Sum { 73 | param( 74 | [object] $Download 75 | ) 76 | If ($UpdateChecksums) { 77 | $Download.Checksum = Update-Checksum ` 78 | -Path $Download.OutFile() ` 79 | -Checksum $Download.Checksum 80 | } 81 | Return Compare-Checksum ` 82 | -Checksum $Download.Checksum ` 83 | -Path $Download.OutFile() 84 | } 85 | 86 | # ----------------------------------------------------------------------------- 87 | Function Download-File { 88 | param( 89 | [object] $Download 90 | ) 91 | # hide progress bar 92 | $Global:ProgressPreference = 'silentlyContinue' 93 | If (!(Test-Path $Download.DownloadDir)) { 94 | Debug info "Create directory $($Download.DownloadDir)" 95 | New-Item -Path $Download.DownloadDir -Type directory | Out-Null 96 | } 97 | If (!(Test-Path $Download.OutFile())) { 98 | Try { 99 | Debug info "Download URL $($Download.URL) to $($Download.OutFile()).part" 100 | # iwr Does not work for sourceforge.net :( so we use this construct 101 | $Downloader = New-Object System.Net.WebClient 102 | $Downloader.DownloadFile($Download.URL, "$($Download.OutFile()).part") 103 | 104 | Debug info "Move file $($Download.OutFile()).part to $($Download.OutFile())" 105 | Move-Item -Path "$($Download.OutFile()).part" ` 106 | -Destination $Download.OutFile() 107 | } 108 | Catch { 109 | Debug fatal "Failed to download URL $($Download.URL)" 110 | Exit 1 111 | } 112 | } 113 | If (!(Check-Sum -Download $Download)) { 114 | Debug fatal "Checksum for $($Download.OutFile()) " ` 115 | "does not match '$($Donwload.Checksum)'" 116 | Exit 1 117 | } 118 | Debug info "Downloaded file '$($Download.OutFile())'" 119 | } 120 | 121 | # ----------------------------------------------------------------------------- 122 | Function Expand-Download { 123 | param( 124 | [object] $Download 125 | ) 126 | If (!(Test-Path $Download.ExtractTo())) { 127 | Debug info "Create extract directory $($Download.ExtractTo())" 128 | New-Item -Path $Download.ExtractTo() -Type "directory" | Out-Null 129 | } 130 | Debug info "Extract $($Download.OutFile()) to $($Download.ExtractTo())" 131 | Expand-Archive -LiteralPath $Download.OutFile() ` 132 | -DestinationPath $Download.ExtractTo() -Force 133 | } 134 | 135 | # ----------------------------------------------------------------------------- 136 | Function Expand-7Zip { 137 | param( 138 | [object] $Download 139 | ) 140 | $7ZipExe = $(Which-7Zip) 141 | If (!(Test-Path $Download.ExtractTo())) { 142 | Debug info "Create extract directory $($Download.ExtractTo())" 143 | New-Item -Path $Download.ExtractTo() -Type "directory" | Out-Null 144 | } 145 | Debug info "Extract $($Download.OutFile()) to $($Download.ExtractTo())" 146 | $Command = "$7ZipExe x -r -y " + 147 | " -o""$($Download.ExtractTo())"" " + 148 | " ""$($Download.OutFile())""" 149 | Debug info "Running command '$Command'" 150 | Invoke-Expression $Command | Out-Null 151 | } 152 | 153 | # ----------------------------------------------------------------------------- 154 | Function Update-Release { 155 | param( 156 | [object] $Download 157 | ) 158 | Switch -regex ($Download.Basename()) { 159 | '\.zip$' { 160 | Expand-Download -Download $Download 161 | break 162 | } 163 | '\.7z.exe$' { 164 | Expand-7Zip -Download $Download 165 | break 166 | } 167 | } 168 | If (Test-Path $Download.MoveTo()) { 169 | Debug info "Cleanup $($Download.MoveTo())" 170 | Remove-Item -Path $Download.MoveTo() ` 171 | -Force ` 172 | -Recurse 173 | } 174 | # Create destination Directory if not exist 175 | $MoveBaseDir = $Download.MoveTo() | Split-Path 176 | If (!(Test-Path $MoveBaseDir)) { 177 | Debug info "Create directory $MoveBaseDir prior to moving items" 178 | New-Item -Path $MoveBaseDir -Type "directory" | Out-Null 179 | } 180 | Debug info ` 181 | "Move release from $($Download.MoveFrom()) to $($Download.MoveTo())" 182 | Move-Item -Path $Download.MoveFrom() ` 183 | -Destination $Download.MoveTo() ` 184 | -Force 185 | } 186 | 187 | # ----------------------------------------------------------------------------- 188 | Function Update-Appinfo() { 189 | $Version = $Config.Section("Version") 190 | $AppInfo = Read-IniFile -IniFile $AppInfoIni 191 | $AppInfo.Section("Version")["PackageVersion"] = $Version["Package"] 192 | $AppInfo.Section("Version")["DisplayVersion"] = $Version["Display"] 193 | (Write-IniFile -IniFile $AppInfoIni -Struct $AppInfo.Struct).Commit() 194 | } 195 | 196 | # ----------------------------------------------------------------------------- 197 | Function Update-Application() { 198 | $Archive = $Config.Section('Archive') 199 | $Position = 1 200 | While ($True) { 201 | If (-Not ($Archive.Contains("URL$Position"))) { 202 | Break 203 | } 204 | $Download = [Download]::new( 205 | $Archive["URL$Position"], 206 | $Archive["ExtractName$Position"], 207 | $Archive["TargetName$Position"], 208 | $Archive["Checksum$Position"] 209 | ) 210 | Download-File -Download $Download 211 | Update-Release -Download $Download 212 | $Position += 1 213 | } 214 | } 215 | 216 | # ----------------------------------------------------------------------------- 217 | Function Source-InstallScript() { 218 | Param( 219 | [String] $Mode 220 | ) 221 | $Script = "$PSScriptRoot\$Mode.ps1" 222 | If (Test-Path $Script) { 223 | . $Script 224 | } 225 | } 226 | 227 | # ----------------------------------------------------------------------------- 228 | Function Create-AdditionalLaunchers() { 229 | $Control = (Read-IniFile -IniFile $AppInfoIni).Section("Control") 230 | $Counter = 2 231 | $Icons = $Control.Item("Icons") 232 | $PALDir = Join-Path $InfraDir "PortableApps.comLauncher" 233 | $Nsis = [System.IO.Path]::Combine($PALDir, 'App', 'NSIS', 'makensis.exe') 234 | $Script = "$PALDir\Other\Source\PortableApps.comLauncher.nsi" 235 | $Options = @( 236 | "/O""$(ConvertTo-WindowsPath $PALDir)\Data\PortableApps.comLauncherGeneratorLog.txt""", 237 | "/DPACKAGE=""$(ConvertTo-WindowsPath $AppRoot)""", 238 | "/DNamePortable=""{0}""", 239 | "/DAppID=""{1}""", 240 | "/DIconPath=""$(ConvertTo-WindowsPath $AppInfoDir)\appicon{2}.ico""" 241 | ) -join " " 242 | While ($Counter -le $Icons) { 243 | $Name = $Control.Item("Name$Counter") 244 | $AppId = $Control.Item("Start$Counter").Replace(".exe", "") 245 | $Args = $Options -f $Name, $AppId, $Counter 246 | 247 | Switch (Test-Unix) { 248 | $True { 249 | $Arguments = "$Nsis $Args $(ConvertTo-WindowsPath $Script)" 250 | $Command = "wine" 251 | break 252 | } 253 | default { 254 | $Arguments = "$Args $(ConvertTo-WindowsPath $Script)" 255 | $Command = $Nsis 256 | } 257 | } 258 | Start-Process $Command -ArgumentList $Arguments -NoNewWindow -Wait 259 | $Counter++ 260 | } 261 | } 262 | 263 | # ----------------------------------------------------------------------------- 264 | Function Create-Launcher() { 265 | Set-Location $AppRoot 266 | $AppPath = (Get-Location) 267 | Create-AdditionalLaunchers 268 | Try { 269 | $Command = Assemble-PAExec ` 270 | -Name 'PortableApps.comLauncher' ` 271 | -Suffix 'Generator.exe' 272 | Invoke-Helper -Command $Command 273 | } 274 | Catch { 275 | Debug fatal "Unable to create PortableApps Launcher - " + $_ 276 | Exit 21 277 | } 278 | } 279 | 280 | # ----------------------------------------------------------------------------- 281 | Function Create-Installer() { 282 | Try { 283 | $Command = Assemble-PAExec -Name 'PortableApps.comInstaller' 284 | Invoke-Helper -Sleep 5 -Timeout 300 -Command $Command 285 | } 286 | Catch { 287 | Debug fatal "Unable to create installer for PortableApps - " + $_ 288 | Exit 42 289 | } 290 | } 291 | 292 | # ----------------------------------------------------------------------------- 293 | Function Assemble-PAExec() { 294 | Param( 295 | [String] $Name, 296 | [String] $Suffix = '.exe' 297 | ) 298 | Debug debug "InfraDir is ${InfraDir}" 299 | [System.IO.Path]::Combine($InfraDir, $Name, "$Name$Suffix") 300 | } 301 | 302 | # ----------------------------------------------------------------------------- 303 | Function Invoke-Helper() { 304 | param( 305 | [string] $Command, 306 | [int] $Sleep = $Null, 307 | [int] $Timeout = 30 308 | ) 309 | Set-Location $AppRoot 310 | $AppPath = (Get-Location) 311 | 312 | Switch (Test-Unix) { 313 | $True { 314 | $Arguments = "$Command $(ConvertTo-WindowsPath $AppPath)" 315 | $Command = "wine" 316 | break 317 | } 318 | default { 319 | $Arguments = ConvertTo-WindowsPath $AppPath 320 | } 321 | } 322 | 323 | Debug info "Run PA $Command $Arguments" 324 | Start-Process $Command -ArgumentList $Arguments -NoNewWindow -Wait 325 | } 326 | 327 | # ----------------------------------------------------------------------------- 328 | # Main 329 | # ----------------------------------------------------------------------------- 330 | $Config = Read-IniFile -IniFile $UpdateIni 331 | Source-InstallScript Preinstall 332 | Update-Application 333 | Update-Appinfo 334 | Source-InstallScript Postinstall 335 | Create-Launcher 336 | Create-Installer 337 | -------------------------------------------------------------------------------- /README.adoc: -------------------------------------------------------------------------------- 1 | = {app-name-spaced} for PortableApps.com 2 | :author: Urs Roesch 3 | :app-name-spaced: LDAP Admin 4 | :app-name: LdapAdminPortable 5 | :git-user: uroesch 6 | :app-project-url: https://github.com/{git-user}/{app-name} 7 | :upstream-name: {app-name-spaced} 8 | :upstream-url: http://www.ldapadmin.org/ 9 | :shields-url: https://img.shields.io/github/v/release/{git-user}/{app-name} 10 | :icons: font 11 | :imagesdir: Other/Images 12 | :no-data: image:../Icons/no_data.svg[] 13 | :no-support: image:../Icons/no_support.svg[] 14 | :not-applicable: image:../Icons/not_applicable.svg[] 15 | :probably-supported: image:../Icons/probably_supported.svg[] 16 | :full-support: image:../Icons/full_support.svg[] 17 | ifdef::env-gitlab[] 18 | :git-base-url: https://gitlab.com/{git-user} 19 | endif::env-gitlab[] 20 | ifdef::env-github[] 21 | :git-base-url: https://github.com/{git-user} 22 | :tip-caption: :bulb: 23 | :note-caption: :information_source: 24 | :important-caption: :heavy_exclamation_mark: 25 | :caution-caption: :fire: 26 | :warning-caption: :warning: 27 | endif::env-github[] 28 | :doctype: book 29 | 30 | ifdef::env-github[] 31 | image:{app-project-url}/workflows/build-linux/badge.svg[ 32 | title="Linux Build", 33 | link={app-project-url}/actions?query=workflow%3Abuild-linux 34 | ] 35 | image:{app-project-url}/workflows/build-windows/badge.svg[ 36 | title="Windows Build", 37 | link={app-project-url}/actions?query=workflow%3Abuild-windows 38 | ] 39 | image:{shields-url}?include_prereleases[ 40 | title="GitHub release (latest by date including pre-releases)", 41 | link={app-project-url}/releases 42 | ] 43 | <> 45 | image:https://img.shields.io/github/downloads/{git-user}/{app-name}/total[ 46 | title="GitHub All Release Downloads" 47 | ] 48 | endif::env-github[] 49 | 50 | ifndef::env-github,env-gitlab[] 51 | image:../../App/AppInfo/appicon_128.png[float="left"] 52 | endif::env-github,env-gitlab[] 53 | 54 | ifdef::env-github,env-gitlab[] 55 | +++ 56 | 57 | +++ 58 | endif::env-github,env-gitlab[] 59 | 60 | {upstream-url}[{app-name-spaced}] is a free Windows LDAP client and 61 | administration tool for LDAP directory management. This application lets 62 | you browse, search, modify, create and delete objects on LDAP server. It 63 | also supports more complex operations such as directory copy and move between 64 | remote servers and extends the common edit functions to support specific 65 | object types (such as groups and accounts). 66 | 67 | You can use it to manage Posix groups and accounts, Samba accounts and it 68 | even includes support for Postfix MTA. Ldap Admin is free Open Source 69 | software distributed under the GNU General Public License. 70 | 71 | == Runtime dependencies 72 | 73 | * 32-bit or 64-bit version of Windows. 74 | 75 | = Support matrix 76 | 77 | [cols=",^,^", options=header] 78 | |=== 79 | | OS | 32-bit | 64-bit 80 | | ReactOS 0.4.14* | {full-support} | {not-applicable} 81 | | ReactOS 0.4.15* | {full-support} | {no-data} 82 | | Windows XP | {full-support} | {no-data} 83 | | Windows Vista | {full-support} | {full-support} 84 | | Windows 7 | {full-support} | {full-support} 85 | | Windows 8 | {full-support} | {full-support} 86 | | Windows 10 | {full-support} | {full-support} 87 | | Windows 11 | {not-applicable} | {full-support} 88 | |=== 89 | 90 | Legend: 91 | {no-support} not supported; 92 | {not-applicable} not applicable; 93 | {no-data} no data; 94 | {probably-supported} supported but not verified; 95 | {full-support} verified; 96 | 97 | *) Starts up but throws error during LDAP query! 98 | 99 | == Status 100 | 101 | This PortableApps project has been tested when installed locally and on a cloud drive (Box). 102 | 103 | // Start include INSTALL.adoc 104 | == Installation 105 | 106 | === Download 107 | 108 | Since this is not an official PortableApp the PortableApps installer must 109 | be download first. Navigate to https://github.com/uroesch/{app-name}/releases 110 | for a selection of releases. 111 | 112 | === Install via the PortableApps.com Platform 113 | 114 | After downloading the `.paf.exe` installer navigate to your PortableApps.com 115 | platform `Apps` Menu ❶ and select `Install a new app (paf.exe)` ❷. 116 | 117 | 118 | image:install_newapp_menu.png[width="400"] 119 | 120 | From the dialog choose the previously downloaded `.paf.exe` file. ❸ 121 | 122 | image:install_newapp_dialog.png[width="400"] 123 | 124 | After a short while the installation dialog will appear. 125 | 126 | image:install_newapp_installation.png[width="400"] 127 | 128 | 129 | === Install outside of the PortableApps.com Platform 130 | 131 | The Packages found under the release page are not digitally signed so there the 132 | installation is a bit involved. 133 | 134 | After downloading the `.paf.exe` installer trying to install may result in a 135 | windows defender warning. 136 | 137 | image:info_defender-protected.png[width="260"] 138 | 139 | To unblock the installer and install the application follow the annotated 140 | screenshot below. 141 | 142 | image:howto_unblock-file.png[width="600"] 143 | 144 | . Right click on the executable file. 145 | . Choose `Properties` at the bottom of the menu. 146 | . Check the unblock box. 147 | // End include INSTALL.adoc 148 | 149 | // Start include BUILD.adoc 150 | === Build 151 | 152 | ==== Windows 153 | 154 | ===== Windows 10 155 | 156 | The only supported build platform for Windows is version 10 other releases 157 | have not been tested. 158 | 159 | ====== Clone repositories 160 | 161 | [source,console,subs=attributes] 162 | ---- 163 | git clone {git-base-url}/PortableApps.comInstaller.git 164 | git clone -b patched https://github.com/uroesch/PortableApps.comLauncher.git 165 | git clone {git-base-url}/{app-name}.git 166 | ---- 167 | 168 | ====== Build installer 169 | 170 | [source,console,subs=attributes] 171 | ---- 172 | cd {app-name} 173 | powershell -ExecutionPolicy ByPass -File Other/Update/Update.ps1 174 | ---- 175 | 176 | ==== Linux 177 | 178 | ===== Docker 179 | 180 | [NOTE] 181 | This is currently the preferred way of building the PortableApps installer. 182 | 183 | For a Docker build run the following command. 184 | 185 | ====== Clone repo 186 | 187 | [source,console,subs=attributes] 188 | ---- 189 | git clone {git-base-url}/{app-name}.git 190 | ---- 191 | 192 | ====== Build installer 193 | 194 | [source,console,subs=attributes] 195 | ---- 196 | cd {app-name} 197 | curl -sJL https://raw.githubusercontent.com/uroesch/PortableApps/master/scripts/docker-build.sh | bash 198 | ---- 199 | 200 | ==== Local build 201 | 202 | ===== Ubuntu 20.04 203 | 204 | To build the installer under Ubuntu 20.04 `Wine`, `PowerShell`, `7-Zip` and 205 | when building headless `Xvfb` are required. 206 | 207 | ====== Setup 208 | 209 | [source,console] 210 | ---- 211 | sudo snap install powershell --classic 212 | sudo apt --yes install git wine p7zip-full xvfb 213 | ---- 214 | 215 | When building headless run the below command starts a virtual Xserver required 216 | for the build to succeed. 217 | 218 | [source,console] 219 | ---- 220 | export DISPLAY=:7777 221 | Xvfb ${DISPLAY} -ac & 222 | ---- 223 | 224 | ====== Clone repositories 225 | 226 | [source,console,subs=attributes] 227 | ---- 228 | git clone {git-base-url}/PortableApps.comInstaller.git 229 | git clone -b patched {git-base-url}/PortableApps.comLauncher.git 230 | git clone {git-base-url}/{app-name}.git 231 | ---- 232 | 233 | ====== Build installer 234 | 235 | [source,console,subs=attributes] 236 | ---- 237 | cd {app-name} 238 | pwsh Other/Update/Update.ps1 239 | ---- 240 | 241 | ===== Ubuntu 18.04 242 | 243 | To build the installer under Ubuntu 18.04 `Wine`, `PowerShell`, `7-Zip` and 244 | when building headless `Xvfb` are required. 245 | 246 | ====== Setup 247 | 248 | [source,console] 249 | ---- 250 | sudo snap install powershell --classic 251 | sudo apt --yes install git p7zip-full xvfb 252 | sudo dpkg --add-architecture i386 253 | sudo apt update 254 | sudo apt --yes install wine32 255 | ---- 256 | 257 | When building headless run the below command starts a virtual Xserver required 258 | for the build to succeed. 259 | 260 | [source,console] 261 | ---- 262 | export DISPLAY=:7777 263 | Xvfb ${DISPLAY} -ac & 264 | ---- 265 | 266 | ====== Clone repositories 267 | 268 | [source,console,subs=attributes] 269 | ---- 270 | git clone {git-base-url}/PortableApps.comInstaller.git 271 | git clone -b patched {git-base-url}/PortableApps.comLauncher.git 272 | git clone {git-base-url}/{app-name}.git 273 | ---- 274 | 275 | ====== Build installer 276 | 277 | [source,console,subs=attributes] 278 | ---- 279 | cd {app-name} 280 | pwsh Other/Update/Update.ps1 281 | ---- 282 | // End include BUILD.adoc 283 | 284 | // vim: set colorcolumn=80 textwidth=80 : #spell spelllang=en_us : 285 | -------------------------------------------------------------------------------- /help.html: -------------------------------------------------------------------------------- 1 | 2 | LDAP Admin Portable Help 3 | 4 | 5 | 150 | 151 | 152 | 153 |
154 |

LDAP Admin Portable Help

155 |

compare files on the go

156 |

LDAP Admin Portable allows you to compare and diff files on the go. Learn more about LDAP Admin...

157 | 158 | Make a Donation - Support PortableApps.com's Hosting and Development 159 | 160 |

Go to the LDAP Admin Portable Homepage >>

161 | 162 |

Get more portable apps at PortableApps.com

163 | 164 |

This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative.

165 | 166 |

LDAP Admin Portable-Specific Issues

167 | 173 | 174 |
175 | 176 | 177 | 178 | --------------------------------------------------------------------------------