From b6cf7174055c2c09adf5914b8b9e3da21fec6c76 Mon Sep 17 00:00:00 2001 From: El RIDO Date: Mon, 28 Jul 2025 09:50:52 +0200 Subject: [PATCH 001/273] chore: prepare for next release --- CHANGELOG.md | 2 ++ Makefile | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 395219f3..fa19ea7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # PrivateBin version history +## 2.0.1 (not yet released) + ## 2.0.0 (2025-07-28) * ADDED: Error logging in database and filesystem backend (#1554) * ADDED: Statistics on v1 pastes in administration script and option to delete them diff --git a/Makefile b/Makefile index ebd00769..ff0f25ed 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: all coverage coverage-js coverage-php doc doc-js doc-php increment sign test test-js test-php help CURRENT_VERSION = 2.0.0 -VERSION ?= 2.0.0 +VERSION ?= 2.0.1 VERSION_FILES = README.md SECURITY.md doc/Installation.md js/package*.json lib/Controller.php Makefile REGEX_CURRENT_VERSION := $(shell echo $(CURRENT_VERSION) | sed "s/\./\\\./g") REGEX_VERSION := $(shell echo $(VERSION) | sed "s/\./\\\./g") From 4d257a9d11c1301348b56eac9f31f98e703af8a2 Mon Sep 17 00:00:00 2001 From: El RIDO Date: Mon, 28 Jul 2025 11:00:07 +0200 Subject: [PATCH 002/273] update CSP to display icons by default with bootstrap5 template --- CHANGELOG.md | 1 + cfg/conf.sample.php | 8 ++++---- lib/Configuration.php | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa19ea7e..1876c7e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # PrivateBin version history ## 2.0.1 (not yet released) +* CHANGED: Update CSP to display icons by default with bootstrap5 template ## 2.0.0 (2025-07-28) * ADDED: Error logging in database and filesystem backend (#1554) diff --git a/cfg/conf.sample.php b/cfg/conf.sample.php index 0f343624..c02783e9 100644 --- a/cfg/conf.sample.php +++ b/cfg/conf.sample.php @@ -106,8 +106,8 @@ languageselection = false ; scripts or run your site behind certain DDoS-protection services. ; Check the documentation at https://content-security-policy.com/ ; Notes: -; - If you use the bootstrap5 theme, you must change default-src to 'self' to -; enable display of the svg icons +; - If you do not use the bootstrap5 theme, you can change default-src to 'none'; +; 'self' is required in bootstrap5 to enable display of the svg icons ; - By default this disallows to load images from third-party servers, e.g. when ; they are embedded in documents. If you wish to allow that, you can adjust the ; policy here. See https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-it-load-embedded-images @@ -119,10 +119,10 @@ languageselection = false ; See https://issues.chromium.org/issues/343754409 ; - To allow displaying PDF previews in Firefox or Chrome, sandboxing must also ; get turned off. The following CSP allows PDF previews: -; cspheader = "default-src 'none'; base-uri 'self'; form-action 'none'; manifest-src 'self'; connect-src * blob:; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; font-src 'self'; frame-ancestors 'none'; frame-src blob:; img-src 'self' data: blob:; media-src blob:; object-src blob:" +; cspheader = "default-src 'self'; base-uri 'self'; form-action 'none'; manifest-src 'self'; connect-src * blob:; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; font-src 'self'; frame-ancestors 'none'; frame-src blob:; img-src 'self' data: blob:; media-src blob:; object-src blob:" ; ; The recommended and default used CSP is: -; cspheader = "default-src 'none'; base-uri 'self'; form-action 'none'; manifest-src 'self'; connect-src * blob:; script-src 'self' 'wasm-unsafe-eval'; style-src 'self'; font-src 'self'; frame-ancestors 'none'; frame-src blob:; img-src 'self' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-modals allow-downloads" +; cspheader = "default-src 'self'; base-uri 'self'; form-action 'none'; manifest-src 'self'; connect-src * blob:; script-src 'self' 'wasm-unsafe-eval'; style-src 'self'; font-src 'self'; frame-ancestors 'none'; frame-src blob:; img-src 'self' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-modals allow-downloads" ; Enable or disable the warning message when the site is served over an insecure ; connection (insecure HTTP instead of HTTPS), defaults to true. diff --git a/lib/Configuration.php b/lib/Configuration.php index 4e421273..8274539f 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -64,7 +64,7 @@ class Configuration 'qrcode' => true, 'email' => true, 'icon' => 'jdenticon', - 'cspheader' => 'default-src \'none\'; base-uri \'self\'; form-action \'none\'; manifest-src \'self\'; connect-src * blob:; script-src \'self\' \'wasm-unsafe-eval\'; style-src \'self\'; font-src \'self\'; frame-ancestors \'none\'; frame-src blob:; img-src \'self\' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-modals allow-downloads', + 'cspheader' => 'default-src \'self\'; base-uri \'self\'; form-action \'none\'; manifest-src \'self\'; connect-src * blob:; script-src \'self\' \'wasm-unsafe-eval\'; style-src \'self\'; font-src \'self\'; frame-ancestors \'none\'; frame-src blob:; img-src \'self\' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-modals allow-downloads', 'httpwarning' => true, 'compression' => 'zlib', ), From e8882f89edb8f76b3fdae1a301f98c5eca7086c1 Mon Sep 17 00:00:00 2001 From: Mariusz Krzaczkowski Date: Mon, 28 Jul 2025 11:00:15 +0200 Subject: [PATCH 003/273] chore(translation): update Polish translation --- i18n/pl.json | 56 ++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/i18n/pl.json b/i18n/pl.json index d9c11afb..d3fc7697 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -1,9 +1,9 @@ { "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of stored data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s jest minimalistycznym, otwartoźródłowym serwisem typu pastebin, w którym serwer nie ma jakichkolwiek informacji o tym, co jest wklejane. Dane są szyfrowane i deszyfrowane %sw przeglądarce%s z użyciem 256-bitowego klucza AES.", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of stored data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s jest minimalistycznym, otwartoźródłowym serwisem typu pastebin, w którym serwer nie ma żadnej wiedzy o przechowywanych danych. Dane są szyfrowane i deszyfrowane %sw przeglądarce%s z użyciem 256-bitowego klucza AES.", "More information on the project page.": "Więcej informacji na stronie projektu.", "Because ignorance is bliss": "Ponieważ ignorancja jest cnotą", - "Document does not exist, has expired or has been deleted.": "Wklejka nie istnieje, wygasła albo została usunięta.", + "Document does not exist, has expired or has been deleted.": "Dokument nie istnieje, wygasł lub został usunięty.", "%s requires php %s or above to work. Sorry.": "%s wymaga PHP w wersji %s lub nowszej. Przykro mi.", "%s requires configuration section [%s] to be present in configuration file.": "%s wymaga obecności sekcji [%s] w pliku konfiguracyjnym.", "Please wait %d seconds between each post.": [ @@ -14,19 +14,19 @@ "Poczekaj %d sekund pomiędzy każdą wklejką.", "Poczekaj %d sekund pomiędzy każdą wklejką." ], - "Document is limited to %s of encrypted data.": "Wklejka jest limitowana do %s zaszyfrowanych danych.", + "Document is limited to %s of encrypted data.": "Dokument jest ograniczony do %s zaszyfrowanych danych.", "Invalid data.": "Nieprawidłowe dane.", "You are unlucky. Try again.": "Miałeś pecha. Spróbuj ponownie.", "Error saving comment. Sorry.": "Błąd przy zapisywaniu komentarza, sorry.", - "Error saving document. Sorry.": "Błąd przy zapisywaniu wklejki, sorry.", - "Invalid document ID.": "Nieprawidłowe ID wklejki.", - "Document is not of burn-after-reading type.": "Ta wklejka nie ulega autodestrukcji po przeczytaniu.", - "Wrong deletion token. Document was not deleted.": "Nieprawidłowy token usuwania. Wklejka nie została usunięta.", - "Document was properly deleted.": "Wklejka usunięta poprawnie.", + "Error saving document. Sorry.": "Błąd podczas zapisywania dokumentu. Przepraszamy.", + "Invalid document ID.": "Nieprawidłowy ID dokumentu.", + "Document is not of burn-after-reading type.": "Dokument nie ulega autodestrukcji po przeczytaniu.", + "Wrong deletion token. Document was not deleted.": "Nieprawidłowy token usuwania. Dokument nie został usunięty.", + "Document was properly deleted.": "Dokument został prawidłowo usunięty.", "JavaScript is required for %s to work. Sorry for the inconvenience.": "Do działania %sa jest wymagany JavaScript. Przepraszamy za tę niedogodność.", "%s requires a modern browser to work.": "%s wymaga do działania nowoczesnej przeglądarki.", "New": "Nowa", - "Create": "Stwórz", + "Create": "Dodaj", "Clone": "Sklonuj", "Raw text": "Czysty tekst", "Expires": "Wygasa za", @@ -133,9 +133,9 @@ "Ten dokument wygaśnie za %d miesięcy.", "Ten dokument wygaśnie za %d miesięcy." ], - "Please enter the password for this document:": "Wpisz hasło dla tej wklejki:", + "Please enter the password for this document:": "Wprowadź hasło dla tego dokumentu:", "Could not decrypt data (Wrong key?)": "Nie udało się odszyfrować danych (zły klucz?)", - "Could not delete the document, it was not stored in burn after reading mode.": "Nie udało się usunąć wklejki, nie została zapisana w trybie zniszczenia po przeczytaniu.", + "Could not delete the document, it was not stored in burn after reading mode.": "Nie można usunąć dokumentu, nie została zapisana w trybie zniszczenia po przeczytaniu.", "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "TYLKO DO TWOJEGO WGLĄDU. Nie zamykaj tego okna, ta wiadomość nie będzie mogła być wyświetlona ponownie.", "Could not decrypt comment; Wrong key?": "Nie udało się odszyfrować komentarza; zły klucz?", "Reply": "Odpowiedz", @@ -150,11 +150,11 @@ "unknown status": "nieznany status", "server error or not responding": "błąd serwera lub brak odpowiedzi", "Could not post comment: %s": "Nie udało się wysłać komentarza: %s", - "Sending document…": "Wysyłanie wklejki…", - "Your document is %s (Hit Ctrl+c to copy)": "Twoja wklejka to %s (wciśnij Ctrl+c aby skopiować)", + "Sending document…": "Wysyłanie dokumentu…", + "Your document is %s (Hit Ctrl+c to copy)": "Twój dokument to %s (wciśnij Ctrl+c aby skopiować)", "Delete data": "Skasuj dane", - "Could not create document: %s": "Nie udało się utworzyć wklejki: %s", - "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nie udało się odszyfrować wklejki - brak klucza deszyfrującego w adresie (użyłeś skracacza linków, który ucina część adresu?)", + "Could not create document: %s": "Nie można utworzyć dokumentu: %s", + "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nie można odszyfrować dokumentu: Brak klucza deszyfrującego w adresie URL (Czy użyto przekierowania lub skracacza adresów URL, który usuwa część adresu URL?)", "B": "B", "kB": "kB", "MB": "MB", @@ -170,7 +170,7 @@ "Markdown": "Znakowanie", "Download attachment": "Pobierz załącznik", "Cloned: '%s'": "Sklonowano: '%s'", - "The cloned file '%s' was attached to this document.": "Sklonowany plik '%s' był dołączony do tej wklejki.", + "The cloned file '%s' was attached to this document.": "Sklonowany plik '%s' był dołączony do tego dokumentu.", "Attach a file": "Załącz plik", "alternatively drag & drop a file or document an image from the clipboard": "Alternatywnie przeciągnij i upuść plik albo wklej obraz ze schowka", "File too large, to display a preview. Please download the attachment.": "Plik zbyt duży aby wyświetlić podgląd. Proszę pobrać załącznik.", @@ -185,15 +185,15 @@ "Decrypt": "Odszyfruj", "Enter password": "Wpisz hasło", "Loading…": "Wczytywanie…", - "Decrypting document…": "Odszyfrowywanie wklejki…", - "Preparing new document…": "Przygotowywanie nowej wklejki…", + "Decrypting document…": "Odszyfrowywanie dokumentu…", + "Preparing new document…": "Przygotowywanie nowego dokumentu…", "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": "W przypadku gdy ten komunikat nigdy nie znika, proszę spójrz na to FAQ aby rozwiązać problem (po angielsku).", - "+++ no document text +++": "+++ brak wklejonego tekstu +++", - "Could not get document data: %s": "Nie można było pobrać danych wklejki: %s", + "+++ no document text +++": "+++ brak tekstu dokumentu +++", + "Could not get document data: %s": "Nie można uzyskać danych dokumentu: %s", "QR code": "Kod QR", "This website is using an insecure HTTP connection! Please use it only for testing.": "Ta witryna używa niezabezpieczonego połączenia HTTP! Używaj jej wyłącznie do testowania.", "For more information see this FAQ entry.": "Aby uzyskać więcej informacji, sprawdź to często zadawane pytanie.", - "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": "Twoja przeglądarka może wymagać połączenia HTTPS do obsługi API WebCrypto. Wypróbuj przełączenie na HTTPS.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": "Twoja przeglądarka może wymagać połączenia HTTPS, aby obsługiwać API WebCrypto. Spróbuj przełączyć się na HTTPS.", "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Twoja przeglądarka nie obsługuje WebAssembly używanego do kompresji zlib. Możesz utworzyć nieskompresowane dokumenty, ale nie możesz odczytać skompresowanych.", "waiting on user to provide a password": "oczekiwanie na podanie hasła przez użytkownika", "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Błąd odszyfrowywania danych. Czy wprowadzono niepoprawne hasło? Spróbuj ponownie, używając przycisku na górze.", @@ -210,22 +210,22 @@ "Encrypted note on %s": "Zaszyfrowana notatka na %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Naciśnij tej odnośnik, aby zobaczyć notatkę. Każda osoba z dostępem do tego adresu URL również może zobaczyć tę notatkę.", "URL shortener may expose your decrypt key in URL.": "Skrócenie adresu URL może ujawnić Twój klucz odszyfrowujący w adresie URL.", - "Save document": "Zapisz wklejenie", - "Your IP is not authorized to create documents.": "Twój adres IP nie jest upoważniony do tworzenia wklejeń.", + "Save document": "Zapisz dokument", + "Your IP is not authorized to create documents.": "Twój adres IP nie jest autoryzowany do tworzenia dokumentów.", "Trying to shorten a URL that isn't pointing at our instance.": "Próba skrócenia adresu URL wskazującego na inną instancję.", "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Błąd wywoływania YOURLS. Możliwy błąd konfiguracji, taki jak błędne lub brakujące \"apiurl\" lub \"signature\".", "Error parsing YOURLS response.": "Błąd przetwarzania odpowiedzi YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Tę tajną wiadomość możesz zobaczyć tylko jeden raz. Czy chcesz to zrobić teraz?", "Yes, see it": "Tak, pokaż", "Dark Mode": "Ciemny motyw", - "Error compressing document, due to missing WebAssembly support.": "Błąd kompresowania wklejenia przez brak obsługi WebAssembly.", - "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Błąd dekompresowania wklejenia przez brak obsługi WebAssembly przez przeglądarkę. Użyj innej przeglądarki, aby zobaczyć to wklejenie.", + "Error compressing document, due to missing WebAssembly support.": "Wystąpił błąd podczas kompresji dokumentu z powodu braku obsługi WebAssembly.", + "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Wystąpił błąd podczas dekompresji dokumentu. Twoja przeglądarka nie obsługuje WebAssembly. Użyj innej przeglądarki, aby wyświetlić ten dokument.", "Start over": "Zacznij od nowa", - "Document copied to clipboard": "Wklejka skopiowana do schowka", - "To copy document press on the copy button or use the clipboard shortcut Ctrl+c/Cmd+c": "Aby skopiować wklejkę, naciśnij przycisk kopiowania lub użyj skrótu schowka Ctrl+c/Cmd+c", + "Document copied to clipboard": "Dokument został skopiowany do schowka", + "To copy document press on the copy button or use the clipboard shortcut Ctrl+c/Cmd+c": "Aby skopiować dokument, naciśnij przycisk kopiowania lub użyj skrótu do schowka Ctrl+c/Cmd+c", "Copy link": "Kopiuj link", "Link copied to clipboard": "Link został skopiowany do schowka", - "Document text": "Wklej tekst", + "Document text": "Tekst dokumentu", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Klawisz Tabulatora służy jako znak (przytrzymaj Ctrl+m lub Esc aby przełączać)", "Theme": "Motyw" } From d3d632ba04495f4a2d2eff7c22bd9e1b046c851c Mon Sep 17 00:00:00 2001 From: El RIDO Date: Mon, 28 Jul 2025 11:22:17 +0200 Subject: [PATCH 004/273] undo attachment hint translation change here paste refers to the act of "pasting" a copied item from the clipboard, not a document --- i18n/ar.json | 2 +- i18n/bg.json | 2 +- i18n/ca.json | 2 +- i18n/co.json | 2 +- i18n/cs.json | 2 +- i18n/de.json | 2 +- i18n/el.json | 2 +- i18n/en.json | 2 +- i18n/es.json | 2 +- i18n/et.json | 2 +- i18n/fi.json | 2 +- i18n/fr.json | 2 +- i18n/he.json | 2 +- i18n/hi.json | 2 +- i18n/hu.json | 2 +- i18n/id.json | 2 +- i18n/it.json | 2 +- i18n/ja.json | 2 +- i18n/jbo.json | 2 +- i18n/ko.json | 2 +- i18n/ku.json | 2 +- i18n/la.json | 2 +- i18n/lt.json | 2 +- i18n/nl.json | 2 +- i18n/no.json | 2 +- i18n/oc.json | 2 +- i18n/pl.json | 2 +- i18n/pt.json | 2 +- i18n/ro.json | 2 +- i18n/ru.json | 2 +- i18n/sk.json | 2 +- i18n/sl.json | 2 +- i18n/sv.json | 2 +- i18n/th.json | 2 +- i18n/tr.json | 2 +- i18n/uk.json | 2 +- i18n/zh.json | 2 +- 37 files changed, 37 insertions(+), 37 deletions(-) diff --git a/i18n/ar.json b/i18n/ar.json index dfbc433f..3b32b408 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "مستنسخ: '%s'", "The cloned file '%s' was attached to this document.": "تم إرفاق الملف المستنسخ '%s' بهذا اللصق.", "Attach a file": "أرفق ملف", - "alternatively drag & drop a file or document an image from the clipboard": "بدلاً من ذلك، اسحب ملفًا وأسقطه أو الصق صورة من الحافظة", + "alternatively drag & drop a file or paste an image from the clipboard": "بدلاً من ذلك، اسحب ملفًا وأسقطه أو الصق صورة من الحافظة", "File too large, to display a preview. Please download the attachment.": "الملف كبير جدًا، بحيث لا يمكن عرض معاينة. الرجاء تنزيل المرفق.", "Remove attachment": "أزِل المرفق", "Your browser does not support uploading encrypted files. Please use a newer browser.": "متصفحك لا يدعم رفع الملفات المشفرة. الرجاء استخدام متصفح أحدث.", diff --git a/i18n/bg.json b/i18n/bg.json index 5549b92e..457bfc10 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Дублирано: '%s'", "The cloned file '%s' was attached to this document.": "Дублирания файл '%s' беше прикачен.", "Attach a file": "Прикачи файл", - "alternatively drag & drop a file or document an image from the clipboard": "Също можеш да пуснеш файла върху този прозорец или да поставиш изображение от клипборда", + "alternatively drag & drop a file or paste an image from the clipboard": "Също можеш да пуснеш файла върху този прозорец или да поставиш изображение от клипборда", "File too large, to display a preview. Please download the attachment.": "Файла е твърде голям, за да се представи визуализация. Моля, свалете файла.", "Remove attachment": "Премахнете файла", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Браузърът ви не поддържа прикачване на шифровани файлове. Моля, използвайте по-нов браузър", diff --git a/i18n/ca.json b/i18n/ca.json index 7eaffdbe..1a6d57c3 100644 --- a/i18n/ca.json +++ b/i18n/ca.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Adjuntar un fitxer", - "alternatively drag & drop a file or document an image from the clipboard": "alternativament, pots arrossegar i deixar anar un fitxer o enganxar una imatge des del porta-retalls", + "alternatively drag & drop a file or paste an image from the clipboard": "alternativament, pots arrossegar i deixar anar un fitxer o enganxar una imatge des del porta-retalls", "File too large, to display a preview. Please download the attachment.": "El fitxer és massa gran per fer una vista prèvia. Si us plau, descarrega l'adjunt.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", diff --git a/i18n/co.json b/i18n/co.json index 8fa0ca4a..986b60e8 100644 --- a/i18n/co.json +++ b/i18n/co.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Duppiatu : « %s »", "The cloned file '%s' was attached to this document.": "U schedariu duppiatu « %s » hè statu aghjuntu à st’appiccicu.", "Attach a file": "Aghjunghje un schedariu", - "alternatively drag & drop a file or document an image from the clipboard": "in alternanza, sguillà è depone un schedariu o incullà una fiura da u preme’papei", + "alternatively drag & drop a file or paste an image from the clipboard": "in alternanza, sguillà è depone un schedariu o incullà una fiura da u preme’papei", "File too large, to display a preview. Please download the attachment.": "Schedariu troppu maiò per affissà una fighjulata. Scaricate a pezza ghjunta.", "Remove attachment": "Caccià a pezza ghjunta", "Your browser does not support uploading encrypted files. Please use a newer browser.": "U vostru navigatore ùn accetta micca l’inviu di i schedarii cifrati. Impiegate un navigatore più recente.", diff --git a/i18n/cs.json b/i18n/cs.json index d37ecbdd..e313524d 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Naklonováno: '%s'", "The cloned file '%s' was attached to this document.": "Naklonovaný soubor „%s“ byl připojen k tomuto příspěvku.", "Attach a file": "Připojit soubor", - "alternatively drag & drop a file or document an image from the clipboard": "případně přetáhněte soubor nebo vložte obrázek ze schránky", + "alternatively drag & drop a file or paste an image from the clipboard": "případně přetáhněte soubor nebo vložte obrázek ze schránky", "File too large, to display a preview. Please download the attachment.": "Soubor je příliš velký pro zobrazení náhledu. Stáhněte si přílohu.", "Remove attachment": "Odstranit přílohu", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Váš prohlížeč nepodporuje nahrávání šifrovaných souborů. Použijte modernější verzi prohlížeče.", diff --git a/i18n/de.json b/i18n/de.json index c8a07255..34251265 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Geklont: '%s'", "The cloned file '%s' was attached to this document.": "Die geklonte Datei '%s' wurde angehängt.", "Attach a file": "Datei anhängen", - "alternatively drag & drop a file or document an image from the clipboard": "Eine Datei kann auch durch ziehen und loslassen ausgewählt oder ein Bild aus der Zwischenablage einfügt werden.", + "alternatively drag & drop a file or paste an image from the clipboard": "Eine Datei kann auch durch ziehen und loslassen ausgewählt oder ein Bild aus der Zwischenablage einfügt werden.", "File too large, to display a preview. Please download the attachment.": "Datei zu groß, um als Vorschau angezeigt zu werden. Bitte Anhang herunterladen.", "Remove attachment": "Anhang entfernen", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Dein Browser unterstützt das hochladen von verschlüsselten Dateien nicht. Bitte verwende einen neueren Browser.", diff --git a/i18n/el.json b/i18n/el.json index bf28c52f..df1833a7 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Κλώνος: '%s'", "The cloned file '%s' was attached to this document.": "Το κλωνοποιημένο αρχείο '%s' επισυνάφθηκε στ αυτή την επικόλληση.", "Attach a file": "Επισύναψη αρχείου", - "alternatively drag & drop a file or document an image from the clipboard": "εναλλακτικά σύρετε το αρχείο ή επικολλήστε μία εικόνα από το clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "εναλλακτικά σύρετε το αρχείο ή επικολλήστε μία εικόνα από το clipboard", "File too large, to display a preview. Please download the attachment.": "Πολύ μεγάλο αρχείο για προεπισκόπηση. Παρακαλώ κατεβάστε το επισυναπτόμενο.", "Remove attachment": "Αφαίρεση επισυναπτόμενου", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Ο φυλλομετρητής (browser) σας δεν υποστηρίζει κρυπτογραφημένα αρχεία. Παρακαλώ χρησιμοποιήστε νεότερο φιλομετρητή.", diff --git a/i18n/en.json b/i18n/en.json index eb318881..791677ff 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", diff --git a/i18n/es.json b/i18n/es.json index 4096af45..86db6478 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Clonado: '%s'.", "The cloned file '%s' was attached to this document.": "El archivo clonado '%s' ha sido adjuntado a este texto.", "Attach a file": "Adjuntar archivo", - "alternatively drag & drop a file or document an image from the clipboard": "alternativamente, arrastre y suelte un archivo o pegue una imagen desde el portapapeles", + "alternatively drag & drop a file or paste an image from the clipboard": "alternativamente, arrastre y suelte un archivo o pegue una imagen desde el portapapeles", "File too large, to display a preview. Please download the attachment.": "Archivo demasiado grande para mostrar una vista previa. Por favor, descargue el archivo adjunto.", "Remove attachment": "Remover adjunto", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Tu navegador no admite la carga de archivos cifrados. Utilice un navegador más reciente.", diff --git a/i18n/et.json b/i18n/et.json index 5433b4d6..37a90e98 100644 --- a/i18n/et.json +++ b/i18n/et.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Kloonitud: '%s'", "The cloned file '%s' was attached to this document.": "Kloonitud fail '%s' manustati sellele kleepele.", "Attach a file": "Manusta fail", - "alternatively drag & drop a file or document an image from the clipboard": "teise võimalusena lohista fail või kleebi pilt lõikelaualt", + "alternatively drag & drop a file or paste an image from the clipboard": "teise võimalusena lohista fail või kleebi pilt lõikelaualt", "File too large, to display a preview. Please download the attachment.": "Fail on eelvaate kuvamiseks liiga suur. Palun laadi manus alla.", "Remove attachment": "Eemalda manus", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Sinu brauser ei toeta krüpteeritud failide üleslaadimist. Palun kasuta uuemat brauserit.", diff --git a/i18n/fi.json b/i18n/fi.json index ec44bf6e..f906299a 100644 --- a/i18n/fi.json +++ b/i18n/fi.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Kloonattu: '%s'", "The cloned file '%s' was attached to this document.": "Kloonattu tiedosto '%s' liitettiin tähän pasteen", "Attach a file": "Liitä tiedosto", - "alternatively drag & drop a file or document an image from the clipboard": "vaihtoehtoisesti vedä & pudota tiedosto tai liitä kuva leikepöydältä", + "alternatively drag & drop a file or paste an image from the clipboard": "vaihtoehtoisesti vedä & pudota tiedosto tai liitä kuva leikepöydältä", "File too large, to display a preview. Please download the attachment.": "Tiedosto on liian iso esikatselun näyttämiseksi. Lataathan liitteen.", "Remove attachment": "Poista liite", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Selaimesi ei tue salattujen tiedostojen lataamista. Käytäthän uudempaa selainta.", diff --git a/i18n/fr.json b/i18n/fr.json index 8811d485..f6a9cd11 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloner '%s'", "The cloned file '%s' was attached to this document.": "Le fichier cloné '%s' a été attaché à ce document.", "Attach a file": "Attacher un fichier", - "alternatively drag & drop a file or document an image from the clipboard": "au choix, glisser & déposer un fichier ou coller une image à partir du presse-papiers", + "alternatively drag & drop a file or paste an image from the clipboard": "au choix, glisser & déposer un fichier ou coller une image à partir du presse-papiers", "File too large, to display a preview. Please download the attachment.": "Fichier trop volumineux, pour afficher un aperçu. Veuillez télécharger la pièce jointe.", "Remove attachment": "Enlever la pièce jointe", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Votre navigateur ne supporte pas l'envoi de fichiers chiffrés. Merci d'utiliser un navigateur plus récent.", diff --git a/i18n/he.json b/i18n/he.json index 6dd99009..b59d1257 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "שוכפל: '%s'", "The cloned file '%s' was attached to this document.": "הקובץ '%s' שהועתק צורף להדבקה זו.", "Attach a file": "צירוף קובץ", - "alternatively drag & drop a file or document an image from the clipboard": "לחלופין, ניתן לגרור ולשחרר קובץ או להדביק תמונה מהלוח.", + "alternatively drag & drop a file or paste an image from the clipboard": "לחלופין, ניתן לגרור ולשחרר קובץ או להדביק תמונה מהלוח.", "File too large, to display a preview. Please download the attachment.": "הקובץ גדול מדי כדי להציג תצוגה מקדימה. אנא הורד את הקובץ המצורף.", "Remove attachment": "הסר קובץ מצורף", "Your browser does not support uploading encrypted files. Please use a newer browser.": "הדפדפן שלך אינו תומך בהעלאת קבצים מוצפנים. אנא השתמש בדפדפן עדכני יותר.", diff --git a/i18n/hi.json b/i18n/hi.json index eb318881..791677ff 100644 --- a/i18n/hi.json +++ b/i18n/hi.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", diff --git a/i18n/hu.json b/i18n/hu.json index 04a9a193..64df16c6 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "'%s' másolva", "The cloned file '%s' was attached to this document.": "A másolt '%s' csatolmányt hozzáadtuk ehhez a bejegyzéshez.", "Attach a file": "Fájl csatolása", - "alternatively drag & drop a file or document an image from the clipboard": "vagy húzz ide egy fájlt, netán illessz be egy képet a vágólapról.", + "alternatively drag & drop a file or paste an image from the clipboard": "vagy húzz ide egy fájlt, netán illessz be egy képet a vágólapról.", "File too large, to display a preview. Please download the attachment.": "A fájl túl nagy ahhoz, hogy előnézete legyen. Töltsd le, hogy megtekinthesd.", "Remove attachment": "Csatolmány eltávolítása", "Your browser does not support uploading encrypted files. Please use a newer browser.": "A böngésződ nem támogatja titkosított fájlok feltöltését. Használj újabbat.", diff --git a/i18n/id.json b/i18n/id.json index 9f2e7a13..dde4afc9 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Diklon: '%s'", "The cloned file '%s' was attached to this document.": "Berkas yang di-klon '%s' telah dilampirkan pada document ini.", "Attach a file": "Lampirkan sebuah berkas", - "alternatively drag & drop a file or document an image from the clipboard": "sebagai alternatif, seret & jatuhkan berkas atau tempel sebuah gambar dari papan klip", + "alternatively drag & drop a file or paste an image from the clipboard": "sebagai alternatif, seret & jatuhkan berkas atau tempel sebuah gambar dari papan klip", "File too large, to display a preview. Please download the attachment.": "File terlalu besar untuk menampilkan pratinjau. Silakan unduh lampirannya.", "Remove attachment": "Hapus lampiran", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Browser Anda tidak mendukung pengunggahan file terenkripsi. Harap gunakan browser yang lebih baru.", diff --git a/i18n/it.json b/i18n/it.json index 1bab4ed3..1a20167d 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Clonato: '%s'", "The cloned file '%s' was attached to this document.": "Il file clonato '%s' era allegato a questo messaggio.", "Attach a file": "Allega un file", - "alternatively drag & drop a file or document an image from the clipboard": "in alternativa trascina e rilascia un file o incolla un'immagine dagli appunti", + "alternatively drag & drop a file or paste an image from the clipboard": "in alternativa trascina e rilascia un file o incolla un'immagine dagli appunti", "File too large, to display a preview. Please download the attachment.": "File troppo grande, per visualizzare un'anteprima. Sei pregato di scaricare l'allegato.", "Remove attachment": "Rimuovi allegato", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Il tuo browser non supporta l'invio di file cifrati. Utilizza un browser più recente.", diff --git a/i18n/ja.json b/i18n/ja.json index 9b5b259e..60ce321e 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "複製済:'%s'", "The cloned file '%s' was attached to this document.": "複製されたファイル '%s' がこのペーストに添付されました。", "Attach a file": "ファイルを添付", - "alternatively drag & drop a file or document an image from the clipboard": "代わりに、ファイルをドラッグ&ドロップまたはクリップボードから画像を貼り付け", + "alternatively drag & drop a file or paste an image from the clipboard": "代わりに、ファイルをドラッグ&ドロップまたはクリップボードから画像を貼り付け", "File too large, to display a preview. Please download the attachment.": "ファイルが大きすぎるため、プレビューを表示できません。ダウンロードしてください。", "Remove attachment": "添付ファイルを削除", "Your browser does not support uploading encrypted files. Please use a newer browser.": "お使いのブラウザーは暗号化されたファイルのアップロードをサポートしていません。新しいブラウザーを使用してください。", diff --git a/i18n/jbo.json b/i18n/jbo.json index 69519582..13670de7 100644 --- a/i18n/jbo.json +++ b/i18n/jbo.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", diff --git a/i18n/ko.json b/i18n/ko.json index eb318881..791677ff 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", diff --git a/i18n/ku.json b/i18n/ku.json index 85be3a82..a30ce774 100644 --- a/i18n/ku.json +++ b/i18n/ku.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", diff --git a/i18n/la.json b/i18n/la.json index 1823eff9..d7b005fa 100644 --- a/i18n/la.json +++ b/i18n/la.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", diff --git a/i18n/lt.json b/i18n/lt.json index fa840a13..ed82c21c 100644 --- a/i18n/lt.json +++ b/i18n/lt.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Dubliuota: „%s“", "The cloned file '%s' was attached to this document.": "Dubliuotas failas „%s“ buvo pridėtas į šį įdėjimą.", "Attach a file": "Pridėti failą", - "alternatively drag & drop a file or document an image from the clipboard": "arba kitaip - tempkite failą arba įdėkite paveikslą iš iškarpinės", + "alternatively drag & drop a file or paste an image from the clipboard": "arba kitaip - tempkite failą arba įdėkite paveikslą iš iškarpinės", "File too large, to display a preview. Please download the attachment.": "Failas per didelis, kad būtų rodoma peržiūra. Atsisiųskite priedą.", "Remove attachment": "Šalinti priedą", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Jūsų naršyklė nepalaiko šifruotų failų įkėlimo. Naudokite naujesnę naršyklę.", diff --git a/i18n/nl.json b/i18n/nl.json index 6480b5ff..36bbce0d 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Gekloond: '%s'", "The cloned file '%s' was attached to this document.": "Het gekloonde bestand '%s' is bijgevoegd aan de document.", "Attach a file": "Een bestand toevoegen", - "alternatively drag & drop a file or document an image from the clipboard": "Je kunt ook een bestand slepen en neerzetten of een afbeelding plakken van het klembord", + "alternatively drag & drop a file or paste an image from the clipboard": "Je kunt ook een bestand slepen en neerzetten of een afbeelding plakken van het klembord", "File too large, to display a preview. Please download the attachment.": "Het bestand is te groot om voorbeeld weer te geven. Aub de bijlage downloaden.", "Remove attachment": "Bijlage verwijderen", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Je browser biedt geen ondersteuning voor het uploaden van gecodeerde bestanden. Gebruik alstublieft een nieuwere browser.", diff --git a/i18n/no.json b/i18n/no.json index 6f8e991d..3184e464 100644 --- a/i18n/no.json +++ b/i18n/no.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Kopiert: '%s'", "The cloned file '%s' was attached to this document.": "Den klonede filen '%s' var koblet til denne innlimingen.", "Attach a file": "Legg til fil", - "alternatively drag & drop a file or document an image from the clipboard": "alternativt dra og slipp en fil, eller lim inn et bilde fra utklippstavlen", + "alternatively drag & drop a file or paste an image from the clipboard": "alternativt dra og slipp en fil, eller lim inn et bilde fra utklippstavlen", "File too large, to display a preview. Please download the attachment.": "Filen er for stor, for å vise en forhåndsvisning. Last ned vedlegget.", "Remove attachment": "Slett vedlegg", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Nettleseren din støtter ikke å laste opp krypterte filer. Vennligst bruk en nyere nettleser.", diff --git a/i18n/oc.json b/i18n/oc.json index 733c4d2c..38171035 100644 --- a/i18n/oc.json +++ b/i18n/oc.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Clonar : '%s'", "The cloned file '%s' was attached to this document.": "Aqueste fichièr clonat '%s' es estat ajustat a aqueste tèxte.", "Attach a file": "Juntar un fichièr", - "alternatively drag & drop a file or document an image from the clipboard": "autrament lisatz lo fichièr o pegatz l’imatge del quichapapièrs", + "alternatively drag & drop a file or paste an image from the clipboard": "autrament lisatz lo fichièr o pegatz l’imatge del quichapapièrs", "File too large, to display a preview. Please download the attachment.": "Fichièr tròp pesuc per mostrar un apercebut. Telecargatz la pèca junta.", "Remove attachment": "Levar la pèça junta", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Vòstre navigator es pas compatible amb lo mandadís de fichièrs chifrats. Mercés d’emplegar un navigator mai recent.", diff --git a/i18n/pl.json b/i18n/pl.json index d3fc7697..a146fe6d 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Sklonowano: '%s'", "The cloned file '%s' was attached to this document.": "Sklonowany plik '%s' był dołączony do tego dokumentu.", "Attach a file": "Załącz plik", - "alternatively drag & drop a file or document an image from the clipboard": "Alternatywnie przeciągnij i upuść plik albo wklej obraz ze schowka", + "alternatively drag & drop a file or paste an image from the clipboard": "Alternatywnie przeciągnij i upuść plik albo wklej obraz ze schowka", "File too large, to display a preview. Please download the attachment.": "Plik zbyt duży aby wyświetlić podgląd. Proszę pobrać załącznik.", "Remove attachment": "Usuń załącznik", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Twoja przeglądarka nie wspiera wysyłania zaszyfrowanych plików. Użyj nowszej przeglądarki.", diff --git a/i18n/pt.json b/i18n/pt.json index eaeef45b..e426425b 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Clonado: '%s'", "The cloned file '%s' was attached to this document.": "O arquivo clonado '%s' foi anexado a essa cópia.", "Attach a file": "Anexar um arquivo", - "alternatively drag & drop a file or document an image from the clipboard": "alternativamente, arraste e solte um arquivo ou cole uma imagem da área de transferência", + "alternatively drag & drop a file or paste an image from the clipboard": "alternativamente, arraste e solte um arquivo ou cole uma imagem da área de transferência", "File too large, to display a preview. Please download the attachment.": "Arquivo muito grande para exibir uma prévia. Por favor, faça o download do anexo.", "Remove attachment": "Remover anexo", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Seu navegador não permite subir arquivos cifrados. Por favor, utilize um navegador mais recente.", diff --git a/i18n/ro.json b/i18n/ro.json index 1bb8b91f..cb8cd5e4 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "S-a clonat: '%s'", "The cloned file '%s' was attached to this document.": "Fișierul clonat '%s' a fost atașat la acest document.", "Attach a file": "Atașați un fișier", - "alternatively drag & drop a file or document an image from the clipboard": "alternativ, trageți și plasați un fișier sau lipiți o imagine din clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternativ, trageți și plasați un fișier sau lipiți o imagine din clipboard", "File too large, to display a preview. Please download the attachment.": "Fișierul este prea mare pentru a afișa o previzualizare. Vă rugăm să descărcaţi fișierul.", "Remove attachment": "Eliminați fișierul atașat", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Browserul dvs. nu acceptă încărcarea fișierelor criptate. Vă rugăm să folosiți un browser mai nou.", diff --git a/i18n/ru.json b/i18n/ru.json index d6943cbd..80139e94 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Дублировано: '%s'", "The cloned file '%s' was attached to this document.": "Дубликат файла '%s' был прикреплен к этой записи.", "Attach a file": "Прикрепить файл", - "alternatively drag & drop a file or document an image from the clipboard": "так же можно перенести файл в окно браузера или вставить изображение из буфера", + "alternatively drag & drop a file or paste an image from the clipboard": "так же можно перенести файл в окно браузера или вставить изображение из буфера", "File too large, to display a preview. Please download the attachment.": "Файл слишком большой для отображения предпросмотра. Пожалуйста, скачайте прикрепленный файл.", "Remove attachment": "Удалить вложение", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Ваш браузер не поддерживает отправку зашифрованных файлов. Используйте более новый браузер.", diff --git a/i18n/sk.json b/i18n/sk.json index 2fd91bef..2d72d32f 100644 --- a/i18n/sk.json +++ b/i18n/sk.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Naklonované: '%s'", "The cloned file '%s' was attached to this document.": "K tomuto príspevku bol pripojený klonovaný súbor '%s'.", "Attach a file": "Priložiť súbor", - "alternatively drag & drop a file or document an image from the clipboard": "prípadne presuňte súbor myšou alebo vložte obrázok zo schránky", + "alternatively drag & drop a file or paste an image from the clipboard": "prípadne presuňte súbor myšou alebo vložte obrázok zo schránky", "File too large, to display a preview. Please download the attachment.": "Súbor je príliš veľký na zobrazenie ukážky. Stiahnite si prosím prílohu.", "Remove attachment": "Odstrániť prílohu", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Váš prehliadač nepodporuje nahrávanie šifrovaných súborov. Použite prosím novší prehliadač.", diff --git a/i18n/sl.json b/i18n/sl.json index c69797df..ca49a341 100644 --- a/i18n/sl.json +++ b/i18n/sl.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "'%s' klonirana", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Pripni datoteko", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Odstrani priponko", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Tvoj brskalnik ne omogoča nalaganje zakodiranih datotek. Prosim uporabi novejši brskalnik.", diff --git a/i18n/sv.json b/i18n/sv.json index 235137d0..00e64693 100644 --- a/i18n/sv.json +++ b/i18n/sv.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", diff --git a/i18n/th.json b/i18n/th.json index 9c6b3b8e..c64e451b 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "โคลนแล้ว: '%s'", "The cloned file '%s' was attached to this document.": "การโคลนข้อมูลการฝากโค้ด มีไฟล์ '%s' แนบมาด้วย", "Attach a file": "แนบไฟล์", - "alternatively drag & drop a file or document an image from the clipboard": "หรือสามารถลากและวางไฟล์หรือวางรูปภาพจากคลิปบอร์ดได้", + "alternatively drag & drop a file or paste an image from the clipboard": "หรือสามารถลากและวางไฟล์หรือวางรูปภาพจากคลิปบอร์ดได้", "File too large, to display a preview. Please download the attachment.": "ไฟล์มีขนาดใหญ่เกินไปที่จะแสดงตัวอย่าง กรุณาดาวน์โหลดเป็นไฟล์แนบแทน", "Remove attachment": "ลบไฟล์แนบ", "Your browser does not support uploading encrypted files. Please use a newer browser.": "เบราว์เซอร์ของคุณไม่สนับสนุนการอัปโหลดไฟล์แบบเข้ารหัสได้ กรุณาใช้เบราว์เซอร์ที่ใหม่กว่า", diff --git a/i18n/tr.json b/i18n/tr.json index c3d5311a..0f12990a 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Klonlandı: '%s'", "The cloned file '%s' was attached to this document.": "Klonlanmış dosya '%s' bu yazıya eklendi.", "Attach a file": "Dosya ekle", - "alternatively drag & drop a file or document an image from the clipboard": "alternatif olarak dosyayı yapıştırabilir veya sürükleyip bırakabilirsiniz", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatif olarak dosyayı yapıştırabilir veya sürükleyip bırakabilirsiniz", "File too large, to display a preview. Please download the attachment.": "Dosya önizleme için çok büyük. Lütfen eki indirin.", "Remove attachment": "Eki sil", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Tarayıcınız şifreli dosyaları yüklemeyi desteklemiyor. Lütfen daha yeni bir tarayıcı kullanın.", diff --git a/i18n/uk.json b/i18n/uk.json index c908398b..5649b463 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Дубльовано: '%s'", "The cloned file '%s' was attached to this document.": "Дублікат файлу '%s' був прикріплений до цього запису.", "Attach a file": "Прикріпити файл", - "alternatively drag & drop a file or document an image from the clipboard": "також можна перенести файл у вікно переглядача чи вставити зображення з буфера", + "alternatively drag & drop a file or paste an image from the clipboard": "також можна перенести файл у вікно переглядача чи вставити зображення з буфера", "File too large, to display a preview. Please download the attachment.": "Файл завеликий для відображення передогляду. Будь ласка, звантажте прикріплений файл.", "Remove attachment": "Видалити вкладення", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Ваш переглядач не підтримує відправлення зашифрованих файлів. Використовуйте сучасніший переглядач.", diff --git a/i18n/zh.json b/i18n/zh.json index 7812e598..72b1fc76 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "副本:“%s”", "The cloned file '%s' was attached to this document.": "副本“%s”已附加到此粘贴内容。", "Attach a file": "添加一个附件", - "alternatively drag & drop a file or document an image from the clipboard": "拖放文件或从剪贴板粘贴图片", + "alternatively drag & drop a file or paste an image from the clipboard": "拖放文件或从剪贴板粘贴图片", "File too large, to display a preview. Please download the attachment.": "文件过大,无法显示预览。请下载附件。", "Remove attachment": "移除附件", "Your browser does not support uploading encrypted files. Please use a newer browser.": "您的浏览器不支持上传加密的文件,请使用新版本的浏览器。", From 6b3d1cf1a6cfc4d1f73ba6f3dad6e01bd8216c37 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:19 +0200 Subject: [PATCH 005/273] New translations en.json (Romanian) --- i18n/ro.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ro.json b/i18n/ro.json index 1bb8b91f..5afd2cbb 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "S-a clonat: '%s'", "The cloned file '%s' was attached to this document.": "Fișierul clonat '%s' a fost atașat la acest document.", "Attach a file": "Atașați un fișier", - "alternatively drag & drop a file or document an image from the clipboard": "alternativ, trageți și plasați un fișier sau lipiți o imagine din clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Fișierul este prea mare pentru a afișa o previzualizare. Vă rugăm să descărcaţi fișierul.", "Remove attachment": "Eliminați fișierul atașat", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Browserul dvs. nu acceptă încărcarea fișierelor criptate. Vă rugăm să folosiți un browser mai nou.", From f6efe1592d270933afe1091313d5fe140b5cb9d6 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:20 +0200 Subject: [PATCH 006/273] New translations en.json (French) --- i18n/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/fr.json b/i18n/fr.json index 8811d485..fd6bb5fd 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloner '%s'", "The cloned file '%s' was attached to this document.": "Le fichier cloné '%s' a été attaché à ce document.", "Attach a file": "Attacher un fichier", - "alternatively drag & drop a file or document an image from the clipboard": "au choix, glisser & déposer un fichier ou coller une image à partir du presse-papiers", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Fichier trop volumineux, pour afficher un aperçu. Veuillez télécharger la pièce jointe.", "Remove attachment": "Enlever la pièce jointe", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Votre navigateur ne supporte pas l'envoi de fichiers chiffrés. Merci d'utiliser un navigateur plus récent.", From 8a90cc1d8fa8d3f9f3229477056adbcaf27d2276 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:21 +0200 Subject: [PATCH 007/273] New translations en.json (Spanish) --- i18n/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/es.json b/i18n/es.json index 4096af45..e4b3e023 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Clonado: '%s'.", "The cloned file '%s' was attached to this document.": "El archivo clonado '%s' ha sido adjuntado a este texto.", "Attach a file": "Adjuntar archivo", - "alternatively drag & drop a file or document an image from the clipboard": "alternativamente, arrastre y suelte un archivo o pegue una imagen desde el portapapeles", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Archivo demasiado grande para mostrar una vista previa. Por favor, descargue el archivo adjunto.", "Remove attachment": "Remover adjunto", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Tu navegador no admite la carga de archivos cifrados. Utilice un navegador más reciente.", From 2514572a8809025346967ce2b70e4858fe186d94 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:22 +0200 Subject: [PATCH 008/273] New translations en.json (Arabic) --- i18n/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ar.json b/i18n/ar.json index dfbc433f..a523d63b 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "مستنسخ: '%s'", "The cloned file '%s' was attached to this document.": "تم إرفاق الملف المستنسخ '%s' بهذا اللصق.", "Attach a file": "أرفق ملف", - "alternatively drag & drop a file or document an image from the clipboard": "بدلاً من ذلك، اسحب ملفًا وأسقطه أو الصق صورة من الحافظة", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "الملف كبير جدًا، بحيث لا يمكن عرض معاينة. الرجاء تنزيل المرفق.", "Remove attachment": "أزِل المرفق", "Your browser does not support uploading encrypted files. Please use a newer browser.": "متصفحك لا يدعم رفع الملفات المشفرة. الرجاء استخدام متصفح أحدث.", From 3933bbc8cc99db7cd0574fda2c8738a46ba651f2 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:23 +0200 Subject: [PATCH 009/273] New translations en.json (Bulgarian) --- i18n/bg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/bg.json b/i18n/bg.json index 5549b92e..c00ed5c0 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Дублирано: '%s'", "The cloned file '%s' was attached to this document.": "Дублирания файл '%s' беше прикачен.", "Attach a file": "Прикачи файл", - "alternatively drag & drop a file or document an image from the clipboard": "Също можеш да пуснеш файла върху този прозорец или да поставиш изображение от клипборда", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Файла е твърде голям, за да се представи визуализация. Моля, свалете файла.", "Remove attachment": "Премахнете файла", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Браузърът ви не поддържа прикачване на шифровани файлове. Моля, използвайте по-нов браузър", From f916a4d0d0aafc664e83de2ab15f2d9d10d26bb1 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:24 +0200 Subject: [PATCH 010/273] New translations en.json (Catalan) --- i18n/ca.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ca.json b/i18n/ca.json index 7eaffdbe..be3a2e78 100644 --- a/i18n/ca.json +++ b/i18n/ca.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Adjuntar un fitxer", - "alternatively drag & drop a file or document an image from the clipboard": "alternativament, pots arrossegar i deixar anar un fitxer o enganxar una imatge des del porta-retalls", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "El fitxer és massa gran per fer una vista prèvia. Si us plau, descarrega l'adjunt.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", From 5c06d8289b3089f321a4aa49ed77b0ec514cf82b Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:25 +0200 Subject: [PATCH 011/273] New translations en.json (Czech) --- i18n/cs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/cs.json b/i18n/cs.json index d37ecbdd..ed0065f9 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Naklonováno: '%s'", "The cloned file '%s' was attached to this document.": "Naklonovaný soubor „%s“ byl připojen k tomuto příspěvku.", "Attach a file": "Připojit soubor", - "alternatively drag & drop a file or document an image from the clipboard": "případně přetáhněte soubor nebo vložte obrázek ze schránky", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Soubor je příliš velký pro zobrazení náhledu. Stáhněte si přílohu.", "Remove attachment": "Odstranit přílohu", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Váš prohlížeč nepodporuje nahrávání šifrovaných souborů. Použijte modernější verzi prohlížeče.", From 0016cbc3830a96c3be462e5e050ad127dcb100a1 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:26 +0200 Subject: [PATCH 012/273] New translations en.json (German) --- i18n/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/de.json b/i18n/de.json index c8a07255..4336f00e 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Geklont: '%s'", "The cloned file '%s' was attached to this document.": "Die geklonte Datei '%s' wurde angehängt.", "Attach a file": "Datei anhängen", - "alternatively drag & drop a file or document an image from the clipboard": "Eine Datei kann auch durch ziehen und loslassen ausgewählt oder ein Bild aus der Zwischenablage einfügt werden.", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Datei zu groß, um als Vorschau angezeigt zu werden. Bitte Anhang herunterladen.", "Remove attachment": "Anhang entfernen", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Dein Browser unterstützt das hochladen von verschlüsselten Dateien nicht. Bitte verwende einen neueren Browser.", From 0804b93ec81eb6ab7909306958e25b0e08526797 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:28 +0200 Subject: [PATCH 013/273] New translations en.json (Greek) --- i18n/el.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/el.json b/i18n/el.json index bf28c52f..3870f59c 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Κλώνος: '%s'", "The cloned file '%s' was attached to this document.": "Το κλωνοποιημένο αρχείο '%s' επισυνάφθηκε στ αυτή την επικόλληση.", "Attach a file": "Επισύναψη αρχείου", - "alternatively drag & drop a file or document an image from the clipboard": "εναλλακτικά σύρετε το αρχείο ή επικολλήστε μία εικόνα από το clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Πολύ μεγάλο αρχείο για προεπισκόπηση. Παρακαλώ κατεβάστε το επισυναπτόμενο.", "Remove attachment": "Αφαίρεση επισυναπτόμενου", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Ο φυλλομετρητής (browser) σας δεν υποστηρίζει κρυπτογραφημένα αρχεία. Παρακαλώ χρησιμοποιήστε νεότερο φιλομετρητή.", From a1dfbf7f5bba0fc45511e12db0957d341ad37fdc Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:29 +0200 Subject: [PATCH 014/273] New translations en.json (Finnish) --- i18n/fi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/fi.json b/i18n/fi.json index ec44bf6e..38300b7f 100644 --- a/i18n/fi.json +++ b/i18n/fi.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Kloonattu: '%s'", "The cloned file '%s' was attached to this document.": "Kloonattu tiedosto '%s' liitettiin tähän pasteen", "Attach a file": "Liitä tiedosto", - "alternatively drag & drop a file or document an image from the clipboard": "vaihtoehtoisesti vedä & pudota tiedosto tai liitä kuva leikepöydältä", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Tiedosto on liian iso esikatselun näyttämiseksi. Lataathan liitteen.", "Remove attachment": "Poista liite", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Selaimesi ei tue salattujen tiedostojen lataamista. Käytäthän uudempaa selainta.", From a9171c34b263ad3abcd79942f1ea21cb15ef8688 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:30 +0200 Subject: [PATCH 015/273] New translations en.json (Hebrew) --- i18n/he.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/he.json b/i18n/he.json index 6dd99009..33a4154f 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "שוכפל: '%s'", "The cloned file '%s' was attached to this document.": "הקובץ '%s' שהועתק צורף להדבקה זו.", "Attach a file": "צירוף קובץ", - "alternatively drag & drop a file or document an image from the clipboard": "לחלופין, ניתן לגרור ולשחרר קובץ או להדביק תמונה מהלוח.", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "הקובץ גדול מדי כדי להציג תצוגה מקדימה. אנא הורד את הקובץ המצורף.", "Remove attachment": "הסר קובץ מצורף", "Your browser does not support uploading encrypted files. Please use a newer browser.": "הדפדפן שלך אינו תומך בהעלאת קבצים מוצפנים. אנא השתמש בדפדפן עדכני יותר.", From dc3e838d2fceb7310524e43fc9d7904c2e7eac2a Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:31 +0200 Subject: [PATCH 016/273] New translations en.json (Hungarian) --- i18n/hu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/hu.json b/i18n/hu.json index 04a9a193..d8e65172 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "'%s' másolva", "The cloned file '%s' was attached to this document.": "A másolt '%s' csatolmányt hozzáadtuk ehhez a bejegyzéshez.", "Attach a file": "Fájl csatolása", - "alternatively drag & drop a file or document an image from the clipboard": "vagy húzz ide egy fájlt, netán illessz be egy képet a vágólapról.", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "A fájl túl nagy ahhoz, hogy előnézete legyen. Töltsd le, hogy megtekinthesd.", "Remove attachment": "Csatolmány eltávolítása", "Your browser does not support uploading encrypted files. Please use a newer browser.": "A böngésződ nem támogatja titkosított fájlok feltöltését. Használj újabbat.", From c70efcc31f4b0bf923cdf0d265ce2428070a15ae Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:32 +0200 Subject: [PATCH 017/273] New translations en.json (Italian) --- i18n/it.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/it.json b/i18n/it.json index 1bab4ed3..efe146d1 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Clonato: '%s'", "The cloned file '%s' was attached to this document.": "Il file clonato '%s' era allegato a questo messaggio.", "Attach a file": "Allega un file", - "alternatively drag & drop a file or document an image from the clipboard": "in alternativa trascina e rilascia un file o incolla un'immagine dagli appunti", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File troppo grande, per visualizzare un'anteprima. Sei pregato di scaricare l'allegato.", "Remove attachment": "Rimuovi allegato", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Il tuo browser non supporta l'invio di file cifrati. Utilizza un browser più recente.", From 74c4b31e03bb2d2709e419c83b377cfa10ebceac Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:33 +0200 Subject: [PATCH 018/273] New translations en.json (Japanese) --- i18n/ja.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ja.json b/i18n/ja.json index 9b5b259e..0dc0d66e 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "複製済:'%s'", "The cloned file '%s' was attached to this document.": "複製されたファイル '%s' がこのペーストに添付されました。", "Attach a file": "ファイルを添付", - "alternatively drag & drop a file or document an image from the clipboard": "代わりに、ファイルをドラッグ&ドロップまたはクリップボードから画像を貼り付け", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "ファイルが大きすぎるため、プレビューを表示できません。ダウンロードしてください。", "Remove attachment": "添付ファイルを削除", "Your browser does not support uploading encrypted files. Please use a newer browser.": "お使いのブラウザーは暗号化されたファイルのアップロードをサポートしていません。新しいブラウザーを使用してください。", From 63608c93feecd2b62b77edb876013c0388893ff1 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:34 +0200 Subject: [PATCH 019/273] New translations en.json (Korean) --- i18n/ko.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ko.json b/i18n/ko.json index eb318881..791677ff 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", From 950ab4e3935e6e20d5e06a14b300b9b1661ef4fa Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:35 +0200 Subject: [PATCH 020/273] New translations en.json (Kurdish) --- i18n/ku.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ku.json b/i18n/ku.json index 85be3a82..a30ce774 100644 --- a/i18n/ku.json +++ b/i18n/ku.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", From 69cfe9109496a5469a27aaed4bfe8e82b317cbcd Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:36 +0200 Subject: [PATCH 021/273] New translations en.json (Lithuanian) --- i18n/lt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/lt.json b/i18n/lt.json index fa840a13..e537949e 100644 --- a/i18n/lt.json +++ b/i18n/lt.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Dubliuota: „%s“", "The cloned file '%s' was attached to this document.": "Dubliuotas failas „%s“ buvo pridėtas į šį įdėjimą.", "Attach a file": "Pridėti failą", - "alternatively drag & drop a file or document an image from the clipboard": "arba kitaip - tempkite failą arba įdėkite paveikslą iš iškarpinės", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Failas per didelis, kad būtų rodoma peržiūra. Atsisiųskite priedą.", "Remove attachment": "Šalinti priedą", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Jūsų naršyklė nepalaiko šifruotų failų įkėlimo. Naudokite naujesnę naršyklę.", From 425bbac01419d031930c84b5e83a7c2ff716d350 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:37 +0200 Subject: [PATCH 022/273] New translations en.json (Dutch) --- i18n/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/nl.json b/i18n/nl.json index 6480b5ff..c6eb1fd5 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Gekloond: '%s'", "The cloned file '%s' was attached to this document.": "Het gekloonde bestand '%s' is bijgevoegd aan de document.", "Attach a file": "Een bestand toevoegen", - "alternatively drag & drop a file or document an image from the clipboard": "Je kunt ook een bestand slepen en neerzetten of een afbeelding plakken van het klembord", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Het bestand is te groot om voorbeeld weer te geven. Aub de bijlage downloaden.", "Remove attachment": "Bijlage verwijderen", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Je browser biedt geen ondersteuning voor het uploaden van gecodeerde bestanden. Gebruik alstublieft een nieuwere browser.", From b4ec073c778cbd72680106bd2f0184e6b1ba43f1 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:39 +0200 Subject: [PATCH 023/273] New translations en.json (Norwegian) --- i18n/no.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/no.json b/i18n/no.json index 6f8e991d..d5f4a2bf 100644 --- a/i18n/no.json +++ b/i18n/no.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Kopiert: '%s'", "The cloned file '%s' was attached to this document.": "Den klonede filen '%s' var koblet til denne innlimingen.", "Attach a file": "Legg til fil", - "alternatively drag & drop a file or document an image from the clipboard": "alternativt dra og slipp en fil, eller lim inn et bilde fra utklippstavlen", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Filen er for stor, for å vise en forhåndsvisning. Last ned vedlegget.", "Remove attachment": "Slett vedlegg", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Nettleseren din støtter ikke å laste opp krypterte filer. Vennligst bruk en nyere nettleser.", From b40e891e1fd6d1fd3bd2aefe759f73b0e4857d02 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:41 +0200 Subject: [PATCH 024/273] New translations en.json (Polish) --- i18n/pl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/pl.json b/i18n/pl.json index d3fc7697..676b8305 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Sklonowano: '%s'", "The cloned file '%s' was attached to this document.": "Sklonowany plik '%s' był dołączony do tego dokumentu.", "Attach a file": "Załącz plik", - "alternatively drag & drop a file or document an image from the clipboard": "Alternatywnie przeciągnij i upuść plik albo wklej obraz ze schowka", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Plik zbyt duży aby wyświetlić podgląd. Proszę pobrać załącznik.", "Remove attachment": "Usuń załącznik", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Twoja przeglądarka nie wspiera wysyłania zaszyfrowanych plików. Użyj nowszej przeglądarki.", From 38e7ce817e22e96afc276bf8b5c183c215d6de96 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:42 +0200 Subject: [PATCH 025/273] New translations en.json (Portuguese) --- i18n/pt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/pt.json b/i18n/pt.json index eaeef45b..2e6a57c3 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Clonado: '%s'", "The cloned file '%s' was attached to this document.": "O arquivo clonado '%s' foi anexado a essa cópia.", "Attach a file": "Anexar um arquivo", - "alternatively drag & drop a file or document an image from the clipboard": "alternativamente, arraste e solte um arquivo ou cole uma imagem da área de transferência", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Arquivo muito grande para exibir uma prévia. Por favor, faça o download do anexo.", "Remove attachment": "Remover anexo", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Seu navegador não permite subir arquivos cifrados. Por favor, utilize um navegador mais recente.", From a0b658151fc4f08707dad08568cf8d9448ef17d0 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:43 +0200 Subject: [PATCH 026/273] New translations en.json (Russian) --- i18n/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/ru.json b/i18n/ru.json index d6943cbd..f0ea79ba 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Дублировано: '%s'", "The cloned file '%s' was attached to this document.": "Дубликат файла '%s' был прикреплен к этой записи.", "Attach a file": "Прикрепить файл", - "alternatively drag & drop a file or document an image from the clipboard": "так же можно перенести файл в окно браузера или вставить изображение из буфера", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Файл слишком большой для отображения предпросмотра. Пожалуйста, скачайте прикрепленный файл.", "Remove attachment": "Удалить вложение", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Ваш браузер не поддерживает отправку зашифрованных файлов. Используйте более новый браузер.", From fcf7b33fef3805c898fe16ca14f56017056e8143 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:44 +0200 Subject: [PATCH 027/273] New translations en.json (Slovak) --- i18n/sk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/sk.json b/i18n/sk.json index 2fd91bef..d23510ad 100644 --- a/i18n/sk.json +++ b/i18n/sk.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Naklonované: '%s'", "The cloned file '%s' was attached to this document.": "K tomuto príspevku bol pripojený klonovaný súbor '%s'.", "Attach a file": "Priložiť súbor", - "alternatively drag & drop a file or document an image from the clipboard": "prípadne presuňte súbor myšou alebo vložte obrázok zo schránky", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Súbor je príliš veľký na zobrazenie ukážky. Stiahnite si prosím prílohu.", "Remove attachment": "Odstrániť prílohu", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Váš prehliadač nepodporuje nahrávanie šifrovaných súborov. Použite prosím novší prehliadač.", From 53c3a44dd6762c43cf70d18a68b0acebe03997a1 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:45 +0200 Subject: [PATCH 028/273] New translations en.json (Slovenian) --- i18n/sl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/sl.json b/i18n/sl.json index c69797df..ca49a341 100644 --- a/i18n/sl.json +++ b/i18n/sl.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "'%s' klonirana", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Pripni datoteko", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Odstrani priponko", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Tvoj brskalnik ne omogoča nalaganje zakodiranih datotek. Prosim uporabi novejši brskalnik.", From 16451a8479feba7e53e85d9ca8dc9c41f00382bb Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:46 +0200 Subject: [PATCH 029/273] New translations en.json (Swedish) --- i18n/sv.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/sv.json b/i18n/sv.json index 235137d0..00e64693 100644 --- a/i18n/sv.json +++ b/i18n/sv.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", From 5e48888fecedc4dc53413015db849f3420c374e5 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:47 +0200 Subject: [PATCH 030/273] New translations en.json (Turkish) --- i18n/tr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/tr.json b/i18n/tr.json index c3d5311a..d968ac4d 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Klonlandı: '%s'", "The cloned file '%s' was attached to this document.": "Klonlanmış dosya '%s' bu yazıya eklendi.", "Attach a file": "Dosya ekle", - "alternatively drag & drop a file or document an image from the clipboard": "alternatif olarak dosyayı yapıştırabilir veya sürükleyip bırakabilirsiniz", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Dosya önizleme için çok büyük. Lütfen eki indirin.", "Remove attachment": "Eki sil", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Tarayıcınız şifreli dosyaları yüklemeyi desteklemiyor. Lütfen daha yeni bir tarayıcı kullanın.", From 9225e3658499c874914284740027d912d2315504 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:49 +0200 Subject: [PATCH 031/273] New translations en.json (Ukrainian) --- i18n/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/uk.json b/i18n/uk.json index c908398b..98606ca6 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Дубльовано: '%s'", "The cloned file '%s' was attached to this document.": "Дублікат файлу '%s' був прикріплений до цього запису.", "Attach a file": "Прикріпити файл", - "alternatively drag & drop a file or document an image from the clipboard": "також можна перенести файл у вікно переглядача чи вставити зображення з буфера", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Файл завеликий для відображення передогляду. Будь ласка, звантажте прикріплений файл.", "Remove attachment": "Видалити вкладення", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Ваш переглядач не підтримує відправлення зашифрованих файлів. Використовуйте сучасніший переглядач.", From 956f0f5bea4a2a193d4f46ae932d987328cd0692 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:50 +0200 Subject: [PATCH 032/273] New translations en.json (Chinese Simplified) --- i18n/zh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/zh.json b/i18n/zh.json index 7812e598..48f7c2cd 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "副本:“%s”", "The cloned file '%s' was attached to this document.": "副本“%s”已附加到此粘贴内容。", "Attach a file": "添加一个附件", - "alternatively drag & drop a file or document an image from the clipboard": "拖放文件或从剪贴板粘贴图片", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "文件过大,无法显示预览。请下载附件。", "Remove attachment": "移除附件", "Your browser does not support uploading encrypted files. Please use a newer browser.": "您的浏览器不支持上传加密的文件,请使用新版本的浏览器。", From 7cad5581f4454178e397fcde66f1767f06c5ae60 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:51 +0200 Subject: [PATCH 033/273] New translations en.json (Indonesian) --- i18n/id.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/id.json b/i18n/id.json index 9f2e7a13..a7cb7286 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Diklon: '%s'", "The cloned file '%s' was attached to this document.": "Berkas yang di-klon '%s' telah dilampirkan pada document ini.", "Attach a file": "Lampirkan sebuah berkas", - "alternatively drag & drop a file or document an image from the clipboard": "sebagai alternatif, seret & jatuhkan berkas atau tempel sebuah gambar dari papan klip", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File terlalu besar untuk menampilkan pratinjau. Silakan unduh lampirannya.", "Remove attachment": "Hapus lampiran", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Browser Anda tidak mendukung pengunggahan file terenkripsi. Harap gunakan browser yang lebih baru.", From a172ad305f14f3ca9b46b003b386710c2d1de883 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:52 +0200 Subject: [PATCH 034/273] New translations en.json (Thai) --- i18n/th.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/th.json b/i18n/th.json index 9c6b3b8e..317a00d5 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "โคลนแล้ว: '%s'", "The cloned file '%s' was attached to this document.": "การโคลนข้อมูลการฝากโค้ด มีไฟล์ '%s' แนบมาด้วย", "Attach a file": "แนบไฟล์", - "alternatively drag & drop a file or document an image from the clipboard": "หรือสามารถลากและวางไฟล์หรือวางรูปภาพจากคลิปบอร์ดได้", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "ไฟล์มีขนาดใหญ่เกินไปที่จะแสดงตัวอย่าง กรุณาดาวน์โหลดเป็นไฟล์แนบแทน", "Remove attachment": "ลบไฟล์แนบ", "Your browser does not support uploading encrypted files. Please use a newer browser.": "เบราว์เซอร์ของคุณไม่สนับสนุนการอัปโหลดไฟล์แบบเข้ารหัสได้ กรุณาใช้เบราว์เซอร์ที่ใหม่กว่า", From 457a6b251e1808d7928d6f9172597bbce606d23d Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:53 +0200 Subject: [PATCH 035/273] New translations en.json (Estonian) --- i18n/et.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/et.json b/i18n/et.json index 5433b4d6..bd8896d1 100644 --- a/i18n/et.json +++ b/i18n/et.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Kloonitud: '%s'", "The cloned file '%s' was attached to this document.": "Kloonitud fail '%s' manustati sellele kleepele.", "Attach a file": "Manusta fail", - "alternatively drag & drop a file or document an image from the clipboard": "teise võimalusena lohista fail või kleebi pilt lõikelaualt", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Fail on eelvaate kuvamiseks liiga suur. Palun laadi manus alla.", "Remove attachment": "Eemalda manus", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Sinu brauser ei toeta krüpteeritud failide üleslaadimist. Palun kasuta uuemat brauserit.", From ebea0a56b179869753c5969fa23b4bc42a1c5155 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:54 +0200 Subject: [PATCH 036/273] New translations en.json (Hindi) --- i18n/hi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/hi.json b/i18n/hi.json index eb318881..791677ff 100644 --- a/i18n/hi.json +++ b/i18n/hi.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", From 69770cb1e5df8fb9888b90cd28652e7beb30b2cf Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:55 +0200 Subject: [PATCH 037/273] New translations en.json (Lojban) --- i18n/jbo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/jbo.json b/i18n/jbo.json index 69519582..13670de7 100644 --- a/i18n/jbo.json +++ b/i18n/jbo.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", From 4b89f4c4b61c740d974bd5c523fb691d7b1b2c9c Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:56 +0200 Subject: [PATCH 038/273] New translations en.json (Latin) --- i18n/la.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/la.json b/i18n/la.json index 1823eff9..d7b005fa 100644 --- a/i18n/la.json +++ b/i18n/la.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Cloned: '%s'", "The cloned file '%s' was attached to this document.": "The cloned file '%s' was attached to this document.", "Attach a file": "Attach a file", - "alternatively drag & drop a file or document an image from the clipboard": "alternatively drag & drop a file or document an image from the clipboard", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", "Remove attachment": "Remove attachment", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Your browser does not support uploading encrypted files. Please use a newer browser.", From 9022529bc4244337d3a3ea34a557c22b47edb638 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:57 +0200 Subject: [PATCH 039/273] New translations en.json (Occitan) --- i18n/oc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/oc.json b/i18n/oc.json index 733c4d2c..30b7c6e2 100644 --- a/i18n/oc.json +++ b/i18n/oc.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Clonar : '%s'", "The cloned file '%s' was attached to this document.": "Aqueste fichièr clonat '%s' es estat ajustat a aqueste tèxte.", "Attach a file": "Juntar un fichièr", - "alternatively drag & drop a file or document an image from the clipboard": "autrament lisatz lo fichièr o pegatz l’imatge del quichapapièrs", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Fichièr tròp pesuc per mostrar un apercebut. Telecargatz la pèca junta.", "Remove attachment": "Levar la pèça junta", "Your browser does not support uploading encrypted files. Please use a newer browser.": "Vòstre navigator es pas compatible amb lo mandadís de fichièrs chifrats. Mercés d’emplegar un navigator mai recent.", From f5187b4fbe30b5635e5708898e84beb14051ae12 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:19:59 +0200 Subject: [PATCH 040/273] New translations en.json (Corsican) --- i18n/co.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/co.json b/i18n/co.json index 8fa0ca4a..b6302062 100644 --- a/i18n/co.json +++ b/i18n/co.json @@ -172,7 +172,7 @@ "Cloned: '%s'": "Duppiatu : « %s »", "The cloned file '%s' was attached to this document.": "U schedariu duppiatu « %s » hè statu aghjuntu à st’appiccicu.", "Attach a file": "Aghjunghje un schedariu", - "alternatively drag & drop a file or document an image from the clipboard": "in alternanza, sguillà è depone un schedariu o incullà una fiura da u preme’papei", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", "File too large, to display a preview. Please download the attachment.": "Schedariu troppu maiò per affissà una fighjulata. Scaricate a pezza ghjunta.", "Remove attachment": "Caccià a pezza ghjunta", "Your browser does not support uploading encrypted files. Please use a newer browser.": "U vostru navigatore ùn accetta micca l’inviu di i schedarii cifrati. Impiegate un navigatore più recente.", From 4fd63176ad71a636ce9f0eeb04fd0406c885e7a4 Mon Sep 17 00:00:00 2001 From: El RIDO Date: Mon, 28 Jul 2025 15:39:33 +0200 Subject: [PATCH 041/273] belt & braces occasionally paste without meta attribute are encountered (while they are written), leading to: PHP Warning: Trying to access array offset on false in /srv/bin/administration on line 287 PHP Fatal error: Uncaught TypeError: array_key_exists(): Argument #2 ($array) must be of type array, null given in /srv/bin/administration:287 Stack trace: #0 /srv/bin/administration(287): array_key_exists() #1 /srv/bin/administration(398): PrivateBin\Administration->_statistics() #2 /srv/bin/administration(403): PrivateBin\Administration->__construct() #3 {main} thrown in /srv/bin/administration on line 287 --- bin/administration | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/administration b/bin/administration index 1796a21d..82eaa6bb 100755 --- a/bin/administration +++ b/bin/administration @@ -284,6 +284,7 @@ EOT, PHP_EOL; ++$counters['progress']; if ( + array_key_exists('meta', $paste) && array_key_exists('expire_date', $paste['meta']) && $paste['meta']['expire_date'] < $time ) { From 1378fb7356119ef75599e76a3f2c4bc848fc3c09 Mon Sep 17 00:00:00 2001 From: El RIDO Date: Mon, 28 Jul 2025 16:04:19 +0200 Subject: [PATCH 042/273] update CSP recommendation around bootstrap5 template resolved in Firefox 131, see https://bugzilla.mozilla.org/show_bug.cgi?id=1773976 kudos @Ribas160 for finding this --- CHANGELOG.md | 2 +- cfg/conf.sample.php | 6 ++---- lib/Configuration.php | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1876c7e8..3bfaf1d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # PrivateBin version history ## 2.0.1 (not yet released) -* CHANGED: Update CSP to display icons by default with bootstrap5 template +* CHANGED: CSP recommendation around bootstrap5 template resolved in Firefox 131 (#1613) ## 2.0.0 (2025-07-28) * ADDED: Error logging in database and filesystem backend (#1554) diff --git a/cfg/conf.sample.php b/cfg/conf.sample.php index c02783e9..4b2874d6 100644 --- a/cfg/conf.sample.php +++ b/cfg/conf.sample.php @@ -106,8 +106,6 @@ languageselection = false ; scripts or run your site behind certain DDoS-protection services. ; Check the documentation at https://content-security-policy.com/ ; Notes: -; - If you do not use the bootstrap5 theme, you can change default-src to 'none'; -; 'self' is required in bootstrap5 to enable display of the svg icons ; - By default this disallows to load images from third-party servers, e.g. when ; they are embedded in documents. If you wish to allow that, you can adjust the ; policy here. See https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-it-load-embedded-images @@ -119,10 +117,10 @@ languageselection = false ; See https://issues.chromium.org/issues/343754409 ; - To allow displaying PDF previews in Firefox or Chrome, sandboxing must also ; get turned off. The following CSP allows PDF previews: -; cspheader = "default-src 'self'; base-uri 'self'; form-action 'none'; manifest-src 'self'; connect-src * blob:; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; font-src 'self'; frame-ancestors 'none'; frame-src blob:; img-src 'self' data: blob:; media-src blob:; object-src blob:" +; cspheader = "default-src 'none'; base-uri 'self'; form-action 'none'; manifest-src 'self'; connect-src * blob:; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; font-src 'self'; frame-ancestors 'none'; frame-src blob:; img-src 'self' data: blob:; media-src blob:; object-src blob:" ; ; The recommended and default used CSP is: -; cspheader = "default-src 'self'; base-uri 'self'; form-action 'none'; manifest-src 'self'; connect-src * blob:; script-src 'self' 'wasm-unsafe-eval'; style-src 'self'; font-src 'self'; frame-ancestors 'none'; frame-src blob:; img-src 'self' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-modals allow-downloads" +; cspheader = "default-src 'none'; base-uri 'self'; form-action 'none'; manifest-src 'self'; connect-src * blob:; script-src 'self' 'wasm-unsafe-eval'; style-src 'self'; font-src 'self'; frame-ancestors 'none'; frame-src blob:; img-src 'self' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-modals allow-downloads" ; Enable or disable the warning message when the site is served over an insecure ; connection (insecure HTTP instead of HTTPS), defaults to true. diff --git a/lib/Configuration.php b/lib/Configuration.php index 8274539f..4e421273 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -64,7 +64,7 @@ class Configuration 'qrcode' => true, 'email' => true, 'icon' => 'jdenticon', - 'cspheader' => 'default-src \'self\'; base-uri \'self\'; form-action \'none\'; manifest-src \'self\'; connect-src * blob:; script-src \'self\' \'wasm-unsafe-eval\'; style-src \'self\'; font-src \'self\'; frame-ancestors \'none\'; frame-src blob:; img-src \'self\' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-modals allow-downloads', + 'cspheader' => 'default-src \'none\'; base-uri \'self\'; form-action \'none\'; manifest-src \'self\'; connect-src * blob:; script-src \'self\' \'wasm-unsafe-eval\'; style-src \'self\'; font-src \'self\'; frame-ancestors \'none\'; frame-src blob:; img-src \'self\' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-modals allow-downloads', 'httpwarning' => true, 'compression' => 'zlib', ), From ba2799fc8940c860d617998a6c97225e4de58891 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 16:21:22 +0200 Subject: [PATCH 043/273] New translations en.json (Corsican) --- i18n/co.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/i18n/co.json b/i18n/co.json index 986b60e8..1de2863b 100644 --- a/i18n/co.json +++ b/i18n/co.json @@ -1,9 +1,9 @@ { "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of stored data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s hè un serviziu in linea di tipu « pastebin » (ghjestiunariu d’appiccicu di pezzi di testu è di codice di fonte) minimalistu è à fonte aperta induve u servitore ùn hà micca cunnuscenza di i dati mandati. I dati sò cifrati è dicifrati %sin u navigatore%s cù una cifratura AES di 256 bit.", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of stored data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s hè un serviziu in linea, minimalistu è à fonte aperta, di tipu « pastebin », vole à dì chì face a ghjestione d’appiccicu di pezzi di testu è di codice di fonte, induve u servitore ùn hà manc’appena a cunnuscenza di i dati mandati. I dati sò cifrati è dicifrati %sin u navigatore%s cù una cifratura AES di 256 bit.", "More information on the project page.": "Più d’infurmazione annant’à a pagina di u prughjettu.", "Because ignorance is bliss": "Perchè l’ignurenza hè una campa", - "Document does not exist, has expired or has been deleted.": "L’appiccicu ùn esiste micca, hè scadutu o hè statu squassatu.", + "Document does not exist, has expired or has been deleted.": "U ducumentu ùn esiste micca, hè scadutu o hè statu squassatu.", "%s requires php %s or above to work. Sorry.": "Per disgrazzia, %s richiede php %s o più recente per funziunà.", "%s requires configuration section [%s] to be present in configuration file.": "%s richiede a presenza di a sezzione di cunfigurazione [%s] in a schedariu di cunfigurazione.", "Please wait %d seconds between each post.": [ @@ -14,15 +14,15 @@ "Aspettate %d seconde trà dui publicazioni.", "Aspettate %d seconde trà dui publicazioni." ], - "Document is limited to %s of encrypted data.": "L’appiccicu hè limitatu à %s di dati cifrati.", + "Document is limited to %s of encrypted data.": "U ducumentu hè limitatu à %s di dati cifrati.", "Invalid data.": "Dati inaccetevule.", "You are unlucky. Try again.": "Pruvate torna, Serete più furtunati.", "Error saving comment. Sorry.": "Per disgrazzia, ci hè un sbagliu à l’arregistramentu di u cummentu.", - "Error saving document. Sorry.": "Per disgrazzia, ci hè un sbagliu à l’arregistramentu di l’appiccicu.", - "Invalid document ID.": "N° di l’appiccicu inaccettevule.", - "Document is not of burn-after-reading type.": "L’appiccicu ùn hè micca di tipu « Squassà dopu a lettura ».", - "Wrong deletion token. Document was not deleted.": "Gettone di squassatura incurrettu. L’appiccicu ùn hè micca statu squassatu.", - "Document was properly deleted.": "L’appiccicu hè statu squassatu currettamente.", + "Error saving document. Sorry.": "Per disgrazzia, ci hè un sbagliu à l’arregistramentu di u ducumentu.", + "Invalid document ID.": "N° di u ducumentu inaccettevule.", + "Document is not of burn-after-reading type.": "U ducumentu ùn hè micca di tipu « Squassà dopu a lettura ».", + "Wrong deletion token. Document was not deleted.": "Gettone di squassatura incurrettu. U ducumentu ùn hè micca statu squassatu.", + "Document was properly deleted.": "U ducumentu hè statu squassatu currettamente.", "JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript hè richiestu per fà funziunà %s. Scusate per stu penseru.", "%s requires a modern browser to work.": "%s richiede un navigatore mudernu per funziunà.", "New": "Novu", @@ -133,9 +133,9 @@ "Stu ducumentu serà scadutu in %d mesi.", "Stu ducumentu serà scadutu in %d mesi." ], - "Please enter the password for this document:": "Stampittate a parolla d’intesa per st’appiccicu :", + "Please enter the password for this document:": "Stampittate a parolla d’intesa per stu ducumentu :", "Could not decrypt data (Wrong key?)": "Ùn si pò micca dicifrà i dati ; seria incurretta a chjave ?", - "Could not delete the document, it was not stored in burn after reading mode.": "Ùn si pò micca squassà l’appiccicu, ùn hè micca statu in u modu « Squassà dopu a lettura ».", + "Could not delete the document, it was not stored in burn after reading mode.": "Ùn si pò micca squassà u ducumentu perchè ùn hè micca statu creatu in u modu « Squassà dopu a lettura ».", "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "SOLU CÙ L’OCHJI. Ùn chjudite micca sta finestra, stu messaghju un puderà più esse affissatu torna.", "Could not decrypt comment; Wrong key?": "Ùn si pò micca dicifrà u cummentu. Seria incurretta a chjave ?", "Reply": "Risponde", @@ -150,11 +150,11 @@ "unknown status": "statu scunnisciutu", "server error or not responding": "sbagliu di u servitore o u servitore ùn risponde micca", "Could not post comment: %s": "Ùn si pò micca impustà u cummentu : %s", - "Sending document…": "Inviu di l’appiccicu…", - "Your document is %s (Hit Ctrl+c to copy)": "U vostru appiccicu si trova à l’indirizzu %s (Appughjate nant’à Ctrl+c per cupià u liame)", + "Sending document…": "Inviu di u ducumentu…", + "Your document is %s (Hit Ctrl+c to copy)": "U vostru ducumentu si trova à l’indirizzu %s (Appughjate nant’à Ctrl+c per cupià u liame)", "Delete data": "Squassà i dati", - "Could not create document: %s": "Ùn si pò micca creà l’appiccicu : %s", - "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Ùn si pò micca dicifrà l’appiccicu : A chjave di dicifratura hè assente in l’indirizzu. Averiate impiegatu un orientadore d’indirizzu o un riduttore chì ammuzzeghja una parte di l’indirizzu ?", + "Could not create document: %s": "Ùn si pò micca creà u ducumentu : %s", + "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Ùn si pò micca dicifrà u ducumentu : A chjave di dicifratura hè assente in l’indirizzu. Averiate impiegatu un orientadore d’indirizzu o un riduttore chì ammuzzeghja una parte di l’indirizzu ?", "B": "o", "kB": "Ko", "MB": "Mo", From f7063f6b1d2f986ac05f2a84a96388dfbff65f70 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 28 Jul 2025 17:20:39 +0200 Subject: [PATCH 044/273] New translations en.json (Corsican) --- i18n/co.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/i18n/co.json b/i18n/co.json index 1de2863b..d681893e 100644 --- a/i18n/co.json +++ b/i18n/co.json @@ -170,7 +170,7 @@ "Markdown": "Markdown", "Download attachment": "Scaricà a pezza ghjunta", "Cloned: '%s'": "Duppiatu : « %s »", - "The cloned file '%s' was attached to this document.": "U schedariu duppiatu « %s » hè statu aghjuntu à st’appiccicu.", + "The cloned file '%s' was attached to this document.": "U schedariu duppiatu « %s » hè statu aghjuntu à stu ducumentu.", "Attach a file": "Aghjunghje un schedariu", "alternatively drag & drop a file or paste an image from the clipboard": "in alternanza, sguillà è depone un schedariu o incullà una fiura da u preme’papei", "File too large, to display a preview. Please download the attachment.": "Schedariu troppu maiò per affissà una fighjulata. Scaricate a pezza ghjunta.", @@ -185,11 +185,11 @@ "Decrypt": "Dicifrà", "Enter password": "Stampittate a parolla d’intesa", "Loading…": "Caricamentu…", - "Decrypting document…": "Dicifratura di l’appiccicu…", - "Preparing new document…": "Approntu di u novu appiccicu…", + "Decrypting document…": "Dicifratura di u ducumentu…", + "Preparing new document…": "Approntu di u ducumentu novu…", "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": "S’è stu messaghju ùn smarisce micca, lighjite sta FAQ per ottene infurmazioni annant’à a risuluzione di i prublemi.", - "+++ no document text +++": "+++ nisunu testu incullatu +++", - "Could not get document data: %s": "Ùn si pò micca ottene i dati di l’appiccicu : %s", + "+++ no document text +++": "+++ nisunu testu di ducumentu +++", + "Could not get document data: %s": "Ùn si pò micca ottene i dati di u ducumentu : %s", "QR code": "Codice QR", "This website is using an insecure HTTP connection! Please use it only for testing.": "Stu situ web impiegheghja una cunnessione HTTP non sicura ! impiegatelu solu per una prova.", "For more information see this FAQ entry.": "Per sapene di più, lighjite sta rubrica di a FAQ.", @@ -210,22 +210,22 @@ "Encrypted note on %s": "Nota cifrata nant’à %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visitate stu liame per vede a nota. Date l’indirizzu à qualunque li permette d’accede à a nota dinù.", "URL shortener may expose your decrypt key in URL.": "Un ammuzzatore d’indirizzu pò palisà a vostra chjave di dicifratura in l’indirizzu.", - "Save document": "Arregistrà l’appiccicu", - "Your IP is not authorized to create documents.": "U vostru indirizzu IP ùn hè micca auturizatu à creà l’appiccichi.", + "Save document": "Arregistrà u ducumentu", + "Your IP is not authorized to create documents.": "U vostru indirizzu IP ùn hè micca auturizatu à creà ducumenti.", "Trying to shorten a URL that isn't pointing at our instance.": "Pruvate d’ammuzzà un indirizzu web chì ùn punta micca versu a vostra instanza.", "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Sbagliu à a chjama di YOURLS. Seria forse una cunfigurazione gattiva, tale una « apiurl » o « signature » falsa o assente.", "Error parsing YOURLS response.": "Sbagliu durante l’analisa di a risposta di YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Stu messaghju secretu pò esse affissatu solu una volta. Vulete fighjallu subitu ?", "Yes, see it": "Iè, fighjallu", "Dark Mode": "Modu scuru", - "Error compressing document, due to missing WebAssembly support.": "Sbagliu durante a cumpressione di l’appiccicu, perchè WebAssembly ùn hè micca accettatu.", - "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Sbagliu durante a scumpressione di l’appiccicu, perchè u vostru navigatore ùn accetteghja micca WebAssembly. Ci vole à impiegà un altru navigatore per affissà st’appiccicu.", + "Error compressing document, due to missing WebAssembly support.": "Sbagliu durante a cumpressione di u ducumentu, perchè WebAssembly ùn hè micca accettatu.", + "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Sbagliu durante a scumpressione di u ducumentu, perchè u vostru navigatore ùn accetteghja micca WebAssembly. Ci vole à impiegà un altru navigatore per affissà stu ducumentu.", "Start over": "Principià torna", - "Document copied to clipboard": "L’appiccicu hè statu cupiatu in u preme’papei", - "To copy document press on the copy button or use the clipboard shortcut Ctrl+c/Cmd+c": "Per cupià l’appiccicu, appughjate nant’à u buttone di copia o impiegate l’accurtatoghju di u preme’papei Ctrl+c/Cmd+c", + "Document copied to clipboard": "U ducumentu hè statu cupiatu in u preme’papei", + "To copy document press on the copy button or use the clipboard shortcut Ctrl+c/Cmd+c": "Per cupià u ducumentu, appughjate nant’à u buttone di copia o impiegate l’accurtatoghju di tastera Ctrl+c/Cmd+c", "Copy link": "Cupià u liame", "Link copied to clipboard": "U liame hè statu cupiatu in u preme’papei", - "Document text": "Testu di l’appiccicu", + "Document text": "Testu di u ducumentu", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "U tastu di tabulazione ghjova cum’è un caratteru (Appughjate nant’à Ctrl+m o Scapp per scambià)", "Theme": "Tema" } From 99265e546465fb0b467e4e82deb513ca238fb308 Mon Sep 17 00:00:00 2001 From: El RIDO Date: Tue, 29 Jul 2025 07:49:56 +0200 Subject: [PATCH 045/273] avoid undefined variable warning --- bin/administration | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/bin/administration b/bin/administration index 82eaa6bb..9ddb6887 100755 --- a/bin/administration +++ b/bin/administration @@ -292,27 +292,27 @@ EOT, PHP_EOL; } if (array_key_exists('adata', $paste)) { - $format = $paste['adata'][Paste::ADATA_FORMATTER]; - $discussion = $paste['adata'][Paste::ADATA_OPEN_DISCUSSION]; - $burn = $paste['adata'][Paste::ADATA_BURN_AFTER_READING]; + switch ($paste['adata'][Paste::ADATA_FORMATTER]) { + case 'plaintext': + ++$counters['plain']; + break; + case 'syntaxhighlighting': + ++$counters['syntax']; + break; + case 'markdown': + ++$counters['md']; + break; + default: + ++$counters['unknown']; + break; + } + $counters['discussion'] += (int) $paste['adata'][Paste::ADATA_OPEN_DISCUSSION]; + $counters['burn'] += (int) $paste['adata'][Paste::ADATA_BURN_AFTER_READING]; } else { - echo "Unsupported v1 document ", $pasteid, PHP_EOL; + echo "Unsupported v1 paste ", $pasteid, PHP_EOL; ++$counters['legacy']; } - if ($format === 'plaintext') { - ++$counters['plain']; - } elseif ($format === 'syntaxhighlighting') { - ++$counters['syntax']; - } elseif ($format === 'markdown') { - ++$counters['md']; - } else { - ++$counters['unknown']; - } - - $counters['discussion'] += (int) $discussion; - $counters['burn'] += (int) $burn; - // display progress if ($counters['progress'] % $dots === 0) { echo '.'; From b77544a6b14a44b43cc671b45c54b93cf5953cc7 Mon Sep 17 00:00:00 2001 From: Anonymoussaurus <50231698+AnonymousWP@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:40:26 +0200 Subject: [PATCH 046/273] chore(translation): fix incorrect Dutch wording for `document` * 'de' -> 'het' * 'deze' -> 'dit' * 'notitie' -> 'document' * 'documents' -> 'documenten' --- i18n/nl.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/i18n/nl.json b/i18n/nl.json index 36bbce0d..abb89a77 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -18,7 +18,7 @@ "Invalid data.": "Ongeldige gegevens.", "You are unlucky. Try again.": "Helaas. Probeer het nog eens.", "Error saving comment. Sorry.": "Fout bij het opslaan van het commentaar. Sorry.", - "Error saving document. Sorry.": "Fout bij het opslaan van de document. Sorry.", + "Error saving document. Sorry.": "Fout bij het opslaan van het document. Sorry.", "Invalid document ID.": "Ongeldige ID.", "Document is not of burn-after-reading type.": "Document is geen 'vernietig na lezen' type.", "Wrong deletion token. Document was not deleted.": "Foutieve verwijdercode. Document is niet verwijderd.", @@ -133,9 +133,9 @@ "Dit document verloopt over %d maanden.", "Dit document verloopt over %d maanden." ], - "Please enter the password for this document:": "Voer het wachtwoord in voor deze document:", + "Please enter the password for this document:": "Voer het wachtwoord in voor dit document:", "Could not decrypt data (Wrong key?)": "Kon de gegevens niet decoderen (verkeerde sleutel?)", - "Could not delete the document, it was not stored in burn after reading mode.": "Verwijderen van de document niet mogelijk, deze werd niet opgeslagen in 'vernietig na lezen' modus.", + "Could not delete the document, it was not stored in burn after reading mode.": "Verwijderen van het document niet mogelijk, deze werd niet opgeslagen in 'vernietig na lezen' modus.", "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "ALLEEN VOOR JOUW OGEN BESTEMD. Sluit dit venster niet, dit bericht kan niet opnieuw worden weergegeven.", "Could not decrypt comment; Wrong key?": "Kon het commentaar niet decoderen; Verkeerde sleutel?", "Reply": "Beantwoorden", @@ -153,8 +153,8 @@ "Sending document…": "Document verzenden…", "Your document is %s (Hit Ctrl+c to copy)": "Je document is %s (Druk Ctrl+c om te kopiëren)", "Delete data": "Gegevens wissen", - "Could not create document: %s": "Kon de document niet aanmaken: %s", - "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Kon de document niet decoderen: Decoderingssleutel ontbreekt in URL (Heb je een doorverwijzer of een URL-verkorter gebruikt die een deel van de URL verwijdert?)", + "Could not create document: %s": "Kon het document niet aanmaken: %s", + "Cannot decrypt document: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Kon het document niet decoderen: Decoderingssleutel ontbreekt in URL (Heb je een doorverwijzer of een URL-verkorter gebruikt die een deel van de URL verwijdert?)", "B": "B", "kB": "kB", "MB": "MB", @@ -170,7 +170,7 @@ "Markdown": "Markdown", "Download attachment": "Bijlage downloaden", "Cloned: '%s'": "Gekloond: '%s'", - "The cloned file '%s' was attached to this document.": "Het gekloonde bestand '%s' is bijgevoegd aan de document.", + "The cloned file '%s' was attached to this document.": "Het gekloonde bestand '%s' is bijgevoegd aan dit document.", "Attach a file": "Een bestand toevoegen", "alternatively drag & drop a file or paste an image from the clipboard": "Je kunt ook een bestand slepen en neerzetten of een afbeelding plakken van het klembord", "File too large, to display a preview. Please download the attachment.": "Het bestand is te groot om voorbeeld weer te geven. Aub de bijlage downloaden.", @@ -189,7 +189,7 @@ "Preparing new document…": "Nieuwe document voorbereiden…", "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": "In het geval dat dit bericht nooit verdwijnt, kijkt dan eens naar veelgestelde vragen voor informatie over het oplossen van problemen.", "+++ no document text +++": "+++ geen document tekst +++", - "Could not get document data: %s": "Kon geen document data verkrijgen: %s", + "Could not get document data: %s": "Kon geen documentdata verkrijgen: %s", "QR code": "QR-code", "This website is using an insecure HTTP connection! Please use it only for testing.": "Deze website gebruikt een onveilige HTTP-verbinding! Gelieve deze enkel te gebruiken om te testen.", "For more information see this FAQ entry.": "Voor meer informatie zie dit FAQ-artikel.", @@ -207,21 +207,21 @@ "Use Current Timezone": "Gebruik huidige tijdzone", "Convert To UTC": "Omzetten naar UTC", "Close": "Sluiten", - "Encrypted note on %s": "Versleutelde notitie op %s", - "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Bezoek deze link om de notitie te bekijken. Als je de URL aan iemand geeft, kan die de notitie ook bekijken.", + "Encrypted note on %s": "Versleuteld document op %s", + "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Bezoek deze link om het document te bekijken. Als je de URL aan iemand geeft, kan die het document ook bekijken.", "URL shortener may expose your decrypt key in URL.": "URL-verkorter kan je ontcijferingssleutel in URL blootleggen.", - "Save document": "Notitie opslaan", - "Your IP is not authorized to create documents.": "Je IP-adres is niet gemachtigd om documents te maken.", + "Save document": "Document opslaan", + "Your IP is not authorized to create documents.": "Je IP-adres is niet gemachtigd om documenten te maken.", "Trying to shorten a URL that isn't pointing at our instance.": "Proberen om een URL te verkorten dat niet naar ons systeem wijst.", "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Foutmelding ophalen YOURLS. Waarschijnlijk een configuratiefout, zoals een verkeerde of missende \"apiurl\" of \"signature\".", "Error parsing YOURLS response.": "Foutmelding bij parsen van YOURLS respons.", "This secret message can only be displayed once. Would you like to see it now?": "Dit geheime bericht kan maar één keer worden weergegeven. Wil je het nu zien?", "Yes, see it": "Ja, tonen", "Dark Mode": "Donkere modus", - "Error compressing document, due to missing WebAssembly support.": "Fout bij het comprimeren van notitie door ontbrekende ondersteuning voor WebAssembly.", - "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Fout bij het decomprimeren van de notitie, uw browser ondersteunt WebAssembly niet. Gebruik een andere browser om deze notitie te bekijken.", + "Error compressing document, due to missing WebAssembly support.": "Fout bij het comprimeren van document door ontbrekende ondersteuning voor WebAssembly.", + "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Fout bij het decomprimeren van het document, uw browser ondersteunt WebAssembly niet. Gebruik een andere browser om dit document te bekijken.", "Start over": "Opnieuw beginnen", - "Document copied to clipboard": "Notitie gekopieerd naar klembord", + "Document copied to clipboard": "Document gekopieerd naar klembord", "To copy document press on the copy button or use the clipboard shortcut Ctrl+c/Cmd+c": "Om te kopiëren en plakken druk je op de knop Kopiëren of gebruik je de sneltoets op het klembord Ctrl+c/Cmd+c", "Copy link": "Kopieer link", "Link copied to clipboard": "Link gekopieerd naar klembord", From 13f592239781e7eec09e390edaf19e02c4b453ae Mon Sep 17 00:00:00 2001 From: Nicolas Lepage <19571875+nlepage@users.noreply.github.com> Date: Thu, 31 Jul 2025 14:08:40 +0200 Subject: [PATCH 047/273] fix: attach paste listener on message field paste listener prevents default behavior in unexpected cases such as pasting a password in the passworddecrypt field attaching the paste listener on the message field instead of the whole document should fix this problem --- js/privatebin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/privatebin.js b/js/privatebin.js index e61b0924..a5bfc578 100644 --- a/js/privatebin.js +++ b/js/privatebin.js @@ -3382,7 +3382,7 @@ jQuery.PrivateBin = (function($) { * @function */ function addClipboardEventHandler() { - $(document).on('paste', function (event) { + $('#message').on('paste', function (event) { const items = (event.clipboardData || event.originalEvent.clipboardData).items; const files = [...items] .filter(item => item.kind === 'file') From 79dc03660b5b6109c057e23d063027077db90383 Mon Sep 17 00:00:00 2001 From: Nicolas Lepage <19571875+nlepage@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:19:42 +0200 Subject: [PATCH 048/273] chore: updates SRI hash for privatebin.js --- lib/Configuration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Configuration.php b/lib/Configuration.php index 4e421273..a131f75a 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -116,7 +116,7 @@ class Configuration 'js/kjua-0.10.0.js' => 'sha512-BYj4xggowR7QD150VLSTRlzH62YPfhpIM+b/1EUEr7RQpdWAGKulxWnOvjFx1FUlba4m6ihpNYuQab51H6XlYg==', 'js/legacy.js' => 'sha512-08+subq1Lo+r+la5ENqeXiMgNJcVaaTtBIFGkrjziSpvtgCId3Jtin4/OkSdHYSoeztwwIab8uvCzPKHta6puQ==', 'js/prettify.js' => 'sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==', - 'js/privatebin.js' => 'sha512-ytZMcsBxoon+uFaTyES2QBm0oN445Fu1iE4txInHaME1wpo3NUu02gxOvjrZhCimM59wTLgSMhm60BxE/DIm3w==', + 'js/privatebin.js' => 'sha512-5ngU5T+BRPoN2XEZLA2Fk5vYqOM/16muI5iSxp/7WVDitpAF/wvoU3XnqFG/O62UkntQzmvHqlLmXuCifzBtmw==', 'js/purify-3.2.6.js' => 'sha512-zqwL4OoBLFx89QPewkz4Lz5CSA2ktU+f31fuECkF0iK3Id5qd3Zpq5dMby8KwHjIEpsUgOqwF58cnmcaNem0EA==', 'js/showdown-2.1.0.js' => 'sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==', 'js/zlib-1.3.1-1.js' => 'sha512-5bU9IIP4PgBrOKLZvGWJD4kgfQrkTz8Z3Iqeu058mbQzW3mCumOU6M3UVbVZU9rrVoVwaW4cZK8U8h5xjF88eQ==', From 8e3f59a49c7e4f6b3de9b369fefbdfc1beaa6a01 Mon Sep 17 00:00:00 2001 From: Nicolas Lepage <19571875+nlepage@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:31:37 +0200 Subject: [PATCH 049/273] chroe: adds bugfix in CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bfaf1d8..7bb3b93c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 2.0.1 (not yet released) * CHANGED: CSP recommendation around bootstrap5 template resolved in Firefox 131 (#1613) +* FIXED: Allow pasting a password for decrypting a paste (#1620) ## 2.0.0 (2025-07-28) * ADDED: Error logging in database and filesystem backend (#1554) From 51d8e92e6a10b722917b976679f3b89a11f622e0 Mon Sep 17 00:00:00 2001 From: Jacques Bodin-Hullin Date: Thu, 31 Jul 2025 23:59:58 +0200 Subject: [PATCH 050/273] feat(configuration): Use protected instead of private This way we can override the $_configuration property using a new Configuration extending the PrivateBin one. --- lib/Configuration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Configuration.php b/lib/Configuration.php index 4e421273..fa5a420d 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -25,7 +25,7 @@ class Configuration * * @var array */ - private $_configuration; + protected $_configuration; /** * default configuration From 4f8fc4873a6c8e5f8c91afc2201f9b884ad2b763 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Mon, 4 Aug 2025 03:09:04 +0530 Subject: [PATCH 051/273] Update scripts to defer --- tpl/bootstrap5.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tpl/bootstrap5.php b/tpl/bootstrap5.php index 85c71687..81fe355e 100644 --- a/tpl/bootstrap5.php +++ b/tpl/bootstrap5.php @@ -29,28 +29,28 @@ endif; - _scriptTag('js/kjua-0.10.0.js', 'async'); ?> + _scriptTag('js/kjua-0.10.0.js', 'defer'); ?> _scriptTag('js/zlib-1.3.1-1.js', 'defer'); ?> _scriptTag('js/base-x-5.0.1.js', 'defer'); ?> - _scriptTag('js/bootstrap-5.3.7.js', 'async'); ?> + _scriptTag('js/bootstrap-5.3.7.js', 'defer'); ?> _scriptTag('js/dark-mode-switch.js', 'defer'); ?> - _scriptTag('js/prettify.js', 'async'); ?> + _scriptTag('js/prettify.js', 'defer'); ?> - _scriptTag('js/showdown-2.1.0.js', 'async'); ?> + _scriptTag('js/showdown-2.1.0.js', 'defer'); ?> _scriptTag('js/purify-3.2.6.js', 'defer'); ?> - _scriptTag('js/legacy.js', 'async'); ?> + _scriptTag('js/legacy.js', 'defer'); ?> _scriptTag('js/privatebin.js', 'defer'); ?> From ce188671dbc0c503db0e73e1281d3633f90a1320 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Tue, 5 Aug 2025 01:14:37 +0530 Subject: [PATCH 052/273] Update Copy Link url after short url is generated --- js/privatebin.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/privatebin.js b/js/privatebin.js index a5bfc578..908d863e 100644 --- a/js/privatebin.js +++ b/js/privatebin.js @@ -2158,6 +2158,7 @@ jQuery.PrivateBin = (function($) { $pasteUrl.prop('href', shortUrl); // we pre-select the link so that the user only has to [Ctrl]+[c] the link Helper.selectText($pasteUrl[0]); + CopyToClipboard.setUrl(shortUrl); return; } } From 065d9eaa233302914e545e0692f0d36cc2efbb4b Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Wed, 6 Aug 2025 23:36:36 +0530 Subject: [PATCH 053/273] Updated SRI and Changelog --- CHANGELOG.md | 1 + lib/Configuration.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bb3b93c..59cc1fbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 2.0.1 (not yet released) * CHANGED: CSP recommendation around bootstrap5 template resolved in Firefox 131 (#1613) * FIXED: Allow pasting a password for decrypting a paste (#1620) +* FIXED: Allow copying the shortened link after using a URL shortener (#1624) ## 2.0.0 (2025-07-28) * ADDED: Error logging in database and filesystem backend (#1554) diff --git a/lib/Configuration.php b/lib/Configuration.php index 60a8caf1..f5715801 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -116,7 +116,7 @@ class Configuration 'js/kjua-0.10.0.js' => 'sha512-BYj4xggowR7QD150VLSTRlzH62YPfhpIM+b/1EUEr7RQpdWAGKulxWnOvjFx1FUlba4m6ihpNYuQab51H6XlYg==', 'js/legacy.js' => 'sha512-08+subq1Lo+r+la5ENqeXiMgNJcVaaTtBIFGkrjziSpvtgCId3Jtin4/OkSdHYSoeztwwIab8uvCzPKHta6puQ==', 'js/prettify.js' => 'sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==', - 'js/privatebin.js' => 'sha512-5ngU5T+BRPoN2XEZLA2Fk5vYqOM/16muI5iSxp/7WVDitpAF/wvoU3XnqFG/O62UkntQzmvHqlLmXuCifzBtmw==', + 'js/privatebin.js' => 'sha512-MRYtt3QYHP1WibzqSEYwWHXEDYgovKn9OmtJwXm5swnz0cpXdIW3seJS3zo5E3oq6QZTC/1tsa77W0QLm4aRtw==', 'js/purify-3.2.6.js' => 'sha512-zqwL4OoBLFx89QPewkz4Lz5CSA2ktU+f31fuECkF0iK3Id5qd3Zpq5dMby8KwHjIEpsUgOqwF58cnmcaNem0EA==', 'js/showdown-2.1.0.js' => 'sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==', 'js/zlib-1.3.1-1.js' => 'sha512-5bU9IIP4PgBrOKLZvGWJD4kgfQrkTz8Z3Iqeu058mbQzW3mCumOU6M3UVbVZU9rrVoVwaW4cZK8U8h5xjF88eQ==', From 397d006479ee0101aaa330b7fc521f2bc28858e7 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Fri, 8 Aug 2025 12:44:53 +0530 Subject: [PATCH 054/273] Updated bootstrap.php to include scripts as defer --- tpl/bootstrap.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tpl/bootstrap.php b/tpl/bootstrap.php index 870536af..f1ea895d 100644 --- a/tpl/bootstrap.php +++ b/tpl/bootstrap.php @@ -46,27 +46,27 @@ endif; - _scriptTag('js/kjua-0.10.0.js', 'async'); ?> + _scriptTag('js/kjua-0.10.0.js', 'defer'); ?> - _scriptTag('js/zlib-1.3.1-1.js', 'async'); ?> + _scriptTag('js/zlib-1.3.1-1.js', 'defer'); ?> _scriptTag('js/base-x-5.0.1.js', 'defer'); ?> _scriptTag('js/bootstrap-3.4.1.js', 'defer'); ?> - _scriptTag('js/prettify.js', 'async'); ?> + _scriptTag('js/prettify.js', 'defer'); ?> - _scriptTag('js/showdown-2.1.0.js', 'async'); ?> + _scriptTag('js/showdown-2.1.0.js', 'defer'); ?> - _scriptTag('js/purify-3.2.6.js', 'async'); ?> - _scriptTag('js/legacy.js', 'async'); ?> + _scriptTag('js/purify-3.2.6.js', 'defer'); ?> + _scriptTag('js/legacy.js', 'defer'); ?> _scriptTag('js/privatebin.js', 'defer'); ?> From 09bab8744f37276eb81d8210922450e32b306c35 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 17:11:00 +0000 Subject: [PATCH 055/273] Bump actions/checkout from 4 to 5 Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/snyk-scan.yml | 2 +- .github/workflows/tests.yml | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ac6143c7..25c8d787 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -33,7 +33,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f3795964..bb396de5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Fetch changelog from tag - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: sparse-checkout: CHANGELOG.md sparse-checkout-cone-mode: false diff --git a/.github/workflows/snyk-scan.yml b/.github/workflows/snyk-scan.yml index 66f67e7a..72e58de3 100644 --- a/.github/workflows/snyk-scan.yml +++ b/.github/workflows/snyk-scan.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest if: ${{ github.repository == 'PrivateBin/PrivateBin' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install Google Cloud Storage run: composer require --no-update google/cloud-storage && composer update --no-dev - name: Run Snyk to check for vulnerabilities diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 811cedcf..70496011 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Validate composer.json and composer.lock run: composer validate - name: Install dependencies @@ -36,7 +36,7 @@ jobs: # let's get started! - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 # cache PHP extensions - name: Setup cache environment @@ -124,7 +124,7 @@ jobs: # let's get started! - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 # cache PHP extensions - name: Setup cache environment @@ -208,7 +208,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node uses: actions/setup-node@v4 From 059e64adb16b128ae19cac4a1df6cffb6d580c64 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Sat, 9 Aug 2025 00:01:25 +0100 Subject: [PATCH 056/273] Auto Shortening URLs --- cfg/conf.sample.php | 5 +++++ i18n/en.json | 1 + js/privatebin.js | 17 +++++++++++++++++ lib/Configuration.php | 1 + lib/Controller.php | 1 + tpl/bootstrap.php | 10 +++++++++- tpl/bootstrap5.php | 10 +++++++++- 7 files changed, 43 insertions(+), 2 deletions(-) diff --git a/cfg/conf.sample.php b/cfg/conf.sample.php index 4b2874d6..8883716f 100644 --- a/cfg/conf.sample.php +++ b/cfg/conf.sample.php @@ -84,6 +84,11 @@ languageselection = false ; the documents encryption key. ; urlshortener = "https://shortener.example.com/api?link=" +; (optional) Whether to shorten the URL by default when a new document is created. +; If set to true, the "Shorten URL" functionality will be automatically called. +; This only works if the "urlshortener" option is set. +; shortenbydefault = false + ; (optional) Let users create a QR code for sharing the document URL with one click. ; It works both when a new document is created and when you view a document. ; qrcode = true diff --git a/i18n/en.json b/i18n/en.json index 791677ff..6649c797 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Encrypted note on %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.", "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", diff --git a/js/privatebin.js b/js/privatebin.js index 908d863e..2ee9ad7e 100644 --- a/js/privatebin.js +++ b/js/privatebin.js @@ -2120,6 +2120,21 @@ jQuery.PrivateBin = (function($) { Helper.selectText($pasteUrl[0]); }; + /** + * Checks if auto-shortening is enabled and sends the link to the shortener if it is. + * + * @name PasteStatus.checkAutoShorten + * @function + */ + me.checkAutoShorten = function() { + // check if auto-shortening is enabled + if ($shortenButton.data('autoshorten') === true) { + // if so, we send the link to the shortener + // we do not remove the button, in case shortener fails + sendToShortener(); + } + } + /** * extracts URLs from given string * @@ -5030,6 +5045,8 @@ jQuery.PrivateBin = (function($) { TopNav.hideDownloadButton(); Editor.hide(); + PasteStatus.checkAutoShorten(); + // parse and show text // (preparation already done in me.sendPaste()) PasteViewer.run(); diff --git a/lib/Configuration.php b/lib/Configuration.php index f5715801..5b9f5052 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -61,6 +61,7 @@ class Configuration 'languageselection' => false, 'languagedefault' => '', 'urlshortener' => '', + 'shortenbydefault' => false, 'qrcode' => true, 'email' => true, 'icon' => 'jdenticon', diff --git a/lib/Controller.php b/lib/Controller.php index 2a70156e..5b2ddb94 100644 --- a/lib/Controller.php +++ b/lib/Controller.php @@ -477,6 +477,7 @@ class Controller $page->assign('EXPIRE', $expire); $page->assign('EXPIREDEFAULT', $this->_conf->getKey('default', 'expire')); $page->assign('URLSHORTENER', $this->_conf->getKey('urlshortener')); + $page->assign('SHORTENBYDEFAULT', $this->_conf->getKey('shortenbydefault')); $page->assign('QRCODE', $this->_conf->getKey('qrcode')); $page->assign('EMAIL', $this->_conf->getKey('email')); $page->assign('HTTPWARNING', $this->_conf->getKey('httpwarning')); diff --git a/tpl/bootstrap.php b/tpl/bootstrap.php index f1ea895d..099b2558 100644 --- a/tpl/bootstrap.php +++ b/tpl/bootstrap.php @@ -565,12 +565,20 @@ endif; if (!empty($URLSHORTENER)) : ?>

