From c3e92d7d4cc050b13e4943d56100082a9e906b9c Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Fri, 15 Dec 2023 23:54:20 +0100 Subject: [PATCH 01/19] Increase version to v1.10.2 --- .github/ISSUE_TEMPLATE/bug-report.md | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- public/index.html | 2 +- public/service-worker.js | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index a182f5b..db35767 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -36,7 +36,7 @@ If applicable, add screenshots to help explain your problem. **Bug occurs on official PairDrop instance https://pairdrop.net/** No | Yes -Version: v1.10.1 +Version: v1.10.2 **Bug occurs on self-hosted PairDrop instance** No | Yes @@ -44,7 +44,7 @@ No | Yes **Self-Hosted Setup** Proxy: Nginx | Apache2 Deployment: docker run | docker compose | npm run start:prod -Version: v1.10.1 +Version: v1.10.2 **Additional context** Add any other context about the problem here. diff --git a/package-lock.json b/package-lock.json index c549da4..0c1c2c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pairdrop", - "version": "1.10.1", + "version": "1.10.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "pairdrop", - "version": "1.10.1", + "version": "1.10.2", "license": "ISC", "dependencies": { "express": "^4.18.2", diff --git a/package.json b/package.json index 6ddad49..9925073 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pairdrop", - "version": "1.10.1", + "version": "1.10.2", "type": "module", "description": "", "main": "server/index.js", diff --git a/public/index.html b/public/index.html index 0b545dd..e6fbff8 100644 --- a/public/index.html +++ b/public/index.html @@ -582,7 +582,7 @@

PairDrop

