diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index dae6e46..2360d39 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.5 +Version: v1.10.6 **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.5 +Version: v1.10.6 **Additional context** Add any other context about the problem here. diff --git a/README.md b/README.md index 27cac02..02621f3 100644 --- a/README.md +++ b/README.md @@ -3,133 +3,127 @@ Logo -

PairDrop

+ # _Send it_, with [PairDrop](https://pairdrop.net)

- Local file sharing in your browser. Inspired by Apple's AirDrop. -
- Explore » + Local file sharing in your web browser.

- Report Bug - · - Request Feature + Report a bug +
+ Request feature

## Features -[PairDrop](https://pairdrop.net) is a sublime alternative to AirDrop that works on all platforms. +File sharing on your local network that works on all platforms. -- File Sharing on your local network - - Send images, documents or text via peer to peer connection to devices on the same local network. -- Internet Transfers - - Join temporary public rooms to transfer files easily over the internet! -- Web-Application - - As it is web based, it runs on all devices. +- A multi-platform AirDrop-like solution that works. + - Send images, documents or text via peer-to-peer connection to devices on the same local network. +- Internet transfers + - Join temporary public rooms to transfer files easily over the Internet. +- Web-app + - Works on all devices with a modern web-browser. + +Send a file from your phone to your laptop? +
Share photos in original quality with friends using Android and iOS? +
Share private files peer-to-peer between Linux systems? -You want to quickly send a file from your phone to your laptop? -
You want to share photos in original quality with friends that use a mixture of Android and iOS? -
You want to share private files peer to peer between Linux systems? -
AirDrop is unreliable again? -
_Send it with PairDrop!_ +Screenshot GIF showing PairDrop in use -Developed based on [Snapdrop](https://github.com/RobinLinus/snapdrop) +## Differences to the [Snapdrop](https://github.com/RobinLinus/snapdrop) it is based on +
List view -## Differences to Snapdrop -
Click to expand - -### Paired Devices and Public Rooms - Internet Transfer -* Transfer files over the internet between paired devices or by entering temporary public rooms. -* Connect to devices in complex network environments (public Wi-Fi, company network, Apple Private Relay, VPN etc.). +### Paired Devices and Public Rooms — Internet Transfer +* Transfer files over the Internet between paired devices or by entering temporary public rooms. +* Connect to devices in complex network environments (public Wi-Fi, company network, iCloud Private Relay, VPN, etc.). * Connect to devices on your mobile hotspot. -* Devices outside your local network that are behind a NAT are connected automatically via the PairDrop TURN server. +* Devices outside of your local network that are behind a NAT are auto-connected via the PairDrop TURN server. * Connect to devices on your mobile hotspot. -* You will always discover devices on your local network. Paired devices and devices in the same public room are shown additionally. +* Devices from the local network, in the same public room, or previously paired are shown. #### Persistent Device Pairing -* Pair your devices via a 6-digit code or a QR-Code. -* Paired devices will always find each other via shared secrets independently of their local network. -* Paired devices are persistent. You find your devices even after reopening PairDrop. -* You can edit and unpair devices easily -* Ideal to always connect easily to your own devices + +Always connect to known devices + +* Pair devices via a 6-digit code or a QR-Code. +* Paired devices always find each other via shared secrets independently of their local network. +* Pairing is persistent. You find your devices even after reopening PairDrop. +* You can edit and unpair devices easily. #### Temporary Public Rooms -* Enter a public room via a 5-letter code or a QR-Code. -* Enter a public room to temporarily connect to devices outside your local network. -* All devices in the same public room see each other mutually. -* Public rooms are temporary. Public rooms are left as soon as PairDrop is closed. -* Ideal to connect easily to others in complex network situations or over the internet. -### [Improved UI for sending/receiving files](https://github.com/RobinLinus/snapdrop/issues/560) -* Files are transferred only after a request is accepted first. On transfer completion files are downloaded automatically if possible. +Connect to others in complex network situations, or over the Internet. + +* Enter a public room via a 5-letter code or a QR-code. +* Enter a public room to temporarily connect to devices outside your local network. +* All devices in the same public room see each other. +* Public rooms are temporary. Closing PairDrop leaves all rooms. + +### [Improved UI for Sending/Receiving Files](https://github.com/RobinLinus/snapdrop/issues/560) +* Files are transferred after a request is accepted. Files are auto-downloaded upon completing a transfer, if possible. * Multiple files are downloaded as a ZIP file -* On iOS and Android, in addition to downloading, files can be shared or saved to the gallery via the Share menu. -* Multiple files are transferred at once with an overall progress indicator +* Download, share or save to gallery via the "Share" menu on Android and iOS. +* Multiple files are transferred at once with an overall progress indicator. ### Send Files or Text Directly From Share Menu, Context Menu or CLI -* [Send files directly from context menu on Windows](docs/how-to.md#send-multiple-files-and-directories-directly-from-context-menu-on-windows) -* [Send files directly from context menu on Ubuntu (using Nautilus)](/docs/how-to.md#send-multiple-files-and-directories-directly-from-context-menu-on-ubuntu-using-nautilus) -* [Send files directly from share menu on iOS](docs/how-to.md#send-directly-from-share-menu-on-ios) -* [Send files directly from share menu on Android](docs/how-to.md#send-directly-from-share-menu-on-android) -* [Send files directly via command-line interface](docs/how-to.md#send-directly-via-command-line-interface) +* [Send files directly from context menu on Ubuntu (using Nautilus)](docs/how-to.md#send-multiple-files-and-directories-directly-from-context-menu-on-ubuntu-using-nautilus) +* [Send files directly from the context menu on Windows](docs/how-to.md#send-files-directly-from-context-menu-on-windows) +* [Send directly from the "Share" menu on iOS](docs/how-to.md#send-directly-from-share-menu-on-ios) +* [Send directly from the "Share" menu on Android](docs/how-to.md#send-directly-from-share-menu-on-android) +* [Send directly via the command-line interface](docs/how-to.md#send-directly-via-command-line-interface) -### Other changes -* Change your display name permanently to easily differentiate your devices -* [Paste files/text and choose the recipient afterwords ](https://github.com/RobinLinus/snapdrop/pull/534) +### Other Changes +* Change your display name to easily differentiate your devices. +* [Paste files/text and choose the recipient afterwards ](https://github.com/RobinLinus/snapdrop/pull/534) * [Prevent devices from sleeping on file transfer](https://github.com/RobinLinus/snapdrop/pull/413) * Warn user before PairDrop is closed on file transfer * Open PairDrop on multiple tabs simultaneously (Thanks [@willstott101](https://github.com/willstott101)) -* [Video and Audio preview](https://github.com/RobinLinus/snapdrop/pull/455) (Thanks [@victorwads](https://github.com/victorwads)) -* Switch theme back to auto/system after darkmode or lightmode is enabled +* [Video and audio preview](https://github.com/RobinLinus/snapdrop/pull/455) (Thanks [@victorwads](https://github.com/victorwads)) +* Switch theme back to auto/system after dark or light mode is on * Node-only implementation (Thanks [@Bellisario](https://github.com/Bellisario)) -* Automatic restart on error (Thanks [@KaKi87](https://github.com/KaKi87)) +* Auto-restart on error (Thanks [@KaKi87](https://github.com/KaKi87)) * Lots of stability fixes (Thanks [@MWY001](https://github.com/MWY001) [@skiby7](https://github.com/skiby7) and [@willstott101](https://github.com/willstott101)) * To host PairDrop on your local network (e.g. on Raspberry Pi): [All peers connected with private IPs are discoverable by each other](https://github.com/RobinLinus/snapdrop/pull/558) -* When hosting PairDrop yourself you can [set your own STUN/TURN servers](docs/host-your-own.md#specify-stunturn-servers) -* Built-in translations via [Weblate](https://hosted.weblate.org/engage/pairdrop/) -* Airy design (Thanks [@Avieshek](https://linktr.ee/avieshek/)) +* When hosting PairDrop yourself, you can [set your own STUN/TURN servers](docs/host-your-own.md#specify-stunturn-servers) +* Translations.
-## Screenshots -Gif of Screenshots that show PairDrop in use - -## PairDrop is built with the following awesome technologies: -* Vanilla HTML5 / ES6 / CSS3 frontend -* [WebRTC](http://webrtc.org/) / [WebSockets](http://www.websocket.org/) -* [NodeJS](https://nodejs.org/en/) backend -* [Progressive Web App](https://wikipedia.org/wiki/Progressive_Web_App) -* [IndexedDB API](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) -* [Weblate](https://weblate.org/) Web based localization tool -* [zip.js](https://github.com/gildas-lormeau/zip.js) JavaScript library to zip and unzip files ([BSD 3-Clause License](licenses/BSD_3-Clause-zip-js)) -* [NoSleep](https://github.com/richtr/NoSleep.js) JavaScript library to prevent display sleep and enable wake lock in any Android or iOS web browser ([MIT License](licenses/MIT-NoSleep)) -* [heic2any](https://github.com/alexcorvi/heic2any) JavaScript library to convert HEIC/HEIF images to PNG/GIF/JPEG ([MIT License](licenses/MIT-heic2any)) -* [cyrb53](https://github.com/bryc) Super fast hash function - -Have any questions? Read our [FAQ](docs/faq.md). - -You can [host your own instance with Docker](docs/host-your-own.md). - - -## Support PairDrop - -Buy Me A Coffee - - -PairDrop is free and always will be. -Still, we have to pay for the domain and the server. - -To contribute and support, please use BuyMeACoffee via the button above. - -Thanks a lot for supporting free and open software! - -## Translate PairDrop +## Translate PairDrop on [Hosted Weblate](https://hosted.weblate.org/engage/pairdrop/) -Translation status +Translation status -## How to contribute +## Built with the following awesome technologies: +* Vanilla HTML5 / JS ES6 / CSS 3 frontend +* [WebRTC](http://webrtc.org/) / WebSockets +* [Node.js](https://nodejs.org/en/) backend +* [Progressive web app (PWA)](https://en.wikipedia.org/wiki/Progressive_web_app) unified functionality +* [IndexedDB API](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) storage handling +* [zip.js](https://gildas-lormeau.github.io/zip.js/) library +* [cyrb53](https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js) super-fast hash function +* [NoSleep](https://github.com/richtr/NoSleep.js) display sleep, add wake lock ([MIT](licenses/MIT-NoSleep)) +* [heic2any](https://github.com/alexcorvi/heic2any) HEIC/HEIF to PNG/GIF/JPEG ([MIT](licenses/MIT-heic2any)) +* [Weblate](https://weblate.org/) web-based localization tool +[FAQ](docs/faq.md) + +[Host your own instance with Docker or Node.js](docs/host-your-own.md). + +## Support + +Buy me a coffee + +
+
+ +PairDrop is libre, and always will be. \ +I footed the bill for the domain and the server, and you can help create great softeare by supporting me. \ +Please use BuyMeACoffee via the button above. \ +Thanks a lot for supporting copylefted libre software! + +## Contributing Feel free to [open an issue](https://github.com/schlagmichdoch/pairdrop/issues/new/choose) or a -[pull request](https://github.com/schlagmichdoch/pairdrop/pulls) but follow +[pull request](https://github.com/schlagmichdoch/pairdrop/pulls), following the [Contributing Guidelines](CONTRIBUTING.md). diff --git a/docs/how-to.md b/docs/how-to.md index 6cdda83..754b154 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.5/pairdrop-cli.zip" + wget "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.6/pairdrop-cli.zip" ``` or ```shell - curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.5/pairdrop-cli.zip" + curl -LO "https://github.com/schlagmichdoch/PairDrop/releases/download/v1.10.6/pairdrop-cli.zip" ``` 2. Unzip the archive to a folder of your choice e.g. `/usr/share/pairdrop-cli/` ```shell @@ -125,7 +125,7 @@ It is possible to send multiple files with PairDrop via the context menu by addi ``` 3. Make the shell file _send-with-pairdrop_ executable ```shell - chmod +x ~/.local/share/nautilus/scripts/send-with-pairdrop` + chmod +x ~/.local/share/nautilus/scripts/send-with-pairdrop ``` 4. You are done! You can now send multiple files and directories directly via PairDrop: diff --git a/package-lock.json b/package-lock.json index dc8171a..a0a70b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pairdrop", - "version": "1.10.5", + "version": "1.10.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "pairdrop", - "version": "1.10.5", + "version": "1.10.6", "license": "ISC", "dependencies": { "express": "^4.18.2", diff --git a/package.json b/package.json index 3cb3c0f..2afa4c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pairdrop", - "version": "1.10.5", + "version": "1.10.6", "type": "module", "description": "", "main": "server/index.js", diff --git a/public/index.html b/public/index.html index 3207b47..0cdd990 100644 --- a/public/index.html +++ b/public/index.html @@ -582,7 +582,7 @@

PairDrop

-
v1.10.5
+
v1.10.6
diff --git a/public/lang/id.json b/public/lang/id.json index e271f51..5159c4b 100644 --- a/public/lang/id.json +++ b/public/lang/id.json @@ -69,7 +69,9 @@ "language-selector_title": "Atur Bahasa", "about_title": "Tentang PairDrop", "about_aria-label": "Buka Tentang PairDrop", - "theme-light_title": "Selalu gunakan tema terang" + "theme-light_title": "Selalu gunakan tema terang", + "edit-share-mode": "Sunting", + "expand_title": "Perluas baris tombol header" }, "instructions": { "x-instructions_mobile": "Ketuk untuk mengirim file atau ketuk lama untuk mengirim pesan", @@ -83,7 +85,11 @@ "no-peers-title": "Buka PairDrop di perangkat lain untuk berkirim file", "x-instructions_data-drop-peer": "Lepaskan untuk mengirim ke rekan", "x-instructions_data-drop-bg": "Lepaskan untuk memilih penerima", - "no-peers_data-drop-bg": "Lepaskan untuk memilih penerima" + "no-peers_data-drop-bg": "Lepaskan untuk memilih penerima", + "activate-share-mode-and-other-file": "dan 1 file lainnya", + "activate-share-mode-shared-file": "file yang dibagikan", + "activate-share-mode-shared-files-plural": "{{count}} file yang dibagikan", + "webrtc-requirement": "Untuk menggunakan instance PairDrop ini, WebRTC harus diaktifkan!" }, "peer-ui": { "processing": "Memproses…", @@ -111,7 +117,7 @@ "join": "Gabung", "title-image-plural": "Gambar", "send": "Kirim", - "base64-tap-to-paste": "Ketuk di sini untuk menempelkan {{type}}", + "base64-tap-to-paste": "Ketuk di sini untuk membagikan{{type}}", "base64-text": "teks", "copy": "Salin", "file-other-description-image": "dan 1 gambar lainnya", @@ -125,7 +131,7 @@ "title-image": "Gambar", "file-other-description-file-plural": "dan {{count}} file lainnya", "would-like-to-share": "ingin berbagi", - "send-message-to": "Kirim pesan ke", + "send-message-to": "Ke:", "language-selector-title": "Pilih Bahasa", "pair": "Pasangkan", "hr-or": "ATAU", @@ -144,7 +150,11 @@ "enter-room-id-from-another-device": "Masukkan room ID dari perangkat lain untuk bergabung dengan room.", "message_title": "Masukkan pesan untuk dikirim", "pair-devices-qr-code_title": "Klik untuk menyalin tautan untuk memasangkan perangkat ini", - "public-room-qr-code_title": "Klik untuk menyalin tautan ke ruang publik" + "public-room-qr-code_title": "Klik untuk menyalin tautan ke ruang publik", + "base64-title-files": "Bagikan File", + "base64-title-text": "Bagikan Teks", + "message_placeholder": "Teks", + "paired-device-removed": "Perangkat yang dipasangkan telah dihapus." }, "about": { "claim": "Cara termudah untuk mentransfer file lintas perangkat", diff --git a/public/lang/ja.json b/public/lang/ja.json index 32a956c..4ce93bc 100644 --- a/public/lang/ja.json +++ b/public/lang/ja.json @@ -69,7 +69,9 @@ "language-selector_title": "言語を設定", "about_title": "PairDropについて", "about_aria-label": "PairDropについてを開く", - "theme-light_title": "常にライトテーマを使用する" + "theme-light_title": "常にライトテーマを使用する", + "edit-share-mode": "編集", + "expand_title": "ヘッダーボタン列を拡大する" }, "instructions": { "x-instructions_mobile": "タップしてファイルを送信または長押ししてメッセージを送信します", @@ -83,7 +85,11 @@ "no-peers-title": "他のデバイスでPairDropを開いてファイルを送信します", "x-instructions_data-drop-peer": "離すとこの相手に送信します", "x-instructions_data-drop-bg": "送信したい相手の上で離してください", - "no-peers_data-drop-bg": "送信したい相手の上で離してください" + "no-peers_data-drop-bg": "送信したい相手の上で離してください", + "activate-share-mode-and-other-file": "もう1つの別のファイル", + "activate-share-mode-shared-file": "共有されたファイル", + "activate-share-mode-shared-files-plural": "{{count}}個の共有されたファイル", + "webrtc-requirement": "このPairDropインスタンスを使用するには、WebRTCを有効にする必要があります!" }, "peer-ui": { "processing": "処理中…", @@ -144,7 +150,16 @@ "enter-room-id-from-another-device": "他のデバイスに表示された参加したいルームのIDを入力します。", "message_title": "送信するメッセージを挿入", "pair-devices-qr-code_title": "クリックしてこのデバイスをペア設定するリンクをコピー", - "public-room-qr-code_title": "クリックしてパブリックルームへのリンクをコピー" + "public-room-qr-code_title": "クリックしてパブリックルームへのリンクをコピー", + "paired-device-removed": "ペア設定されたデバイスが削除されました。", + "message_placeholder": "テキスト", + "base64-title-files": "共有されたファイル", + "base64-title-text": "テキストを共有", + "approve": "承諾", + "share-text-subtitle": "送信する前にメッセージを編集する:", + "share-text-checkbox": "テキストを共有するときに常にこのダイアログを表示する", + "close-toast_title": "通知を閉じる", + "share-text-title": "テキストメッセージを共有します" }, "about": { "claim": "デバイス間でファイルを転送する最も簡単な方法", @@ -152,7 +167,11 @@ "close-about_aria-label": "PairDropについてを閉じる", "buy-me-a-coffee_title": "コーヒーをおごってください!", "github_title": "GitHubでPairDropを見る", - "faq_title": "FAQ" + "faq_title": "FAQ", + "mastodon_title": "MastodonにPairDropについて書く", + "bluesky_title": "BlueSkyでフォロー", + "custom_title": "フォロー", + "privacypolicy_title": "プライバシーポリシーを開く" }, "document-titles": { "file-transfer-requested": "ファイルの転送がリクエストされました", diff --git a/public/lang/tr.json b/public/lang/tr.json index 7a08e39..dce1d1d 100644 --- a/public/lang/tr.json +++ b/public/lang/tr.json @@ -12,7 +12,8 @@ "cancel-share-mode": "Bitti", "join-public-room_title": "Geçici olarak genel odaya katılın", "language-selector_title": "Dili Seç", - "edit-share-mode": "Düzenle" + "edit-share-mode": "Düzenle", + "expand_title": "Başlık düğmesi satırını genişlet" }, "instructions": { "no-peers_data-drop-bg": "Alıcıyı seçmek için bırakın", @@ -166,7 +167,11 @@ "close-about_aria-label": "PairDrop Hakkında'yı Kapat", "buy-me-a-coffee_title": "Bana bir kahve al!", "github_title": "GitHub'da PairDrop", - "faq_title": "Sıkça sorulan sorular" + "faq_title": "Sıkça sorulan sorular", + "custom_title": "Bizi takip edin", + "privacypolicy_title": "Gizlilik politikamızı açın", + "mastodon_title": "Mastodon'da PairDrop hakkında yazın", + "bluesky_title": "Bizi BlueSky'da takip edin" }, "document-titles": { "file-transfer-requested": "Dosya Transferi Talep Edildi", diff --git a/public/scripts/ui.js b/public/scripts/ui.js index d171258..4d9d93a 100644 --- a/public/scripts/ui.js +++ b/public/scripts/ui.js @@ -2021,8 +2021,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 @@ -2030,7 +2030,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 diff --git a/public/service-worker.js b/public/service-worker.js index 3d245ec..0e76246 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,4 +1,4 @@ -const cacheVersion = 'v1.10.5'; +const cacheVersion = 'v1.10.6'; const cacheTitle = `pairdrop-cache-${cacheVersion}`; const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions const relativePathsToCache = [