-

-

Date: Thu, 14 Aug 2025 00:39:59 +0100 Subject: [PATCH 057/273] update SRI --- lib/Configuration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Configuration.php b/lib/Configuration.php index 5b9f5052..e6bb89cc 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -117,7 +117,7 @@ class Configuration 'js/kjua-0.10.0.js' => 'sha512-BYj4xggowR7QD150VLSTRlzH62YPfhpIM+b/1EUEr7RQpdWAGKulxWnOvjFx1FUlba4m6ihpNYuQab51H6XlYg==', 'js/legacy.js' => 'sha512-08+subq1Lo+r+la5ENqeXiMgNJcVaaTtBIFGkrjziSpvtgCId3Jtin4/OkSdHYSoeztwwIab8uvCzPKHta6puQ==', 'js/prettify.js' => 'sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==', - 'js/privatebin.js' => 'sha512-MRYtt3QYHP1WibzqSEYwWHXEDYgovKn9OmtJwXm5swnz0cpXdIW3seJS3zo5E3oq6QZTC/1tsa77W0QLm4aRtw==', + 'js/privatebin.js' => 'sha512-Cor4acli/veLhX81YVTGQNkQ+poXsz0gRQUmLeJ6WebIXUlUi7ZQZ6lk1oIYesnBG3cV/stVT07cdVsByXoaJA==', 'js/purify-3.2.6.js' => 'sha512-zqwL4OoBLFx89QPewkz4Lz5CSA2ktU+f31fuECkF0iK3Id5qd3Zpq5dMby8KwHjIEpsUgOqwF58cnmcaNem0EA==', 'js/showdown-2.1.0.js' => 'sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==', 'js/zlib-1.3.1-1.js' => 'sha512-5bU9IIP4PgBrOKLZvGWJD4kgfQrkTz8Z3Iqeu058mbQzW3mCumOU6M3UVbVZU9rrVoVwaW4cZK8U8h5xjF88eQ==', From eab8b3b7c9e7bf92455bc77626b324ca293462f8 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Thu, 14 Aug 2025 00:48:36 +0100 Subject: [PATCH 058/273] Updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59cc1fbd..72f86f31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * CHANGED: CSP recommendation around bootstrap5 template resolved in Firefox 131 (#1613) * FIXED: Allow pasting a password for decrypting a paste (#1620) * FIXED: Allow copying the shortened link after using a URL shortener (#1624) +* ADDED: Auto shorten URLs with config option `shortenbydefault` (#1627) ## 2.0.0 (2025-07-28) * ADDED: Error logging in database and filesystem backend (#1554) From 0460f18ca0d291d5ef6e793d0e887f28b1bbdb48 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Thu, 14 Aug 2025 01:21:49 +0100 Subject: [PATCH 059/273] chore: added new translation --- i18n/ar.json | 1 + i18n/bg.json | 1 + i18n/ca.json | 1 + i18n/co.json | 1 + i18n/cs.json | 1 + i18n/de.json | 1 + i18n/el.json | 1 + i18n/es.json | 1 + i18n/et.json | 1 + i18n/fi.json | 1 + i18n/fr.json | 1 + i18n/he.json | 1 + i18n/hi.json | 1 + i18n/hu.json | 1 + i18n/id.json | 1 + i18n/it.json | 1 + i18n/ja.json | 1 + i18n/jbo.json | 1 + i18n/ko.json | 1 + i18n/ku.json | 1 + i18n/la.json | 1 + i18n/lt.json | 1 + i18n/nl.json | 1 + i18n/no.json | 1 + i18n/oc.json | 1 + i18n/pl.json | 1 + i18n/pt.json | 1 + i18n/ro.json | 1 + i18n/ru.json | 1 + i18n/sk.json | 1 + i18n/sl.json | 1 + i18n/sv.json | 1 + i18n/th.json | 1 + i18n/tr.json | 1 + i18n/uk.json | 1 + i18n/zh.json | 1 + 36 files changed, 36 insertions(+) diff --git a/i18n/ar.json b/i18n/ar.json index 3b32b408..b6c750ff 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "ملاحظة مشفرة على %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "زُر هذا الرابط لرؤية الملاحظة. يتيح إعطاء عنوان URL لأي شخص الوصول إلى الملاحظة أيضًا.", "URL shortener may expose your decrypt key in URL.": "قد يفضح أداة تقصير عناوين URL مفتاح فك التشفير الخاص بك في URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "احفظ اللصق", "Your IP is not authorized to create documents.": "عنوان IP الخاص بك غير مصرح له بإنشاء لصُق.", "Trying to shorten a URL that isn't pointing at our instance.": "محاولة تقصير عنوان URL لا يشير إلى خادمنا.", diff --git a/i18n/bg.json b/i18n/bg.json index 457bfc10..9d7430c5 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Encrypted note on %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.", "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", diff --git a/i18n/ca.json b/i18n/ca.json index 1a6d57c3..0a2f8c08 100644 --- a/i18n/ca.json +++ b/i18n/ca.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Encrypted note on %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.", "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Save document", "Your IP is not authorized to create documents.": "La teva IP no està autoritzada a crear notes.", "Trying to shorten a URL that isn't pointing at our instance.": "S'està intentant escurçar un URL que no apunta a la nostra instància.", diff --git a/i18n/co.json b/i18n/co.json index d681893e..ac7d3a7b 100644 --- a/i18n/co.json +++ b/i18n/co.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Nota cifrata nant’à %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visitate stu liame per vede a nota. Date l’indirizzu à qualunque li permette d’accede à a nota dinù.", "URL shortener may expose your decrypt key in URL.": "Un ammuzzatore d’indirizzu pò palisà a vostra chjave di dicifratura in l’indirizzu.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Arregistrà u ducumentu", "Your IP is not authorized to create documents.": "U vostru indirizzu IP ùn hè micca auturizatu à creà ducumenti.", "Trying to shorten a URL that isn't pointing at our instance.": "Pruvate d’ammuzzà un indirizzu web chì ùn punta micca versu a vostra instanza.", diff --git a/i18n/cs.json b/i18n/cs.json index e313524d..94c3ce8c 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Šifrovaná poznámka ve službě %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Pro zobrazení poznámky navštivte tento odkaz. Přeposláním URL umožníte přístup také jiným lidem.", "URL shortener may expose your decrypt key in URL.": "Zkracovač URL může prozradit váš dešifrovací klíč v URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Uložit příspěvek", "Your IP is not authorized to create documents.": "Vaše IP adresa nemá oprávnění k vytváření příspěvků.", "Trying to shorten a URL that isn't pointing at our instance.": "Pokus o zkrácení URL, které neodkazuje na naši instanci.", diff --git a/i18n/de.json b/i18n/de.json index 34251265..5381a249 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Verschlüsselte Notiz auf %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Besuche diesen Link um das Dokument zu sehen. Wird die URL an eine andere Person gegeben, so kann diese Person ebenfalls auf dieses Dokument zugreifen.", "URL shortener may expose your decrypt key in URL.": "Der URL-Verkürzer kann den Schlüssel in der URL enthüllen.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Dokument speichern", "Your IP is not authorized to create documents.": "Deine IP ist nicht berechtigt, Texte zu erstellen.", "Trying to shorten a URL that isn't pointing at our instance.": "Versuch eine URL zu verkürzen, die nicht auf unsere Instanz zeigt.", diff --git a/i18n/el.json b/i18n/el.json index df1833a7..d19dec88 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Κρυπτογραφημένο μήνυμα από το %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Επισκεφτείτε αυτόν τον σύνδεσμο για να δείτε το μήνυμα. Δίνοντας τον σύνδεσμο σε οποιονδήποτε, του επιτρέπετε να επισκεφτεί το μήνυμα επίσης.", "URL shortener may expose your decrypt key in URL.": "Συντομευτές συνδέσμων πιθανώς να δημοσιοποιήσουν το κλειδί αποκρυπτογράφισης στον σύνδεσμο.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Αποθήκευση επικόλλησης", "Your IP is not authorized to create documents.": "Η IP σας δεν επιτρέπεται να δημιουργεί επικολλήσεις.", "Trying to shorten a URL that isn't pointing at our instance.": "Έγινε προσπάθεια συντόμευσης ενός URL που δε δείχνει προς τη δική μας υπηρεσία.", diff --git a/i18n/es.json b/i18n/es.json index 86db6478..a2708dff 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Nota cifrada en %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visite este enlace para ver la nota. Dar la URL a cualquier persona también les permite acceder a la nota.", "URL shortener may expose your decrypt key in URL.": "El acortador de URL puede exponer su clave de descifrado en el URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Guardar documento", "Your IP is not authorized to create documents.": "Tu IP no está autorizada para crear contenido.", "Trying to shorten a URL that isn't pointing at our instance.": "Intentando acortar una URL que no apunta a nuestra instancia.", diff --git a/i18n/et.json b/i18n/et.json index 37a90e98..d2c74d20 100644 --- a/i18n/et.json +++ b/i18n/et.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Krüpteeritud kiri %s-is", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Kirja nägemiseks külasta seda linki. Teistele URL-i andmine lubab ka neil ligi pääseda kirjale.", "URL shortener may expose your decrypt key in URL.": "URL-i lühendaja võib paljastada sinu dekrüpteerimisvõtme URL-is.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Salvesta kleebe", "Your IP is not authorized to create documents.": "Su IP-l ei ole lubatud kleepeid luua.", "Trying to shorten a URL that isn't pointing at our instance.": "Püüame lühendada URL-i, mis ei viita meie instantsile.", diff --git a/i18n/fi.json b/i18n/fi.json index f906299a..966ed1f0 100644 --- a/i18n/fi.json +++ b/i18n/fi.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Salattu viesti %sissä", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Vieraile tässä linkissä nähdäksesi viestin. URL:n antaminen kenellekään antaa heidänkin päästä katsomaan viestiä.", "URL shortener may expose your decrypt key in URL.": "URL-lyhentäjä voi paljastaa purkuavaimesi URL:ssä.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Tallenna asiakirja", "Your IP is not authorized to create documents.": "IP:llesi ei ole annettu oikeutta luoda pasteja.", "Trying to shorten a URL that isn't pointing at our instance.": "Yritetään lyhentää URL-osoite, joka ei osoita meidän instanssiiin.", diff --git a/i18n/fr.json b/i18n/fr.json index f6a9cd11..f9632ed2 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Message chiffré sur %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visiter ce lien pour voir la note. Donner l'URL à une autre personne lui permet également d'accéder à la note.", "URL shortener may expose your decrypt key in URL.": "Raccourcir l'URL peut exposer votre clé de déchiffrement dans l'URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Sauver le document", "Your IP is not authorized to create documents.": "Votre adresse IP n'est pas autorisée à créer des documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Tentative de raccourcir une URL qui ne pointe pas vers notre instance.", diff --git a/i18n/he.json b/i18n/he.json index b59d1257..69aad3ac 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "%sהערה מוצפנת ב־", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "נא לבקר בקישור כדי לצפות בהערה. מסירת הקישור לאנשים כלשהם תאפשר גם להם לגשת להערה.", "URL shortener may expose your decrypt key in URL.": "שירות קיצור כתובת URL עשוי לחשוף את מפתח הפענוח שלך בכתובת ה-URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "שמור הדבקה", "Your IP is not authorized to create documents.": "ה-IP שלך אינו מורשה ליצור הדבקות.", "Trying to shorten a URL that isn't pointing at our instance.": "מנסים לקצר כתובת URL שאינה מצביעה על המערכת שלנו.", diff --git a/i18n/hi.json b/i18n/hi.json index 791677ff..6649c797 100644 --- a/i18n/hi.json +++ b/i18n/hi.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Encrypted note on %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.", "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", diff --git a/i18n/hu.json b/i18n/hu.json index 64df16c6..910e38c8 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Titkosított jegyzet a %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Látogasd meg ezt a hivatkozást a bejegyzés megtekintéséhez. Ha mások számára is megadod ezt a linket, azzal hozzáférnek ők is.", "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", diff --git a/i18n/id.json b/i18n/id.json index dde4afc9..0845f6dd 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Catatan ter-ekrip di %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Kunjungi tautan ini untuk melihat catatan. Memberikan alamat URL pada siapapun juga, akan mengizinkan mereka untuk mengakses catatan, so pasti gitu loh Kaka.", "URL shortener may expose your decrypt key in URL.": "Pemendek URL mungkin akan menampakkan kunci dekrip Anda dalam URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Simpan document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", diff --git a/i18n/it.json b/i18n/it.json index 1a20167d..eafc5378 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Nota crittografata su %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visita questo collegamento per vedere la nota. Dare l'URL a chiunque consente anche a loro di accedere alla nota.", "URL shortener may expose your decrypt key in URL.": "URL shortener può esporre la tua chiave decrittografata nell'URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Salva il messagio", "Your IP is not authorized to create documents.": "Il tuo IP non è autorizzato a creare dei messaggi.", "Trying to shorten a URL that isn't pointing at our instance.": "Tantativo in corso di accorciare un URL che non punta alla nostra istanza.", diff --git a/i18n/ja.json b/i18n/ja.json index 60ce321e..21e5fe41 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "%sの暗号化されたメモ", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "メモを見るには、このリンクを参照してください。誰でもURLからこのメモにアクセスできます。", "URL shortener may expose your decrypt key in URL.": "URLの短縮アプリケーションを使うと、復号用のキーが漏洩するおそれがあります。", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "ペーストを保存", "Your IP is not authorized to create documents.": "あなたのIPアドレスにはペーストを作成する権限がありません。", "Trying to shorten a URL that isn't pointing at our instance.": "このインスタンスを指していないURLを短縮しようとしています。", diff --git a/i18n/jbo.json b/i18n/jbo.json index 13670de7..d56c0909 100644 --- a/i18n/jbo.json +++ b/i18n/jbo.json @@ -210,6 +210,7 @@ "Encrypted note on %s": ".i lo lo notci ku mifra cu zvati %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.", "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "rejgau fukpi", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", diff --git a/i18n/ko.json b/i18n/ko.json index 791677ff..6649c797 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Encrypted note on %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.", "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", diff --git a/i18n/ku.json b/i18n/ku.json index a30ce774..50d6fa94 100644 --- a/i18n/ku.json +++ b/i18n/ku.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Encrypted note on %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.", "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", diff --git a/i18n/la.json b/i18n/la.json index d7b005fa..abd9e057 100644 --- a/i18n/la.json +++ b/i18n/la.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Encrypted note on %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.", "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", diff --git a/i18n/lt.json b/i18n/lt.json index ed82c21c..852f0173 100644 --- a/i18n/lt.json +++ b/i18n/lt.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Šifruoti užrašai ties %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Norėdami matyti užrašus, aplankykite šį tinklalapį. Pasidalinus šiuo URL adresu su kitais žmonėmis, jiems taip pat bus leidžiama prieiga prie šių užrašų.", "URL shortener may expose your decrypt key in URL.": "URL trumpinimo įrankis gali atskleisti URL adrese jūsų iššifravimo raktą.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Įrašyti įdėjimą", "Your IP is not authorized to create documents.": "Jūsų IP adresas neturi įgaliojimų kurti įdėjimų.", "Trying to shorten a URL that isn't pointing at our instance.": "Bandoma sutrumpinti URL adresą, kuris nenurodo į mūsų egzempliorių.", diff --git a/i18n/nl.json b/i18n/nl.json index abb89a77..d16cfedc 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Versleuteld document op %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Bezoek deze link om het document te bekijken. Als je de URL aan iemand geeft, kan die het document ook bekijken.", "URL shortener may expose your decrypt key in URL.": "URL-verkorter kan je ontcijferingssleutel in URL blootleggen.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Document opslaan", "Your IP is not authorized to create documents.": "Je IP-adres is niet gemachtigd om documenten te maken.", "Trying to shorten a URL that isn't pointing at our instance.": "Proberen om een URL te verkorten dat niet naar ons systeem wijst.", diff --git a/i18n/no.json b/i18n/no.json index 3184e464..df40dc86 100644 --- a/i18n/no.json +++ b/i18n/no.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Kryptert notat på %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Besøk denne lenken for å se notatet. Hvis lenken deles med andre, vil de også kunne se notatet.", "URL shortener may expose your decrypt key in URL.": "URL forkorter kan avsløre dekrypteringsnøkkelen.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Lagre utklipp", "Your IP is not authorized to create documents.": "Din IP er ikke autorisert til å opprette dokumenter.", "Trying to shorten a URL that isn't pointing at our instance.": "Prøver å forkorte en URL som ikke peker i vår instans.", diff --git a/i18n/oc.json b/i18n/oc.json index 38171035..70ecb293 100644 --- a/i18n/oc.json +++ b/i18n/oc.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Nòtas chifradas sus %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visitatz aqueste ligam per veire la nòta. Fornir lo ligam a qualqu’un mai li permet tanben d’accedir a la nòta.", "URL shortener may expose your decrypt key in URL.": "Los espleches d’acorchiment d’URL pòdon expausar la clau de deschiframent dins l’URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Enregistrar lo tèxt", "Your IP is not authorized to create documents.": "Vòstra adreça IP a pas l’autorizacion de crear de tèxtes.", "Trying to shorten a URL that isn't pointing at our instance.": "Ensag d’abracar una URL que mena pas a nòstra instància.", diff --git a/i18n/pl.json b/i18n/pl.json index a146fe6d..4f0ecbc7 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Zaszyfrowana notatka na %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Naciśnij tej odnośnik, aby zobaczyć notatkę. Każda osoba z dostępem do tego adresu URL również może zobaczyć tę notatkę.", "URL shortener may expose your decrypt key in URL.": "Skrócenie adresu URL może ujawnić Twój klucz odszyfrowujący w adresie URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Zapisz dokument", "Your IP is not authorized to create documents.": "Twój adres IP nie jest autoryzowany do tworzenia dokumentów.", "Trying to shorten a URL that isn't pointing at our instance.": "Próba skrócenia adresu URL wskazującego na inną instancję.", diff --git a/i18n/pt.json b/i18n/pt.json index e426425b..23c2ffbb 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Nota criptografada no %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visite esse link para ver a nota. Dar a URL para qualquer um permite que eles também acessem a nota.", "URL shortener may expose your decrypt key in URL.": "Encurtador de URL pode expor sua chave de descriptografia em URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Salvar cópia", "Your IP is not authorized to create documents.": "Seu IP não está autorizado a criar cópias.", "Trying to shorten a URL that isn't pointing at our instance.": "Tentando encurtar uma URL que não aponta para a nossa instância.", diff --git a/i18n/ro.json b/i18n/ro.json index cb8cd5e4..3e14dc59 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Notă criptată pe %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Accesați acest link pentru a vedea nota. Nota poate fi accesată de către oricine care are acest URL.", "URL shortener may expose your decrypt key in URL.": "Scurtătorul de URL ar putea să vă expună cheia de decriptare din URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Salvați document-ul", "Your IP is not authorized to create documents.": "Adresa dvs. IP nu este autorizată să creeze document-uri.", "Trying to shorten a URL that isn't pointing at our instance.": "Încercarea de a scurta un URL care nu direcționează spre instanța noastră.", diff --git a/i18n/ru.json b/i18n/ru.json index 80139e94..dbbbe68c 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Зашифрованная запись на %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Посетите эту ссылку чтобы просмотреть запись. Передача ссылки кому либо позволит им получить доступ к записи тоже.", "URL shortener may expose your decrypt key in URL.": "Сервис сокращения ссылок может получить ваш ключ расшифровки из ссылки.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Сохранить запись", "Your IP is not authorized to create documents.": "Вашему IP адресу не разрешено создавать записи.", "Trying to shorten a URL that isn't pointing at our instance.": "Попытка сократить URL, который указывает не на наш сервер.", diff --git a/i18n/sk.json b/i18n/sk.json index 2d72d32f..2f3f2095 100644 --- a/i18n/sk.json +++ b/i18n/sk.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Zašifrovaná poznámka na %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Ak chcete zobraziť poznámku, navštívte tento odkaz. Poskytnutie adresy URL komukoľvek im umožní prístup aj k poznámke.", "URL shortener may expose your decrypt key in URL.": "Skracovač adries URL môže odhaliť váš dešifrovací kľúč v adrese URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Uložiť príspevok", "Your IP is not authorized to create documents.": "Vaša IP adresa nie je oprávnená vytvárať príspevky.", "Trying to shorten a URL that isn't pointing at our instance.": "Pokúšate sa skrátiť adresu URL, ktorá neukazuje na túto inštanciu.", diff --git a/i18n/sl.json b/i18n/sl.json index ca49a341..8d716366 100644 --- a/i18n/sl.json +++ b/i18n/sl.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Encrypted note on %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.", "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", diff --git a/i18n/sv.json b/i18n/sv.json index 00e64693..83712ff1 100644 --- a/i18n/sv.json +++ b/i18n/sv.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Encrypted note on %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.", "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", diff --git a/i18n/th.json b/i18n/th.json index c64e451b..9f6b8629 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "เขารหัสบันทึกย่อบน %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "ไปที่ลิงก์นี้เพื่อดูบันทึกย่อทั้งหมด ส่ง URL นี้ให้ใครก็ได้เพื่อให้สามารถเข้าถึงบันทึกย่อได้", "URL shortener may expose your decrypt key in URL.": "เครื่องมือสร้างลิงก์ย่ออาจเปิดเผยคีย์ถอดรหัสของคุณใน URL ได้", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "ดาวน์โหลดข้อมูลการฝากโค้ด", "Your IP is not authorized to create documents.": "IP ของคุณไม่ได้รับอนุญาตให้สร้างการฝากโค้ด", "Trying to shorten a URL that isn't pointing at our instance.": "กำลังพยายามใช้เครื่องมือสร้างลิงก์ย่อ ที่ไม่ได้ชี้ไปที่อินสแตนซ์ของเรา", diff --git a/i18n/tr.json b/i18n/tr.json index 0f12990a..40f00275 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "%s üzerinde şifrelenmiş not", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Notu görmek için bu bağlantıyı ziyaret edin. URL'yi birine vermek, onların da nota erişmesini sağlar.", "URL shortener may expose your decrypt key in URL.": "URL kısaltıcı, şifre çözme anahtarınızı URL içinde gösterebilir.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Yazıyı kaydet", "Your IP is not authorized to create documents.": "IP adresinizin yazı oluşturmaya yetkisi yoktur.", "Trying to shorten a URL that isn't pointing at our instance.": "URL'yi kısaltmaya çalışırken, bizim sunucumuza işaret etmeyen bir URL kullanıyorsunuz.", diff --git a/i18n/uk.json b/i18n/uk.json index 5649b463..429614d0 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "Зашифрована нотатка на %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Відвідайте посилання, щоб переглянути нотатку. Передача посилання будь-кому дозволить їм переглянути нотатку.", "URL shortener may expose your decrypt key in URL.": "Сервіс скорочення посилань може викрити ваш ключ дешифрування з URL.", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "Зберегти вставку", "Your IP is not authorized to create documents.": "Вашому IP не дозволено створювати вставки.", "Trying to shorten a URL that isn't pointing at our instance.": "Спроба скоротити URL, який не вказує на наш екземпляр.", diff --git a/i18n/zh.json b/i18n/zh.json index 72b1fc76..bd4eb510 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -210,6 +210,7 @@ "Encrypted note on %s": "%s 上的加密笔记", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "访问此链接来查看该笔记。将此 URL 发送给任何人即可允许其访问该笔记。", "URL shortener may expose your decrypt key in URL.": "短链接服务可能会暴露您在 URL 中的解密密钥。", + "URL shortener is enabled by default.": "URL shortener is enabled by default.", "Save document": "保存内容", "Your IP is not authorized to create documents.": "您的 IP 无权创建粘贴。", "Trying to shorten a URL that isn't pointing at our instance.": "尝试缩短一个不指向我们实例的URL。", From 0808052acf98f2f4d8fa026f965b7080eed73e15 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Fri, 15 Aug 2025 00:07:51 +0100 Subject: [PATCH 060/273] Added shlink integration --- CHANGELOG.md | 1 + cfg/conf.sample.php | 11 ++ lib/Configuration.php | 4 + lib/Controller.php | 24 +++++ lib/Request.php | 4 + lib/ShlinkProxy.php | 140 ++++++++++++++++++++++++++ tpl/shlinkproxy.php | 27 +++++ tst/ViewTest.php | 4 +- vendor/composer/autoload_classmap.php | 1 + vendor/composer/autoload_static.php | 1 + 10 files changed, 215 insertions(+), 2 deletions(-) create mode 100644 lib/ShlinkProxy.php create mode 100644 tpl/shlinkproxy.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 72f86f31..cee04504 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * FIXED: Allow pasting a password for decrypting a paste (#1620) * FIXED: Allow copying the shortened link after using a URL shortener (#1624) * ADDED: Auto shorten URLs with config option `shortenbydefault` (#1627) +* ADDED: Added `shortenviashlink` endpoint with an `shlink` configuration section ## 2.0.0 (2025-07-28) * ADDED: Error logging in database and filesystem backend (#1554) diff --git a/cfg/conf.sample.php b/cfg/conf.sample.php index 8883716f..8fb5288b 100644 --- a/cfg/conf.sample.php +++ b/cfg/conf.sample.php @@ -274,6 +274,17 @@ dir = PATH "data" ;version = "latest" ;bucket = "my-bucket" +;[shlink] +; - Shlink requires you to make a post call with a generated API key. +; use this section to setup the API key and URL. In order to use this section, +; "urlshortener" needs to point to the base URL of your PrivateBin +; instance with "?shortenviashlink&link=" appended. For example: +; urlshortener = "${basepath}?shortenviashlink&link=" +; This URL will in turn call YOURLS on the server side, using the URL from +; "apiurl" and the API Key from the "apikey" parameters below. +; apiurl = "https://shlink.example.com/rest/v3/short-urls" +; apikey = "your_api_key" + ;[yourls] ; When using YOURLS as a "urlshortener" config item: ; - By default, "urlshortener" will point to the YOURLS API URL, with or without diff --git a/lib/Configuration.php b/lib/Configuration.php index e6bb89cc..b139903e 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -107,6 +107,10 @@ class Configuration 'signature' => '', 'apiurl' => '', ), + 'shlink' => array( + 'apikey' => '', + 'apiurl' => '', + ), // update this array when adding/changing/removing js files 'sri' => array( 'js/base-x-5.0.1.js' => 'sha512-FmhlnjIxQyxkkxQmzf0l6IRGsGbgyCdgqPxypFsEtHMF1naRqaLLo6mcyN5rEaT16nKx1PeJ4g7+07D6gnk/Tg==', diff --git a/lib/Controller.php b/lib/Controller.php index 5b2ddb94..104985b0 100644 --- a/lib/Controller.php +++ b/lib/Controller.php @@ -151,6 +151,9 @@ class Controller case 'yourlsproxy': $this->_yourlsproxy($this->_request->getParam('link')); break; + case 'shlinkproxy': + $this->_shlinkproxy($this->_request->getParam('link')); + break; } $this->_setCacheHeaders(); @@ -454,6 +457,11 @@ class Controller $page->draw('yourlsproxy'); return; } + if ($this->_request->getOperation() === 'shlinkproxy') { + $page->assign('SHORTURL', $this->_status); + $page->draw('shlinkproxy'); + return; + } $page->assign('BASEPATH', I18n::_($this->_conf->getKey('basepath'))); $page->assign('STATUS', I18n::_($this->_status)); $page->assign('ISDELETED', I18n::_(json_encode($this->_is_deleted))); @@ -543,6 +551,22 @@ class Controller } } + /** + * proxies link to SHLINK, updates status or error with response + * + * @access private + * @param string $link + */ + private function _shlinkproxy($link) + { + $shlink = new ShlinkProxy($this->_conf, $link); + if ($shlink->isError()) { + $this->_error = $shlink->getError(); + } else { + $this->_status = $shlink->getUrl(); + } + } + /** * prepares JSON encoded status message * diff --git a/lib/Request.php b/lib/Request.php index c01f91c6..24a083be 100644 --- a/lib/Request.php +++ b/lib/Request.php @@ -124,6 +124,7 @@ class Request 'link' => FILTER_SANITIZE_URL, 'pasteid' => FILTER_SANITIZE_SPECIAL_CHARS, 'shortenviayourls' => FILTER_SANITIZE_SPECIAL_CHARS, + 'shortenviashlink' => FILTER_SANITIZE_SPECIAL_CHARS, ), false); } if ( @@ -149,6 +150,9 @@ class Request if (str_contains($this->getRequestUri(), '/shortenviayourls') || array_key_exists('shortenviayourls', $this->_params)) { $this->_operation = 'yourlsproxy'; } + if (str_contains($this->getRequestUri(), '/shortenviashlink') || array_key_exists('shortenviashlink', $this->_params)) { + $this->_operation = 'shlinkproxy'; + } } } diff --git a/lib/ShlinkProxy.php b/lib/ShlinkProxy.php new file mode 100644 index 00000000..38c311c1 --- /dev/null +++ b/lib/ShlinkProxy.php @@ -0,0 +1,140 @@ +getKey('basepath') . '?')) { + $this->_error = 'Trying to shorten a URL that isn\'t pointing at our instance.'; + return; + } + + $shlink_api_url = $conf->getKey('apiurl', 'shlink'); + $shlink_api_key = $conf->getKey('apikey', 'shlink'); + + if (empty($shlink_api_url) || empty($shlink_api_key)) { + $this->_error = 'Error calling Shlink. Probably a configuration issue, like wrong or missing "apiurl" or "apikey".'; + return; + } + + $data = file_get_contents( + $shlink_api_url, false, stream_context_create( + array( + 'http' => array( + 'method' => 'POST', + 'header' => "Content-Type: application/json\r\n" . + "X-Api-Key: " . $shlink_api_key . "\r\n", + 'content' => json_encode( + array( + 'longUrl' => $link, + ) + ), + ), + ) + ) + ); + if ($data === false) { + $http_response_header = $http_response_header ?? []; + $statusCode = ''; + if (!empty($http_response_header) && preg_match('/HTTP\/\d+\.\d+\s+(\d+)/', $http_response_header[0], $matches)) { + $statusCode = $matches[1]; + } + $this->_error = 'Error calling shlink. HTTP request failed for URL ' . $shlink_api_url . '. Status code: ' . $statusCode; + error_log('Error calling shlink: HTTP request failed for URL ' . $shlink_api_url . '. Status code: ' . $statusCode); + return; + } + try { + $data = Json::decode($data); + } catch (Exception $e) { + $this->_error = 'Error calling shlink. Probably a configuration issue, like wrong or missing "apiurl" or "apikey".'; + error_log('Error calling shlink: ' . $e->getMessage()); + return; + } + + if ( + !is_null($data) && + // array_key_exists('statusCode', $data) && + // $data['statusCode'] == 200 && + array_key_exists('shortUrl', $data) + ) { + $this->_url = $data['shortUrl']; + } else { + $this->_error = 'Error parsing shlink response.'; + } + } + + /** + * Returns the (untranslated) error message + * + * @access public + * @return string + */ + public function getError() + { + return $this->_error; + } + + /** + * Returns the shortened URL + * + * @access public + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + /** + * Returns true if any error has occurred + * + * @access public + * @return bool + */ + public function isError() + { + return !empty($this->_error); + } +} diff --git a/tpl/shlinkproxy.php b/tpl/shlinkproxy.php new file mode 100644 index 00000000..bbd454e9 --- /dev/null +++ b/tpl/shlinkproxy.php @@ -0,0 +1,27 @@ + +> + + + + + + <?php echo I18n::_($NAME); ?> + + + +

%s (Hit Ctrl+c to copy)', $SHORTURL, $SHORTURL); ?>

+ +
+

+
+ + + diff --git a/tst/ViewTest.php b/tst/ViewTest.php index 82d574b7..c1e7aad3 100644 --- a/tst/ViewTest.php +++ b/tst/ViewTest.php @@ -106,8 +106,8 @@ class ViewTest extends TestCase $content, $template . ': outputs error correctly' ); - if ($template === 'yourlsproxy') { - // yourlsproxy template only displays error message + if ($template === 'yourlsproxy' || $template === 'shlinkproxy') { + // yourlsproxy and shlinkproxy templates only display error message continue; } $this->assertMatchesRegularExpression( diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 6be3e28e..2ef68746 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -90,6 +90,7 @@ return array( 'PrivateBin\\View' => $baseDir . '/lib/View.php', 'PrivateBin\\Vizhash16x16' => $baseDir . '/lib/Vizhash16x16.php', 'PrivateBin\\YourlsProxy' => $baseDir . '/lib/YourlsProxy.php', + 'PrivateBin\\ShlinkProxy' => $baseDir . '/lib/ShlinkProxy.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index aa289799..a4b6c6b2 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -138,6 +138,7 @@ class ComposerStaticInitDontChange 'PrivateBin\\View' => __DIR__ . '/../..' . '/lib/View.php', 'PrivateBin\\Vizhash16x16' => __DIR__ . '/../..' . '/lib/Vizhash16x16.php', 'PrivateBin\\YourlsProxy' => __DIR__ . '/../..' . '/lib/YourlsProxy.php', + 'PrivateBin\\ShlinkProxy' => __DIR__ . '/../..' . '/lib/ShlinkProxy.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', From 714e4554790df7c547b42f5ea16f3d07865a1af3 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Fri, 15 Aug 2025 00:20:11 +0100 Subject: [PATCH 061/273] style fixes --- lib/ShlinkProxy.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ShlinkProxy.php b/lib/ShlinkProxy.php index 38c311c1..d33f2c7f 100644 --- a/lib/ShlinkProxy.php +++ b/lib/ShlinkProxy.php @@ -65,7 +65,7 @@ class ShlinkProxy 'http' => array( 'method' => 'POST', 'header' => "Content-Type: application/json\r\n" . - "X-Api-Key: " . $shlink_api_key . "\r\n", + 'X-Api-Key: ' . $shlink_api_key . "\r\n", 'content' => json_encode( array( 'longUrl' => $link, @@ -76,8 +76,8 @@ class ShlinkProxy ) ); if ($data === false) { - $http_response_header = $http_response_header ?? []; - $statusCode = ''; + $http_response_header = $http_response_header ?? array(); + $statusCode = ''; if (!empty($http_response_header) && preg_match('/HTTP\/\d+\.\d+\s+(\d+)/', $http_response_header[0], $matches)) { $statusCode = $matches[1]; } From 4a39a2ad0fc7172fd8e9e94bd0c055d027abc653 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Fri, 15 Aug 2025 23:28:44 +0100 Subject: [PATCH 062/273] refactor: added AbstractProxy base class for shortener proxies --- CREDITS.md | 1 + lib/AbstractProxy.php | 139 ++++++++++++++++++++ lib/Controller.php | 41 +++--- lib/ShlinkProxy.php | 116 +++++----------- lib/YourlsProxy.php | 97 ++++---------- tpl/{shlinkproxy.php => shortenerproxy.php} | 0 tpl/yourlsproxy.php | 27 ---- tst/JsonApiTest.php | 2 +- tst/ViewTest.php | 4 +- tst/YourlsProxyTest.php | 4 +- vendor/composer/autoload_classmap.php | 3 +- vendor/composer/autoload_static.php | 3 +- 12 files changed, 221 insertions(+), 216 deletions(-) create mode 100644 lib/AbstractProxy.php rename tpl/{shlinkproxy.php => shortenerproxy.php} (100%) delete mode 100644 tpl/yourlsproxy.php diff --git a/CREDITS.md b/CREDITS.md index 37026898..aabc732e 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -6,6 +6,7 @@ * rugk - security review, doc improvment, JS refactoring & various other stuff * R4SAS - python client, compression, blob URI to support larger attachments * Mikhail Romanov - UI improvements, theme switching, clipboard support, multi-file upload, bugfixes, code refactoring +* karthikkasturi - shlink proxy and url shortening bugfixes ## Past contributions diff --git a/lib/AbstractProxy.php b/lib/AbstractProxy.php new file mode 100644 index 00000000..f02229fd --- /dev/null +++ b/lib/AbstractProxy.php @@ -0,0 +1,139 @@ +getKey('basepath') . '?')) { + $this->_error = 'Trying to shorten a URL that isn\'t pointing at our instance.'; + return; + } + + $data = $this->_getcontents($conf, $link); + + if ($data == null) { + $this->_error = 'Error calling proxy. Probably a configuration issue'; + error_log('Error calling proxy: ' . $this->_error); + return; + } + + if ($data === false) { + $http_response_header = $http_response_header ?? array(); + $statusCode = ''; + if (!empty($http_response_header) && preg_match('/HTTP\/\d+\.\d+\s+(\d+)/', $http_response_header[0], $matches)) { + $statusCode = $matches[1]; + } + $this->_error = 'Error calling proxy. HTTP request failed. Status code: ' . $statusCode; + error_log('Error calling proxy: ' . $this->_error); + return; + } + + try { + $data = Json::decode($data); + } catch (Exception $e) { + $this->_error = 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'; + error_log('Error calling proxy: ' . $e->getMessage()); + return; + } + + $url = $this->_extractShortUrl($data); + + if ($url === null) { + $this->_error = 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'; + } else { + $this->_url = $url; + } + } + + /** + * Returns the (untranslated) error message + * + * @access public + * @return string + */ + public function getError() + { + return $this->_error; + } + + /** + * Returns the shortened URL + * + * @access public + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + /** + * Returns true if any error has occurred + * + * @access public + * @return bool + */ + public function isError() + { + return !empty($this->_error); + } + + /** + * Abstract method to get contents from a URL. + * + * @param Configuration $conf + * @param string $link + * @return mixed + */ + abstract protected function _getcontents(Configuration $conf, string $link); + + /** + * Abstract method to extract the shortUrl from the response + * + * @param array $data + * @return ?string + */ + abstract protected function _extractShortUrl(array $data): ?string; +} diff --git a/lib/Controller.php b/lib/Controller.php index 104985b0..31e2dbfe 100644 --- a/lib/Controller.php +++ b/lib/Controller.php @@ -149,10 +149,10 @@ class Controller $this->_jsonld($this->_request->getParam('jsonld')); return; case 'yourlsproxy': - $this->_yourlsproxy($this->_request->getParam('link')); + $this->_shortenerproxy($this->_request->getParam('link'), YourlsProxy::class); break; case 'shlinkproxy': - $this->_shlinkproxy($this->_request->getParam('link')); + $this->_shortenerproxy($this->_request->getParam('link'), ShlinkProxy::class); break; } @@ -454,12 +454,12 @@ class Controller $page->assign('NAME', $this->_conf->getKey('name')); if ($this->_request->getOperation() === 'yourlsproxy') { $page->assign('SHORTURL', $this->_status); - $page->draw('yourlsproxy'); + $page->draw('shortenerproxy'); return; } if ($this->_request->getOperation() === 'shlinkproxy') { $page->assign('SHORTURL', $this->_status); - $page->draw('shlinkproxy'); + $page->draw('shortenerproxy'); return; } $page->assign('BASEPATH', I18n::_($this->_conf->getKey('basepath'))); @@ -536,34 +536,23 @@ class Controller } /** - * proxies link to YOURLS, updates status or error with response + * Proxies a link using the specified proxy class, and updates the status or error with the response. * * @access private - * @param string $link + * @param string $link The link to be proxied. + * @param string $proxyClass The fully qualified class name of the proxy to use. */ - private function _yourlsproxy($link) + private function _shortenerproxy($link, $proxyClass) { - $yourls = new YourlsProxy($this->_conf, $link); - if ($yourls->isError()) { - $this->_error = $yourls->getError(); - } else { - $this->_status = $yourls->getUrl(); + if (!is_subclass_of($proxyClass, AbstractProxy::class)) { + $this->_error = 'Invalid proxy class.'; + return; } - } - - /** - * proxies link to SHLINK, updates status or error with response - * - * @access private - * @param string $link - */ - private function _shlinkproxy($link) - { - $shlink = new ShlinkProxy($this->_conf, $link); - if ($shlink->isError()) { - $this->_error = $shlink->getError(); + $proxy = new $proxyClass($this->_conf, $link); + if ($proxy->isError()) { + $this->_error = $proxy->getError(); } else { - $this->_status = $shlink->getUrl(); + $this->_status = $proxy->getUrl(); } } diff --git a/lib/ShlinkProxy.php b/lib/ShlinkProxy.php index d33f2c7f..56915609 100644 --- a/lib/ShlinkProxy.php +++ b/lib/ShlinkProxy.php @@ -11,130 +11,74 @@ namespace PrivateBin; -use Exception; - /** * ShlinkProxy * * Forwards a URL for shortening to shlink and stores the result. */ -class ShlinkProxy +class ShlinkProxy extends AbstractProxy { - /** - * error message - * - * @access private - * @var string - */ - private $_error = ''; - - /** - * shortened URL - * - * @access private - * @var string - */ - private $_url = ''; - /** * constructor * - * initializes and runs PrivateBin + * initializes and runs ShlinkProxy * * @access public * @param string $link */ public function __construct(Configuration $conf, $link) { - if (!str_starts_with($link, $conf->getKey('basepath') . '?')) { - $this->_error = 'Trying to shorten a URL that isn\'t pointing at our instance.'; - return; - } + parent::__construct($conf, $link); + } + /** + * Overrides the abstract parent function to get contents from Shlink API. + * + * @access protected + * @return string + */ + protected function _getcontents(Configuration $conf, string $link) + { $shlink_api_url = $conf->getKey('apiurl', 'shlink'); $shlink_api_key = $conf->getKey('apikey', 'shlink'); if (empty($shlink_api_url) || empty($shlink_api_key)) { - $this->_error = 'Error calling Shlink. Probably a configuration issue, like wrong or missing "apiurl" or "apikey".'; return; } - $data = file_get_contents( + $body = array( + 'longUrl' => $link, + ); + + return file_get_contents( $shlink_api_url, false, stream_context_create( array( 'http' => array( 'method' => 'POST', 'header' => "Content-Type: application/json\r\n" . 'X-Api-Key: ' . $shlink_api_key . "\r\n", - 'content' => json_encode( - array( - 'longUrl' => $link, - ) - ), + 'content' => Json::encode($body), ), ) ) ); - if ($data === false) { - $http_response_header = $http_response_header ?? array(); - $statusCode = ''; - if (!empty($http_response_header) && preg_match('/HTTP\/\d+\.\d+\s+(\d+)/', $http_response_header[0], $matches)) { - $statusCode = $matches[1]; - } - $this->_error = 'Error calling shlink. HTTP request failed for URL ' . $shlink_api_url . '. Status code: ' . $statusCode; - error_log('Error calling shlink: HTTP request failed for URL ' . $shlink_api_url . '. Status code: ' . $statusCode); - return; - } - try { - $data = Json::decode($data); - } catch (Exception $e) { - $this->_error = 'Error calling shlink. Probably a configuration issue, like wrong or missing "apiurl" or "apikey".'; - error_log('Error calling shlink: ' . $e->getMessage()); - return; - } + } + /** + * Extracts the short URL from the shlink API response. + * + * @access protected + * @param array $data + * @return ?string + */ + protected function _extractShortUrl(array $data): ?string + { if ( !is_null($data) && - // array_key_exists('statusCode', $data) && - // $data['statusCode'] == 200 && array_key_exists('shortUrl', $data) ) { - $this->_url = $data['shortUrl']; - } else { - $this->_error = 'Error parsing shlink response.'; + return $data['shortUrl']; } - } - - /** - * Returns the (untranslated) error message - * - * @access public - * @return string - */ - public function getError() - { - return $this->_error; - } - - /** - * Returns the shortened URL - * - * @access public - * @return string - */ - public function getUrl() - { - return $this->_url; - } - - /** - * Returns true if any error has occurred - * - * @access public - * @return bool - */ - public function isError() - { - return !empty($this->_error); + return null; } } diff --git a/lib/YourlsProxy.php b/lib/YourlsProxy.php index a7c6ad6d..4f60ba78 100644 --- a/lib/YourlsProxy.php +++ b/lib/YourlsProxy.php @@ -11,54 +11,42 @@ namespace PrivateBin; -use Exception; - /** * YourlsProxy * * Forwards a URL for shortening to YOURLS (your own URL shortener) and stores * the result. */ -class YourlsProxy +class YourlsProxy extends AbstractProxy { - /** - * error message - * - * @access private - * @var string - */ - private $_error = ''; - - /** - * shortened URL - * - * @access private - * @var string - */ - private $_url = ''; - /** * constructor * - * initializes and runs PrivateBin + * initializes and runs YourlsProxy * * @access public * @param string $link */ public function __construct(Configuration $conf, $link) { - if (!str_starts_with($link, $conf->getKey('basepath') . '?')) { - $this->_error = 'Trying to shorten a URL that isn\'t pointing at our instance.'; - return; - } + parent::__construct($conf, $link); + } + /** + * Overrides the abstract parent function to get contents from YOURLS API. + * + * @access protected + * @return string + */ + protected function _getcontents(Configuration $conf, string $link) + { $yourls_api_url = $conf->getKey('apiurl', 'yourls'); + if (empty($yourls_api_url)) { - $this->_error = 'Error calling YOURLS. Probably a configuration issue, like wrong or missing "apiurl" or "signature".'; - return; + return null; } - $data = file_get_contents( + return file_get_contents( $yourls_api_url, false, stream_context_create( array( 'http' => array( @@ -76,56 +64,25 @@ class YourlsProxy ) ) ); - try { - $data = Json::decode($data); - } catch (Exception $e) { - $this->_error = 'Error calling YOURLS. Probably a configuration issue, like wrong or missing "apiurl" or "signature".'; - error_log('Error calling YOURLS: ' . $e->getMessage()); - return; - } + } + /** + * Extracts the short URL from the YOURLS API response. + * + * @access protected + * @param array $data + * @return ?string + */ + protected function _extractShortUrl(array $data): ?string + { if ( !is_null($data) && array_key_exists('statusCode', $data) && $data['statusCode'] == 200 && array_key_exists('shorturl', $data) ) { - $this->_url = $data['shorturl']; - } else { - $this->_error = 'Error parsing YOURLS response.'; + return $data['shorturl']; } - } - - /** - * Returns the (untranslated) error message - * - * @access public - * @return string - */ - public function getError() - { - return $this->_error; - } - - /** - * Returns the shortened URL - * - * @access public - * @return string - */ - public function getUrl() - { - return $this->_url; - } - - /** - * Returns true if any error has occurred - * - * @access public - * @return bool - */ - public function isError() - { - return !empty($this->_error); + return null; } } diff --git a/tpl/shlinkproxy.php b/tpl/shortenerproxy.php similarity index 100% rename from tpl/shlinkproxy.php rename to tpl/shortenerproxy.php diff --git a/tpl/yourlsproxy.php b/tpl/yourlsproxy.php deleted file mode 100644 index bbd454e9..00000000 --- a/tpl/yourlsproxy.php +++ /dev/null @@ -1,27 +0,0 @@ - -> - - - - - - <?php echo I18n::_($NAME); ?> - - - -

%s (Hit Ctrl+c to copy)', $SHORTURL, $SHORTURL); ?>

- -
-

-
- - - diff --git a/tst/JsonApiTest.php b/tst/JsonApiTest.php index 3bbd2114..bbb1cc62 100644 --- a/tst/JsonApiTest.php +++ b/tst/JsonApiTest.php @@ -336,6 +336,6 @@ class JsonApiTest extends TestCase new Controller; $content = ob_get_contents(); ob_end_clean(); - $this->assertStringContainsString('Error calling YOURLS.', $content, 'outputs error correctly'); + $this->assertStringContainsString('Error calling proxy.', $content, 'outputs error correctly'); } } diff --git a/tst/ViewTest.php b/tst/ViewTest.php index c1e7aad3..fcb0bdac 100644 --- a/tst/ViewTest.php +++ b/tst/ViewTest.php @@ -106,8 +106,8 @@ class ViewTest extends TestCase $content, $template . ': outputs error correctly' ); - if ($template === 'yourlsproxy' || $template === 'shlinkproxy') { - // yourlsproxy and shlinkproxy templates only display error message + if ($template === 'shortenerproxy') { + // shortenerproxy template only displays error message continue; } $this->assertMatchesRegularExpression( diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 389f510d..11eb6708 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -68,7 +68,7 @@ class YourlsProxyTest extends TestCase $yourls = new YourlsProxy($this->_conf, 'https://example.com/?foo#bar'); $this->assertTrue($yourls->isError()); - $this->assertEquals($yourls->getError(), 'Error parsing YOURLS response.'); + $this->assertEquals($yourls->getError(), 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'); } public function testServerError() @@ -78,6 +78,6 @@ class YourlsProxyTest extends TestCase $yourls = new YourlsProxy($this->_conf, 'https://example.com/?foo#bar'); $this->assertTrue($yourls->isError()); - $this->assertEquals($yourls->getError(), 'Error calling YOURLS. Probably a configuration issue, like wrong or missing "apiurl" or "signature".'); + $this->assertEquals($yourls->getError(), 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'); } } diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 2ef68746..a89cb900 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -66,6 +66,7 @@ return array( 'Jdenticon\\Shapes\\ShapeCategory' => $vendorDir . '/jdenticon/jdenticon/src/Shapes/ShapeCategory.php', 'Jdenticon\\Shapes\\ShapeDefinitions' => $vendorDir . '/jdenticon/jdenticon/src/Shapes/ShapeDefinitions.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'PrivateBin\\AbstractProxy' => $baseDir . '/lib/AbstractProxy.php', 'PrivateBin\\Configuration' => $baseDir . '/lib/Configuration.php', 'PrivateBin\\Controller' => $baseDir . '/lib/Controller.php', 'PrivateBin\\Data\\AbstractData' => $baseDir . '/lib/Data/AbstractData.php', @@ -86,11 +87,11 @@ return array( 'PrivateBin\\Persistence\\ServerSalt' => $baseDir . '/lib/Persistence/ServerSalt.php', 'PrivateBin\\Persistence\\TrafficLimiter' => $baseDir . '/lib/Persistence/TrafficLimiter.php', 'PrivateBin\\Request' => $baseDir . '/lib/Request.php', + 'PrivateBin\\ShlinkProxy' => $baseDir . '/lib/ShlinkProxy.php', 'PrivateBin\\TemplateSwitcher' => $baseDir . '/lib/TemplateSwitcher.php', 'PrivateBin\\View' => $baseDir . '/lib/View.php', 'PrivateBin\\Vizhash16x16' => $baseDir . '/lib/Vizhash16x16.php', 'PrivateBin\\YourlsProxy' => $baseDir . '/lib/YourlsProxy.php', - 'PrivateBin\\ShlinkProxy' => $baseDir . '/lib/ShlinkProxy.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index a4b6c6b2..1d86d957 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -114,6 +114,7 @@ class ComposerStaticInitDontChange 'Jdenticon\\Shapes\\ShapeCategory' => __DIR__ . '/..' . '/jdenticon/jdenticon/src/Shapes/ShapeCategory.php', 'Jdenticon\\Shapes\\ShapeDefinitions' => __DIR__ . '/..' . '/jdenticon/jdenticon/src/Shapes/ShapeDefinitions.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'PrivateBin\\AbstractProxy' => __DIR__ . '/../..' . '/lib/AbstractProxy.php', 'PrivateBin\\Configuration' => __DIR__ . '/../..' . '/lib/Configuration.php', 'PrivateBin\\Controller' => __DIR__ . '/../..' . '/lib/Controller.php', 'PrivateBin\\Data\\AbstractData' => __DIR__ . '/../..' . '/lib/Data/AbstractData.php', @@ -134,11 +135,11 @@ class ComposerStaticInitDontChange 'PrivateBin\\Persistence\\ServerSalt' => __DIR__ . '/../..' . '/lib/Persistence/ServerSalt.php', 'PrivateBin\\Persistence\\TrafficLimiter' => __DIR__ . '/../..' . '/lib/Persistence/TrafficLimiter.php', 'PrivateBin\\Request' => __DIR__ . '/../..' . '/lib/Request.php', + 'PrivateBin\\ShlinkProxy' => __DIR__ . '/../..' . '/lib/ShlinkProxy.php', 'PrivateBin\\TemplateSwitcher' => __DIR__ . '/../..' . '/lib/TemplateSwitcher.php', 'PrivateBin\\View' => __DIR__ . '/../..' . '/lib/View.php', 'PrivateBin\\Vizhash16x16' => __DIR__ . '/../..' . '/lib/Vizhash16x16.php', 'PrivateBin\\YourlsProxy' => __DIR__ . '/../..' . '/lib/YourlsProxy.php', - 'PrivateBin\\ShlinkProxy' => __DIR__ . '/../..' . '/lib/ShlinkProxy.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', From 7380b3d5d44a81365a8d99ee864f9824d77ca42e Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Mon, 18 Aug 2025 19:21:45 +0200 Subject: [PATCH 063/273] New translations en.json (Corsican) --- i18n/co.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i18n/co.json b/i18n/co.json index ac7d3a7b..fa814c8e 100644 --- a/i18n/co.json +++ b/i18n/co.json @@ -209,8 +209,8 @@ "Close": "Chjode", "Encrypted note on %s": "Nota cifrata nant’à %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visitate stu liame per vede a nota. Date l’indirizzu à qualunque li permette d’accede à a nota dinù.", - "URL shortener may expose your decrypt key in URL.": "Un ammuzzatore d’indirizzu pò palisà a vostra chjave di dicifratura in l’indirizzu.", - "URL shortener is enabled by default.": "URL shortener is enabled by default.", + "URL shortener may expose your decrypt key in URL.": "Un riduttore d’indirizzu pò palisà a vostra chjave di dicifratura in l’indirizzu.", + "URL shortener is enabled by default.": "U riduttore d’indirizzu hè predefinitu attivu.", "Save document": "Arregistrà u ducumentu", "Your IP is not authorized to create documents.": "U vostru indirizzu IP ùn hè micca auturizatu à creà ducumenti.", "Trying to shorten a URL that isn't pointing at our instance.": "Pruvate d’ammuzzà un indirizzu web chì ùn punta micca versu a vostra instanza.", From 7ec8bc6ef1f243b033521a2c98ed0aaa08c0f0af Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Tue, 19 Aug 2025 20:34:39 +0100 Subject: [PATCH 064/273] chore: moved proxy classes to different folder and namespaces --- lib/Controller.php | 17 ++++----- lib/{ => Proxy}/AbstractProxy.php | 49 +++++++++++++++++++------ lib/{ => Proxy}/ShlinkProxy.php | 45 +++++++++-------------- lib/{ => Proxy}/YourlsProxy.php | 53 +++++++++++---------------- tst/YourlsProxyTest.php | 2 +- vendor/composer/autoload_classmap.php | 6 +-- vendor/composer/autoload_static.php | 6 +-- 7 files changed, 91 insertions(+), 87 deletions(-) rename lib/{ => Proxy}/AbstractProxy.php (68%) rename lib/{ => Proxy}/ShlinkProxy.php (55%) rename lib/{ => Proxy}/YourlsProxy.php (51%) diff --git a/lib/Controller.php b/lib/Controller.php index 31e2dbfe..3d608861 100644 --- a/lib/Controller.php +++ b/lib/Controller.php @@ -14,6 +14,9 @@ namespace PrivateBin; use Exception; use PrivateBin\Persistence\ServerSalt; use PrivateBin\Persistence\TrafficLimiter; +use PrivateBin\Proxy\AbstractProxy; +use PrivateBin\Proxy\ShlinkProxy; +use PrivateBin\Proxy\YourlsProxy; /** * Controller @@ -149,10 +152,10 @@ class Controller $this->_jsonld($this->_request->getParam('jsonld')); return; case 'yourlsproxy': - $this->_shortenerproxy($this->_request->getParam('link'), YourlsProxy::class); + $this->_shortenerproxy(new YourlsProxy($this->_conf, $this->_request->getParam('link'))); break; case 'shlinkproxy': - $this->_shortenerproxy($this->_request->getParam('link'), ShlinkProxy::class); + $this->_shortenerproxy(new ShlinkProxy($this->_conf, $this->_request->getParam('link'))); break; } @@ -539,16 +542,10 @@ class Controller * Proxies a link using the specified proxy class, and updates the status or error with the response. * * @access private - * @param string $link The link to be proxied. - * @param string $proxyClass The fully qualified class name of the proxy to use. + * @param AbstractProxy $proxy The instance of the proxy class. */ - private function _shortenerproxy($link, $proxyClass) + private function _shortenerproxy(AbstractProxy $proxy) { - if (!is_subclass_of($proxyClass, AbstractProxy::class)) { - $this->_error = 'Invalid proxy class.'; - return; - } - $proxy = new $proxyClass($this->_conf, $link); if ($proxy->isError()) { $this->_error = $proxy->getError(); } else { diff --git a/lib/AbstractProxy.php b/lib/Proxy/AbstractProxy.php similarity index 68% rename from lib/AbstractProxy.php rename to lib/Proxy/AbstractProxy.php index f02229fd..7dfc25e5 100644 --- a/lib/AbstractProxy.php +++ b/lib/Proxy/AbstractProxy.php @@ -9,14 +9,16 @@ * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License */ -namespace PrivateBin; +namespace PrivateBin\Proxy; use Exception; +use PrivateBin\Configuration; +use PrivateBin\Json; /** * AbstractProxy * - * Forwards a URL for shortening to shlink and stores the result. + * Forwards a URL for shortening and stores the result. */ abstract class AbstractProxy { @@ -42,20 +44,35 @@ abstract class AbstractProxy * initializes and runs the proxy class * * @access public + * @param Configuration $conf * @param string $link */ - public function __construct(Configuration $conf, $link) + public function __construct(Configuration $conf, string $link) { if (!str_starts_with($link, $conf->getKey('basepath') . '?')) { $this->_error = 'Trying to shorten a URL that isn\'t pointing at our instance.'; return; } - $data = $this->_getcontents($conf, $link); + $proxyUrl = $this->_getProxyUrl($conf); + + if (empty($proxyUrl)) { + $this->_error = 'Error calling proxy. Probably a configuration issue, like missing api url'; + error_log($this->_error); + return; + } + + $data = file_get_contents($proxyUrl, false, + stream_context_create( + array( + 'http' => $this->_getProxyPayload($conf, $link), + ) + ) + ); if ($data == null) { $this->_error = 'Error calling proxy. Probably a configuration issue'; - error_log('Error calling proxy: ' . $this->_error); + error_log($this->_error); return; } @@ -66,22 +83,23 @@ abstract class AbstractProxy $statusCode = $matches[1]; } $this->_error = 'Error calling proxy. HTTP request failed. Status code: ' . $statusCode; - error_log('Error calling proxy: ' . $this->_error); + error_log($this->_error); return; } try { - $data = Json::decode($data); + $jsonData = Json::decode($data); } catch (Exception $e) { $this->_error = 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'; error_log('Error calling proxy: ' . $e->getMessage()); return; } - $url = $this->_extractShortUrl($data); + $url = $this->_extractShortUrl($jsonData); if ($url === null) { $this->_error = 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'; + error_log('Error calling proxy: ' . $data); } else { $this->_url = $url; } @@ -121,13 +139,14 @@ abstract class AbstractProxy } /** - * Abstract method to get contents from a URL. + * Abstract method to get the payload to send to the URL Shortener * + * @access protected * @param Configuration $conf * @param string $link - * @return mixed + * @return array */ - abstract protected function _getcontents(Configuration $conf, string $link); + abstract protected function _getProxyPayload(Configuration $conf, string $link): array; /** * Abstract method to extract the shortUrl from the response @@ -136,4 +155,12 @@ abstract class AbstractProxy * @return ?string */ abstract protected function _extractShortUrl(array $data): ?string; + + /** + * Abstract method to get the proxy URL + * + * @param Configuration $conf + * @return string + */ + abstract protected function _getProxyUrl(Configuration $conf): string; } diff --git a/lib/ShlinkProxy.php b/lib/Proxy/ShlinkProxy.php similarity index 55% rename from lib/ShlinkProxy.php rename to lib/Proxy/ShlinkProxy.php index 56915609..ee4507cf 100644 --- a/lib/ShlinkProxy.php +++ b/lib/Proxy/ShlinkProxy.php @@ -9,7 +9,10 @@ * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License */ -namespace PrivateBin; +namespace PrivateBin\Proxy; + +use PrivateBin\Configuration; +use PrivateBin\Json; /** * ShlinkProxy @@ -19,48 +22,37 @@ namespace PrivateBin; class ShlinkProxy extends AbstractProxy { /** - * constructor + * Overrides the abstract parent function to get the proxy URL. * - * initializes and runs ShlinkProxy - * - * @access public - * @param string $link + * @param Configuration $conf + * @return string */ - public function __construct(Configuration $conf, $link) + protected function _getProxyUrl(Configuration $conf): string { - parent::__construct($conf, $link); + return $conf->getKey('apiurl', 'shlink'); } /** * Overrides the abstract parent function to get contents from Shlink API. * * @access protected - * @return string + * @param Configuration $conf + * @param string $link + * @return array */ - protected function _getcontents(Configuration $conf, string $link) + protected function _getProxyPayload(Configuration $conf, string $link): array { - $shlink_api_url = $conf->getKey('apiurl', 'shlink'); $shlink_api_key = $conf->getKey('apikey', 'shlink'); - if (empty($shlink_api_url) || empty($shlink_api_key)) { - return; - } - $body = array( 'longUrl' => $link, ); - return file_get_contents( - $shlink_api_url, false, stream_context_create( - array( - 'http' => array( - 'method' => 'POST', - 'header' => "Content-Type: application/json\r\n" . - 'X-Api-Key: ' . $shlink_api_key . "\r\n", - 'content' => Json::encode($body), - ), - ) - ) + return array( + 'method' => 'POST', + 'header' => "Content-Type: application/json\r\n" . + 'X-Api-Key: ' . $shlink_api_key . "\r\n", + 'content' => Json::encode($body), ); } @@ -74,7 +66,6 @@ class ShlinkProxy extends AbstractProxy protected function _extractShortUrl(array $data): ?string { if ( - !is_null($data) && array_key_exists('shortUrl', $data) ) { return $data['shortUrl']; diff --git a/lib/YourlsProxy.php b/lib/Proxy/YourlsProxy.php similarity index 51% rename from lib/YourlsProxy.php rename to lib/Proxy/YourlsProxy.php index 4f60ba78..ae9e11e7 100644 --- a/lib/YourlsProxy.php +++ b/lib/Proxy/YourlsProxy.php @@ -9,7 +9,9 @@ * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License */ -namespace PrivateBin; +namespace PrivateBin\Proxy; + +use PrivateBin\Configuration; /** * YourlsProxy @@ -20,49 +22,37 @@ namespace PrivateBin; class YourlsProxy extends AbstractProxy { /** - * constructor + * Overrides the abstract parent function to get the proxy URL. * - * initializes and runs YourlsProxy - * - * @access public - * @param string $link + * @param Configuration $conf + * @return string */ - public function __construct(Configuration $conf, $link) + protected function _getProxyUrl(Configuration $conf): string { - parent::__construct($conf, $link); + return $conf->getKey('apiurl', 'yourls'); } /** * Overrides the abstract parent function to get contents from YOURLS API. * * @access protected - * @return string + * @param Configuration $conf + * @param string $link + * @return array */ - protected function _getcontents(Configuration $conf, string $link) + protected function _getProxyPayload(Configuration $conf, string $link): array { - $yourls_api_url = $conf->getKey('apiurl', 'yourls'); - - if (empty($yourls_api_url)) { - return null; - } - - return file_get_contents( - $yourls_api_url, false, stream_context_create( + return array( + 'method' => 'POST', + 'header' => "Content-Type: application/x-www-form-urlencoded\r\n", + 'content' => http_build_query( array( - 'http' => array( - 'method' => 'POST', - 'header' => "Content-Type: application/x-www-form-urlencoded\r\n", - 'content' => http_build_query( - array( - 'signature' => $conf->getKey('signature', 'yourls'), - 'format' => 'json', - 'action' => 'shorturl', - 'url' => $link, - ) - ), - ), + 'signature' => $conf->getKey('signature', 'yourls'), + 'format' => 'json', + 'action' => 'shorturl', + 'url' => $link, ) - ) + ), ); } @@ -76,7 +66,6 @@ class YourlsProxy extends AbstractProxy protected function _extractShortUrl(array $data): ?string { if ( - !is_null($data) && array_key_exists('statusCode', $data) && $data['statusCode'] == 200 && array_key_exists('shorturl', $data) diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 11eb6708..78821f47 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -2,7 +2,7 @@ use PHPUnit\Framework\TestCase; use PrivateBin\Configuration; -use PrivateBin\YourlsProxy; +use PrivateBin\Proxy\YourlsProxy; class YourlsProxyTest extends TestCase { diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index a89cb900..113f8533 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -66,7 +66,6 @@ return array( 'Jdenticon\\Shapes\\ShapeCategory' => $vendorDir . '/jdenticon/jdenticon/src/Shapes/ShapeCategory.php', 'Jdenticon\\Shapes\\ShapeDefinitions' => $vendorDir . '/jdenticon/jdenticon/src/Shapes/ShapeDefinitions.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', - 'PrivateBin\\AbstractProxy' => $baseDir . '/lib/AbstractProxy.php', 'PrivateBin\\Configuration' => $baseDir . '/lib/Configuration.php', 'PrivateBin\\Controller' => $baseDir . '/lib/Controller.php', 'PrivateBin\\Data\\AbstractData' => $baseDir . '/lib/Data/AbstractData.php', @@ -86,12 +85,13 @@ return array( 'PrivateBin\\Persistence\\PurgeLimiter' => $baseDir . '/lib/Persistence/PurgeLimiter.php', 'PrivateBin\\Persistence\\ServerSalt' => $baseDir . '/lib/Persistence/ServerSalt.php', 'PrivateBin\\Persistence\\TrafficLimiter' => $baseDir . '/lib/Persistence/TrafficLimiter.php', + 'PrivateBin\\Proxy\\AbstractProxy' => $baseDir . '/lib/Proxy/AbstractProxy.php', + 'PrivateBin\\Proxy\\ShlinkProxy' => $baseDir . '/lib/Proxy/ShlinkProxy.php', + 'PrivateBin\\Proxy\\YourlsProxy' => $baseDir . '/lib/Proxy/YourlsProxy.php', 'PrivateBin\\Request' => $baseDir . '/lib/Request.php', - 'PrivateBin\\ShlinkProxy' => $baseDir . '/lib/ShlinkProxy.php', 'PrivateBin\\TemplateSwitcher' => $baseDir . '/lib/TemplateSwitcher.php', 'PrivateBin\\View' => $baseDir . '/lib/View.php', 'PrivateBin\\Vizhash16x16' => $baseDir . '/lib/Vizhash16x16.php', - 'PrivateBin\\YourlsProxy' => $baseDir . '/lib/YourlsProxy.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 1d86d957..ef0e05a6 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -114,7 +114,6 @@ class ComposerStaticInitDontChange 'Jdenticon\\Shapes\\ShapeCategory' => __DIR__ . '/..' . '/jdenticon/jdenticon/src/Shapes/ShapeCategory.php', 'Jdenticon\\Shapes\\ShapeDefinitions' => __DIR__ . '/..' . '/jdenticon/jdenticon/src/Shapes/ShapeDefinitions.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', - 'PrivateBin\\AbstractProxy' => __DIR__ . '/../..' . '/lib/AbstractProxy.php', 'PrivateBin\\Configuration' => __DIR__ . '/../..' . '/lib/Configuration.php', 'PrivateBin\\Controller' => __DIR__ . '/../..' . '/lib/Controller.php', 'PrivateBin\\Data\\AbstractData' => __DIR__ . '/../..' . '/lib/Data/AbstractData.php', @@ -134,12 +133,13 @@ class ComposerStaticInitDontChange 'PrivateBin\\Persistence\\PurgeLimiter' => __DIR__ . '/../..' . '/lib/Persistence/PurgeLimiter.php', 'PrivateBin\\Persistence\\ServerSalt' => __DIR__ . '/../..' . '/lib/Persistence/ServerSalt.php', 'PrivateBin\\Persistence\\TrafficLimiter' => __DIR__ . '/../..' . '/lib/Persistence/TrafficLimiter.php', + 'PrivateBin\\Proxy\\AbstractProxy' => __DIR__ . '/../..' . '/lib/Proxy/AbstractProxy.php', + 'PrivateBin\\Proxy\\ShlinkProxy' => __DIR__ . '/../..' . '/lib/Proxy/ShlinkProxy.php', + 'PrivateBin\\Proxy\\YourlsProxy' => __DIR__ . '/../..' . '/lib/Proxy/YourlsProxy.php', 'PrivateBin\\Request' => __DIR__ . '/../..' . '/lib/Request.php', - 'PrivateBin\\ShlinkProxy' => __DIR__ . '/../..' . '/lib/ShlinkProxy.php', 'PrivateBin\\TemplateSwitcher' => __DIR__ . '/../..' . '/lib/TemplateSwitcher.php', 'PrivateBin\\View' => __DIR__ . '/../..' . '/lib/View.php', 'PrivateBin\\Vizhash16x16' => __DIR__ . '/../..' . '/lib/Vizhash16x16.php', - 'PrivateBin\\YourlsProxy' => __DIR__ . '/../..' . '/lib/YourlsProxy.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', From 0be1cef224d66070f70228cb95811825ceb41c2b Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Tue, 19 Aug 2025 21:39:16 +0100 Subject: [PATCH 065/273] i18n updates --- i18n/ar.json | 4 ++-- i18n/bg.json | 4 ++-- i18n/ca.json | 4 ++-- i18n/co.json | 4 ++-- i18n/cs.json | 4 ++-- i18n/de.json | 4 ++-- i18n/el.json | 4 ++-- i18n/en.json | 4 ++-- i18n/es.json | 4 ++-- i18n/et.json | 4 ++-- i18n/fi.json | 4 ++-- i18n/fr.json | 4 ++-- i18n/he.json | 4 ++-- i18n/hi.json | 4 ++-- i18n/hu.json | 4 ++-- i18n/id.json | 4 ++-- i18n/it.json | 4 ++-- i18n/ja.json | 4 ++-- i18n/jbo.json | 4 ++-- i18n/ko.json | 4 ++-- i18n/ku.json | 4 ++-- i18n/la.json | 4 ++-- i18n/lt.json | 4 ++-- i18n/nl.json | 4 ++-- i18n/no.json | 4 ++-- i18n/oc.json | 4 ++-- i18n/pl.json | 4 ++-- i18n/pt.json | 4 ++-- i18n/ro.json | 4 ++-- i18n/ru.json | 4 ++-- i18n/sk.json | 4 ++-- i18n/sl.json | 4 ++-- i18n/sv.json | 4 ++-- i18n/th.json | 4 ++-- i18n/tr.json | 4 ++-- i18n/uk.json | 4 ++-- i18n/zh.json | 4 ++-- lib/Proxy/AbstractProxy.php | 16 +++++----------- tst/YourlsProxyTest.php | 2 +- 39 files changed, 80 insertions(+), 86 deletions(-) diff --git a/i18n/ar.json b/i18n/ar.json index b6c750ff..efcbbd93 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -214,8 +214,8 @@ "Save document": "احفظ اللصق", "Your IP is not authorized to create documents.": "عنوان IP الخاص بك غير مصرح له بإنشاء لصُق.", "Trying to shorten a URL that isn't pointing at our instance.": "محاولة تقصير عنوان URL لا يشير إلى خادمنا.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "خطأ في الاتصال بـ YOURLS. ربما تكون هناك مشكلة في التضبيط، مثل \"apiurl\" أو \"التوقيع\" الخاطئ أو المفقود.", - "Error parsing YOURLS response.": "خطأ في تحليل استجابة YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "خطأ في الاتصال بـ YOURLS. ربما تكون هناك مشكلة في التضبيط، مثل \"apiurl\" أو \"التوقيع\" الخاطئ أو المفقود.", + "Error parsing proxy response.": "خطأ في تحليل استجابة YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "يمكن عرض هذه الرسالة السرية مرة واحدة فقط. هل ترغب في رؤيتها الآن؟", "Yes, see it": "نعم، دعني اراها", "Dark Mode": "الوضع الداكن", diff --git a/i18n/bg.json b/i18n/bg.json index 9d7430c5..1e7e0bfb 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -214,8 +214,8 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/ca.json b/i18n/ca.json index 0a2f8c08..a2fa1911 100644 --- a/i18n/ca.json +++ b/i18n/ca.json @@ -214,8 +214,8 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "La teva IP no està autoritzada a crear notes.", "Trying to shorten a URL that isn't pointing at our instance.": "S'està intentant escurçar un URL que no apunta a la nostra instància.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error en la crida a YOURLS. Probablement és un problema de configuració, com ara \"apiurl\" o \"signature\" incorrectes o que falten.", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error en la crida a YOURLS. Probablement és un problema de configuració, com ara \"apiurl\" o \"signature\" incorrectes o que falten.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "Aquest missatge secret sols es pot veure una vegada. Vols obrir-ho ara?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/co.json b/i18n/co.json index ac7d3a7b..113eef7f 100644 --- a/i18n/co.json +++ b/i18n/co.json @@ -214,8 +214,8 @@ "Save document": "Arregistrà u ducumentu", "Your IP is not authorized to create documents.": "U vostru indirizzu IP ùn hè micca auturizatu à creà ducumenti.", "Trying to shorten a URL that isn't pointing at our instance.": "Pruvate d’ammuzzà un indirizzu web chì ùn punta micca versu a vostra instanza.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Sbagliu à a chjama di YOURLS. Seria forse una cunfigurazione gattiva, tale una « apiurl » o « signature » falsa o assente.", - "Error parsing YOURLS response.": "Sbagliu durante l’analisa di a risposta di YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Sbagliu à a chjama di YOURLS. Seria forse una cunfigurazione gattiva, tale una « apiurl » o « signature » falsa o assente.", + "Error parsing proxy response.": "Sbagliu durante l’analisa di a risposta di YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Stu messaghju secretu pò esse affissatu solu una volta. Vulete fighjallu subitu ?", "Yes, see it": "Iè, fighjallu", "Dark Mode": "Modu scuru", diff --git a/i18n/cs.json b/i18n/cs.json index 94c3ce8c..93d7ae5a 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -214,8 +214,8 @@ "Save document": "Uložit příspěvek", "Your IP is not authorized to create documents.": "Vaše IP adresa nemá oprávnění k vytváření příspěvků.", "Trying to shorten a URL that isn't pointing at our instance.": "Pokus o zkrácení URL, které neodkazuje na naši instanci.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Chyba volání YOURLS. Pravděpodobně chyba konfigurace, např. nesprávné či chybějící „apiurl“ nebo „signature“.", - "Error parsing YOURLS response.": "Chyba čtení odpovědi YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Chyba volání YOURLS. Pravděpodobně chyba konfigurace, např. nesprávné či chybějící „apiurl“ nebo „signature“.", + "Error parsing proxy response.": "Chyba čtení odpovědi YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Tuto tajnou zprávu lze zobrazit pouze jednou. Chcete si ji prohlédnout teď?", "Yes, see it": "Ano, zobrazit", "Dark Mode": "Tmavý režim", diff --git a/i18n/de.json b/i18n/de.json index 5381a249..b02201c6 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -214,8 +214,8 @@ "Save document": "Dokument speichern", "Your IP is not authorized to create documents.": "Deine IP ist nicht berechtigt, Texte zu erstellen.", "Trying to shorten a URL that isn't pointing at our instance.": "Versuch eine URL zu verkürzen, die nicht auf unsere Instanz zeigt.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Fehler beim Aufruf von YOURLS. Wahrscheinlich ein Konfigurationsproblem, wie eine falsche oder fehlende \"apiurl\" oder \"signature\".", - "Error parsing YOURLS response.": "Fehler beim Verarbeiten der YOURLS-Antwort.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Fehler beim Aufruf von YOURLS. Wahrscheinlich ein Konfigurationsproblem, wie eine falsche oder fehlende \"apiurl\" oder \"signature\".", + "Error parsing proxy response.": "Fehler beim Verarbeiten der YOURLS-Antwort.", "This secret message can only be displayed once. Would you like to see it now?": "Texte des \"Einmal\"-Typs können nach dem Öffnen nur einmal angezeigt werden. Möchtest Du ihn jetzt einsehen?", "Yes, see it": "Ja, jetzt einsehen", "Dark Mode": "Nachtmodus", diff --git a/i18n/el.json b/i18n/el.json index d19dec88..7b21d80b 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -214,8 +214,8 @@ "Save document": "Αποθήκευση επικόλλησης", "Your IP is not authorized to create documents.": "Η IP σας δεν επιτρέπεται να δημιουργεί επικολλήσεις.", "Trying to shorten a URL that isn't pointing at our instance.": "Έγινε προσπάθεια συντόμευσης ενός URL που δε δείχνει προς τη δική μας υπηρεσία.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Σφάλμα κατά την κλήση YOURLS. Πιθανώς ένα ζήτημα διαμόρφωσης, όπως λάθος ή λείπει \"apiurl\" ή \"υπογραφή\".", - "Error parsing YOURLS response.": "Σφάλμα ανάλυσης της απόκρισης YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Σφάλμα κατά την κλήση YOURLS. Πιθανώς ένα ζήτημα διαμόρφωσης, όπως λάθος ή λείπει \"apiurl\" ή \"υπογραφή\".", + "Error parsing proxy response.": "Σφάλμα ανάλυσης της απόκρισης YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Αυτό το μυστικό μήνυμα μπορεί να εμφανιστεί μόνο μία φορά. Θα θέλατε να το δείτε τώρα;", "Yes, see it": "Ναι, δείτε το", "Dark Mode": "Σκοτεινό Θέμα", diff --git a/i18n/en.json b/i18n/en.json index 6649c797..f7ec0b33 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -214,8 +214,8 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/es.json b/i18n/es.json index a2708dff..d7c8c913 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -214,8 +214,8 @@ "Save document": "Guardar documento", "Your IP is not authorized to create documents.": "Tu IP no está autorizada para crear contenido.", "Trying to shorten a URL that isn't pointing at our instance.": "Intentando acortar una URL que no apunta a nuestra instancia.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error llamando a YOURLS. Probablemente un problema de configuración, como error o falta \"apiurl\" o \"signature\".", - "Error parsing YOURLS response.": "Error al analizar la respuesta de YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error llamando a YOURLS. Probablemente un problema de configuración, como error o falta \"apiurl\" o \"signature\".", + "Error parsing proxy response.": "Error al analizar la respuesta de YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Este mensaje secreto sólo se puede mostrar una vez. ¿Quieres verlo ahora?", "Yes, see it": "Sí, verlo", "Dark Mode": "Modo nocturno", diff --git a/i18n/et.json b/i18n/et.json index d2c74d20..f9106000 100644 --- a/i18n/et.json +++ b/i18n/et.json @@ -214,8 +214,8 @@ "Save document": "Salvesta kleebe", "Your IP is not authorized to create documents.": "Su IP-l ei ole lubatud kleepeid luua.", "Trying to shorten a URL that isn't pointing at our instance.": "Püüame lühendada URL-i, mis ei viita meie instantsile.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Viga YOURLS-i kutsumisel. Tõenäoliselt konfiguratsiooniprobleem, näiteks vale või puuduv \"apiurl\" või \"signature\".", - "Error parsing YOURLS response.": "Viga YOURLS vastuse parsimisel.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Viga YOURLS-i kutsumisel. Tõenäoliselt konfiguratsiooniprobleem, näiteks vale või puuduv \"apiurl\" või \"signature\".", + "Error parsing proxy response.": "Viga YOURLS vastuse parsimisel.", "This secret message can only be displayed once. Would you like to see it now?": "Seda turvalist sõnumit saab kuvada vaid ühe korra. \nKas soovid seda näha nüüd?", "Yes, see it": "Jah, vaata seda", "Dark Mode": "Tume režiim", diff --git a/i18n/fi.json b/i18n/fi.json index 966ed1f0..74106775 100644 --- a/i18n/fi.json +++ b/i18n/fi.json @@ -214,8 +214,8 @@ "Save document": "Tallenna asiakirja", "Your IP is not authorized to create documents.": "IP:llesi ei ole annettu oikeutta luoda pasteja.", "Trying to shorten a URL that isn't pointing at our instance.": "Yritetään lyhentää URL-osoite, joka ei osoita meidän instanssiiin.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Virhe kutsuttaessa YOURLS. Luultavasti asetusongelma kuten väärä tai puuttuuva \"apiurl\" tai \"signature\".", - "Error parsing YOURLS response.": "Virhe jäsennettäessä YOURLS-vastausta.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Virhe kutsuttaessa YOURLS. Luultavasti asetusongelma kuten väärä tai puuttuuva \"apiurl\" tai \"signature\".", + "Error parsing proxy response.": "Virhe jäsennettäessä YOURLS-vastausta.", "This secret message can only be displayed once. Would you like to see it now?": "Tämä salainen viesti voidaan näyttää vain kerran. Haluatko nähdä sen nyt?", "Yes, see it": "Kyllä, näet sen", "Dark Mode": "Tumma tila", diff --git a/i18n/fr.json b/i18n/fr.json index f9632ed2..ab63298d 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -214,8 +214,8 @@ "Save document": "Sauver le document", "Your IP is not authorized to create documents.": "Votre adresse IP n'est pas autorisée à créer des documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Tentative de raccourcir une URL qui ne pointe pas vers notre instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Erreur lors de l'appel de YOURLS. Peut-être un problème de configuration, comme \"apiurl\" ou \"signature\" manquant.", - "Error parsing YOURLS response.": "Erreur d'analyse de la réponse YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Erreur lors de l'appel de YOURLS. Peut-être un problème de configuration, comme \"apiurl\" ou \"signature\" manquant.", + "Error parsing proxy response.": "Erreur d'analyse de la réponse YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Les documents de type \"Effacer après la lecture\" ne peuvent être affichés qu'une seule fois. Voulez-vous le voir maintenant ?", "Yes, see it": "Oui, le voir", "Dark Mode": "Mode Sombre", diff --git a/i18n/he.json b/i18n/he.json index 69aad3ac..19593758 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -214,8 +214,8 @@ "Save document": "שמור הדבקה", "Your IP is not authorized to create documents.": "ה-IP שלך אינו מורשה ליצור הדבקות.", "Trying to shorten a URL that isn't pointing at our instance.": "מנסים לקצר כתובת URL שאינה מצביעה על המערכת שלנו.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "שגיאה בעת קריאה ל-YOURLS. כנראה מדובר בבעיה בהגדרות, כמו \"apiurl\" או \"signature\" שגויים או חסרים.", - "Error parsing YOURLS response.": "שגיאה בניתוח התגובה מ-YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "שגיאה בעת קריאה ל-YOURLS. כנראה מדובר בבעיה בהגדרות, כמו \"apiurl\" או \"signature\" שגויים או חסרים.", + "Error parsing proxy response.": "שגיאה בניתוח התגובה מ-YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "ההודעה הסודית הזו יכולה להוצג רק פעם אחת. האם תרצה לראות אותה עכשיו?", "Yes, see it": "כן, ראה אותה", "Dark Mode": "מצב כהה", diff --git a/i18n/hi.json b/i18n/hi.json index 6649c797..f7ec0b33 100644 --- a/i18n/hi.json +++ b/i18n/hi.json @@ -214,8 +214,8 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/hu.json b/i18n/hu.json index 910e38c8..abe29d4c 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -214,8 +214,8 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Sötét mód", diff --git a/i18n/id.json b/i18n/id.json index 0845f6dd..c2fffe1e 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -214,8 +214,8 @@ "Save document": "Simpan document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Mode Gelap", diff --git a/i18n/it.json b/i18n/it.json index eafc5378..3def7997 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -214,8 +214,8 @@ "Save document": "Salva il messagio", "Your IP is not authorized to create documents.": "Il tuo IP non è autorizzato a creare dei messaggi.", "Trying to shorten a URL that isn't pointing at our instance.": "Tantativo in corso di accorciare un URL che non punta alla nostra istanza.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Errore nella chiamata a YOURLS. Probabilmente un problema di configurazione, come un \"apiurl\" o una \"signature\" sbagliati o mancanti.", - "Error parsing YOURLS response.": "Errore nell'analizzare la risposta YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Errore nella chiamata a YOURLS. Probabilmente un problema di configurazione, come un \"apiurl\" o una \"signature\" sbagliati o mancanti.", + "Error parsing proxy response.": "Errore nell'analizzare la risposta YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Questo messaggio di tipo Distruggi-dopo-lettura può essere visualizzato solo una volta. Vuoi vederlo ora?", "Yes, see it": "Sì, visualizzalo", "Dark Mode": "Tema Scuro", diff --git a/i18n/ja.json b/i18n/ja.json index 21e5fe41..7a7a400f 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -214,8 +214,8 @@ "Save document": "ペーストを保存", "Your IP is not authorized to create documents.": "あなたのIPアドレスにはペーストを作成する権限がありません。", "Trying to shorten a URL that isn't pointing at our instance.": "このインスタンスを指していないURLを短縮しようとしています。", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "YOURLSの呼び出し中にエラーが発生しました。\"apiurl\"または\"signature\"等の設定に問題がある可能性があります。", - "Error parsing YOURLS response.": "YOURLSレスポンスの解析中にエラーが発生しました。", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "YOURLSの呼び出し中にエラーが発生しました。\"apiurl\"または\"signature\"等の設定に問題がある可能性があります。", + "Error parsing proxy response.": "YOURLSレスポンスの解析中にエラーが発生しました。", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "はい、使用します", "Dark Mode": "ダークモード", diff --git a/i18n/jbo.json b/i18n/jbo.json index d56c0909..0e92c927 100644 --- a/i18n/jbo.json +++ b/i18n/jbo.json @@ -214,8 +214,8 @@ "Save document": "rejgau fukpi", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/ko.json b/i18n/ko.json index 6649c797..f7ec0b33 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -214,8 +214,8 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/ku.json b/i18n/ku.json index 50d6fa94..17952b39 100644 --- a/i18n/ku.json +++ b/i18n/ku.json @@ -214,8 +214,8 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "جۆری ڕەش", diff --git a/i18n/la.json b/i18n/la.json index abd9e057..d4dd9d27 100644 --- a/i18n/la.json +++ b/i18n/la.json @@ -214,8 +214,8 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/lt.json b/i18n/lt.json index 852f0173..c51f67b0 100644 --- a/i18n/lt.json +++ b/i18n/lt.json @@ -214,8 +214,8 @@ "Save document": "Įrašyti įdėjimą", "Your IP is not authorized to create documents.": "Jūsų IP adresas neturi įgaliojimų kurti įdėjimų.", "Trying to shorten a URL that isn't pointing at our instance.": "Bandoma sutrumpinti URL adresą, kuris nenurodo į mūsų egzempliorių.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Klaida iškviečiant YOURLS. Tikriausiai, konfigūracijos klaida, pavyzdžiui, neteisingi „apiurl“ ar „signature“, arba jų nėra.", - "Error parsing YOURLS response.": "Klaida nagrinėjant YOURLS atsaką.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Klaida iškviečiant YOURLS. Tikriausiai, konfigūracijos klaida, pavyzdžiui, neteisingi „apiurl“ ar „signature“, arba jų nėra.", + "Error parsing proxy response.": "Klaida nagrinėjant YOURLS atsaką.", "This secret message can only be displayed once. Would you like to see it now?": "Ši slapta žinutė gali būti parodyta tik vieną kartą. Ar norėtumėte ją dabar pamatyti?", "Yes, see it": "Taip, pamatyti", "Dark Mode": "Tamsi veiksena", diff --git a/i18n/nl.json b/i18n/nl.json index d16cfedc..7b177349 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -214,8 +214,8 @@ "Save document": "Document opslaan", "Your IP is not authorized to create documents.": "Je IP-adres is niet gemachtigd om documenten te maken.", "Trying to shorten a URL that isn't pointing at our instance.": "Proberen om een URL te verkorten dat niet naar ons systeem wijst.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Foutmelding ophalen YOURLS. Waarschijnlijk een configuratiefout, zoals een verkeerde of missende \"apiurl\" of \"signature\".", - "Error parsing YOURLS response.": "Foutmelding bij parsen van YOURLS respons.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Foutmelding ophalen YOURLS. Waarschijnlijk een configuratiefout, zoals een verkeerde of missende \"apiurl\" of \"signature\".", + "Error parsing proxy response.": "Foutmelding bij parsen van YOURLS respons.", "This secret message can only be displayed once. Would you like to see it now?": "Dit geheime bericht kan maar één keer worden weergegeven. Wil je het nu zien?", "Yes, see it": "Ja, tonen", "Dark Mode": "Donkere modus", diff --git a/i18n/no.json b/i18n/no.json index df40dc86..f60ddc46 100644 --- a/i18n/no.json +++ b/i18n/no.json @@ -214,8 +214,8 @@ "Save document": "Lagre utklipp", "Your IP is not authorized to create documents.": "Din IP er ikke autorisert til å opprette dokumenter.", "Trying to shorten a URL that isn't pointing at our instance.": "Prøver å forkorte en URL som ikke peker i vår instans.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Feil ved å besøke YOURLS. Sannsynligvis et konfigurasjonsproblem, eksempelvis feil eller mangler, med \"apiurl\" eller \"signatur\".", - "Error parsing YOURLS response.": "Feil ved analyse av YOURLS svar.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Feil ved å besøke YOURLS. Sannsynligvis et konfigurasjonsproblem, eksempelvis feil eller mangler, med \"apiurl\" eller \"signatur\".", + "Error parsing proxy response.": "Feil ved analyse av YOURLS svar.", "This secret message can only be displayed once. Would you like to see it now?": "Denne hemmelige meldingen kan bare vises én gang. Vil du se den nå?", "Yes, see it": "Ja, se det", "Dark Mode": "Mørk modus", diff --git a/i18n/oc.json b/i18n/oc.json index 70ecb293..307a4034 100644 --- a/i18n/oc.json +++ b/i18n/oc.json @@ -214,8 +214,8 @@ "Save document": "Enregistrar lo tèxt", "Your IP is not authorized to create documents.": "Vòstra adreça IP a pas l’autorizacion de crear de tèxtes.", "Trying to shorten a URL that isn't pointing at our instance.": "Ensag d’abracar una URL que mena pas a nòstra instància.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error en cridant YOURLS. Es probablament un problèma de configuracion, quicòm coma « apirul » o « signature » marrit o absent.", - "Error parsing YOURLS response.": "Error d'analisi de la responsa YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error en cridant YOURLS. Es probablament un problèma de configuracion, quicòm coma « apirul » o « signature » marrit o absent.", + "Error parsing proxy response.": "Error d'analisi de la responsa YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Aqueste messatge secrèt se pòt pas qu'afichar un còp. Lo volètz veire ara ?", "Yes, see it": "Òc, afichatz-lo", "Dark Mode": "Mòde escur", diff --git a/i18n/pl.json b/i18n/pl.json index 4f0ecbc7..d9b91fc6 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -214,8 +214,8 @@ "Save document": "Zapisz dokument", "Your IP is not authorized to create documents.": "Twój adres IP nie jest autoryzowany do tworzenia dokumentów.", "Trying to shorten a URL that isn't pointing at our instance.": "Próba skrócenia adresu URL wskazującego na inną instancję.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Błąd wywoływania YOURLS. Możliwy błąd konfiguracji, taki jak błędne lub brakujące \"apiurl\" lub \"signature\".", - "Error parsing YOURLS response.": "Błąd przetwarzania odpowiedzi YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Błąd wywoływania YOURLS. Możliwy błąd konfiguracji, taki jak błędne lub brakujące \"apiurl\" lub \"signature\".", + "Error parsing proxy response.": "Błąd przetwarzania odpowiedzi YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Tę tajną wiadomość możesz zobaczyć tylko jeden raz. Czy chcesz to zrobić teraz?", "Yes, see it": "Tak, pokaż", "Dark Mode": "Ciemny motyw", diff --git a/i18n/pt.json b/i18n/pt.json index 23c2ffbb..7c7f676c 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -214,8 +214,8 @@ "Save document": "Salvar cópia", "Your IP is not authorized to create documents.": "Seu IP não está autorizado a criar cópias.", "Trying to shorten a URL that isn't pointing at our instance.": "Tentando encurtar uma URL que não aponta para a nossa instância.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Erro ao chamar YOURLS. Provavelmente um problema de configuração, como errado ou faltando \"apiurl\" ou \"signature\".", - "Error parsing YOURLS response.": "Erro ao analisar a resposta do YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Erro ao chamar YOURLS. Provavelmente um problema de configuração, como errado ou faltando \"apiurl\" ou \"signature\".", + "Error parsing proxy response.": "Erro ao analisar a resposta do YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Esta mensagem secreta só pode ser exibida uma vez. Gostaria de vê-la agora?", "Yes, see it": "Sim, veja", "Dark Mode": "Modo Noturno", diff --git a/i18n/ro.json b/i18n/ro.json index 3e14dc59..c070c154 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -214,8 +214,8 @@ "Save document": "Salvați document-ul", "Your IP is not authorized to create documents.": "Adresa dvs. IP nu este autorizată să creeze document-uri.", "Trying to shorten a URL that isn't pointing at our instance.": "Încercarea de a scurta un URL care nu direcționează spre instanța noastră.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Eroare la apelarea YOURLS. Probabil o problemă de configurare, cum ar fi \"apiurl\" sau \"signature\" greșite sau lipsă.", - "Error parsing YOURLS response.": "Eroare la analizarea răspunsului YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Eroare la apelarea YOURLS. Probabil o problemă de configurare, cum ar fi \"apiurl\" sau \"signature\" greșite sau lipsă.", + "Error parsing proxy response.": "Eroare la analizarea răspunsului YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Acest mesaj secret poate fi afișat o singură dată. Doriți să îl vedeți acum?", "Yes, see it": "Da, vezi", "Dark Mode": "Mod întunecat", diff --git a/i18n/ru.json b/i18n/ru.json index dbbbe68c..063f62e8 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -214,8 +214,8 @@ "Save document": "Сохранить запись", "Your IP is not authorized to create documents.": "Вашему IP адресу не разрешено создавать записи.", "Trying to shorten a URL that isn't pointing at our instance.": "Попытка сократить URL, который указывает не на наш сервер.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Ошибка обращения к YOURLS. Возможно в конфигурации допущена ошибка, например неверный или отсутствующий параметр \"apiurl\" или \"signature\".", - "Error parsing YOURLS response.": "Ошибка разбора ответа от YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Ошибка обращения к YOURLS. Возможно в конфигурации допущена ошибка, например неверный или отсутствующий параметр \"apiurl\" или \"signature\".", + "Error parsing proxy response.": "Ошибка разбора ответа от YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Записи, удаляемые после прочтения, могут быть отображены после загрузки только один раз. Вы хотите открыть её сейчас?", "Yes, see it": "Да, загрузить", "Dark Mode": "Тёмная", diff --git a/i18n/sk.json b/i18n/sk.json index 2f3f2095..4db81610 100644 --- a/i18n/sk.json +++ b/i18n/sk.json @@ -214,8 +214,8 @@ "Save document": "Uložiť príspevok", "Your IP is not authorized to create documents.": "Vaša IP adresa nie je oprávnená vytvárať príspevky.", "Trying to shorten a URL that isn't pointing at our instance.": "Pokúšate sa skrátiť adresu URL, ktorá neukazuje na túto inštanciu.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Áno, zobraziť", "Dark Mode": "Tmavý Režim", diff --git a/i18n/sl.json b/i18n/sl.json index 8d716366..5dca4097 100644 --- a/i18n/sl.json +++ b/i18n/sl.json @@ -214,8 +214,8 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Temni način", diff --git a/i18n/sv.json b/i18n/sv.json index 83712ff1..de8816dd 100644 --- a/i18n/sv.json +++ b/i18n/sv.json @@ -214,8 +214,8 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", - "Error parsing YOURLS response.": "Error parsing YOURLS response.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", + "Error parsing proxy response.": "Error parsing proxy response.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Mörkt Läge", diff --git a/i18n/th.json b/i18n/th.json index 9f6b8629..58bbf3f5 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -214,8 +214,8 @@ "Save document": "ดาวน์โหลดข้อมูลการฝากโค้ด", "Your IP is not authorized to create documents.": "IP ของคุณไม่ได้รับอนุญาตให้สร้างการฝากโค้ด", "Trying to shorten a URL that isn't pointing at our instance.": "กำลังพยายามใช้เครื่องมือสร้างลิงก์ย่อ ที่ไม่ได้ชี้ไปที่อินสแตนซ์ของเรา", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "เกิดข้อผิดพลาดในการเรียก YOURLS อาจเป็นปัญหามาจากการกำหนดค่า เช่น \"apiurl\" หรือ \"signature\" ไม่ถูกต้องหรือขาดหายไป", - "Error parsing YOURLS response.": "เกิดข้อผิดพลาดในการแยกวิเคราะห์การตอบสนองของ YOURLS", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "เกิดข้อผิดพลาดในการเรียก YOURLS อาจเป็นปัญหามาจากการกำหนดค่า เช่น \"apiurl\" หรือ \"signature\" ไม่ถูกต้องหรือขาดหายไป", + "Error parsing proxy response.": "เกิดข้อผิดพลาดในการแยกวิเคราะห์การตอบสนองของ YOURLS", "This secret message can only be displayed once. Would you like to see it now?": "ข้อความลับนี้จะแสดงได้เพียงครั้งเดียวเท่านั้น คุณต้องการดูข้อความนี้ตอนนี้เลยใช่หรือไม่", "Yes, see it": "ใช่ ดูเลย", "Dark Mode": "โหมดสีเข้ม", diff --git a/i18n/tr.json b/i18n/tr.json index 40f00275..964479f6 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -214,8 +214,8 @@ "Save document": "Yazıyı kaydet", "Your IP is not authorized to create documents.": "IP adresinizin yazı oluşturmaya yetkisi yoktur.", "Trying to shorten a URL that isn't pointing at our instance.": "URL'yi kısaltmaya çalışırken, bizim sunucumuza işaret etmeyen bir URL kullanıyorsunuz.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "YOURLS çağrısı başarısız oldu. Muhtemelen \"apiurl\" veya \"signature\" gibi yanlış veya eksik yapılandırma hatası.", - "Error parsing YOURLS response.": "YOURLS yanıtı ayrıştırılamadı.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "YOURLS çağrısı başarısız oldu. Muhtemelen \"apiurl\" veya \"signature\" gibi yanlış veya eksik yapılandırma hatası.", + "Error parsing proxy response.": "YOURLS yanıtı ayrıştırılamadı.", "This secret message can only be displayed once. Would you like to see it now?": "Bu gizli mesaj yalnızca bir kez görüntülenebilir. Şimdi görmek ister misiniz?", "Yes, see it": "Evet, gör", "Dark Mode": "Koyu Mod", diff --git a/i18n/uk.json b/i18n/uk.json index 429614d0..6942d8cc 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -214,8 +214,8 @@ "Save document": "Зберегти вставку", "Your IP is not authorized to create documents.": "Вашому IP не дозволено створювати вставки.", "Trying to shorten a URL that isn't pointing at our instance.": "Спроба скоротити URL, який не вказує на наш екземпляр.", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Помилка виклику YOURLS. Ймовірно проблема з налаштуванням, наприклад \"apiurl\" чи \"signature\".", - "Error parsing YOURLS response.": "Помилка розбору відповіді YOURLS.", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Помилка виклику YOURLS. Ймовірно проблема з налаштуванням, наприклад \"apiurl\" чи \"signature\".", + "Error parsing proxy response.": "Помилка розбору відповіді YOURLS.", "This secret message can only be displayed once. Would you like to see it now?": "Це таємне повідомлення можна надіслати лише один раз. Хочете переглянути його зараз?", "Yes, see it": "Так, побачити", "Dark Mode": "Темний режим", diff --git a/i18n/zh.json b/i18n/zh.json index bd4eb510..10074be2 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -214,8 +214,8 @@ "Save document": "保存内容", "Your IP is not authorized to create documents.": "您的 IP 无权创建粘贴。", "Trying to shorten a URL that isn't pointing at our instance.": "尝试缩短一个不指向我们实例的URL。", - "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "调用 YOURLS 时出错。可能是配置问题,例如“apiurl”或“signature”错误或缺失。", - "Error parsing YOURLS response.": "解析 YOURLS 响应时出错。", + "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "调用 YOURLS 时出错。可能是配置问题,例如“apiurl”或“signature”错误或缺失。", + "Error parsing proxy response.": "解析 YOURLS 响应时出错。", "This secret message can only be displayed once. Would you like to see it now?": "读取粘贴后只能在加载时显示一次。您想现在打开吗?", "Yes, see it": "是的,加载它", "Dark Mode": "夜间模式", diff --git a/lib/Proxy/AbstractProxy.php b/lib/Proxy/AbstractProxy.php index 7dfc25e5..6c024e4c 100644 --- a/lib/Proxy/AbstractProxy.php +++ b/lib/Proxy/AbstractProxy.php @@ -57,7 +57,7 @@ abstract class AbstractProxy $proxyUrl = $this->_getProxyUrl($conf); if (empty($proxyUrl)) { - $this->_error = 'Error calling proxy. Probably a configuration issue, like missing api url'; + $this->_error = 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'; error_log($this->_error); return; } @@ -70,20 +70,14 @@ abstract class AbstractProxy ) ); - if ($data == null) { - $this->_error = 'Error calling proxy. Probably a configuration issue'; - error_log($this->_error); - return; - } - if ($data === false) { $http_response_header = $http_response_header ?? array(); $statusCode = ''; if (!empty($http_response_header) && preg_match('/HTTP\/\d+\.\d+\s+(\d+)/', $http_response_header[0], $matches)) { $statusCode = $matches[1]; } - $this->_error = 'Error calling proxy. HTTP request failed. Status code: ' . $statusCode; - error_log($this->_error); + $this->_error = 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'; + error_log($this->_error . ' Status code: ' . $statusCode); return; } @@ -97,8 +91,8 @@ abstract class AbstractProxy $url = $this->_extractShortUrl($jsonData); - if ($url === null) { - $this->_error = 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'; + if ($url === null || empty($url)) { + $this->_error = 'Error parsing proxy response.'; error_log('Error calling proxy: ' . $data); } else { $this->_url = $url; diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 78821f47..01fb1821 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -68,7 +68,7 @@ class YourlsProxyTest extends TestCase $yourls = new YourlsProxy($this->_conf, 'https://example.com/?foo#bar'); $this->assertTrue($yourls->isError()); - $this->assertEquals($yourls->getError(), 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'); + $this->assertEquals($yourls->getError(), 'Error parsing proxy response.'); } public function testServerError() From 39e527915edd89517d876835a713f786a83337af Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Tue, 19 Aug 2025 23:55:32 +0000 Subject: [PATCH 066/273] Add test cases for shlink --- tst/JsonApiTest.php | 80 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/tst/JsonApiTest.php b/tst/JsonApiTest.php index bbb1cc62..c3236b05 100644 --- a/tst/JsonApiTest.php +++ b/tst/JsonApiTest.php @@ -313,6 +313,60 @@ class JsonApiTest extends TestCase $this->assertStringContainsString('id="pasteurl" href="https://example.com/1"', $content, "'{$baseUri}' outputs shortened URL correctly"); } + /** + * @runInSeparateProcess + * @dataProvider baseShlinkUriProvider + */ + public function testShortenViaShlink($baseUri) + { + $mock_shlink_service = $this->_path . DIRECTORY_SEPARATOR . 'shlink.json'; + $options = parse_ini_file(CONF, true); + $options['main']['basepath'] = 'https://example.com/path'; // missing slash gets added by Configuration constructor + $options['main']['urlshortener'] = 'https://example.com' . $baseUri . 'link='; + $options['shlink']['apiurl'] = $mock_shlink_service; + Helper::createIniFile(CONF, $options); + + // the real service answer is more complex, but we only look for the shorturl & statusCode + file_put_contents($mock_shlink_service, '{"shortUrl":"https:\/\/example.com\/1"}'); + + $_SERVER['REQUEST_URI'] = $baseUri . 'link=https%3A%2F%2Fexample.com%2Fpath%2F%3Ffoo%23bar'; + $_GET['link'] = 'https://example.com/path/?foo#bar'; + if (str_contains($baseUri, '?shortenviashlink')) { + $_GET['shortenviashlink'] = null; + } + ob_start(); + new Controller; + $content = ob_get_contents(); + ob_end_clean(); + $this->assertStringContainsString('id="pasteurl" href="https://example.com/1"', $content, "'{$baseUri}' outputs shortened URL correctly"); + } + + /** + * @runInSeparateProcess + * @dataProvider baseShlinkUriProvider + */ + public function testShortenViaShlinkFailureHttp($baseUri) + { + $mock_shlink_service = 'https://httpbin.org/status/403'; + $options = parse_ini_file(CONF, true); + $options['main']['basepath'] = 'https://example.com/path'; // missing slash gets added by Configuration constructor + $options['main']['urlshortener'] = 'https://example.com' . $baseUri . 'link='; + $options['shlink']['apiurl'] = $mock_shlink_service; + Helper::createIniFile(CONF, $options); + + $_SERVER['REQUEST_URI'] = $baseUri . 'link=https%3A%2F%2Fexample.com%2Fpath%2F%3Ffoo%23bar'; + $_GET['link'] = 'https://example.com/path/?foo#bar'; + if (str_contains($baseUri, '?shortenviashlink')) { + $_GET['shortenviashlink'] = null; + } + ob_start(); + // Use @ to ignore the http warning for the 403. It will be handled appropriately by AbstractProxy + @new Controller; + $content = ob_get_contents(); + ob_end_clean(); + $this->assertStringContainsString('Error calling proxy.', $content, 'outputs error correctly'); + } + public function baseUriProvider() { return array( @@ -322,6 +376,15 @@ class JsonApiTest extends TestCase ); } + public function baseShlinkUriProvider() + { + return array( + array('/path/shortenviashlink?'), + array('/path/index.php/shortenviashlink?'), + array('/path?shortenviashlink&'), + ); + } + /** * @runInSeparateProcess */ @@ -338,4 +401,21 @@ class JsonApiTest extends TestCase ob_end_clean(); $this->assertStringContainsString('Error calling proxy.', $content, 'outputs error correctly'); } + + /** + * @runInSeparateProcess + */ + public function testShortenViaShlinkFailure() + { + $options = parse_ini_file(CONF, true); + $options['main']['basepath'] = 'https://example.com/path'; // missing slash gets added by Configuration constructor + Helper::createIniFile(CONF, $options); + $_SERVER['REQUEST_URI'] = '/path/shortenviashlink?link=https%3A%2F%2Fexample.com%2Fpath%2F%3Ffoo%23bar'; + $_GET['link'] = 'https://example.com/path/?foo#bar'; + ob_start(); + new Controller; + $content = ob_get_contents(); + ob_end_clean(); + $this->assertStringContainsString('Error calling proxy.', $content, 'outputs error correctly'); + } } From 77395c147f266063ec84c6144b1b1b8de0cd7ef3 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Wed, 20 Aug 2025 01:23:06 +0000 Subject: [PATCH 067/273] updated test cases, added clarity in error messages --- i18n/ar.json | 5 +++-- i18n/bg.json | 5 +++-- i18n/ca.json | 5 +++-- i18n/co.json | 5 +++-- i18n/cs.json | 5 +++-- i18n/de.json | 5 +++-- i18n/el.json | 5 +++-- i18n/en.json | 5 +++-- i18n/es.json | 5 +++-- i18n/et.json | 5 +++-- i18n/fi.json | 5 +++-- i18n/fr.json | 5 +++-- i18n/he.json | 5 +++-- i18n/hi.json | 5 +++-- i18n/hu.json | 5 +++-- i18n/id.json | 5 +++-- i18n/it.json | 5 +++-- i18n/ja.json | 5 +++-- i18n/jbo.json | 5 +++-- i18n/ko.json | 5 +++-- i18n/ku.json | 5 +++-- i18n/la.json | 5 +++-- i18n/lt.json | 5 +++-- i18n/nl.json | 5 +++-- i18n/no.json | 5 +++-- i18n/oc.json | 5 +++-- i18n/pl.json | 5 +++-- i18n/pt.json | 5 +++-- i18n/ro.json | 5 +++-- i18n/ru.json | 5 +++-- i18n/sk.json | 5 +++-- i18n/sl.json | 5 +++-- i18n/sv.json | 5 +++-- i18n/th.json | 5 +++-- i18n/tr.json | 5 +++-- i18n/uk.json | 5 +++-- i18n/zh.json | 5 +++-- lib/Proxy/AbstractProxy.php | 23 ++++++++++++++--------- tst/JsonApiTest.php | 34 +++++++++++++++++++++++++++++++--- tst/YourlsProxyTest.php | 4 ++-- 40 files changed, 158 insertions(+), 88 deletions(-) diff --git a/i18n/ar.json b/i18n/ar.json index efcbbd93..1ba7dc63 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -214,8 +214,9 @@ "Save document": "احفظ اللصق", "Your IP is not authorized to create documents.": "عنوان IP الخاص بك غير مصرح له بإنشاء لصُق.", "Trying to shorten a URL that isn't pointing at our instance.": "محاولة تقصير عنوان URL لا يشير إلى خادمنا.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "خطأ في الاتصال بـ YOURLS. ربما تكون هناك مشكلة في التضبيط، مثل \"apiurl\" أو \"التوقيع\" الخاطئ أو المفقود.", - "Error parsing proxy response.": "خطأ في تحليل استجابة YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "خطأ في الاتصال بـ YOURLS. ربما تكون هناك مشكلة في التضبيط، مثل \"apiurl\" أو \"التوقيع\" الخاطئ أو المفقود.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "خطأ في تحليل استجابة YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "يمكن عرض هذه الرسالة السرية مرة واحدة فقط. هل ترغب في رؤيتها الآن؟", "Yes, see it": "نعم، دعني اراها", "Dark Mode": "الوضع الداكن", diff --git a/i18n/bg.json b/i18n/bg.json index 1e7e0bfb..5aa0b00d 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -214,8 +214,9 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/ca.json b/i18n/ca.json index a2fa1911..5c3c6073 100644 --- a/i18n/ca.json +++ b/i18n/ca.json @@ -214,8 +214,9 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "La teva IP no està autoritzada a crear notes.", "Trying to shorten a URL that isn't pointing at our instance.": "S'està intentant escurçar un URL que no apunta a la nostra instància.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error en la crida a YOURLS. Probablement és un problema de configuració, com ara \"apiurl\" o \"signature\" incorrectes o que falten.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Error en la crida a YOURLS. Probablement és un problema de configuració, com ara \"apiurl\" o \"signature\" incorrectes o que falten.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Aquest missatge secret sols es pot veure una vegada. Vols obrir-ho ara?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/co.json b/i18n/co.json index 113eef7f..7bb394b4 100644 --- a/i18n/co.json +++ b/i18n/co.json @@ -214,8 +214,9 @@ "Save document": "Arregistrà u ducumentu", "Your IP is not authorized to create documents.": "U vostru indirizzu IP ùn hè micca auturizatu à creà ducumenti.", "Trying to shorten a URL that isn't pointing at our instance.": "Pruvate d’ammuzzà un indirizzu web chì ùn punta micca versu a vostra instanza.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Sbagliu à a chjama di YOURLS. Seria forse una cunfigurazione gattiva, tale una « apiurl » o « signature » falsa o assente.", - "Error parsing proxy response.": "Sbagliu durante l’analisa di a risposta di YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Sbagliu à a chjama di YOURLS. Seria forse una cunfigurazione gattiva, tale una « apiurl » o « signature » falsa o assente.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Sbagliu durante l’analisa di a risposta di YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Stu messaghju secretu pò esse affissatu solu una volta. Vulete fighjallu subitu ?", "Yes, see it": "Iè, fighjallu", "Dark Mode": "Modu scuru", diff --git a/i18n/cs.json b/i18n/cs.json index 93d7ae5a..ddac66e2 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -214,8 +214,9 @@ "Save document": "Uložit příspěvek", "Your IP is not authorized to create documents.": "Vaše IP adresa nemá oprávnění k vytváření příspěvků.", "Trying to shorten a URL that isn't pointing at our instance.": "Pokus o zkrácení URL, které neodkazuje na naši instanci.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Chyba volání YOURLS. Pravděpodobně chyba konfigurace, např. nesprávné či chybějící „apiurl“ nebo „signature“.", - "Error parsing proxy response.": "Chyba čtení odpovědi YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Chyba volání YOURLS. Pravděpodobně chyba konfigurace, např. nesprávné či chybějící „apiurl“ nebo „signature“.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Chyba čtení odpovědi YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Tuto tajnou zprávu lze zobrazit pouze jednou. Chcete si ji prohlédnout teď?", "Yes, see it": "Ano, zobrazit", "Dark Mode": "Tmavý režim", diff --git a/i18n/de.json b/i18n/de.json index b02201c6..c4ed5739 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -214,8 +214,9 @@ "Save document": "Dokument speichern", "Your IP is not authorized to create documents.": "Deine IP ist nicht berechtigt, Texte zu erstellen.", "Trying to shorten a URL that isn't pointing at our instance.": "Versuch eine URL zu verkürzen, die nicht auf unsere Instanz zeigt.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Fehler beim Aufruf von YOURLS. Wahrscheinlich ein Konfigurationsproblem, wie eine falsche oder fehlende \"apiurl\" oder \"signature\".", - "Error parsing proxy response.": "Fehler beim Verarbeiten der YOURLS-Antwort.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Fehler beim Aufruf von YOURLS. Wahrscheinlich ein Konfigurationsproblem, wie eine falsche oder fehlende \"apiurl\" oder \"signature\".", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Fehler beim Verarbeiten der YOURLS-Antwort.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Texte des \"Einmal\"-Typs können nach dem Öffnen nur einmal angezeigt werden. Möchtest Du ihn jetzt einsehen?", "Yes, see it": "Ja, jetzt einsehen", "Dark Mode": "Nachtmodus", diff --git a/i18n/el.json b/i18n/el.json index 7b21d80b..0be86a5c 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -214,8 +214,9 @@ "Save document": "Αποθήκευση επικόλλησης", "Your IP is not authorized to create documents.": "Η IP σας δεν επιτρέπεται να δημιουργεί επικολλήσεις.", "Trying to shorten a URL that isn't pointing at our instance.": "Έγινε προσπάθεια συντόμευσης ενός URL που δε δείχνει προς τη δική μας υπηρεσία.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Σφάλμα κατά την κλήση YOURLS. Πιθανώς ένα ζήτημα διαμόρφωσης, όπως λάθος ή λείπει \"apiurl\" ή \"υπογραφή\".", - "Error parsing proxy response.": "Σφάλμα ανάλυσης της απόκρισης YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Σφάλμα κατά την κλήση YOURLS. Πιθανώς ένα ζήτημα διαμόρφωσης, όπως λάθος ή λείπει \"apiurl\" ή \"υπογραφή\".", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Σφάλμα ανάλυσης της απόκρισης YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Αυτό το μυστικό μήνυμα μπορεί να εμφανιστεί μόνο μία φορά. Θα θέλατε να το δείτε τώρα;", "Yes, see it": "Ναι, δείτε το", "Dark Mode": "Σκοτεινό Θέμα", diff --git a/i18n/en.json b/i18n/en.json index f7ec0b33..c0d21fca 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -214,8 +214,9 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/es.json b/i18n/es.json index d7c8c913..a792b5ab 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -214,8 +214,9 @@ "Save document": "Guardar documento", "Your IP is not authorized to create documents.": "Tu IP no está autorizada para crear contenido.", "Trying to shorten a URL that isn't pointing at our instance.": "Intentando acortar una URL que no apunta a nuestra instancia.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error llamando a YOURLS. Probablemente un problema de configuración, como error o falta \"apiurl\" o \"signature\".", - "Error parsing proxy response.": "Error al analizar la respuesta de YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Error llamando a YOURLS. Probablemente un problema de configuración, como error o falta \"apiurl\" o \"signature\".", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Error al analizar la respuesta de YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Este mensaje secreto sólo se puede mostrar una vez. ¿Quieres verlo ahora?", "Yes, see it": "Sí, verlo", "Dark Mode": "Modo nocturno", diff --git a/i18n/et.json b/i18n/et.json index f9106000..dfa643e3 100644 --- a/i18n/et.json +++ b/i18n/et.json @@ -214,8 +214,9 @@ "Save document": "Salvesta kleebe", "Your IP is not authorized to create documents.": "Su IP-l ei ole lubatud kleepeid luua.", "Trying to shorten a URL that isn't pointing at our instance.": "Püüame lühendada URL-i, mis ei viita meie instantsile.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Viga YOURLS-i kutsumisel. Tõenäoliselt konfiguratsiooniprobleem, näiteks vale või puuduv \"apiurl\" või \"signature\".", - "Error parsing proxy response.": "Viga YOURLS vastuse parsimisel.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Viga YOURLS-i kutsumisel. Tõenäoliselt konfiguratsiooniprobleem, näiteks vale või puuduv \"apiurl\" või \"signature\".", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Viga YOURLS vastuse parsimisel.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Seda turvalist sõnumit saab kuvada vaid ühe korra. \nKas soovid seda näha nüüd?", "Yes, see it": "Jah, vaata seda", "Dark Mode": "Tume režiim", diff --git a/i18n/fi.json b/i18n/fi.json index 74106775..185db758 100644 --- a/i18n/fi.json +++ b/i18n/fi.json @@ -214,8 +214,9 @@ "Save document": "Tallenna asiakirja", "Your IP is not authorized to create documents.": "IP:llesi ei ole annettu oikeutta luoda pasteja.", "Trying to shorten a URL that isn't pointing at our instance.": "Yritetään lyhentää URL-osoite, joka ei osoita meidän instanssiiin.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Virhe kutsuttaessa YOURLS. Luultavasti asetusongelma kuten väärä tai puuttuuva \"apiurl\" tai \"signature\".", - "Error parsing proxy response.": "Virhe jäsennettäessä YOURLS-vastausta.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Virhe kutsuttaessa YOURLS. Luultavasti asetusongelma kuten väärä tai puuttuuva \"apiurl\" tai \"signature\".", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Virhe jäsennettäessä YOURLS-vastausta.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Tämä salainen viesti voidaan näyttää vain kerran. Haluatko nähdä sen nyt?", "Yes, see it": "Kyllä, näet sen", "Dark Mode": "Tumma tila", diff --git a/i18n/fr.json b/i18n/fr.json index ab63298d..17b93f7a 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -214,8 +214,9 @@ "Save document": "Sauver le document", "Your IP is not authorized to create documents.": "Votre adresse IP n'est pas autorisée à créer des documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Tentative de raccourcir une URL qui ne pointe pas vers notre instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Erreur lors de l'appel de YOURLS. Peut-être un problème de configuration, comme \"apiurl\" ou \"signature\" manquant.", - "Error parsing proxy response.": "Erreur d'analyse de la réponse YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Erreur lors de l'appel de YOURLS. Peut-être un problème de configuration, comme \"apiurl\" ou \"signature\" manquant.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Erreur d'analyse de la réponse YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Les documents de type \"Effacer après la lecture\" ne peuvent être affichés qu'une seule fois. Voulez-vous le voir maintenant ?", "Yes, see it": "Oui, le voir", "Dark Mode": "Mode Sombre", diff --git a/i18n/he.json b/i18n/he.json index 19593758..31d2afd9 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -214,8 +214,9 @@ "Save document": "שמור הדבקה", "Your IP is not authorized to create documents.": "ה-IP שלך אינו מורשה ליצור הדבקות.", "Trying to shorten a URL that isn't pointing at our instance.": "מנסים לקצר כתובת URL שאינה מצביעה על המערכת שלנו.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "שגיאה בעת קריאה ל-YOURLS. כנראה מדובר בבעיה בהגדרות, כמו \"apiurl\" או \"signature\" שגויים או חסרים.", - "Error parsing proxy response.": "שגיאה בניתוח התגובה מ-YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "שגיאה בעת קריאה ל-YOURLS. כנראה מדובר בבעיה בהגדרות, כמו \"apiurl\" או \"signature\" שגויים או חסרים.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "שגיאה בניתוח התגובה מ-YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "ההודעה הסודית הזו יכולה להוצג רק פעם אחת. האם תרצה לראות אותה עכשיו?", "Yes, see it": "כן, ראה אותה", "Dark Mode": "מצב כהה", diff --git a/i18n/hi.json b/i18n/hi.json index f7ec0b33..c0d21fca 100644 --- a/i18n/hi.json +++ b/i18n/hi.json @@ -214,8 +214,9 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/hu.json b/i18n/hu.json index abe29d4c..b451a789 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -214,8 +214,9 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Sötét mód", diff --git a/i18n/id.json b/i18n/id.json index c2fffe1e..89212292 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -214,8 +214,9 @@ "Save document": "Simpan document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Mode Gelap", diff --git a/i18n/it.json b/i18n/it.json index 3def7997..1d91186c 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -214,8 +214,9 @@ "Save document": "Salva il messagio", "Your IP is not authorized to create documents.": "Il tuo IP non è autorizzato a creare dei messaggi.", "Trying to shorten a URL that isn't pointing at our instance.": "Tantativo in corso di accorciare un URL che non punta alla nostra istanza.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Errore nella chiamata a YOURLS. Probabilmente un problema di configurazione, come un \"apiurl\" o una \"signature\" sbagliati o mancanti.", - "Error parsing proxy response.": "Errore nell'analizzare la risposta YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Errore nella chiamata a YOURLS. Probabilmente un problema di configurazione, come un \"apiurl\" o una \"signature\" sbagliati o mancanti.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Errore nell'analizzare la risposta YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Questo messaggio di tipo Distruggi-dopo-lettura può essere visualizzato solo una volta. Vuoi vederlo ora?", "Yes, see it": "Sì, visualizzalo", "Dark Mode": "Tema Scuro", diff --git a/i18n/ja.json b/i18n/ja.json index 7a7a400f..54650f04 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -214,8 +214,9 @@ "Save document": "ペーストを保存", "Your IP is not authorized to create documents.": "あなたのIPアドレスにはペーストを作成する権限がありません。", "Trying to shorten a URL that isn't pointing at our instance.": "このインスタンスを指していないURLを短縮しようとしています。", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "YOURLSの呼び出し中にエラーが発生しました。\"apiurl\"または\"signature\"等の設定に問題がある可能性があります。", - "Error parsing proxy response.": "YOURLSレスポンスの解析中にエラーが発生しました。", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "YOURLSの呼び出し中にエラーが発生しました。\"apiurl\"または\"signature\"等の設定に問題がある可能性があります。", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "YOURLSレスポンスの解析中にエラーが発生しました。", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "はい、使用します", "Dark Mode": "ダークモード", diff --git a/i18n/jbo.json b/i18n/jbo.json index 0e92c927..90160ecf 100644 --- a/i18n/jbo.json +++ b/i18n/jbo.json @@ -214,8 +214,9 @@ "Save document": "rejgau fukpi", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/ko.json b/i18n/ko.json index f7ec0b33..c0d21fca 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -214,8 +214,9 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/ku.json b/i18n/ku.json index 17952b39..e72469d0 100644 --- a/i18n/ku.json +++ b/i18n/ku.json @@ -214,8 +214,9 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "جۆری ڕەش", diff --git a/i18n/la.json b/i18n/la.json index d4dd9d27..081d551f 100644 --- a/i18n/la.json +++ b/i18n/la.json @@ -214,8 +214,9 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Dark Mode", diff --git a/i18n/lt.json b/i18n/lt.json index c51f67b0..02253d08 100644 --- a/i18n/lt.json +++ b/i18n/lt.json @@ -214,8 +214,9 @@ "Save document": "Įrašyti įdėjimą", "Your IP is not authorized to create documents.": "Jūsų IP adresas neturi įgaliojimų kurti įdėjimų.", "Trying to shorten a URL that isn't pointing at our instance.": "Bandoma sutrumpinti URL adresą, kuris nenurodo į mūsų egzempliorių.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Klaida iškviečiant YOURLS. Tikriausiai, konfigūracijos klaida, pavyzdžiui, neteisingi „apiurl“ ar „signature“, arba jų nėra.", - "Error parsing proxy response.": "Klaida nagrinėjant YOURLS atsaką.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Klaida iškviečiant YOURLS. Tikriausiai, konfigūracijos klaida, pavyzdžiui, neteisingi „apiurl“ ar „signature“, arba jų nėra.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Klaida nagrinėjant YOURLS atsaką.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Ši slapta žinutė gali būti parodyta tik vieną kartą. Ar norėtumėte ją dabar pamatyti?", "Yes, see it": "Taip, pamatyti", "Dark Mode": "Tamsi veiksena", diff --git a/i18n/nl.json b/i18n/nl.json index 7b177349..220ff9db 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -214,8 +214,9 @@ "Save document": "Document opslaan", "Your IP is not authorized to create documents.": "Je IP-adres is niet gemachtigd om documenten te maken.", "Trying to shorten a URL that isn't pointing at our instance.": "Proberen om een URL te verkorten dat niet naar ons systeem wijst.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Foutmelding ophalen YOURLS. Waarschijnlijk een configuratiefout, zoals een verkeerde of missende \"apiurl\" of \"signature\".", - "Error parsing proxy response.": "Foutmelding bij parsen van YOURLS respons.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Foutmelding ophalen YOURLS. Waarschijnlijk een configuratiefout, zoals een verkeerde of missende \"apiurl\" of \"signature\".", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Foutmelding bij parsen van YOURLS respons.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Dit geheime bericht kan maar één keer worden weergegeven. Wil je het nu zien?", "Yes, see it": "Ja, tonen", "Dark Mode": "Donkere modus", diff --git a/i18n/no.json b/i18n/no.json index f60ddc46..538364ec 100644 --- a/i18n/no.json +++ b/i18n/no.json @@ -214,8 +214,9 @@ "Save document": "Lagre utklipp", "Your IP is not authorized to create documents.": "Din IP er ikke autorisert til å opprette dokumenter.", "Trying to shorten a URL that isn't pointing at our instance.": "Prøver å forkorte en URL som ikke peker i vår instans.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Feil ved å besøke YOURLS. Sannsynligvis et konfigurasjonsproblem, eksempelvis feil eller mangler, med \"apiurl\" eller \"signatur\".", - "Error parsing proxy response.": "Feil ved analyse av YOURLS svar.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Feil ved å besøke YOURLS. Sannsynligvis et konfigurasjonsproblem, eksempelvis feil eller mangler, med \"apiurl\" eller \"signatur\".", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Feil ved analyse av YOURLS svar.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Denne hemmelige meldingen kan bare vises én gang. Vil du se den nå?", "Yes, see it": "Ja, se det", "Dark Mode": "Mørk modus", diff --git a/i18n/oc.json b/i18n/oc.json index 307a4034..5ba5af14 100644 --- a/i18n/oc.json +++ b/i18n/oc.json @@ -214,8 +214,9 @@ "Save document": "Enregistrar lo tèxt", "Your IP is not authorized to create documents.": "Vòstra adreça IP a pas l’autorizacion de crear de tèxtes.", "Trying to shorten a URL that isn't pointing at our instance.": "Ensag d’abracar una URL que mena pas a nòstra instància.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error en cridant YOURLS. Es probablament un problèma de configuracion, quicòm coma « apirul » o « signature » marrit o absent.", - "Error parsing proxy response.": "Error d'analisi de la responsa YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Error en cridant YOURLS. Es probablament un problèma de configuracion, quicòm coma « apirul » o « signature » marrit o absent.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Error d'analisi de la responsa YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Aqueste messatge secrèt se pòt pas qu'afichar un còp. Lo volètz veire ara ?", "Yes, see it": "Òc, afichatz-lo", "Dark Mode": "Mòde escur", diff --git a/i18n/pl.json b/i18n/pl.json index d9b91fc6..68fcf2c6 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -214,8 +214,9 @@ "Save document": "Zapisz dokument", "Your IP is not authorized to create documents.": "Twój adres IP nie jest autoryzowany do tworzenia dokumentów.", "Trying to shorten a URL that isn't pointing at our instance.": "Próba skrócenia adresu URL wskazującego na inną instancję.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Błąd wywoływania YOURLS. Możliwy błąd konfiguracji, taki jak błędne lub brakujące \"apiurl\" lub \"signature\".", - "Error parsing proxy response.": "Błąd przetwarzania odpowiedzi YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Błąd wywoływania YOURLS. Możliwy błąd konfiguracji, taki jak błędne lub brakujące \"apiurl\" lub \"signature\".", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Błąd przetwarzania odpowiedzi YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Tę tajną wiadomość możesz zobaczyć tylko jeden raz. Czy chcesz to zrobić teraz?", "Yes, see it": "Tak, pokaż", "Dark Mode": "Ciemny motyw", diff --git a/i18n/pt.json b/i18n/pt.json index 7c7f676c..91d8ea4b 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -214,8 +214,9 @@ "Save document": "Salvar cópia", "Your IP is not authorized to create documents.": "Seu IP não está autorizado a criar cópias.", "Trying to shorten a URL that isn't pointing at our instance.": "Tentando encurtar uma URL que não aponta para a nossa instância.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Erro ao chamar YOURLS. Provavelmente um problema de configuração, como errado ou faltando \"apiurl\" ou \"signature\".", - "Error parsing proxy response.": "Erro ao analisar a resposta do YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Erro ao chamar YOURLS. Provavelmente um problema de configuração, como errado ou faltando \"apiurl\" ou \"signature\".", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Erro ao analisar a resposta do YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Esta mensagem secreta só pode ser exibida uma vez. Gostaria de vê-la agora?", "Yes, see it": "Sim, veja", "Dark Mode": "Modo Noturno", diff --git a/i18n/ro.json b/i18n/ro.json index c070c154..aaf35e0d 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -214,8 +214,9 @@ "Save document": "Salvați document-ul", "Your IP is not authorized to create documents.": "Adresa dvs. IP nu este autorizată să creeze document-uri.", "Trying to shorten a URL that isn't pointing at our instance.": "Încercarea de a scurta un URL care nu direcționează spre instanța noastră.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Eroare la apelarea YOURLS. Probabil o problemă de configurare, cum ar fi \"apiurl\" sau \"signature\" greșite sau lipsă.", - "Error parsing proxy response.": "Eroare la analizarea răspunsului YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Eroare la apelarea YOURLS. Probabil o problemă de configurare, cum ar fi \"apiurl\" sau \"signature\" greșite sau lipsă.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Eroare la analizarea răspunsului YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Acest mesaj secret poate fi afișat o singură dată. Doriți să îl vedeți acum?", "Yes, see it": "Da, vezi", "Dark Mode": "Mod întunecat", diff --git a/i18n/ru.json b/i18n/ru.json index 063f62e8..ee4c4013 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -214,8 +214,9 @@ "Save document": "Сохранить запись", "Your IP is not authorized to create documents.": "Вашему IP адресу не разрешено создавать записи.", "Trying to shorten a URL that isn't pointing at our instance.": "Попытка сократить URL, который указывает не на наш сервер.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Ошибка обращения к YOURLS. Возможно в конфигурации допущена ошибка, например неверный или отсутствующий параметр \"apiurl\" или \"signature\".", - "Error parsing proxy response.": "Ошибка разбора ответа от YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Ошибка обращения к YOURLS. Возможно в конфигурации допущена ошибка, например неверный или отсутствующий параметр \"apiurl\" или \"signature\".", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Ошибка разбора ответа от YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Записи, удаляемые после прочтения, могут быть отображены после загрузки только один раз. Вы хотите открыть её сейчас?", "Yes, see it": "Да, загрузить", "Dark Mode": "Тёмная", diff --git a/i18n/sk.json b/i18n/sk.json index 4db81610..95dae475 100644 --- a/i18n/sk.json +++ b/i18n/sk.json @@ -214,8 +214,9 @@ "Save document": "Uložiť príspevok", "Your IP is not authorized to create documents.": "Vaša IP adresa nie je oprávnená vytvárať príspevky.", "Trying to shorten a URL that isn't pointing at our instance.": "Pokúšate sa skrátiť adresu URL, ktorá neukazuje na túto inštanciu.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Áno, zobraziť", "Dark Mode": "Tmavý Režim", diff --git a/i18n/sl.json b/i18n/sl.json index 5dca4097..8098381b 100644 --- a/i18n/sl.json +++ b/i18n/sl.json @@ -214,8 +214,9 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Temni način", diff --git a/i18n/sv.json b/i18n/sv.json index de8816dd..8e9ac275 100644 --- a/i18n/sv.json +++ b/i18n/sv.json @@ -214,8 +214,9 @@ "Save document": "Save document", "Your IP is not authorized to create documents.": "Your IP is not authorized to create documents.", "Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.", - "Error parsing proxy response.": "Error parsing proxy response.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "This secret message can only be displayed once. Would you like to see it now?", "Yes, see it": "Yes, see it", "Dark Mode": "Mörkt Läge", diff --git a/i18n/th.json b/i18n/th.json index 58bbf3f5..d7d2a133 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -214,8 +214,9 @@ "Save document": "ดาวน์โหลดข้อมูลการฝากโค้ด", "Your IP is not authorized to create documents.": "IP ของคุณไม่ได้รับอนุญาตให้สร้างการฝากโค้ด", "Trying to shorten a URL that isn't pointing at our instance.": "กำลังพยายามใช้เครื่องมือสร้างลิงก์ย่อ ที่ไม่ได้ชี้ไปที่อินสแตนซ์ของเรา", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "เกิดข้อผิดพลาดในการเรียก YOURLS อาจเป็นปัญหามาจากการกำหนดค่า เช่น \"apiurl\" หรือ \"signature\" ไม่ถูกต้องหรือขาดหายไป", - "Error parsing proxy response.": "เกิดข้อผิดพลาดในการแยกวิเคราะห์การตอบสนองของ YOURLS", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "เกิดข้อผิดพลาดในการเรียก YOURLS อาจเป็นปัญหามาจากการกำหนดค่า เช่น \"apiurl\" หรือ \"signature\" ไม่ถูกต้องหรือขาดหายไป", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "เกิดข้อผิดพลาดในการแยกวิเคราะห์การตอบสนองของ YOURLS", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "ข้อความลับนี้จะแสดงได้เพียงครั้งเดียวเท่านั้น คุณต้องการดูข้อความนี้ตอนนี้เลยใช่หรือไม่", "Yes, see it": "ใช่ ดูเลย", "Dark Mode": "โหมดสีเข้ม", diff --git a/i18n/tr.json b/i18n/tr.json index 964479f6..c5f6ab21 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -214,8 +214,9 @@ "Save document": "Yazıyı kaydet", "Your IP is not authorized to create documents.": "IP adresinizin yazı oluşturmaya yetkisi yoktur.", "Trying to shorten a URL that isn't pointing at our instance.": "URL'yi kısaltmaya çalışırken, bizim sunucumuza işaret etmeyen bir URL kullanıyorsunuz.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "YOURLS çağrısı başarısız oldu. Muhtemelen \"apiurl\" veya \"signature\" gibi yanlış veya eksik yapılandırma hatası.", - "Error parsing proxy response.": "YOURLS yanıtı ayrıştırılamadı.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "YOURLS çağrısı başarısız oldu. Muhtemelen \"apiurl\" veya \"signature\" gibi yanlış veya eksik yapılandırma hatası.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "YOURLS yanıtı ayrıştırılamadı.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Bu gizli mesaj yalnızca bir kez görüntülenebilir. Şimdi görmek ister misiniz?", "Yes, see it": "Evet, gör", "Dark Mode": "Koyu Mod", diff --git a/i18n/uk.json b/i18n/uk.json index 6942d8cc..efdbc89e 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -214,8 +214,9 @@ "Save document": "Зберегти вставку", "Your IP is not authorized to create documents.": "Вашому IP не дозволено створювати вставки.", "Trying to shorten a URL that isn't pointing at our instance.": "Спроба скоротити URL, який не вказує на наш екземпляр.", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "Помилка виклику YOURLS. Ймовірно проблема з налаштуванням, наприклад \"apiurl\" чи \"signature\".", - "Error parsing proxy response.": "Помилка розбору відповіді YOURLS.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Помилка виклику YOURLS. Ймовірно проблема з налаштуванням, наприклад \"apiurl\" чи \"signature\".", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Помилка розбору відповіді YOURLS.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "Це таємне повідомлення можна надіслати лише один раз. Хочете переглянути його зараз?", "Yes, see it": "Так, побачити", "Dark Mode": "Темний режим", diff --git a/i18n/zh.json b/i18n/zh.json index 10074be2..9dd50d61 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -214,8 +214,9 @@ "Save document": "保存内容", "Your IP is not authorized to create documents.": "您的 IP 无权创建粘贴。", "Trying to shorten a URL that isn't pointing at our instance.": "尝试缩短一个不指向我们实例的URL。", - "Error calling proxy. Probably a configuration issue, like wrong or missing config keys.": "调用 YOURLS 时出错。可能是配置问题,例如“apiurl”或“signature”错误或缺失。", - "Error parsing proxy response.": "解析 YOURLS 响应时出错。", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "调用 YOURLS 时出错。可能是配置问题,例如“apiurl”或“signature”错误或缺失。", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "解析 YOURLS 响应时出错。", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", "This secret message can only be displayed once. Would you like to see it now?": "读取粘贴后只能在加载时显示一次。您想现在打开吗?", "Yes, see it": "是的,加载它", "Dark Mode": "夜间模式", diff --git a/lib/Proxy/AbstractProxy.php b/lib/Proxy/AbstractProxy.php index 6c024e4c..77e918ff 100644 --- a/lib/Proxy/AbstractProxy.php +++ b/lib/Proxy/AbstractProxy.php @@ -57,8 +57,8 @@ abstract class AbstractProxy $proxyUrl = $this->_getProxyUrl($conf); if (empty($proxyUrl)) { - $this->_error = 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'; - error_log($this->_error); + $this->_error = 'Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.'; + $this->logErrorWithClassName($this->_error); return; } @@ -76,29 +76,34 @@ abstract class AbstractProxy if (!empty($http_response_header) && preg_match('/HTTP\/\d+\.\d+\s+(\d+)/', $http_response_header[0], $matches)) { $statusCode = $matches[1]; } - $this->_error = 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'; - error_log($this->_error . ' Status code: ' . $statusCode); + $this->_error = 'Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.'; + $this->logErrorWithClassName($this->_error . ' Status code: ' . $statusCode); return; } try { $jsonData = Json::decode($data); } catch (Exception $e) { - $this->_error = 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'; - error_log('Error calling proxy: ' . $e->getMessage()); + $this->_error = 'Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.'; + $this->logErrorWithClassName('Error calling proxy: ' . $e->getMessage()); return; } $url = $this->_extractShortUrl($jsonData); if ($url === null || empty($url)) { - $this->_error = 'Error parsing proxy response.'; - error_log('Error calling proxy: ' . $data); + $this->_error = 'Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.'; + $this->logErrorWithClassName('Error calling proxy: ' . $data); } else { $this->_url = $url; } } + private function logErrorWithClassName(string $error) + { + error_log('[' . get_class($this) . '] ' . $error); + } + /** * Returns the (untranslated) error message * @@ -133,7 +138,7 @@ abstract class AbstractProxy } /** - * Abstract method to get the payload to send to the URL Shortener + * Abstract method to get the payload to send to the URL shortener * * @access protected * @param Configuration $conf diff --git a/tst/JsonApiTest.php b/tst/JsonApiTest.php index c3236b05..90545c93 100644 --- a/tst/JsonApiTest.php +++ b/tst/JsonApiTest.php @@ -364,7 +364,35 @@ class JsonApiTest extends TestCase @new Controller; $content = ob_get_contents(); ob_end_clean(); - $this->assertStringContainsString('Error calling proxy.', $content, 'outputs error correctly'); + $this->assertStringContainsString('Proxy error: Bad response.', $content, 'outputs error correctly'); + } + + /** + * @runInSeparateProcess + * @dataProvider baseShlinkUriProvider + */ + public function testShortenViaShlinkSuccessButMissingShortUrl($baseUri) + { + $mock_shlink_service = $this->_path . DIRECTORY_SEPARATOR . 'shlink.json'; + $options = parse_ini_file(CONF, true); + $options['main']['basepath'] = 'https://example.com/path'; // missing slash gets added by Configuration constructor + $options['main']['urlshortener'] = 'https://example.com' . $baseUri . 'link='; + $options['shlink']['apiurl'] = $mock_shlink_service; + Helper::createIniFile(CONF, $options); + + // Ideally, this should never happen, just in case "shortUrl" is somehow missing in the 200 response + file_put_contents($mock_shlink_service, '{}'); + + $_SERVER['REQUEST_URI'] = $baseUri . 'link=https%3A%2F%2Fexample.com%2Fpath%2F%3Ffoo%23bar'; + $_GET['link'] = 'https://example.com/path/?foo#bar'; + if (str_contains($baseUri, '?shortenviashlink')) { + $_GET['shortenviashlink'] = null; + } + ob_start(); + new Controller; + $content = ob_get_contents(); + ob_end_clean(); + $this->assertStringContainsString('Proxy error: Error parsing proxy response.', $content, 'outputs error correctly'); } public function baseUriProvider() @@ -399,7 +427,7 @@ class JsonApiTest extends TestCase new Controller; $content = ob_get_contents(); ob_end_clean(); - $this->assertStringContainsString('Error calling proxy.', $content, 'outputs error correctly'); + $this->assertStringContainsString('Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.', $content, 'outputs error correctly'); } /** @@ -416,6 +444,6 @@ class JsonApiTest extends TestCase new Controller; $content = ob_get_contents(); ob_end_clean(); - $this->assertStringContainsString('Error calling proxy.', $content, 'outputs error correctly'); + $this->assertStringContainsString('Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.', $content, 'outputs error correctly'); } } diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 01fb1821..9ceeea35 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -68,7 +68,7 @@ class YourlsProxyTest extends TestCase $yourls = new YourlsProxy($this->_conf, 'https://example.com/?foo#bar'); $this->assertTrue($yourls->isError()); - $this->assertEquals($yourls->getError(), 'Error parsing proxy response.'); + $this->assertEquals($yourls->getError(), 'Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.'); } public function testServerError() @@ -78,6 +78,6 @@ class YourlsProxyTest extends TestCase $yourls = new YourlsProxy($this->_conf, 'https://example.com/?foo#bar'); $this->assertTrue($yourls->isError()); - $this->assertEquals($yourls->getError(), 'Error calling proxy. Probably a configuration issue, like wrong or missing config keys.'); + $this->assertEquals($yourls->getError(), 'Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.'); } } From 53cf3063b902ad8407c98cc1609384c6d121a4ab Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Thu, 21 Aug 2025 15:18:24 +0200 Subject: [PATCH 068/273] New translations en.json (Czech) --- i18n/cs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/cs.json b/i18n/cs.json index 94c3ce8c..57d2d6c3 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -227,6 +227,6 @@ "Copy link": "Copy link", "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", - "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulátor funguje jako znak (pro přepnutí stiskněte Ctrl+m nebo Esc)", "Theme": "Theme" } From 374f937418fd49758b8d2430a20c02618c8f6155 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Thu, 21 Aug 2025 16:56:25 +0200 Subject: [PATCH 069/273] New translations en.json (Czech) --- i18n/cs.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/i18n/cs.json b/i18n/cs.json index 57d2d6c3..fc03e97d 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -210,7 +210,7 @@ "Encrypted note on %s": "Šifrovaná poznámka ve službě %s", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Pro zobrazení poznámky navštivte tento odkaz. Přeposláním URL umožníte přístup také jiným lidem.", "URL shortener may expose your decrypt key in URL.": "Zkracovač URL může prozradit váš dešifrovací klíč v URL.", - "URL shortener is enabled by default.": "URL shortener is enabled by default.", + "URL shortener is enabled by default.": "Ve výchozím nastavení je zkracovač URL povolen.", "Save document": "Uložit příspěvek", "Your IP is not authorized to create documents.": "Vaše IP adresa nemá oprávnění k vytváření příspěvků.", "Trying to shorten a URL that isn't pointing at our instance.": "Pokus o zkrácení URL, které neodkazuje na naši instanci.", @@ -221,12 +221,12 @@ "Dark Mode": "Tmavý režim", "Error compressing document, due to missing WebAssembly support.": "Chyba při komprimování příspěvku kvůli chybějící podpoře WebAssembly.", "Error decompressing document, your browser does not support WebAssembly. Please use another browser to view this document.": "Chyba při dekomprimování příspěvku, váš prohlížeč nepodporuje WebAssembly. Pro zobrazení tohoto příspěvku prosím použijte jiný prohlížeč.", - "Start over": "Start over", - "Document copied to clipboard": "Document copied to clipboard", - "To copy document press on the copy button or use the clipboard shortcut Ctrl+c/Cmd+c": "To copy document press on the copy button or use the clipboard shortcut Ctrl+c/Cmd+c", - "Copy link": "Copy link", - "Link copied to clipboard": "Link copied to clipboard", - "Document text": "Document text", + "Start over": "Začít znovu", + "Document copied to clipboard": "Dokument zkopírován do schránky", + "To copy document press on the copy button or use the clipboard shortcut Ctrl+c/Cmd+c": "Pro zkopírování dokumentu klikněte na tlačítko nebo použijte klávesovou zkratku schránky Ctrl+c/Cmd+c", + "Copy link": "Zkopírovat odkaz", + "Link copied to clipboard": "Odkaz zkopírován do schránky", + "Document text": "Text dokumentu", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulátor funguje jako znak (pro přepnutí stiskněte Ctrl+m nebo Esc)", - "Theme": "Theme" + "Theme": "Vzhled" } From 5cc963be1b1a9799c0f51760a24ec867d17e7d3a Mon Sep 17 00:00:00 2001 From: El RIDO Date: Sat, 30 Aug 2025 09:22:44 +0200 Subject: [PATCH 070/273] deduplicate proxy view operations --- lib/Controller.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/Controller.php b/lib/Controller.php index 3d608861..52557222 100644 --- a/lib/Controller.php +++ b/lib/Controller.php @@ -455,12 +455,7 @@ class Controller $page->assign('CSPHEADER', $metacspheader); $page->assign('ERROR', I18n::_($this->_error)); $page->assign('NAME', $this->_conf->getKey('name')); - if ($this->_request->getOperation() === 'yourlsproxy') { - $page->assign('SHORTURL', $this->_status); - $page->draw('shortenerproxy'); - return; - } - if ($this->_request->getOperation() === 'shlinkproxy') { + if (in_array($this->_request->getOperation(), array('shlinkproxy', 'yourlsproxy'), true)) { $page->assign('SHORTURL', $this->_status); $page->draw('shortenerproxy'); return; From e31027d71e5ad94f23349cdce475e7eb5ee51592 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Sat, 30 Aug 2025 17:54:07 +0200 Subject: [PATCH 071/273] New translations en.json (Corsican) --- i18n/co.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/co.json b/i18n/co.json index 03aae8f4..b029068e 100644 --- a/i18n/co.json +++ b/i18n/co.json @@ -214,9 +214,9 @@ "Save document": "Arregistrà u ducumentu", "Your IP is not authorized to create documents.": "U vostru indirizzu IP ùn hè micca auturizatu à creà ducumenti.", "Trying to shorten a URL that isn't pointing at our instance.": "Pruvate d’ammuzzà un indirizzu web chì ùn punta micca versu a vostra instanza.", - "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Sbagliu à a chjama di YOURLS. Seria forse una cunfigurazione gattiva, tale una « apiurl » o « signature » falsa o assente.", - "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Sbagliu durante l’analisa di a risposta di YOURLS.", - "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", + "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "Sbagliu di u proxy : L’indirizzu web di u proxy hè viotu. Forse per via d’un prublema di chjavi di cunfigurazione false o assente.", + "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "Sbagliu di u proxy : Sbagliu durante l’analisa di u proxy. Forse per via d’un prublema di chjavi di cunfigurazione false o assente.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Sbagliu di u proxy : Risposta gattiva. Forse per via d’un prublema di chjavi di cunfigurazione false o assente, osinnò un’interruzzione timpuraria.", "This secret message can only be displayed once. Would you like to see it now?": "Stu messaghju secretu pò esse affissatu solu una volta. Vulete fighjallu subitu ?", "Yes, see it": "Iè, fighjallu", "Dark Mode": "Modu scuru", From 2c1a17a07f9a6452c8926eb84e4ac07c8100b015 Mon Sep 17 00:00:00 2001 From: rugk Date: Tue, 2 Sep 2025 22:40:22 +0200 Subject: [PATCH 072/273] Strengthen validation of URL in proxy services MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This should definitively rule out any circumstances, where invalid URLs could cause problems. Both URL validity is checked before it is forwarded to the URL shortener proxy _and_ the host part is explicitly compared to make sure the domain is really the same one. TOOD: * [ ] some tests may be needed here (hmpff…) --- lib/Proxy/AbstractProxy.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/Proxy/AbstractProxy.php b/lib/Proxy/AbstractProxy.php index 77e918ff..bcf0a188 100644 --- a/lib/Proxy/AbstractProxy.php +++ b/lib/Proxy/AbstractProxy.php @@ -49,7 +49,14 @@ abstract class AbstractProxy */ public function __construct(Configuration $conf, string $link) { - if (!str_starts_with($link, $conf->getKey('basepath') . '?')) { + if (!filter_var($link, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED & FILTER_FLAG_QUERY_REQUIRED)) { + $this->_error = 'Invalid URL given.'; + return; + } + + if (!str_starts_with($link, $conf->getKey('basepath') . '?') || + parse_url($link, PHP_URL_HOST) != parse_url($conf->getKey('basepath'), PHP_URL_HOST) + ) { $this->_error = 'Trying to shorten a URL that isn\'t pointing at our instance.'; return; } From bdfe74c077c408ece941c9cd92e8d2415c4594be Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 12:37:55 +0000 Subject: [PATCH 073/273] chore: fix Codespace COmposer/PHPUnit PATH --- .devcontainer/postCreateCommand.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/postCreateCommand.sh index d8f50136..e5d4c14e 100755 --- a/.devcontainer/postCreateCommand.sh +++ b/.devcontainer/postCreateCommand.sh @@ -1,6 +1,9 @@ #!/bin/sh export PATH="$PATH:$HOME/.composer/vendor/bin" +export PATH="$PATH:$PWD/vendor/bin" +echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' >> ~/.bashrc +echo 'export PATH="$PATH:$PWD/vendor/bin"' >> ~/.bashrc ln -s ./conf.sample.php cfg/conf.php composer install --no-dev --optimize-autoloader From 64165d992890c9d97f763c7e0961a4e9b420e96b Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 12:38:13 +0000 Subject: [PATCH 074/273] chore: always ignore composer PHP bin dir --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 07ce26ed..09ca72e8 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ vendor/**/tst vendor/**/tests vendor/**/build_phar.php !vendor/**/*.php +vendor/bin/** # Ignore local node modules, unit testing logs, api docs and IDE project files js/node_modules/ From fae7e233f34a4420498ac8ba0f2ed74454fa4891 Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 12:38:44 +0000 Subject: [PATCH 075/273] test: write some tests for testing proxy ensurance --- tst/YourlsProxyTest.php | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 9ceeea35..ecffda6e 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -47,6 +47,42 @@ class YourlsProxyTest extends TestCase $this->assertEquals($yourls->getUrl(), 'https://example.com/1'); } + /** + * @dataProvider providerInvalidUrl + */ + public function testImvalidUrl($uri) + { + $yourls = new YourlsProxy($this->_conf, $uri); + $this->assertTrue($yourls->isError()); + $this->assertEquals($yourls->getError(), 'Invalid URL given.'); + } + + public function providerInvalidUrl() { + return array( + array(''), + array(' '), + array('foo'), + array('https://'), + array('ftp://example.com/?n=np'), + array('https://example.com'), // missing path and query parameter, + array('https://example.com/'), // missing query parameter + array('https://example.com?paste=something'), // missing path parameter + ); + } + + /** + * This tests for a trick using username of an URI, see: + * {@see https://cloud.google.com/blog/topics/threat-intelligence/url-obfuscation-schema-abuse/?hl=en} + * + * @return void + */ + public function testForeignUrlUsingUsernameTrick() + { + $yourls = new YourlsProxy($this->_conf, 'https://example.com/@foreign.malicious.example?foo#bar'); + $this->assertTrue($yourls->isError()); + $this->assertEquals($yourls->getError(), 'Trying to shorten a URL that isn\'t pointing at our instance.'); + } + public function testForeignUrl() { $yourls = new YourlsProxy($this->_conf, 'https://other.example.com/?foo#bar'); From 0a398d73f0f1d5fbd1c7f593fd492aa1f6424797 Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 12:57:55 +0000 Subject: [PATCH 076/273] chore(codespace): install stuff for PHP unit testing --- .devcontainer/postCreateCommand.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/postCreateCommand.sh index e5d4c14e..309dc239 100755 --- a/.devcontainer/postCreateCommand.sh +++ b/.devcontainer/postCreateCommand.sh @@ -7,6 +7,10 @@ echo 'export PATH="$PATH:$PWD/vendor/bin"' >> ~/.bashrc ln -s ./conf.sample.php cfg/conf.php composer install --no-dev --optimize-autoloader +# for PHP unit testing +composer require google/cloud-storage +composer install --optimize-autoloader + sudo chmod a+x "$(pwd)" && sudo rm -rf /var/www/html && sudo ln -s "$(pwd)" /var/www/html npm install --global nyc From 879b696f220a2d562cbc7d695c7c821257fb697c Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 13:43:57 +0000 Subject: [PATCH 077/273] wipfix: correct contatenation of options --- lib/Proxy/AbstractProxy.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Proxy/AbstractProxy.php b/lib/Proxy/AbstractProxy.php index bcf0a188..ebf67fe7 100644 --- a/lib/Proxy/AbstractProxy.php +++ b/lib/Proxy/AbstractProxy.php @@ -49,11 +49,11 @@ abstract class AbstractProxy */ public function __construct(Configuration $conf, string $link) { - if (!filter_var($link, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED & FILTER_FLAG_QUERY_REQUIRED)) { + if (!filter_var($link, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED | FILTER_FLAG_QUERY_REQUIRED)) { $this->_error = 'Invalid URL given.'; return; } - + if (!str_starts_with($link, $conf->getKey('basepath') . '?') || parse_url($link, PHP_URL_HOST) != parse_url($conf->getKey('basepath'), PHP_URL_HOST) ) { From dbaa70ec11fd5cc0880a3a82d3fbb534715d6f0e Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 13:45:30 +0000 Subject: [PATCH 078/273] test: move ftp example to rejected because of foreign URL --- tst/YourlsProxyTest.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index ecffda6e..197b04c8 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -50,9 +50,9 @@ class YourlsProxyTest extends TestCase /** * @dataProvider providerInvalidUrl */ - public function testImvalidUrl($uri) + public function testImvalidUrl($url) { - $yourls = new YourlsProxy($this->_conf, $uri); + $yourls = new YourlsProxy($this->_conf, $url); $this->assertTrue($yourls->isError()); $this->assertEquals($yourls->getError(), 'Invalid URL given.'); } @@ -63,7 +63,6 @@ class YourlsProxyTest extends TestCase array(' '), array('foo'), array('https://'), - array('ftp://example.com/?n=np'), array('https://example.com'), // missing path and query parameter, array('https://example.com/'), // missing query parameter array('https://example.com?paste=something'), // missing path parameter @@ -82,13 +81,21 @@ class YourlsProxyTest extends TestCase $this->assertTrue($yourls->isError()); $this->assertEquals($yourls->getError(), 'Trying to shorten a URL that isn\'t pointing at our instance.'); } - - public function testForeignUrl() +/** + * @dataProvider providerForeignUrl + */ + public function testForeignUrl($url) { - $yourls = new YourlsProxy($this->_conf, 'https://other.example.com/?foo#bar'); + $yourls = new YourlsProxy($this->_conf, $url); $this->assertTrue($yourls->isError()); $this->assertEquals($yourls->getError(), 'Trying to shorten a URL that isn\'t pointing at our instance.'); } + public function providerForeignUrl() { + return array( + ['ftp://example.com/?n=np'], // wrong protocol + ['https://other.example.com/?foo#bar'] // wrong domain + ); + } public function testSneakyForeignUrl() { From f76704a88cc82a4b15f0690526d8c396f3f00944 Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 13:48:28 +0000 Subject: [PATCH 079/273] refactor: simplify tests --- tst/YourlsProxyTest.php | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 197b04c8..1b29c9d0 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -58,15 +58,15 @@ class YourlsProxyTest extends TestCase } public function providerInvalidUrl() { - return array( - array(''), - array(' '), - array('foo'), - array('https://'), - array('https://example.com'), // missing path and query parameter, - array('https://example.com/'), // missing query parameter - array('https://example.com?paste=something'), // missing path parameter - ); + return [ + [''], + [' '], + ['foo'], + ['https://'], + ['https://example.com'], // missing path and query parameter, + ['https://example.com/'], // missing query parameter + ['https://example.com?paste=something'] // missing path parameter + ]; } /** @@ -81,7 +81,8 @@ class YourlsProxyTest extends TestCase $this->assertTrue($yourls->isError()); $this->assertEquals($yourls->getError(), 'Trying to shorten a URL that isn\'t pointing at our instance.'); } -/** + + /** * @dataProvider providerForeignUrl */ public function testForeignUrl($url) @@ -90,18 +91,13 @@ class YourlsProxyTest extends TestCase $this->assertTrue($yourls->isError()); $this->assertEquals($yourls->getError(), 'Trying to shorten a URL that isn\'t pointing at our instance.'); } - public function providerForeignUrl() { - return array( - ['ftp://example.com/?n=np'], // wrong protocol - ['https://other.example.com/?foo#bar'] // wrong domain - ); - } - public function testSneakyForeignUrl() - { - $yourls = new YourlsProxy($this->_conf, 'https://other.example.com/?q=https://example.com/?foo#bar'); - $this->assertTrue($yourls->isError()); - $this->assertEquals($yourls->getError(), 'Trying to shorten a URL that isn\'t pointing at our instance.'); + public function providerForeignUrl() { + return [ + ['ftp://example.com/?n=np'], // wrong protocol + ['https://other.example.com/?foo#bar'], // wrong domain + ['https://other.example.com/?q=https://example.com/?foo#bar'] // domain included inside string + ]; } public function testYourlsError() From 4f13d93af2371eef7798cfe72a417cceec514d4b Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 13:53:51 +0000 Subject: [PATCH 080/273] style: use explicit types --- tst/YourlsProxyTest.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 1b29c9d0..3ed503b1 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -50,14 +50,14 @@ class YourlsProxyTest extends TestCase /** * @dataProvider providerInvalidUrl */ - public function testImvalidUrl($url) + public function testImvalidUrl($url): void { $yourls = new YourlsProxy($this->_conf, $url); $this->assertTrue($yourls->isError()); $this->assertEquals($yourls->getError(), 'Invalid URL given.'); } - public function providerInvalidUrl() { + public function providerInvalidUrl(): array { return [ [''], [' '], @@ -75,7 +75,7 @@ class YourlsProxyTest extends TestCase * * @return void */ - public function testForeignUrlUsingUsernameTrick() + public function testForeignUrlUsingUsernameTrick(): void { $yourls = new YourlsProxy($this->_conf, 'https://example.com/@foreign.malicious.example?foo#bar'); $this->assertTrue($yourls->isError()); @@ -85,14 +85,14 @@ class YourlsProxyTest extends TestCase /** * @dataProvider providerForeignUrl */ - public function testForeignUrl($url) + public function testForeignUrl($url): void { $yourls = new YourlsProxy($this->_conf, $url); $this->assertTrue($yourls->isError()); $this->assertEquals($yourls->getError(), 'Trying to shorten a URL that isn\'t pointing at our instance.'); } - public function providerForeignUrl() { + public function providerForeignUrl(): array { return [ ['ftp://example.com/?n=np'], // wrong protocol ['https://other.example.com/?foo#bar'], // wrong domain From 168fed64b9ee55f161214720c853c1781d67ace5 Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 14:11:35 +0000 Subject: [PATCH 081/273] chore: apply Scruintizer diff --- tst/YourlsProxyTest.php | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 3ed503b1..60c360eb 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -57,16 +57,17 @@ class YourlsProxyTest extends TestCase $this->assertEquals($yourls->getError(), 'Invalid URL given.'); } - public function providerInvalidUrl(): array { - return [ - [''], - [' '], - ['foo'], - ['https://'], - ['https://example.com'], // missing path and query parameter, - ['https://example.com/'], // missing query parameter - ['https://example.com?paste=something'] // missing path parameter - ]; + public function providerInvalidUrl(): array + { + return array( + array(''), + array(' '), + array('foo'), + array('https://'), + array('https://example.com'), // missing path and query parameter, + array('https://example.com/'), // missing query parameter + array('https://example.com?paste=something'), // missing path parameter + ); } /** @@ -92,12 +93,13 @@ class YourlsProxyTest extends TestCase $this->assertEquals($yourls->getError(), 'Trying to shorten a URL that isn\'t pointing at our instance.'); } - public function providerForeignUrl(): array { - return [ - ['ftp://example.com/?n=np'], // wrong protocol - ['https://other.example.com/?foo#bar'], // wrong domain - ['https://other.example.com/?q=https://example.com/?foo#bar'] // domain included inside string - ]; + public function providerForeignUrl(): array + { + return array( + array('ftp://example.com/?n=np'), // wrong protocol + array('https://other.example.com/?foo#bar'), // wrong domain + array('https://other.example.com/?q=https://example.com/?foo#bar'), // domain included inside string + ); } public function testYourlsError() From cfc687d62be257d5cae34ccd5d000319a8cfdf49 Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 14:12:12 +0000 Subject: [PATCH 082/273] style: fix indentation --- lib/Proxy/AbstractProxy.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Proxy/AbstractProxy.php b/lib/Proxy/AbstractProxy.php index ebf67fe7..e45f5377 100644 --- a/lib/Proxy/AbstractProxy.php +++ b/lib/Proxy/AbstractProxy.php @@ -56,7 +56,7 @@ abstract class AbstractProxy if (!str_starts_with($link, $conf->getKey('basepath') . '?') || parse_url($link, PHP_URL_HOST) != parse_url($conf->getKey('basepath'), PHP_URL_HOST) - ) { + ) { $this->_error = 'Trying to shorten a URL that isn\'t pointing at our instance.'; return; } From 25dca0838ec8b5f6bb756837340709aad1ab78f6 Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 14:14:08 +0000 Subject: [PATCH 083/273] style(codespaces): comment PHP unit testing setup for now --- .devcontainer/postCreateCommand.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/postCreateCommand.sh index 309dc239..a59fbfbf 100755 --- a/.devcontainer/postCreateCommand.sh +++ b/.devcontainer/postCreateCommand.sh @@ -8,8 +8,8 @@ ln -s ./conf.sample.php cfg/conf.php composer install --no-dev --optimize-autoloader # for PHP unit testing -composer require google/cloud-storage -composer install --optimize-autoloader +# composer require google/cloud-storage +# composer install --optimize-autoloader sudo chmod a+x "$(pwd)" && sudo rm -rf /var/www/html && sudo ln -s "$(pwd)" /var/www/html From e4f2383dd84d3290a1a2ad47ac2d16e73fec6d57 Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 14:20:03 +0000 Subject: [PATCH 084/273] test: more test cases for testForeignUrlUsingUsernameTrick --- tst/YourlsProxyTest.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 60c360eb..42bc17fd 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -74,15 +74,24 @@ class YourlsProxyTest extends TestCase * This tests for a trick using username of an URI, see: * {@see https://cloud.google.com/blog/topics/threat-intelligence/url-obfuscation-schema-abuse/?hl=en} * - * @return void + * @dataProvider providerForeignUrlUsernameTrick */ - public function testForeignUrlUsingUsernameTrick(): void + public function testForeignUrlUsingUsernameTrick($url): void { - $yourls = new YourlsProxy($this->_conf, 'https://example.com/@foreign.malicious.example?foo#bar'); + $yourls = new YourlsProxy($this->_conf, $url); $this->assertTrue($yourls->isError()); $this->assertEquals($yourls->getError(), 'Trying to shorten a URL that isn\'t pointing at our instance.'); } + public function providerForeignUrlUsernameTrick(): array + { + return array( + array('https://example.com@foreign.malicious.example?foo#bar'), + array('https://example.com/@foreign.malicious.example?foo#bar'), + array('https://example.com/?@foreign.malicious.example?foo#bar') + ); + } + /** * @dataProvider providerForeignUrl */ From 616635c66cab6fbc3a1c5bf7de0cec7d0099f8ec Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 14:21:00 +0000 Subject: [PATCH 085/273] style: scruintizer wants some trailing comma --- tst/YourlsProxyTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 42bc17fd..5b0c5f30 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -88,7 +88,7 @@ class YourlsProxyTest extends TestCase return array( array('https://example.com@foreign.malicious.example?foo#bar'), array('https://example.com/@foreign.malicious.example?foo#bar'), - array('https://example.com/?@foreign.malicious.example?foo#bar') + array('https://example.com/?@foreign.malicious.example?foo#bar'), ); } From a6034ace1bf051c2b927fc5245a051c0afe2c6a8 Mon Sep 17 00:00:00 2001 From: rugk Date: Wed, 3 Sep 2025 14:25:04 +0000 Subject: [PATCH 086/273] test: PHP considers this invalid --- tst/YourlsProxyTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 5b0c5f30..11c07a86 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -67,6 +67,7 @@ class YourlsProxyTest extends TestCase array('https://example.com'), // missing path and query parameter, array('https://example.com/'), // missing query parameter array('https://example.com?paste=something'), // missing path parameter + array('https://example.com@foreign.malicious.example?foo#bar'), // shall belong to providerForeignUrlUsernameTrick, but for some reason PHP considers this an invalid URL ); } @@ -86,7 +87,7 @@ class YourlsProxyTest extends TestCase public function providerForeignUrlUsernameTrick(): array { return array( - array('https://example.com@foreign.malicious.example?foo#bar'), + // array('https://example.com@foreign.malicious.example?foo#bar'), array('https://example.com/@foreign.malicious.example?foo#bar'), array('https://example.com/?@foreign.malicious.example?foo#bar'), ); From bd61a3d0216fd16020f9f3675c07464463e2c385 Mon Sep 17 00:00:00 2001 From: El RIDO Date: Wed, 3 Sep 2025 20:13:33 +0200 Subject: [PATCH 087/273] enable tests to pass The path is only optional when it is / and the very last element, otherwise it is required. As soon as it is in the middle of a URL it helps the parser to identify which part is the username and domain and what is path and GET parameters. The @ sign is legitimate, if unusual, in the latter two. --- tst/YourlsProxyTest.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tst/YourlsProxyTest.php b/tst/YourlsProxyTest.php index 11c07a86..a4a87bd9 100644 --- a/tst/YourlsProxyTest.php +++ b/tst/YourlsProxyTest.php @@ -45,6 +45,10 @@ class YourlsProxyTest extends TestCase $yourls = new YourlsProxy($this->_conf, 'https://example.com/?foo#bar'); $this->assertFalse($yourls->isError()); $this->assertEquals($yourls->getUrl(), 'https://example.com/1'); + + $yourls = new YourlsProxy($this->_conf, 'https://example.com/?@foreign.malicious.example?foo#bar'); + $this->assertFalse($yourls->isError()); + $this->assertEquals($yourls->getUrl(), 'https://example.com/1'); } /** @@ -67,7 +71,7 @@ class YourlsProxyTest extends TestCase array('https://example.com'), // missing path and query parameter, array('https://example.com/'), // missing query parameter array('https://example.com?paste=something'), // missing path parameter - array('https://example.com@foreign.malicious.example?foo#bar'), // shall belong to providerForeignUrlUsernameTrick, but for some reason PHP considers this an invalid URL + array('https://example.com@foreign.malicious.example?foo#bar'), // missing path parameter ); } @@ -87,9 +91,8 @@ class YourlsProxyTest extends TestCase public function providerForeignUrlUsernameTrick(): array { return array( - // array('https://example.com@foreign.malicious.example?foo#bar'), + array('https://example.com@foreign.malicious.example/?foo#bar'), array('https://example.com/@foreign.malicious.example?foo#bar'), - array('https://example.com/?@foreign.malicious.example?foo#bar'), ); } From ba5dfb2a0887b427f6c25164c64045eb1ec70b54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 13:21:14 +0000 Subject: [PATCH 088/273] Bump actions/setup-node from 4 to 5 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 5. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 70496011..01cfdbb4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -211,7 +211,7 @@ jobs: uses: actions/checkout@v5 - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '18' cache: 'npm' From 90d661db6ff7b531df545a8fd84ae56959240f47 Mon Sep 17 00:00:00 2001 From: PrivateBin Translator Bot <72346835+privatebin-translator@users.noreply.github.com> Date: Sun, 7 Sep 2025 04:10:44 +0200 Subject: [PATCH 089/273] New translations en.json (Chinese Simplified) --- i18n/zh.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i18n/zh.json b/i18n/zh.json index 9dd50d61..12aa7d71 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -210,13 +210,13 @@ "Encrypted note on %s": "%s 上的加密笔记", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "访问此链接来查看该笔记。将此 URL 发送给任何人即可允许其访问该笔记。", "URL shortener may expose your decrypt key in URL.": "短链接服务可能会暴露您在 URL 中的解密密钥。", - "URL shortener is enabled by default.": "URL shortener is enabled by default.", + "URL shortener is enabled by default.": "默认已启用 URL 缩短功能。", "Save document": "保存内容", "Your IP is not authorized to create documents.": "您的 IP 无权创建粘贴。", "Trying to shorten a URL that isn't pointing at our instance.": "尝试缩短一个不指向我们实例的URL。", "Proxy error: Proxy URL is empty. This can be a configuration issue, like wrong or missing config keys.": "调用 YOURLS 时出错。可能是配置问题,例如“apiurl”或“signature”错误或缺失。", "Proxy error: Error parsing proxy response. This can be a configuration issue, like wrong or missing config keys.": "解析 YOURLS 响应时出错。", - "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.", + "Proxy error: Bad response. This can be a configuration issue, like wrong or missing config keys or a temporary outage.": "代理错误:响应无效。这可能是配置问题,例如配置密钥错误或丢失,或者临时中断。", "This secret message can only be displayed once. Would you like to see it now?": "读取粘贴后只能在加载时显示一次。您想现在打开吗?", "Yes, see it": "是的,加载它", "Dark Mode": "夜间模式", From 191ed63b0450e178c11532f711e6d274201d2662 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Wed, 10 Sep 2025 16:02:06 +0100 Subject: [PATCH 090/273] fix regex check for short url in response --- CHANGELOG.md | 1 + js/privatebin.js | 2 +- lib/Configuration.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cee04504..88e2d05d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * FIXED: Allow copying the shortened link after using a URL shortener (#1624) * ADDED: Auto shorten URLs with config option `shortenbydefault` (#1627) * ADDED: Added `shortenviashlink` endpoint with an `shlink` configuration section +* FIXED: Check for quotes and conical braces when extracting short url (#1644) ## 2.0.0 (2025-07-28) * ADDED: Error logging in database and filesystem backend (#1554) diff --git a/js/privatebin.js b/js/privatebin.js index 2ee9ad7e..41f8f7f9 100644 --- a/js/privatebin.js +++ b/js/privatebin.js @@ -2151,7 +2151,7 @@ jQuery.PrivateBin = (function($) { response = JSON.stringify(response); } if (typeof response === 'string' && response.length > 0) { - const shortUrlMatcher = /https?:\/\/[^\s"<]+/g; // JSON API will have URL in quotes, XML in tags + const shortUrlMatcher = /(?<=[>"])https?:\/\/[^\s"<]+(?=[<"])/g; // JSON API will have URL in quotes, XML in tags const shortUrl = (response.match(shortUrlMatcher) || []).filter(function(urlRegExMatch) { if (typeof URL.canParse === 'function') { return URL.canParse(urlRegExMatch); diff --git a/lib/Configuration.php b/lib/Configuration.php index b139903e..77e29f26 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -121,7 +121,7 @@ class Configuration 'js/kjua-0.10.0.js' => 'sha512-BYj4xggowR7QD150VLSTRlzH62YPfhpIM+b/1EUEr7RQpdWAGKulxWnOvjFx1FUlba4m6ihpNYuQab51H6XlYg==', 'js/legacy.js' => 'sha512-08+subq1Lo+r+la5ENqeXiMgNJcVaaTtBIFGkrjziSpvtgCId3Jtin4/OkSdHYSoeztwwIab8uvCzPKHta6puQ==', 'js/prettify.js' => 'sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==', - 'js/privatebin.js' => 'sha512-Cor4acli/veLhX81YVTGQNkQ+poXsz0gRQUmLeJ6WebIXUlUi7ZQZ6lk1oIYesnBG3cV/stVT07cdVsByXoaJA==', + 'js/privatebin.js' => 'sha512-L4auMI55jumH2yMuIgMEvGnAMM2U1bEmsQr70Oad43s2n+NhnJFZ1gpJXBBoov4Max1VKNVqZknVRMKy6E1M4w==', 'js/purify-3.2.6.js' => 'sha512-zqwL4OoBLFx89QPewkz4Lz5CSA2ktU+f31fuECkF0iK3Id5qd3Zpq5dMby8KwHjIEpsUgOqwF58cnmcaNem0EA==', 'js/showdown-2.1.0.js' => 'sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==', 'js/zlib-1.3.1-1.js' => 'sha512-5bU9IIP4PgBrOKLZvGWJD4kgfQrkTz8Z3Iqeu058mbQzW3mCumOU6M3UVbVZU9rrVoVwaW4cZK8U8h5xjF88eQ==', From 24afa5a1d86e36d6cf8d3a74b85699a94d171888 Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Thu, 11 Sep 2025 18:17:30 +0100 Subject: [PATCH 091/273] removed CSP tag from shortenerproxy.php --- js/privatebin.js | 2 +- js/test/PasteStatus.js | 1 - lib/Configuration.php | 2 +- tpl/shortenerproxy.php | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/js/privatebin.js b/js/privatebin.js index 41f8f7f9..2ee9ad7e 100644 --- a/js/privatebin.js +++ b/js/privatebin.js @@ -2151,7 +2151,7 @@ jQuery.PrivateBin = (function($) { response = JSON.stringify(response); } if (typeof response === 'string' && response.length > 0) { - const shortUrlMatcher = /(?<=[>"])https?:\/\/[^\s"<]+(?=[<"])/g; // JSON API will have URL in quotes, XML in tags + const shortUrlMatcher = /https?:\/\/[^\s"<]+/g; // JSON API will have URL in quotes, XML in tags const shortUrl = (response.match(shortUrlMatcher) || []).filter(function(urlRegExMatch) { if (typeof URL.canParse === 'function') { return URL.canParse(urlRegExMatch); diff --git a/js/test/PasteStatus.js b/js/test/PasteStatus.js index 5d863bf5..f5132342 100644 --- a/js/test/PasteStatus.js +++ b/js/test/PasteStatus.js @@ -149,7 +149,6 @@ describe('PasteStatus', function () { '\n' + '\t\n' + '\t\t\n' + - '\t\t\n' + '\t\t\n' + '\t\t\n' + '\t\tPrivateBin\n' + diff --git a/lib/Configuration.php b/lib/Configuration.php index 77e29f26..b139903e 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -121,7 +121,7 @@ class Configuration 'js/kjua-0.10.0.js' => 'sha512-BYj4xggowR7QD150VLSTRlzH62YPfhpIM+b/1EUEr7RQpdWAGKulxWnOvjFx1FUlba4m6ihpNYuQab51H6XlYg==', 'js/legacy.js' => 'sha512-08+subq1Lo+r+la5ENqeXiMgNJcVaaTtBIFGkrjziSpvtgCId3Jtin4/OkSdHYSoeztwwIab8uvCzPKHta6puQ==', 'js/prettify.js' => 'sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==', - 'js/privatebin.js' => 'sha512-L4auMI55jumH2yMuIgMEvGnAMM2U1bEmsQr70Oad43s2n+NhnJFZ1gpJXBBoov4Max1VKNVqZknVRMKy6E1M4w==', + 'js/privatebin.js' => 'sha512-Cor4acli/veLhX81YVTGQNkQ+poXsz0gRQUmLeJ6WebIXUlUi7ZQZ6lk1oIYesnBG3cV/stVT07cdVsByXoaJA==', 'js/purify-3.2.6.js' => 'sha512-zqwL4OoBLFx89QPewkz4Lz5CSA2ktU+f31fuECkF0iK3Id5qd3Zpq5dMby8KwHjIEpsUgOqwF58cnmcaNem0EA==', 'js/showdown-2.1.0.js' => 'sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==', 'js/zlib-1.3.1-1.js' => 'sha512-5bU9IIP4PgBrOKLZvGWJD4kgfQrkTz8Z3Iqeu058mbQzW3mCumOU6M3UVbVZU9rrVoVwaW4cZK8U8h5xjF88eQ==', diff --git a/tpl/shortenerproxy.php b/tpl/shortenerproxy.php index bbd454e9..548418f8 100644 --- a/tpl/shortenerproxy.php +++ b/tpl/shortenerproxy.php @@ -4,7 +4,6 @@ use PrivateBin\I18n; > - <?php echo I18n::_($NAME); ?> From f9c958da904df888cde0c7ba076feaae3180b26e Mon Sep 17 00:00:00 2001 From: Karthik Kasturi Date: Thu, 11 Sep 2025 21:34:12 +0000 Subject: [PATCH 092/273] =?UTF-8?q?Password=20peek=20=F0=9F=AB=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- css/common.css | 52 +++++++++++++++++++++++++++++++++++++++++++ i18n/ar.json | 2 ++ i18n/bg.json | 2 ++ i18n/ca.json | 2 ++ i18n/co.json | 2 ++ i18n/cs.json | 2 ++ i18n/de.json | 2 ++ i18n/el.json | 2 ++ i18n/en.json | 2 ++ i18n/es.json | 2 ++ i18n/et.json | 2 ++ i18n/fi.json | 2 ++ i18n/fr.json | 2 ++ i18n/he.json | 2 ++ i18n/hi.json | 2 ++ i18n/hu.json | 2 ++ i18n/id.json | 2 ++ i18n/it.json | 2 ++ i18n/ja.json | 2 ++ i18n/jbo.json | 2 ++ i18n/ko.json | 2 ++ i18n/ku.json | 2 ++ i18n/la.json | 2 ++ i18n/lt.json | 2 ++ i18n/nl.json | 2 ++ i18n/no.json | 2 ++ i18n/oc.json | 2 ++ i18n/pl.json | 2 ++ i18n/pt.json | 2 ++ i18n/ro.json | 2 ++ i18n/ru.json | 2 ++ i18n/sk.json | 2 ++ i18n/sl.json | 2 ++ i18n/sv.json | 2 ++ i18n/th.json | 2 ++ i18n/tr.json | 2 ++ i18n/uk.json | 2 ++ i18n/zh.json | 2 ++ js/privatebin.js | 46 +++++++++++++++++++++++++++++++++++++- lib/Configuration.php | 2 +- tpl/bootstrap.php | 20 +++++++++++++---- tpl/bootstrap5.php | 18 ++++++++++++--- 42 files changed, 203 insertions(+), 9 deletions(-) diff --git a/css/common.css b/css/common.css index b5019c47..2dc3072b 100644 --- a/css/common.css +++ b/css/common.css @@ -105,3 +105,55 @@ background-color: #fd8; transition: background-color 0.2s ease-in; } + +::-ms-reveal { + display: none; +} + +.password-peek-container { + position: relative; +} + +button.toggle-password { + position: absolute; + top: 3px; + right: 4px; + z-index: 9; + width: 2rem; + height: 2rem; + background: 0; + border: 0; +} + +button.toggle-password:active, +button.toggle-password:focus, +button.toggle-password:hover { + cursor: pointer; +} + +button.toggle-password:focus { + outline: none !important; +} + +.input-password { + padding-right: calc(1.5em + 0.75rem); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.input-password[type=text] { + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.359 11.238C15.06 9.72 16 8 16 8s-3-5.5-8-5.5a7.028 7.028 0 0 0-2.79.588l.77.771A5.944 5.944 0 0 1 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.134 13.134 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755-.165.165-.337.328-.517.486l.708.709z'/%3E%3Cpath d='M11.297 9.176a3.5 3.5 0 0 0-4.474-4.474l.823.823a2.5 2.5 0 0 1 2.829 2.829l.822.822zm-2.943 1.299l.822.822a3.5 3.5 0 0 1-4.474-4.474l.823.823a2.5 2.5 0 0 0 2.829 2.829z'/%3E%3Cpath d='M3.35 5.47c-.18.16-.353.322-.518.487A13.134 13.134 0 0 0 1.172 8l.195.288c.335.48.83 1.12 1.465 1.755C4.121 11.332 5.881 12.5 8 12.5c.716 0 1.39-.133 2.02-.36l.77.772A7.029 7.029 0 0 1 8 13.5C3 13.5 0 8 0 8s.939-1.721 2.641-3.238l.708.709z'/%3E%3Cpath fill-rule='evenodd' d='M13.646 14.354l-12-12 .708-.708 12 12-.708.708z'/%3E%3C/svg%3E") !important; +} + +.input-password[type=password] { + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.134 13.134 0 0 0 1.66 2.043C4.12 11.332 5.88 12.5 8 12.5c2.12 0 3.879-1.168 5.168-2.457A13.134 13.134 0 0 0 14.828 8a13.133 13.133 0 0 0-1.66-2.043C11.879 4.668 10.119 3.5 8 3.5c-2.12 0-3.879 1.168-5.168 2.457A13.133 13.133 0 0 0 1.172 8z'/%3E%3Cpath fill-rule='evenodd' d='M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z'/%3E%3C/svg%3E") !important; +} + +[data-bs-theme=dark] .input-password[type=text] { + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' fill='%23adb5bd' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.359 11.238C15.06 9.72 16 8 16 8s-3-5.5-8-5.5a7.028 7.028 0 0 0-2.79.588l.77.771A5.944 5.944 0 0 1 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.134 13.134 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755-.165.165-.337.328-.517.486l.708.709z'/%3E%3Cpath d='M11.297 9.176a3.5 3.5 0 0 0-4.474-4.474l.823.823a2.5 2.5 0 0 1 2.829 2.829l.822.822zm-2.943 1.299l.822.822a3.5 3.5 0 0 1-4.474-4.474l.823.823a2.5 2.5 0 0 0 2.829 2.829z'/%3E%3Cpath d='M3.35 5.47c-.18.16-.353.322-.518.487A13.134 13.134 0 0 0 1.172 8l.195.288c.335.48.83 1.12 1.465 1.755C4.121 11.332 5.881 12.5 8 12.5c.716 0 1.39-.133 2.02-.36l.77.772A7.029 7.029 0 0 1 8 13.5C3 13.5 0 8 0 8s.939-1.721 2.641-3.238l.708.709z'/%3E%3Cpath fill-rule='evenodd' d='M13.646 14.354l-12-12 .708-.708 12 12-.708.708z'/%3E%3C/svg%3E") !important; +} + +[data-bs-theme=dark] .input-password[type=password] { + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' fill='%23adb5bd' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.134 13.134 0 0 0 1.66 2.043C4.12 11.332 5.88 12.5 8 12.5c2.12 0 3.879-1.168 5.168-2.457A13.134 13.134 0 0 0 14.828 8a13.133 13.133 0 0 0-1.66-2.043C11.879 4.668 10.119 3.5 8 3.5c-2.12 0-3.879 1.168-5.168 2.457A13.133 13.133 0 0 0 1.172 8z'/%3E%3Cpath fill-rule='evenodd' d='M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z'/%3E%3C/svg%3E") !important; +} diff --git a/i18n/ar.json b/i18n/ar.json index 1ba7dc63..5802ca54 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "نُسخ الرابط إلى الحافظة", "Document text": "لصق النص", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "مفتاح التبويب يعمل كشخصية (انقر Ctrl+m أو Esc للتبديل)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "السمة" } diff --git a/i18n/bg.json b/i18n/bg.json index 5aa0b00d..00a88cef 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/ca.json b/i18n/ca.json index 5c3c6073..bf25cea8 100644 --- a/i18n/ca.json +++ b/i18n/ca.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/co.json b/i18n/co.json index b029068e..092f2f33 100644 --- a/i18n/co.json +++ b/i18n/co.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "U liame hè statu cupiatu in u preme’papei", "Document text": "Testu di u ducumentu", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "U tastu di tabulazione ghjova cum’è un caratteru (Appughjate nant’à Ctrl+m o Scapp per scambià)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Tema" } diff --git a/i18n/cs.json b/i18n/cs.json index 3dfa081c..9dfcfc44 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Odkaz zkopírován do schránky", "Document text": "Text dokumentu", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulátor funguje jako znak (pro přepnutí stiskněte Ctrl+m nebo Esc)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Vzhled" } diff --git a/i18n/de.json b/i18n/de.json index c4ed5739..2746d07a 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Verknüpfung wurde in die Zwischenablage kopiert.", "Document text": "Text des Dokuments", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulatortaste als Zeichen interpretieren (Umschalten durch Strg+m oder Esc)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Design" } diff --git a/i18n/el.json b/i18n/el.json index 0be86a5c..ab6ad752 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/en.json b/i18n/en.json index c0d21fca..d6dc4ff3 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/es.json b/i18n/es.json index a792b5ab..6362e9e5 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/et.json b/i18n/et.json index dfa643e3..9b9a1242 100644 --- a/i18n/et.json +++ b/i18n/et.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link kopeeriti lõikelauale", "Document text": "Kleebi tekst", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Teema" } diff --git a/i18n/fi.json b/i18n/fi.json index 185db758..4e1a1c77 100644 --- a/i18n/fi.json +++ b/i18n/fi.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Linkki kopioitu leikepöydälle", "Document text": "Liitä teksti", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulaattori toimii merkkinä (Paina Ctrl+m tai Esc vaihtaaksesi)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Teema" } diff --git a/i18n/fr.json b/i18n/fr.json index 17b93f7a..180cb00e 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Lien copié dans le presse-papier", "Document text": "Texte du document", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "La touche de tabulation sert de caractère (Presser Ctrl+m ou Esc pour basculer)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Thème" } diff --git a/i18n/he.json b/i18n/he.json index 31d2afd9..2d3711fe 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "הקישור הועתק ללוח", "Document text": "הדבק טקסט", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "משטח ה-tab פועל כמקש תו (לחץ על Ctrl+m או Esc להחלפה)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "נושא" } diff --git a/i18n/hi.json b/i18n/hi.json index c0d21fca..d6dc4ff3 100644 --- a/i18n/hi.json +++ b/i18n/hi.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/hu.json b/i18n/hu.json index b451a789..34f8a98b 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/id.json b/i18n/id.json index 89212292..44905fa8 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/it.json b/i18n/it.json index 1d91186c..2d0903da 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Testo del messaggio", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/ja.json b/i18n/ja.json index 54650f04..bda7740e 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/jbo.json b/i18n/jbo.json index 90160ecf..6bea3625 100644 --- a/i18n/jbo.json +++ b/i18n/jbo.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/ko.json b/i18n/ko.json index c0d21fca..d6dc4ff3 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/ku.json b/i18n/ku.json index e72469d0..ba62f343 100644 --- a/i18n/ku.json +++ b/i18n/ku.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/la.json b/i18n/la.json index 081d551f..51dc6e7d 100644 --- a/i18n/la.json +++ b/i18n/la.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/lt.json b/i18n/lt.json index 02253d08..317c36b1 100644 --- a/i18n/lt.json +++ b/i18n/lt.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/nl.json b/i18n/nl.json index 220ff9db..291a32b0 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link gekopieerd naar klembord", "Document text": "Tekst plakken", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulatortoets dient als teken (gebruik Ctrl+m of Esc om te schakelen)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Thema" } diff --git a/i18n/no.json b/i18n/no.json index 538364ec..5a01ae39 100644 --- a/i18n/no.json +++ b/i18n/no.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/oc.json b/i18n/oc.json index 5ba5af14..fc813b72 100644 --- a/i18n/oc.json +++ b/i18n/oc.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/pl.json b/i18n/pl.json index 68fcf2c6..9706fc47 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link został skopiowany do schowka", "Document text": "Tekst dokumentu", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Klawisz Tabulatora służy jako znak (przytrzymaj Ctrl+m lub Esc aby przełączać)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Motyw" } diff --git a/i18n/pt.json b/i18n/pt.json index 91d8ea4b..355fb1a2 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/ro.json b/i18n/ro.json index aaf35e0d..fed550da 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/ru.json b/i18n/ru.json index ee4c4013..6dbdac64 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Ссылка скопирована в буфер обмена", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Тема" } diff --git a/i18n/sk.json b/i18n/sk.json index 95dae475..df8cc16a 100644 --- a/i18n/sk.json +++ b/i18n/sk.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Odkaz vložený do schránky", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/sl.json b/i18n/sl.json index 8098381b..9bfeb32e 100644 --- a/i18n/sl.json +++ b/i18n/sl.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/sv.json b/i18n/sv.json index 8e9ac275..8eac7396 100644 --- a/i18n/sv.json +++ b/i18n/sv.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/th.json b/i18n/th.json index d7d2a133..b8933015 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "คัดลอกลิงก์ไปที่คลิปบอร์ดแล้ว", "Document text": "ฝากข้อความ", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "ปุ่ม Tabulator ใช้เป็นอักขระ (กด Ctrl+m หรือ Esc เพื่อสลับ)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "ธีม" } diff --git a/i18n/tr.json b/i18n/tr.json index c5f6ab21..a499c420 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/uk.json b/i18n/uk.json index efdbc89e..218929de 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "Link copied to clipboard", "Document text": "Document text", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "Theme" } diff --git a/i18n/zh.json b/i18n/zh.json index 12aa7d71..d667ed1d 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -229,5 +229,7 @@ "Link copied to clipboard": "链接已复制到剪贴板", "Document text": "粘贴文本", "Tabulator key serves as character (Hit Ctrl+m or Esc to toggle)": "Tab 键可作为字符(按 Ctrl+mEsc 切换开关)", + "Show password as plain text. Warning: this will display your password on the screen.": "Show password as plain text. Warning: this will display your password on the screen.", + "Hide password": "Hide password", "Theme": "主题" } diff --git a/js/privatebin.js b/js/privatebin.js index 2ee9ad7e..bb67d99e 100644 --- a/js/privatebin.js +++ b/js/privatebin.js @@ -2132,7 +2132,7 @@ jQuery.PrivateBin = (function($) { // if so, we send the link to the shortener // we do not remove the button, in case shortener fails sendToShortener(); - } + } } /** @@ -5674,6 +5674,48 @@ jQuery.PrivateBin = (function($) { return me; })(); + /** + * + * @name PasswordPeek + * @class + */ + const PasswordPeek = (function () { + const me = {}; + + /** + * Switch between visible and hidden password + * + * @name PasswordPeek.handleRevealButtonClick + * @private + * @function + */ + function handleRevealButtonClick() { + const passwordInput = $(this).siblings('.input-password'); + const isHidden = passwordInput.attr('type') === 'password'; + + passwordInput.attr('type', isHidden ? 'text' : 'password'); + + const tooltip = I18n._(isHidden ? 'Hide password' : 'Show password as plain text. Warning: this will display your password on the screen.'); + + $(this).attr('title', tooltip); + $(this).attr('aria-label', tooltip); + } + + /** + * Initialize + * + * @name PasswordPeek.init + * @function + */ + me.init = function() { + const revealButton = $('.toggle-password'); + + revealButton.click(handleRevealButtonClick); + }; + + return me; + })(); + /** * (controller) main PrivateBin logic * @@ -5922,6 +5964,7 @@ jQuery.PrivateBin = (function($) { TopNav.init(); UiHelper.init(); CopyToClipboard.init(); + PasswordPeek.init(); // check for legacy browsers before going any further if (!Legacy.Check.getInit()) { @@ -5981,6 +6024,7 @@ jQuery.PrivateBin = (function($) { ServerInteraction: ServerInteraction, PasteEncrypter: PasteEncrypter, PasteDecrypter: PasteDecrypter, + PasswordPeek: PasswordPeek, CopyToClipboard: CopyToClipboard, Controller: Controller }; diff --git a/lib/Configuration.php b/lib/Configuration.php index b139903e..63e1f16f 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -121,7 +121,7 @@ class Configuration 'js/kjua-0.10.0.js' => 'sha512-BYj4xggowR7QD150VLSTRlzH62YPfhpIM+b/1EUEr7RQpdWAGKulxWnOvjFx1FUlba4m6ihpNYuQab51H6XlYg==', 'js/legacy.js' => 'sha512-08+subq1Lo+r+la5ENqeXiMgNJcVaaTtBIFGkrjziSpvtgCId3Jtin4/OkSdHYSoeztwwIab8uvCzPKHta6puQ==', 'js/prettify.js' => 'sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==', - 'js/privatebin.js' => 'sha512-Cor4acli/veLhX81YVTGQNkQ+poXsz0gRQUmLeJ6WebIXUlUi7ZQZ6lk1oIYesnBG3cV/stVT07cdVsByXoaJA==', + 'js/privatebin.js' => 'sha512-WUwQX00pq9GWmMcB+umoiizpmlfGz9LjxAlUXzsNxjPh8vEcuy0gQ0lolidPmBPeNVBDzeh0DOmZ+h4gSH6ekw==', 'js/purify-3.2.6.js' => 'sha512-zqwL4OoBLFx89QPewkz4Lz5CSA2ktU+f31fuECkF0iK3Id5qd3Zpq5dMby8KwHjIEpsUgOqwF58cnmcaNem0EA==', 'js/showdown-2.1.0.js' => 'sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==', 'js/zlib-1.3.1-1.js' => 'sha512-5bU9IIP4PgBrOKLZvGWJD4kgfQrkTz8Z3Iqeu058mbQzW3mCumOU6M3UVbVZU9rrVoVwaW4cZK8U8h5xjF88eQ==', diff --git a/tpl/bootstrap.php b/tpl/bootstrap.php index 099b2558..b57dc40e 100644 --- a/tpl/bootstrap.php +++ b/tpl/bootstrap.php @@ -109,7 +109,13 @@ if (count($class)) {
- +
+ + +
@@ -368,7 +374,13 @@ if ($PASSWORD) : ?>
  • - + @@ -243,7 +249,13 @@ if ($PASSWORD) : ?>

    + + @@ -376,10 +377,11 @@ if ($PASSWORD) : diff --git a/tpl/bootstrap5.php b/tpl/bootstrap5.php index fd0d70c1..1a0875a5 100644 --- a/tpl/bootstrap5.php +++ b/tpl/bootstrap5.php @@ -82,11 +82,12 @@ endif;
    -
    +
    -
    @@ -249,11 +250,12 @@ if ($PASSWORD) : ?>