-
v1.10.1
+
v1.10.2
diff --git a/public/service-worker.js b/public/service-worker.js index 8f54ce7..6bdf441 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,4 +1,4 @@ -const cacheVersion = 'v1.10.1'; +const cacheVersion = 'v1.10.2'; const cacheTitle = `pairdrop-cache-${cacheVersion}`; const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions const relativePathsToCache = [ From 4e7233947986c0b82f3248dc8f9a5778de03cd83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 04:45:23 +0000 Subject: [PATCH 02/19] Bump ws from 8.15.0 to 8.16.0 Bumps [ws](https://github.com/websockets/ws) from 8.15.0 to 8.16.0. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/8.15.0...8.16.0) --- updated-dependencies: - dependency-name: ws dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0c1c2c1..0299056 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "express-rate-limit": "^7.1.5", "ua-parser-js": "^1.0.37", "unique-names-generator": "^4.3.0", - "ws": "^8.15.0" + "ws": "^8.16.0" }, "engines": { "node": ">=15" @@ -640,9 +640,9 @@ } }, "node_modules/ws": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.0.tgz", - "integrity": "sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { "node": ">=10.0.0" }, @@ -1102,9 +1102,9 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "ws": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.0.tgz", - "integrity": "sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "requires": {} } } diff --git a/package.json b/package.json index 9925073..a6bb1e5 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "express-rate-limit": "^7.1.5", "ua-parser-js": "^1.0.37", "unique-names-generator": "^4.3.0", - "ws": "^8.15.0" + "ws": "^8.16.0" }, "engines": { "node": ">=15" From dd0dc21db5aaf5e4e298d145e675614559083e2a Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Wed, 3 Jan 2024 13:54:13 +0100 Subject: [PATCH 03/19] Fix replacement of sent URLs with actual links (fixes #231) --- public/scripts/ui.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/public/scripts/ui.js b/public/scripts/ui.js index ae63a0e..9cf0b3b 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -2014,10 +2014,19 @@ class ReceiveTextDialog extends Dialog { // Beautify text if text is short if (text.length < 2000) { - // replace urls with actual links - this.$text.innerHTML = this.$text.innerHTML.replace(/((https?:\/\/|www)[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\-._~:\/?#\[\]@!$&'()*+,;=]+)/g, url => { - return `${url}`; - }); + // replace URLs with actual links + this.$text.innerHTML = this.$text.innerHTML + .replace(/(^|(?<=(
|\s)))(https?:\/\/|www.)(([a-z]|[A-Z]|[0-9]|[\-_~:\/?#\[\]@!$&'()*+,;=%]){2,}\.)(([a-z]|[A-Z]|[0-9]|[\-_~:\/?#\[\]@!$&'()*+,;=%.]){2,})/g, + (url) => { + let link = url; + + // prefix www.example.com with http protocol to prevent it from being a relative link + if (link.startsWith('www')) { + link = "http://" + link + } + + return `${url}`; + }); } this._evaluateOverflowing(this.$text); @@ -2048,6 +2057,7 @@ class ReceiveTextDialog extends Dialog { } hide() { + // Todo: clear text field super.hide(); setTimeout(() => this._dequeueRequests(), 500); } From 676c68b6e7bbe5ce71e999941150761ec454007c Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Wed, 3 Jan 2024 16:52:26 +0100 Subject: [PATCH 04/19] Clear text field when closing receive text dialog --- public/scripts/ui.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/public/scripts/ui.js b/public/scripts/ui.js index 9cf0b3b..ffef7ee 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -2057,9 +2057,11 @@ class ReceiveTextDialog extends Dialog { } hide() { - // Todo: clear text field super.hide(); - setTimeout(() => this._dequeueRequests(), 500); + setTimeout(() => { + this._dequeueRequests(); + this.$text.innerHTML = ""; + }, 500); } } From d58f38056574a60ba4eb77ce898792293242fbb6 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Wed, 3 Jan 2024 16:53:09 +0100 Subject: [PATCH 05/19] Prevent executing _onCopy() when text is selected on receive text dialog --- public/scripts/ui.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/public/scripts/ui.js b/public/scripts/ui.js index ffef7ee..1917eb8 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -1978,12 +1978,15 @@ class ReceiveTextDialog extends Dialog { this._receiveTextQueue = []; } + selectionEmpty() { + return !window.getSelection().toString() + } + async _onKeyDown(e) { if (!this.isShown()) return - if (e.code === "KeyC" && (e.ctrlKey || e.metaKey)) { + if (e.code === "KeyC" && (e.ctrlKey || e.metaKey) && this.selectionEmpty()) { await this._onCopy() - this.hide(); } else if (e.code === "Escape") { this.hide(); From 229084fab33827c3e9d243a7a4fed0283f487ec5 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Wed, 3 Jan 2024 16:54:01 +0100 Subject: [PATCH 06/19] Properly style indented text via css --- public/styles/styles-deferred.css | 1 + 1 file changed, 1 insertion(+) diff --git a/public/styles/styles-deferred.css b/public/styles/styles-deferred.css index 36a7b29..cda51e2 100644 --- a/public/styles/styles-deferred.css +++ b/public/styles/styles-deferred.css @@ -16,6 +16,7 @@ max-height: 350px; word-break: break-word; word-wrap: anywhere; + white-space: pre-wrap; } .textarea:before { From 48090ec41cecca89508aea69af14d0b98cd99729 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Wed, 3 Jan 2024 16:54:43 +0100 Subject: [PATCH 07/19] Fix x-paper width (fixed #233) --- public/styles/styles-deferred.css | 1 + 1 file changed, 1 insertion(+) diff --git a/public/styles/styles-deferred.css b/public/styles/styles-deferred.css index cda51e2..6fbf811 100644 --- a/public/styles/styles-deferred.css +++ b/public/styles/styles-deferred.css @@ -336,6 +336,7 @@ x-dialog x-paper { display: flex; margin: auto; flex-direction: column; + width: 100%; max-width: 450px; z-index: 3; border-radius: 30px; From bea0fa5b9c83559112671a2c9caffae5a05199ab Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Wed, 3 Jan 2024 17:11:38 +0100 Subject: [PATCH 08/19] Fix color of URLs on receive text dialog --- public/styles/styles-deferred.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/styles/styles-deferred.css b/public/styles/styles-deferred.css index 6fbf811..0d81761 100644 --- a/public/styles/styles-deferred.css +++ b/public/styles/styles-deferred.css @@ -384,10 +384,6 @@ x-dialog:not([show]) x-paper { transform: scale(0.1); } -x-dialog a { - color: var(--primary-color); -} - /* Pair Devices Dialog & Public Room Dialog */ .input-key-container { @@ -786,7 +782,7 @@ x-dialog x-paper { background-color: var(--bg-color-secondary) !important; } -.textarea * { +.textarea *:not(a) { margin: 0 !important; padding: 0 !important; color: unset !important; @@ -799,6 +795,10 @@ x-dialog x-paper { font-weight: unset !important; } +x-dialog a { + color: var(--primary-color); +} + /* Image/Video/Audio Preview */ .file-preview { margin-bottom: 15px; From ccb2170287cc47cccf80e576b5d1fb1d986edb26 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Wed, 3 Jan 2024 17:18:04 +0100 Subject: [PATCH 09/19] Increase version to v1.10.3 --- .github/ISSUE_TEMPLATE/bug-report.md | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- public/index.html | 2 +- public/service-worker.js | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index db35767..28a72e1 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -36,7 +36,7 @@ If applicable, add screenshots to help explain your problem. **Bug occurs on official PairDrop instance https://pairdrop.net/** No | Yes -Version: v1.10.2 +Version: v1.10.3 **Bug occurs on self-hosted PairDrop instance** No | Yes @@ -44,7 +44,7 @@ No | Yes **Self-Hosted Setup** Proxy: Nginx | Apache2 Deployment: docker run | docker compose | npm run start:prod -Version: v1.10.2 +Version: v1.10.3 **Additional context** Add any other context about the problem here. diff --git a/package-lock.json b/package-lock.json index 0299056..1a7e9bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pairdrop", - "version": "1.10.2", + "version": "1.10.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "pairdrop", - "version": "1.10.2", + "version": "1.10.3", "license": "ISC", "dependencies": { "express": "^4.18.2", diff --git a/package.json b/package.json index a6bb1e5..c915ed4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pairdrop", - "version": "1.10.2", + "version": "1.10.3", "type": "module", "description": "", "main": "server/index.js", diff --git a/public/index.html b/public/index.html index e6fbff8..566d232 100644 --- a/public/index.html +++ b/public/index.html @@ -582,7 +582,7 @@

PairDrop

-
v1.10.2
+
v1.10.3
diff --git a/public/service-worker.js b/public/service-worker.js index 6bdf441..959f51f 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,4 +1,4 @@ -const cacheVersion = 'v1.10.2'; +const cacheVersion = 'v1.10.3'; const cacheTitle = `pairdrop-cache-${cacheVersion}`; const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions const relativePathsToCache = [ From ff883fb99441c2eca84dc8a7026592d85acbbc3d Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Thu, 4 Jan 2024 17:41:20 +0100 Subject: [PATCH 10/19] Use blue icons as favicons too to prevent white logo on white background (fixes #235) --- public/images/favicon-96x96-notification.png | Bin 7691 -> 12282 bytes public/images/favicon-96x96.png | Bin 7270 -> 12571 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/favicon-96x96-notification.png b/public/images/favicon-96x96-notification.png index 54cbbf6edeb078cb00f1a8ee3b31c940383814e7..34b2e515dcd7044423e6990165e6d39782329fbb 100644 GIT binary patch delta 8863 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 diff --git a/public/images/favicon-96x96.png b/public/images/favicon-96x96.png index 3ed2446ec3a94637a74cf14c87afb9410b7f35bc..b6442350e751497d5ef604681aa3033346f9a8b5 100644 GIT binary patch delta 9154 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 M07*qoM6N<$f+EM7o&W#< delta 3973 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 XRjz9*p6ECZLjDF|>1a`D=6mx$JqSTN From 89addd6649a3e676346a6c0c1ed2cb09ee16a5e8 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Thu, 4 Jan 2024 18:12:08 +0100 Subject: [PATCH 11/19] pairdrop-cli: Exit application if config file cannot be created on first run --- docs/how-to.md | 4 ++-- pairdrop-cli/pairdrop | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/how-to.md b/docs/how-to.md index 7db17fc..d47cc41 100644 --- a/docs/how-to.md +++ b/docs/how-to.md @@ -24,7 +24,7 @@ This opens PairDrop in the default browser where you can choose the receiver. ```bash pairdrop -h ``` -```bash +``` Send files or text with PairDrop via command-line interface. Current domain: https://pairdrop-dev.onrender.com/ @@ -35,7 +35,7 @@ Send text: pairdrop -t "text" Specify domain: pairdrop -d "https://pairdrop.net/" Show this help text: pairdrop (-h|--help) -This pairdrop-cli version was released alongside v1.10.0 +This pairdrop-cli version was released alongside v1.10.4 ```
diff --git a/pairdrop-cli/pairdrop b/pairdrop-cli/pairdrop index d9edacb..e4c662a 100644 --- a/pairdrop-cli/pairdrop +++ b/pairdrop-cli/pairdrop @@ -1,6 +1,9 @@ #!/bin/bash set -e +# PairDrop version when this file was last changed +version="v1.10.4" + ############################################################ # Help # ############################################################ @@ -17,7 +20,7 @@ help() echo -e "Specify domain:\t\t$(basename "$0") -d \"https://pairdrop.net/\"" echo -e "Show this help text:\t$(basename "$0") (-h|--help)" echo - echo "This pairdrop-cli version was released alongside v1.10.0" + echo "This pairdrop-cli version was released alongside ${version}" } openPairDrop() @@ -337,12 +340,15 @@ popd > '/dev/null'; config_path="${script_path}/.pairdrop-cli-config" +# If config file does not exist, try to create it. If it fails log error message and exit [ ! -f "$config_path" ] && specifyDomain "https://pairdrop.net/" && [ ! -f "$config_path" ] && - echo "Could not create config file. Add 'DOMAIN=https://pairdrop.net/' to a file called .pairdrop-cli-config in the same file as this 'pairdrop' bash file" + echo "Could not create config file. Add 'DOMAIN=https://pairdrop.net/' to a file called .pairdrop-cli-config in the same file as this 'pairdrop' bash file (${script_path})" && + exit -[ ! -f "$config_path" ] || export "$(grep -v '^#' "$config_path" | xargs)" +# Read config variables +export "$(grep -v '^#' "$config_path" | xargs)" setOs From 79cc8e5590ff49645465f2c0af49116bc90a2747 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sat, 6 Jan 2024 15:11:18 +0100 Subject: [PATCH 12/19] Release file pairdrop-cli.zip should only include contents of folder pairdrop-cli instead of the folder itself --- .github/workflows/zip-release.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/zip-release.yml b/.github/workflows/zip-release.yml index b249867..4ab6daf 100644 --- a/.github/workflows/zip-release.yml +++ b/.github/workflows/zip-release.yml @@ -26,9 +26,8 @@ jobs: - name: Archive Release uses: thedoctor0/zip-release@b57d897cb5d60cb78b51a507f63fa184cfe35554 # v0.7.6 with: - type: 'zip' filename: 'pairdrop-cli.zip' - path: 'pairdrop-cli' + directory: 'pairdrop-cli' exclusions: '*.git* /*node_modules/* .editorconfig' - name: Upload Release uses: ncipollo/release-action@6c75be85e571768fa31b40abf38de58ba0397db5 # v1.13.0 From 1a9fa8e60a423fb169700351c548e4e978c8da77 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sat, 6 Jan 2024 15:13:48 +0100 Subject: [PATCH 13/19] Enhance the documentation for pairdrop-cli and add shell commands --- docs/how-to.md | 92 ++++++++++++------- pairdrop-cli/.pairdrop-cli-config.example | 1 + ...nd-with-pairdrop.sh => send-with-pairdrop} | 5 +- 3 files changed, 59 insertions(+), 39 deletions(-) create mode 100644 pairdrop-cli/.pairdrop-cli-config.example rename pairdrop-cli/{send-with-pairdrop.sh => send-with-pairdrop} (65%) diff --git a/docs/how-to.md b/docs/how-to.md index d47cc41..09fe2f6 100644 --- a/docs/how-to.md +++ b/docs/how-to.md @@ -41,38 +41,55 @@ This pairdrop-cli version was released alongside v1.10.4
### Setup -Download the bash file: [pairdrop-cli/pairdrop](/pairdrop-cli/pairdrop). -#### Linux +#### Linux / Mac 1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases) -2. Unzip the archive to a folder of your choice e.g. `/usr/local/bin/pairdrop-cli/` -3. Make sure the bash file `/usr/local/bin/pairdrop-cli/pairdrop` is executable. Otherwise, use `chmod +x pairdrop` -4. Add absolute path of the folder to PATH variable to make `pairdrop` available globally by executing - `export PATH=$PATH:/usr/local/bin/pairdrop-cli/` - -
- -#### Mac -1. add bash file to `/usr/local/bin` + ```shell + wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.4/pairdrop-cli.zip" + ``` + or + ```shell + curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.4/pairdrop-cli.zip" + ``` +2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/` + ```shell + sudo unzip pairdrop-cli.zip -d /usr/share/pairdrop-cli/ + ``` +3. Copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_ + ```shell + sudo cp /usr/share/pairdrop-cli/.pairdrop-cli-config.example /usr/share/pairdrop-cli/.pairdrop-cli-config + ``` +4. Make the bash file _pairdrop_ executable + ```shell + sudo chmod +x /usr/share/pairdrop-cli/pairdrop + ``` +5. Add a symlink to /usr/local/bin/ to include _pairdrop_ to _PATH_ + ```shell + sudo ln -s /usr/share/pairdrop-cli/pairdrop /usr/local/bin/pairdrop + ```
#### Windows 1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases) 2. Put file in a preferred folder e.g. `C:\Program Files\pairdrop-cli` -3. Search for and open `Edit environment variables for your account` -4. Click `Environment Variables…` -5. Under *System Variables* select `Path` and click *Edit...* -6. Click *New*, insert the preferred folder (`C:\Program Files\pairdrop-cli`), click *OK* until all windows are closed -7. Reopen Command prompt window +3. Inside this folder, copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_ +4. Search for and open `Edit environment variables for your account` +5. Click `Environment Variables…` +6. Under _System Variables_ select `Path` and click _Edit..._ +7. Click _New_, insert the preferred folder (`C:\Program Files\pairdrop-cli`), click *OK* until all windows are closed +8. Reopen Command prompt window -
+**Requirements** -### Requirements As Windows cannot execute bash scripts natively, you need to install [Git Bash](https://gitforwindows.org/). -Then, you can also use pairdrop-cli from the default Windows Command Prompt \ -by using the shell file instead of the bash file: `pairdrop.sh -h` which then itself executes \ -pairdrop-cli (the bash file) via the Git Bash. + +Then, you can also use pairdrop-cli from the default Windows Command Prompt +by using the shell file instead of the bash file which then itself executes +_pairdrop-cli_ (the bash file) via the Git Bash. +```shell +pairdrop.sh -h +```
@@ -82,14 +99,15 @@ pairdrop-cli (the bash file) via the Git Bash. It is possible to send multiple files with PairDrop via the context menu by adding pairdrop-cli to Windows `Send to` menu: 1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases) 2. Unzip the archive to a folder of your choice e.g. `C:\Program Files\pairdrop-cli\` -3. Copy the shortcut _send with PairDrop.lnk_ -4. Hit Windows Key+R, type: `shell:sendto` and hit Enter. -5. Paste the copied shortcut into the directory -6. Open the properties window of the shortcut and edit the link field to point to _send-with-pairdrop.ps1_ located in the folder you used in step 2: \ +3. Inside this folder, copy the file _.pairdrop-cli-config.example_ to _.pairdrop-cli-config_ +4. Copy the shortcut _send with PairDrop.lnk_ +5. Hit Windows Key+R, type: `shell:sendto` and hit Enter. +6. Paste the copied shortcut into the directory +7. Open the properties window of the shortcut and edit the link field to point to _send-with-pairdrop.ps1_ located in the folder you used in step 2: \ `"C:\Program Files\PowerShell\7\pwsh.exe" -File "C:\Program Files\pairdrop-cli\send-with-pairdrop.ps1"` -7. You are done! You can now send multiple files and directories directly via PairDrop: +8. You are done! You can now send multiple files and directories directly via PairDrop: -> _context menu > Send to > PairDrop_ + _context menu_ > _Send to_ > _PairDrop_ ##### Requirements As Windows cannot execute bash scripts natively, you need to install [Git Bash](https://gitforwindows.org/). @@ -100,14 +118,18 @@ As Windows cannot execute bash scripts natively, you need to install [Git Bash]( ### Registering to open files with PairDrop It is possible to send multiple files with PairDrop via the context menu by adding pairdrop-cli to Nautilus `Scripts` menu: -1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases) -2. Unzip the archive to a folder of your choice e.g. `/usr/local/bin/pairdrop-cli/` -3. Copy the shell file _send-with-pairdrop.sh_ to `/home//.local/share/nautilus/scripts/` -4. Edit the shell file and edit the variable `pathToPairDropCli` to point to the pairdrop-cli executable from step 2 (e.g. `/usr/local/bin/pairdrop-cli/pairdrop`) -5. Make sure the shell file `/home//.local/share/nautilus/scripts/send-with-pairdrop.sh` is executable. Otherwise, use `chmod +x send-with-pairdrop.sh` -6. You are done! You can now send multiple files and directories directly via PairDrop: +1. Register _pairdrop_ as executable via [guide above](#linux). +2. Copy the shell file _send-with-pairdrop_ to `~/.local/share/nautilus/scripts/` to include it in the context menu + ```shell + cp /usr/share/pairdrop-cli/send-with-pairdrop ~/.local/share/nautilus/scripts/ + ``` +3. Make the shell file _send-with-pairdrop_ executable + ```shell + chmod +x ~/.local/share/nautilus/scripts/send-with-pairdrop` + ``` +4. You are done! You can now send multiple files and directories directly via PairDrop: -> _context menu > Scripts > send-with-pairdrop.sh_ + _context menu_ > _Scripts_ > _send-with-pairdrop_
@@ -115,6 +137,6 @@ It is possible to send multiple files with PairDrop via the context menu by addi The [File Handling API](https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/how-to/handle-files) was implemented, but it was removed as default file associations were overwritten ([#17](https://github.com/schlagmichdoch/PairDrop/issues/17), [#116](https://github.com/schlagmichdoch/PairDrop/issues/116) [#190](https://github.com/schlagmichdoch/PairDrop/issues/190)) -and it only worked with explicitly specified file types and not with directories at all. +and it only worked with explicitly specified file types and couldn't handle directories at all. [< Back](/README.md) diff --git a/pairdrop-cli/.pairdrop-cli-config.example b/pairdrop-cli/.pairdrop-cli-config.example new file mode 100644 index 0000000..163b9e1 --- /dev/null +++ b/pairdrop-cli/.pairdrop-cli-config.example @@ -0,0 +1 @@ +DOMAIN=https://pairdrop.net/ \ No newline at end of file diff --git a/pairdrop-cli/send-with-pairdrop.sh b/pairdrop-cli/send-with-pairdrop similarity index 65% rename from pairdrop-cli/send-with-pairdrop.sh rename to pairdrop-cli/send-with-pairdrop index 194beac..d99797d 100644 --- a/pairdrop-cli/send-with-pairdrop.sh +++ b/pairdrop-cli/send-with-pairdrop @@ -1,8 +1,5 @@ #!/bin/bash -# edit this to point to the pairdrop-cli executable -pathToPairDropCli="/usr/local/bin/pairdrop-cli/pairdrop" - # Initialize an array lines=() @@ -17,4 +14,4 @@ length=${#lines[@]} # Remove the last entry unset 'lines[length-1]' -$pathToPairDropCli "${lines[@]}" \ No newline at end of file +pairdrop "${lines[@]}" \ No newline at end of file From c9e4510f653fbbbe771a1f2a3cebbe3a49593f3e Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sat, 6 Jan 2024 15:27:39 +0100 Subject: [PATCH 14/19] Increase version to v1.10.4 ## Changes - Use blue icons as favicons for better contrast (#235) - Fix pairdrop-cli exit on error - Enhancement: On release: Prevent nesting of pairdrop-cli folder inside pairdrop-cli.zip - Enhance documentation for pairdrop-cli and sending from context menu (#236) - Translations update from Hosted Weblate --- .github/ISSUE_TEMPLATE/bug-report.md | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- public/index.html | 2 +- public/service-worker.js | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 28a72e1..6eff2ba 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -36,7 +36,7 @@ If applicable, add screenshots to help explain your problem. **Bug occurs on official PairDrop instance https://pairdrop.net/** No | Yes -Version: v1.10.3 +Version: v1.10.4 **Bug occurs on self-hosted PairDrop instance** No | Yes @@ -44,7 +44,7 @@ No | Yes **Self-Hosted Setup** Proxy: Nginx | Apache2 Deployment: docker run | docker compose | npm run start:prod -Version: v1.10.3 +Version: v1.10.4 **Additional context** Add any other context about the problem here. diff --git a/package-lock.json b/package-lock.json index 1a7e9bb..ece1903 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pairdrop", - "version": "1.10.3", + "version": "1.10.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "pairdrop", - "version": "1.10.3", + "version": "1.10.4", "license": "ISC", "dependencies": { "express": "^4.18.2", diff --git a/package.json b/package.json index c915ed4..db77961 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pairdrop", - "version": "1.10.3", + "version": "1.10.4", "type": "module", "description": "", "main": "server/index.js", diff --git a/public/index.html b/public/index.html index 566d232..1e34b5d 100644 --- a/public/index.html +++ b/public/index.html @@ -582,7 +582,7 @@

PairDrop

-
v1.10.3
+
v1.10.4
diff --git a/public/service-worker.js b/public/service-worker.js index 959f51f..cf7eacb 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,4 +1,4 @@ -const cacheVersion = 'v1.10.3'; +const cacheVersion = 'v1.10.4'; const cacheTitle = `pairdrop-cache-${cacheVersion}`; const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions const relativePathsToCache = [ From a7f5d336c3a076b41470c79822340a8c12a87145 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sat, 6 Jan 2024 15:37:05 +0100 Subject: [PATCH 15/19] Fix Zip Release workflow: wrong upload path --- .github/workflows/zip-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/zip-release.yml b/.github/workflows/zip-release.yml index 4ab6daf..de3eae3 100644 --- a/.github/workflows/zip-release.yml +++ b/.github/workflows/zip-release.yml @@ -32,5 +32,5 @@ jobs: - name: Upload Release uses: ncipollo/release-action@6c75be85e571768fa31b40abf38de58ba0397db5 # v1.13.0 with: - artifacts: "pairdrop-cli.zip" + artifacts: "pairdrop-cli/pairdrop-cli.zip" token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From f15264545239a238a2371f64acbbf82b74cef41b Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sat, 6 Jan 2024 15:41:39 +0100 Subject: [PATCH 16/19] Increase version to v1.10.5 ## Changes - Fix Zip Release workflow --- .github/ISSUE_TEMPLATE/bug-report.md | 4 ++-- docs/how-to.md | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- public/index.html | 2 +- public/service-worker.js | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 6eff2ba..dae6e46 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -36,7 +36,7 @@ If applicable, add screenshots to help explain your problem. **Bug occurs on official PairDrop instance https://pairdrop.net/** No | Yes -Version: v1.10.4 +Version: v1.10.5 **Bug occurs on self-hosted PairDrop instance** No | Yes @@ -44,7 +44,7 @@ No | Yes **Self-Hosted Setup** Proxy: Nginx | Apache2 Deployment: docker run | docker compose | npm run start:prod -Version: v1.10.4 +Version: v1.10.5 **Additional context** Add any other context about the problem here. diff --git a/docs/how-to.md b/docs/how-to.md index 09fe2f6..6cdda83 100644 --- a/docs/how-to.md +++ b/docs/how-to.md @@ -45,11 +45,11 @@ This pairdrop-cli version was released alongside v1.10.4 #### Linux / Mac 1. Download the latest _pairdrop-cli.zip_ from the [releases page](https://github.com/schlagmichdoch/PairDrop/releases) ```shell - wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.4/pairdrop-cli.zip" + wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.5/pairdrop-cli.zip" ``` or ```shell - curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.4/pairdrop-cli.zip" + curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.5/pairdrop-cli.zip" ``` 2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/` ```shell diff --git a/package-lock.json b/package-lock.json index ece1903..dc8171a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pairdrop", - "version": "1.10.4", + "version": "1.10.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "pairdrop", - "version": "1.10.4", + "version": "1.10.5", "license": "ISC", "dependencies": { "express": "^4.18.2", diff --git a/package.json b/package.json index db77961..3cb3c0f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pairdrop", - "version": "1.10.4", + "version": "1.10.5", "type": "module", "description": "", "main": "server/index.js", diff --git a/public/index.html b/public/index.html index 1e34b5d..308c0b6 100644 --- a/public/index.html +++ b/public/index.html @@ -582,7 +582,7 @@

PairDrop

-
v1.10.4
+
v1.10.5
diff --git a/public/service-worker.js b/public/service-worker.js index cf7eacb..f40f256 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,4 +1,4 @@ -const cacheVersion = 'v1.10.4'; +const cacheVersion = 'v1.10.5'; const cacheTitle = `pairdrop-cache-${cacheVersion}`; const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions const relativePathsToCache = [ From 041261be2ae21892e3c71f4da4ca8c2c5f231e73 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Sat, 6 Jan 2024 16:13:32 +0100 Subject: [PATCH 17/19] Fix url argument case ?share_target --- public/service-worker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/service-worker.js b/public/service-worker.js index f40f256..3d245ec 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -193,7 +193,7 @@ const evaluateRequestData = function (request) { const objectStoreRequest = objectStore.add(fileObjects[i]); objectStoreRequest.onsuccess = _ => { - if (i === fileObjects.length - 1) resolve(pairDropUrl + '?share-target=files'); + if (i === fileObjects.length - 1) resolve(pairDropUrl + '?share_target=files'); } } } @@ -202,7 +202,7 @@ const evaluateRequestData = function (request) { } } else { - let urlArgument = '?share-target=text'; + let urlArgument = '?share_target=text'; if (title) urlArgument += `&title=${title}`; if (text) urlArgument += `&text=${text}`; From 2e15a018daab68d2d8c4c76ba31fc73d564831e7 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Fri, 12 Jan 2024 01:23:14 +0100 Subject: [PATCH 18/19] Fix Error Invalid Group Specifier Name on Safari by removing REGEX lookbehind group construct (fixes #239) --- public/scripts/ui.js | 12 +++++++++--- public/scripts/util.js | 10 ++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/public/scripts/ui.js b/public/scripts/ui.js index 1917eb8..e399d89 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -2019,8 +2019,8 @@ class ReceiveTextDialog extends Dialog { if (text.length < 2000) { // replace URLs with actual links this.$text.innerHTML = this.$text.innerHTML - .replace(/(^|(?<=(
|\s)))(https?:\/\/|www.)(([a-z]|[A-Z]|[0-9]|[\-_~:\/?#\[\]@!$&'()*+,;=%]){2,}\.)(([a-z]|[A-Z]|[0-9]|[\-_~:\/?#\[\]@!$&'()*+,;=%.]){2,})/g, - (url) => { + .replace(/(^|
|\s|")((https?:\/\/|www.)(([a-z]|[A-Z]|[0-9]|[\-_~:\/?#\[\]@!$&'()*+,;=%]){2,}\.)(([a-z]|[A-Z]|[0-9]|[\-_~:\/?#\[\]@!$&'()*+,;=%.]){2,}))/g, + (match, whitespace, url) => { let link = url; // prefix www.example.com with http protocol to prevent it from being a relative link @@ -2028,7 +2028,13 @@ class ReceiveTextDialog extends Dialog { link = "http://" + link } - return `${url}`; + // Check if link is valid + if (isUrlValid(link)) { + return `${whitespace}${url}`; + } + else { + return match; + } }); } diff --git a/public/scripts/util.js b/public/scripts/util.js index 1ab43c5..fc418ff 100644 --- a/public/scripts/util.js +++ b/public/scripts/util.js @@ -583,4 +583,14 @@ async function decodeBase64Text(base64) { if (!base64) throw new Error('Base64 is empty'); return decodeURIComponent(escape(window.atob(base64))) +} + +function isUrlValid(url) { + try { + let urlObj = new URL(url); + return true; + } + catch (e) { + return false; + } } \ No newline at end of file From 59360fb0478b2b1763061f43fe1da4126eb51ae7 Mon Sep 17 00:00:00 2001 From: schlagmichdoch Date: Fri, 12 Jan 2024 01:43:08 +0100 Subject: [PATCH 19/19] Fix websocket-fallback info text not centered when line is broken --- public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index 308c0b6..3207b47 100644 --- a/public/index.html +++ b/public/index.html @@ -139,7 +139,7 @@
-