Compare commits

..

219 Commits
1.7.2 ... 1.7.5

Author SHA1 Message Date
El RIDO
1a434b0e8d incrementing version 2024-11-16 08:02:20 +01:00
El RIDO
3460f20e40 Merge pull request #1448 from slaweallx/patch-1
Update tr.json
2024-11-09 20:13:42 +01:00
Ali Çömez | Slaweally
82c2e685b6 Update tr.json 2024-11-09 22:05:49 +03:00
El RIDO
9eadf09ac3 bump libraries, document change 2024-10-31 08:05:49 +01:00
El RIDO
365782ebeb Merge pull request #1446 from PrivateBin/dependabot/composer/mlocati/ip-lib-1.18.1
Bump mlocati/ip-lib from 1.18.0 to 1.18.1
2024-10-31 07:55:09 +01:00
dependabot[bot]
6db7d9a6fa Bump mlocati/ip-lib from 1.18.0 to 1.18.1
Bumps [mlocati/ip-lib](https://github.com/mlocati/ip-lib) from 1.18.0 to 1.18.1.
- [Release notes](https://github.com/mlocati/ip-lib/releases)
- [Commits](https://github.com/mlocati/ip-lib/compare/1.18.0...1.18.1)

---
updated-dependencies:
- dependency-name: mlocati/ip-lib
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-30 11:33:35 +00:00
El RIDO
631b65c1ea Merge pull request #1438 from PrivateBin/array-key-type-error
Numeric array key type errors
2024-10-27 07:10:25 +01:00
El RIDO
8752354d63 apply StyleCI fixes 2024-10-25 07:12:30 +02:00
El RIDO
0268e01ab5 experiment: add return types to a unit test facility 2024-10-25 07:09:13 +02:00
El RIDO
e468f07626 avoid clever key manipulation, all we need are incremental numbers starting at 1 2024-10-25 06:58:05 +02:00
El RIDO
cf83e3825f ensure key is cast to string, fixes #1435 2024-10-23 08:23:02 +02:00
El RIDO
93a2b97d69 add failing test case, dedup code 2024-10-23 08:17:13 +02:00
El RIDO
d23bb748d4 Merge pull request #1401 from PrivateBin/b5-message-height
bootstrap footer improvements
2024-10-23 07:22:04 +02:00
El RIDO
7d6a70a24e Merge branch 'master' into b5-message-height 2024-10-23 07:21:28 +02:00
El RIDO
9da6d8b24b Merge pull request #1424 from PrivateBin/fix-webkit
Restore WebKit (Safari, iOS, etc.) compatibility
2024-10-23 07:19:35 +02:00
rugk
6876e14679 Merge remote-tracking branch 'origin/master' into fix-webkit 2024-10-22 22:32:32 +00:00
rugk
628b60dcb4 refactor: deferring everything including all potential deps
Also works on Safari…
2024-10-22 22:29:42 +00:00
rugk
5b3537a7cf Merge branch 'fix-webkit' of https://github.com/PrivateBin/PrivateBin into fix-webkit 2024-10-22 22:22:21 +00:00
rugk
f0ca1ac888 fix: also loaad dark-mode switch defer'Ed to make it load correctly
(async fails on WebKIt)
2024-10-22 22:20:49 +00:00
El RIDO
b077fb7749 Merge pull request #1432 from PrivateBin/crowdin-translation
New Crowdin updates
2024-10-20 15:33:45 +02:00
PrivateBin Translator Bot
dd4f3a43fe New translations en.json (Corsican) 2024-10-20 12:12:07 +02:00
El RIDO
eed2a13757 Merge pull request #1431 from PrivateBin/dompurify-3.1.7
upgrading DOMpurify library to 3.1.7
2024-10-19 16:52:33 +02:00
El RIDO
bcf163dd8a Merge pull request #1430 from PrivateBin/crowdin-translation
New Crowdin updates
2024-10-19 12:44:41 +02:00
PrivateBin Translator Bot
d321995d7d New translations en.json (Czech) 2024-10-19 12:28:51 +02:00
El RIDO
07aeed1c4c Merge branch 'master' into fix-webkit 2024-10-19 11:35:57 +02:00
El RIDO
849e32201e improve SRI example 2024-10-19 11:28:01 +02:00
PrivateBin Translator Bot
2cd1dca600 New translations en.json (Czech) 2024-10-19 11:26:11 +02:00
El RIDO
ec2e981984 upgrading DOMpurify library to 3.1.7 2024-10-19 11:17:53 +02:00
El RIDO
233a69adde typo in usage 2024-10-19 10:55:36 +02:00
PrivateBin Translator Bot
95935fe628 New translations en.json (Czech) 2024-10-19 10:09:33 +02:00
PrivateBin Translator Bot
2b668de6c6 New translations en.json (Czech) 2024-10-19 09:02:01 +02:00
PrivateBin Translator Bot
0985cad5bf New translations en.json (Occitan) 2024-10-19 00:32:34 +02:00
PrivateBin Translator Bot
6e3cb7791c New translations en.json (Italian) 2024-10-19 00:32:33 +02:00
PrivateBin Translator Bot
bc052b9c74 New translations en.json (German) 2024-10-19 00:32:31 +02:00
PrivateBin Translator Bot
35b3a823d2 New translations en.json (Czech) 2024-10-19 00:32:30 +02:00
PrivateBin Translator Bot
38c28b8b96 New translations en.json (French) 2024-10-19 00:32:29 +02:00
El RIDO
980bdc922f Update SRI 2024-10-18 23:08:02 +02:00
PrivateBin Translator Bot
3bd8a873a7 New translations en.json (Occitan) 2024-10-18 22:53:18 +02:00
PrivateBin Translator Bot
160e875bc5 New translations en.json (Czech) 2024-10-18 22:53:02 +02:00
El RIDO
52ab0abf51 Merge pull request #1417 from PrivateBin/crowdin-translation
New Crowdin updates
2024-10-18 22:46:28 +02:00
El RIDO
a7e9c7a52b Merge branch 'master' into crowdin-translation 2024-10-18 22:45:57 +02:00
El RIDO
b4e584c574 Merge pull request #1413 from Parthiv-M/navigate-after-delete
Fix: redirect to home page after a paste is deleted
2024-10-18 22:43:40 +02:00
El RIDO
97edbcc167 Merge branch 'master' into navigate-after-delete 2024-10-18 22:39:04 +02:00
parthiv-m
11326f86ba Update SRI 2024-10-18 11:51:57 -04:00
parthiv-m
4d2d9d75c1 Add new key to all translation related files 2024-10-18 11:51:39 -04:00
El RIDO
b31bb4f4e2 Merge pull request #1427 from PrivateBin/doc/unittesting
Fix phpunit doc missing crucial step of installing GCS
2024-10-18 07:07:56 +02:00
El RIDO
6c9e2e054f Merge pull request #1421 from PrivateBin/fixmail
Fix paste link not always being included in mail
2024-10-18 07:04:21 +02:00
parthiv-m
851dadf600 Update CHANGELOG.md 2024-10-17 21:56:42 -04:00
parthiv-m
788146012e Fix failing tests, update button icon and text according to feedback 2024-10-17 21:56:27 -04:00
theProton
922971590e Merge branch 'PrivateBin:master' into navigate-after-delete 2024-10-17 21:22:29 -04:00
rugk
8d435d7c14 Fix style by removing optional parameter
Co-authored-by: El RIDO <elrido@gmx.net>
2024-10-18 02:59:20 +02:00
rugk
763d6fca7e Adding hint that you will see unrelated files and to ignore these 2024-10-18 02:20:50 +02:00
rugk
5b245a3f85 Fix phpunit doc missing crucial step of installing GCS
I tried following the steps when running, for https://github.com/PrivateBin/PrivateBin/pull/1421, but this crucial one step is missing.

Maybe more was missing, most tests failed so hmm… but I only wanted it for the SRI generation and this was hard enough.

(And no, I did not feel like trying to run a container in a [dev]container, so these manual steps should better work.)

Maybe we can improve that further here, I the things I've noticed in this or the other PR.
2024-10-18 02:18:45 +02:00
rugk
2bc5931672 Codespace: Also ensure composer deps like phpunit are usable in devcontainer 2024-10-18 00:13:18 +00:00
rugk
368e8a2ee7 chore: update SRI hash 2024-10-18 00:11:35 +00:00
rugk
2790113199 Revert "Move jquery initialisation/startup logic at the end/down"
This reverts commit eabf763c41.

It is not needed anymore, apparently.
2024-10-16 22:56:35 +00:00
rugk
64ed6e96ee fix: load in WebKit again by loading jquery, base and deflate libs non-async'ly 2024-10-16 22:46:18 +00:00
rugk
6631e770a0 doc: make config consistent in quoting yourls header too as everything is unused 2024-10-16 22:30:11 +00:00
rugk
2cb10b841f doc: fix wrong doc missing quotation marks 2024-10-16 22:29:20 +00:00
rugk
eabf763c41 Move jquery initialisation/startup logic at the end/down 2024-10-16 22:27:50 +00:00
rugk
ff3a9eea79 Improve devcontainer experience by linking sample config as real config 2024-10-16 21:40:17 +00:00
rugk
e675b2547f Fix
Fixes https://github.com/PrivateBin/PrivateBin/issues/1420

I have not tested it practically (just a quick hotfix), but given the code history and this was what worked before, I guess this should work. 🙃
2024-10-16 23:09:00 +02:00
parthiv-m
773c56fc94 Fix conditional display of 'New' paste button on alert 2024-10-14 12:54:36 -04:00
parthiv-m
5acecdb879 Fix for styleci failures 2024-10-13 17:51:45 -04:00
parthiv-m
f2b60d3765 Add _is_deleted status message to Controller and prompt for button click after paste delete 2024-10-13 17:45:05 -04:00
PrivateBin Translator Bot
b5da63318d New translations en.json (Polish) 2024-10-11 14:12:31 +02:00
El RIDO
702831ea38 Merge pull request #1416 from ensag-dev/patch-1
i18n: Update Occitan locale
2024-10-11 07:15:28 +02:00
El RIDO
aafc143a5a strict types in templates 2024-10-11 07:14:18 +02:00
El RIDO
a36d72e914 handle potential key cast
since we introduced strict types, this test occasionally fails when a ID consisting only of decimal numbers gets generated
2024-10-11 07:13:20 +02:00
ensag-dev
a8331d65df Update Occitan locale 2024-10-10 09:31:08 +02:00
El RIDO
0040531057 fix Czech translation tests, test strings now use a non-breaking space 2024-10-09 07:04:12 +02:00
El RIDO
0cc556e8ad Merge pull request #1415 from PrivateBin/crowdin-translation
New Crowdin updates
2024-10-09 06:55:49 +02:00
PrivateBin Translator Bot
55e5f65cbd New translations en.json (Polish) 2024-10-08 23:30:43 +02:00
parthiv-m
d69d29f3a9 Fix: Once a paste is deleted, navigate to
the home page after 5 seconds; change type
of the corresponding alert to alert-success
2024-10-07 17:42:37 -04:00
El RIDO
545ef9f64a Merge pull request #1411 from mormegil-cz/cs-translation
Fix/improve/complete Czech translation
2024-10-05 09:01:30 +02:00
Mormegil
4cc2a20d66 Fix/improve/complete Czech translation 2024-10-03 16:26:47 +02:00
El RIDO
f4bb624ae6 Merge pull request #1410 from PrivateBin/crowdin-translation
New Crowdin updates
2024-10-02 18:23:25 +02:00
PrivateBin Translator Bot
a58b7b80f8 New translations en.json (Ukrainian) 2024-10-02 06:03:27 +02:00
El RIDO
9ac08ba202 Merge pull request #1408 from PrivateBin/crowdin-translation
New Crowdin updates
2024-10-01 22:06:30 +02:00
PrivateBin Translator Bot
d8a986dbda New translations en.json (Greek) 2024-10-01 21:54:55 +02:00
PrivateBin Translator Bot
d9fa9786c9 New translations en.json (Ukrainian) 2024-10-01 21:54:54 +02:00
PrivateBin Translator Bot
50ac504fed New translations en.json (Greek) 2024-10-01 16:54:37 +02:00
PrivateBin Translator Bot
471f6ba355 New translations en.json (Ukrainian) 2024-10-01 00:27:21 +02:00
El RIDO
cc16dd0165 undue footer change for bootstrap 3, switch to dvh heights, deal with small screens 2024-09-15 10:57:42 +02:00
El RIDO
57080eb7cc use recommended bootstrap sticky footer solutions 2024-09-14 08:43:19 +02:00
El RIDO
1a51c0973d bootstrap improvements, fixes #1392
- remove unused styles (no IDs called preview or comments)
- replace margins & paddings with bootstrap utility classes
- apply min body height to placeholder, plaintext & prettymessage, to move footer to end of viewport
2024-09-12 07:50:52 +02:00
El RIDO
c1333e5831 Merge pull request #1399 from PrivateBin/crowdin-translation
New Crowdin updates
2024-09-10 05:31:05 +02:00
PrivateBin Translator Bot
2a0ea64456 New translations en.json (Lithuanian) 2024-09-10 01:06:41 +02:00
El RIDO
e865bec9c3 document changes 2024-09-03 05:53:01 +02:00
El RIDO
a85a7552c1 Merge pull request #1396 from alexistoulotte/fix/use-opt-model-options-configuration
fix(configuration): Use "model_options[opt]" section from "conf.php"
2024-09-03 05:50:15 +02:00
Alexis Toulotte
d0d0d7b6e5 fix: Get rid of unused code 2024-09-03 09:40:08 +11:00
Alexis Toulotte
46c92e7404 fix(configuration): Use "model_options[opt]" section from "conf.php" 2024-09-03 09:19:01 +11:00
El RIDO
81f4a1f34a Merge pull request #1395 from Lopkop/patch-1
Update LICENSE.md
2024-08-31 19:22:03 +02:00
El RIDO
083632a074 Merge pull request #1394 from alexistoulotte/fix/allow-non-persistent-sql-connection
Allow non persistent SQL connections
2024-08-31 19:20:09 +02:00
El RIDO
cbd6183f61 Merge pull request #1389 from PrivateBin/crowdin-translation
New Crowdin updates
2024-08-31 19:13:52 +02:00
Mark
a696069ead Update LICENSE.md 2024-08-30 15:14:28 +00:00
Alexis Toulotte
05644d39f8 fix(configuration): Allow non persistent SQL connections 2024-08-30 11:10:25 +11:00
PrivateBin Translator Bot
8e40b96586 New translations en.json (Catalan) 2024-08-23 09:54:19 +02:00
PrivateBin Translator Bot
fb9ad37db2 New translations en.json (Catalan) 2024-08-22 13:53:01 +02:00
PrivateBin Translator Bot
a04fa272da New translations en.json (Catalan) 2024-08-22 12:29:54 +02:00
PrivateBin Translator Bot
bf22c15782 New translations en.json (Dutch) 2024-08-18 23:59:36 +02:00
PrivateBin Translator Bot
6ebc7a7dcb New translations en.json (Dutch) 2024-08-18 22:08:46 +02:00
PrivateBin Translator Bot
0915c8858b New translations en.json (Dutch) 2024-08-17 06:55:56 +02:00
PrivateBin Translator Bot
aad14ac05f New translations en.json (Korean) 2024-08-17 06:55:54 +02:00
El RIDO
2f4fa349ec Merge pull request #1384 from PrivateBin/dompurify-3.1.6
upgrading DOMpurify library to 3.1.6
2024-08-03 13:14:45 +02:00
El RIDO
ab2d2f2477 upgrading DOMpurify library to 3.1.6 2024-08-03 09:52:30 +02:00
El RIDO
123d5833a5 Merge pull request #1372 from PrivateBin/sri-into-config
Make SRI hashes configurable, no longer hardcoded in templates
2024-08-03 09:38:54 +02:00
El RIDO
41369e28d5 Merge pull request #1380 from PrivateBin/crowdin-translation
New Crowdin updates
2024-07-23 07:05:31 +02:00
PrivateBin Translator Bot
435f201e2e New translations en.json (Greek) 2024-07-22 22:29:08 +02:00
El RIDO
d032efdb64 Merge pull request #1379 from PrivateBin/crowdin-translation
New Crowdin updates
2024-07-20 21:03:17 +02:00
PrivateBin Translator Bot
d038966b64 New translations en.json (Ukrainian) 2024-07-20 00:48:16 +02:00
El RIDO
93bc122086 apply StyleCI recommendation 2024-07-19 08:20:15 +02:00
El RIDO
2b76898546 preserve configured SRI hashes 2024-07-19 08:05:40 +02:00
El RIDO
5ef8a094e7 re-add missing attribute 2024-07-09 22:47:15 +02:00
El RIDO
4b6c8356f5 clarify use of cache buster, avoid using regex 2024-07-09 22:35:21 +02:00
El RIDO
3c6df4573e apply StyleCI recommendation 2024-07-09 22:21:01 +02:00
El RIDO
6261c94fc9 break unit tests if mismatch between JS files and SRI configuration array is detected 2024-07-09 22:20:08 +02:00
El RIDO
118c919663 adjust regex due to StyleCI spacing change 2024-07-09 21:51:19 +02:00
El RIDO
e051cde317 apply StyleCI recommendation 2024-07-09 21:48:40 +02:00
El RIDO
d27e7e8ee3 make scriptTag parameter a string for flexibility and clarity 2024-07-09 21:38:41 +02:00
El RIDO
7294ea7847 Merge branch 'master' into sri-into-config 2024-07-09 21:32:42 +02:00
El RIDO
cf95e0b1d1 Merge branch 'master' into pg-tables-query 2024-07-09 21:30:17 +02:00
El RIDO
d2f311d246 chore: prepare for next release 2024-07-09 21:27:49 +02:00
El RIDO
031bcef317 incrementing version 2024-07-09 20:36:26 +02:00
El RIDO
0c4e810e67 Merge branch 'shorten-non-self-url' 2024-07-09 20:33:54 +02:00
El RIDO
8712ed6a5d Merge pull request #1357 from PrivateBin/b5-textarea-height
bootstrap5 textarea height relative to viewport height
2024-07-09 20:28:17 +02:00
El RIDO
8b3b16be44 SRI hashes are now configurable, no longer hardcoded in templates
- addresses #1365
- should make upgrades easier for those using custom templates
- if the JS files got customized, the default SRI hashes can be replaced in the conf.php file, added commented section in conf.sample.php
2024-07-07 16:36:52 +02:00
El RIDO
3cba170f32 re-order stubs to the end of the file for easier maintenance 2024-07-07 15:10:17 +02:00
El RIDO
d097631469 possibly not necessary? 2024-07-07 14:28:29 +02:00
El RIDO
84d4d31c73 composer is not part of the matrix, don't try and process event.json 2024-07-07 14:22:48 +02:00
El RIDO
17f924118e address warnings and errors in github actions 2024-07-07 14:13:59 +02:00
El RIDO
e0bca0d4dc simpler PostgreSQL table lookup query, fixes #1361 2024-07-07 12:37:28 +02:00
El RIDO
f662640554 Merge pull request #1366 from PrivateBin/crowdin-translation
New Crowdin updates
2024-06-30 19:46:57 +02:00
PrivateBin Translator Bot
4fe51b5578 New translations en.json (Ukrainian) 2024-06-30 13:22:12 +02:00
El RIDO
8e6e31db5c fix test, basepath needs to be set 2024-06-30 07:45:06 +02:00
El RIDO
2c711e9d3c prevent bypassing YOURLS proxy URL filter, allowing to shorten non-self URLs 2024-06-29 20:28:18 +02:00
El RIDO
0eae149474 Merge pull request #1360 from PrivateBin/crowdin-translation
New Crowdin updates
2024-06-22 06:51:27 +02:00
PrivateBin Translator Bot
5461f279d7 New translations en.json (Corsican) 2024-06-21 16:11:15 +02:00
El RIDO
3abbd107ca Merge pull request #1356 from PrivateBin/b5-darkmode-toggle-state-init
bootstrap5 dark mode toggle unset on dark browser preference
2024-06-15 08:42:05 +02:00
El RIDO
eb42915991 bootstrap5 textarea height relative to viewport height, fixes #1349 2024-06-13 20:22:40 +02:00
El RIDO
ab05ed9532 bootstrap5 dark mode toggle unset on dark browser preference, fixes #1340 2024-06-13 20:00:26 +02:00
El RIDO
e4902e1bf1 Merge pull request #1355 from PrivateBin/dependabot/github_actions/dawidd6/action-download-artifact-6
Bump dawidd6/action-download-artifact from 5 to 6
2024-06-13 07:49:28 +02:00
dependabot[bot]
4d912b082b Bump dawidd6/action-download-artifact from 5 to 6
Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 5 to 6.
- [Release notes](https://github.com/dawidd6/action-download-artifact/releases)
- [Commits](deb3bb8325...bf251b5aa9)

---
updated-dependencies:
- dependency-name: dawidd6/action-download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-12 11:12:15 +00:00
El RIDO
d190507fbe Merge pull request #1350 from PrivateBin/strict_types
enable strict types
2024-06-08 18:36:17 +02:00
El RIDO
3c6bf26dc8 Merge pull request #1353 from PrivateBin/crowdin-translation
New Crowdin updates
2024-06-06 06:10:06 +02:00
PrivateBin Translator Bot
036563d320 New translations en.json (Norwegian) 2024-06-06 06:08:07 +02:00
El RIDO
51eec9a776 Merge pull request #1352 from PrivateBin/dependabot/github_actions/dawidd6/action-download-artifact-5
Bump dawidd6/action-download-artifact from 3.1.4 to 5
2024-06-06 06:03:25 +02:00
dependabot[bot]
48b4c6ce5b Bump dawidd6/action-download-artifact from 3.1.4 to 5
Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 3.1.4 to 5.
- [Release notes](https://github.com/dawidd6/action-download-artifact/releases)
- [Commits](09f2f74827...deb3bb8325)

---
updated-dependencies:
- dependency-name: dawidd6/action-download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-04 11:09:50 +00:00
El RIDO
662d0e1430 document change 2024-06-04 07:32:13 +02:00
El RIDO
68ccaaace0 address unit test failures due to strict typing 2024-06-04 07:27:45 +02:00
El RIDO
cebc9acce6 enable strict types in PHP 2024-06-04 07:13:55 +02:00
El RIDO
b9d24b74b3 Merge branch 'version-sed' 2024-05-30 18:52:18 +02:00
El RIDO
b32efe0187 disable snyk scan on forks, they won't have the necessary secret 2024-05-30 07:54:19 +02:00
El RIDO
6aa292e33d document changes 2024-05-30 07:31:13 +02:00
El RIDO
4875bedac7 Merge pull request #1346 from 9401adarsh/password-input-bug-fix
fix: reset password input field on creation of new paste
2024-05-29 22:12:56 +02:00
9401adarsh
750a0adce4 chore: update sri hashes to reflect changes in js/ 2024-05-29 16:21:08 +05:30
9401adarsh
372fb58d20 fix: password input not resetting bug, add resetPasswordInput() method 2024-05-29 16:20:28 +05:30
El RIDO
4c347ea08e Merge pull request #1345 from PrivateBin/crowdin-translation
New Crowdin updates
2024-05-29 07:49:55 +02:00
PrivateBin Translator Bot
9f5de7284e New translations en.json (French) 2024-05-28 22:11:41 +02:00
El RIDO
05402ef304 remove version from doc blocs
- @version in file header level isn't used on code docs, it is intended
  for API versions at class or method level
- avoids needing to update all these files on version increment
- avoids needing to regenerate SRI hashes for privatebin.js through
  extra phpunit run
- simplifies VERSION_FILES list
- avoids having to filter above list during loop
- adds a few missing doc bloc headers
2024-05-28 21:03:22 +02:00
El RIDO
f313578892 Merge pull request #1343 from PrivateBin/db-version-upgrade
refactor database schema upgrade to support skipping versions
2024-05-26 08:40:29 +02:00
El RIDO
99a3e087ed refactor database schema upgrade to support skipping versions 2024-05-25 09:40:41 +02:00
El RIDO
b96c8ae531 revert version increment in database upgrade 2024-05-25 09:14:24 +02:00
El RIDO
1264418102 Merge branch '9401adarsh-file-download-md-format-support-feature' 2024-05-21 07:14:54 +02:00
El RIDO
c04c7b0f34 update SRI hashes, npm lock file 2024-05-21 07:14:12 +02:00
El RIDO
a240dbc616 Merge pull request #1341 from FingerlessGlov3s/patch-1
Fix bootstrap5 template width
2024-05-21 06:46:11 +02:00
FingerlessGloves
4913837d37 Fix bootstrap5 template width 2024-05-20 20:28:13 +01:00
Adarsh Ashokan
7c7b5abad3 fix: downloadText() method to accommodate .md file format 2024-05-21 00:51:41 +05:30
El RIDO
a0e42aae9e Merge pull request #1333 from PrivateBin/crowdin-translation
New Crowdin updates
2024-05-18 21:56:57 +02:00
El RIDO
f9f8f18781 helper interacts with rawText call 2024-05-18 21:55:14 +02:00
El RIDO
5e5b394291 fix rawText test and split parts into hideAllButtons test 2024-05-18 20:02:54 +02:00
El RIDO
39a359c23f Merge pull request #1338 from ankiiisharma/ankit#1336
Added test case to verify rawText
2024-05-18 08:39:13 +02:00
Ankiiisharma
bae6e6ff25 Added test case to verify rawText
Added test case to verify rawText manipulates button visibility correctly
2024-05-18 00:09:23 +05:30
El RIDO
2324e83b84 Merge pull request #1331 from PrivateBin/dependabot/github_actions/dawidd6/action-download-artifact-3.1.4
Bump dawidd6/action-download-artifact from 3.0.0 to 3.1.4
2024-05-14 05:43:30 +02:00
PrivateBin Translator Bot
451f4af484 New translations en.json (Romanian) 2024-05-13 22:01:08 +02:00
El RIDO
d961a892f2 chore: prepare for next release 2024-05-13 19:33:43 +02:00
El RIDO
22419cd68a incrementing version 2024-05-13 19:18:30 +02:00
dependabot[bot]
2aeec14a52 Bump dawidd6/action-download-artifact from 3.0.0 to 3.1.4
Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 3.0.0 to 3.1.4.
- [Release notes](https://github.com/dawidd6/action-download-artifact/releases)
- [Commits](e7466d1a75...09f2f74827)

---
updated-dependencies:
- dependency-name: dawidd6/action-download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-13 12:00:22 +00:00
El RIDO
b60dec64e5 Merge pull request #1330 from AnonymousWP/Fix-Dutch-translations
feat(translations): add new Dutch strings
2024-05-13 12:39:39 +02:00
Anonymoussaurus
0b474bb6c0 feat(lang): add new Dutch strings 2024-05-13 11:28:34 +02:00
El RIDO
74cc2c3c92 Merge pull request #1326 from PrivateBin/unset-platform-matrix
in PHP matrix tests, we don't want to constrain the platform
2024-05-13 06:58:53 +02:00
El RIDO
619fbb6653 Merge remote-tracking branch 'origin/dompurify' 2024-05-13 06:57:41 +02:00
El RIDO
435f0d8ea1 Merge remote-tracking branch 'origin/bootstrap5-navbar' 2024-05-13 06:55:50 +02:00
El RIDO
9d53c6493b Merge remote-tracking branch 'origin/bootstrap5-code' 2024-05-13 06:53:41 +02:00
El RIDO
55d30ce9bd Merge pull request #1323 from PrivateBin/bootstrap5-fileupload
bootstrap 5 attachment dropdown sizing
2024-05-13 06:47:46 +02:00
El RIDO
6ae1f7bfcc Merge pull request #1319 from PrivateBin/crowdin-translation
New Crowdin updates
2024-05-13 06:44:34 +02:00
El RIDO
b080fd5e39 Merge pull request #1322 from PrivateBin/bootstrap-expiration-time
expiration time selection fix for bootstrap template
2024-05-13 06:43:30 +02:00
El RIDO
ee3b5ec08a chore: upgrade DOMPurify from v3.1.2 to 3.1.3 2024-05-12 10:18:49 +02:00
El RIDO
9239c0267f Merge pull request #1307 from PrivateBin/experimental-8.4
Add upload test results job in CI
2024-05-12 10:12:25 +02:00
El RIDO
df377d9652 in PHP matrix tests, we don't want to constrain the platform
setting the platform allow composer to prevent upgrades to versions that would exceed the configured version, for the matrix tests we want to use the latest ones for that release
2024-05-09 19:33:50 +02:00
El RIDO
976650bdde bootstrap 5 nav bar & footer improvements, closes #1317 2024-05-09 18:18:57 +02:00
El RIDO
efb04d868d bootstrap 5 code block improvements, closes #1314 2024-05-09 17:53:26 +02:00
El RIDO
47df01b4c6 bootstrap 5 attachment dropdown sizing, fixes #1313 2024-05-09 17:01:02 +02:00
El RIDO
81ad352c8c improve TopNav.getExpiration test 2024-05-09 16:11:15 +02:00
El RIDO
2c8b5ed0e4 expiration time selection for bootstrap template, fixes #1309 2024-05-09 15:55:42 +02:00
PrivateBin Translator Bot
1e10011ca6 New translations en.json (Italian) 2024-05-08 08:01:14 +02:00
PrivateBin Translator Bot
a68a635239 New translations en.json (German) 2024-05-08 08:01:13 +02:00
PrivateBin Translator Bot
a52dd6eae0 New translations en.json (French) 2024-05-08 08:01:12 +02:00
PrivateBin Translator Bot
ebbef00b01 New translations en.json (German) 2024-05-08 06:49:32 +02:00
El RIDO
08aa10a4b7 Merge pull request #1318 from PrivateBin/crowdin-translation
New Crowdin updates
2024-05-08 06:42:47 +02:00
PrivateBin Translator Bot
acfaad8131 New translations en.json (Corsican) 2024-05-07 17:01:14 +02:00
El RIDO
11c26a7281 update SRI hashes and add missing translation messages 2024-05-06 12:40:48 +02:00
El RIDO
0bdac4b4a9 Merge pull request #1312 from Sommerwiesel/master
Rephrase the WebAssembly error on unsupported browser
2024-05-06 12:26:58 +02:00
Marvin Zurborg
0405422a4c Rephrase the WebAssembly error on unsupported browser
Rephrase the WebAssembly error on unsupported browser
2024-05-06 08:07:02 +00:00
El RIDO
28f3e544b8 chore: prepare for next release 2024-05-05 22:53:19 +02:00
El RIDO
28e5ec582a typo 2024-05-05 22:52:49 +02:00
rugk
b7528f4427 Merge pull request #1303 from PrivateBin/test-improvments
Add upload test results job
2024-05-05 20:38:25 +02:00
rugk
9df90ece78 Merge branch 'experimental-8.4' into test-improvments 2024-05-05 18:27:08 +02:00
rugk
4ff9dea9cf ci: try fixing intendation 2024-05-05 15:10:00 +02:00
rugk
6144caae85 ci: fix test results publishing being a totally separate action 2024-05-05 15:01:47 +02:00
rugk
33df5fbd2f Actually make tests continue on experimental builds 2024-05-04 16:02:31 +02:00
rugk
1d6a14ba14 Switch to better artifact download action 2024-05-04 13:29:58 +02:00
rugk
93f59d6456 Upload and use event file, too, for test runs
To support forked repos: https://github.com/marketplace/actions/publish-test-results#support-fork-repositories-and-dependabot-branches

**NOTE:** Do _not_ use with `pull_request_target` as that causes issues!
2024-05-04 13:21:57 +02:00
rugk
00fca44986 Fix npm syntax 2024-05-04 13:14:25 +02:00
rugk
f92edf0026 Run mocha tests properly 2024-05-04 13:13:22 +02:00
rugk
8443d3e397 Add CI test script to package.json 2024-05-04 13:12:23 +02:00
rugk
91957838be Add upload test results job
As per https://github.com/marketplace/actions/publish-test-results#use-with-matrix-strategy only one job should upload all results.
2024-05-04 13:07:53 +02:00
rugk
04822aa643 Actually make tests continue on experimental builds 2024-05-04 12:40:44 +02:00
rugk
55dec46cf4 Mark PHP v8.4 tests as experimental
As per this doc: https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs#handling-failures

Workaround for https://github.com/PrivateBin/PrivateBin/issues/1301 for now. I hope this ignores failures?
2024-05-04 12:16:37 +02:00
120 changed files with 1746 additions and 1112 deletions

View File

@@ -1,5 +1,9 @@
#!/bin/sh
export PATH="$PATH:$HOME/.composer/vendor/bin"
ln -s ./conf.sample.php cfg/conf.php
composer install --no-dev --optimize-autoloader
sudo chmod a+x "$(pwd)" && sudo rm -rf /var/www/html && sudo ln -s "$(pwd)" /var/www/html
npm install --global nyc

View File

@@ -12,6 +12,7 @@ jobs:
# https://github.com/snyk/actions/tree/master/php
snyk-php:
runs-on: ubuntu-latest
if: ${{ github.repository == 'PrivateBin/PrivateBin' }}
steps:
- uses: actions/checkout@v4
- name: Install Google Cloud Storage

38
.github/workflows/test-results.yml vendored Normal file
View File

@@ -0,0 +1,38 @@
name: Test Results
on:
workflow_run:
workflows: ["Tests"]
types:
- completed
permissions: {}
jobs:
test-results:
name: Test Results
runs-on: ubuntu-latest
if: github.event.workflow_run.conclusion != 'skipped'
permissions:
checks: write
# needed unless run with comment_mode: off
pull-requests: write
# required by download step to access artifacts API
actions: read
steps:
- name: Download and Extract Artifacts
uses: dawidd6/action-download-artifact@bf251b5aa9c2f7eeb574a96ee720e24f801b7c11
with:
run_id: ${{ github.event.workflow_run.id }}
path: artifacts
- name: Publish Test Results
uses: EnricoMi/publish-unit-test-result-action@v2
with:
commit: ${{ github.event.workflow_run.head_sha }}
event_file: artifacts/Event File/event.json
event_name: ${{ github.event.workflow_run.event }}
files: "artifacts/**/*.xml"

View File

@@ -18,7 +18,8 @@ jobs:
PHPunit:
name: PHP ${{ matrix.php-versions }} unit tests on ${{ matrix.operating-system }}
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental }}
# https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs#handling-failures
continue-on-error: "${{ matrix.experimental }}"
strategy:
matrix:
php-versions: ['7.3', '7.4', '8.0', '8.1', '8.2', '8.3']
@@ -83,11 +84,14 @@ jobs:
- name: Cache dependencies
uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ steps.get-date.outputs.date }}-${{ hashFiles('**/composer.json') }}
restore-keys: ${{ runner.os }}-composer-${{ steps.get-date.outputs.date }}-
path: "${{ steps.composer-cache.outputs.dir }}"
key: "${{ runner.os }}-composer-${{ steps.get-date.outputs.date }}-${{ hashFiles('**/composer.json') }}"
restore-keys: "${{ runner.os }}-composer-${{ steps.get-date.outputs.date }}-"
# composer installation
- name: Unset platform requirement
run: composer config --unset platform
- name: Setup PHPunit
run: composer install -n
@@ -96,9 +100,16 @@ jobs:
# testing
- name: Run unit tests
run: ../vendor/bin/phpunit --no-coverage
run: ../vendor/bin/phpunit --no-coverage --log-junit results.xml
working-directory: tst
- name: Upload Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: Test Results (PHP ${{ matrix.php-versions }})
path: tst/results.xml
Mocha:
runs-on: ubuntu-latest
steps:
@@ -121,5 +132,22 @@ jobs:
working-directory: js
- name: Run unit tests
run: npm test
run: npm run ci-test
working-directory: js
- name: Upload Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: Test Results (Mocha)
path: js/mocha-results.xml
event_file:
name: "Event File"
runs-on: ubuntu-latest
steps:
- name: Upload
uses: actions/upload-artifact@v4
with:
name: Event File
path: "${{ github.event_path }}"

1
.gitignore vendored
View File

@@ -28,6 +28,7 @@ vendor/**/build_phar.php
# Ignore local node modules, unit testing logs, api docs and IDE project files
js/node_modules/
js/mocha-results.xml
js/test.log
tst/log/
tst/ConfigurationCombinationsTest.php

View File

@@ -1,5 +1,28 @@
# PrivateBin version history
## 1.7.5 (2024-11-16)
* ADDED: Allow non persistent SQL connections, if configured (#1394)
* ADDED: Show a button (that redirects to the `basepath` URL) inside the alert after a paste is deleted
* CHANGED: Tweaked page footer of the `bootstrap5` template (#1392)
* CHANGED: Simpler PostgreSQL table lookup query (#1361)
* CHANGED: SRI hashes are now configurable, no longer hardcoded in templates (#1365)
* CHANGED: Upgrading libraries to: DOMpurify 3.1.7, ip-lib 1.18.1, cloud-storage 1.43.0, aws-sdk-php 3.325.0
* FIXED: Numeric array keys being cast to integer causing failures under strict type checking (#1435)
## 1.7.4 (2024-07-09)
* CHANGED: Saving markdown pastes uses `.md` extension instead of `.txt` (#1293)
* CHANGED: Enable strict type checking in PHP (#1350)
* CHANGED: Various tweaks of the `bootstrap5` template, suggested by the community
* FIXED: Reset password input field on creation of new paste (#1194)
* FIXED: Allow database schema upgrade to skip versions (#1343)
* FIXED: `bootstrap5` dark mode toggle unset on dark browser preference (#1340)
* FIXED: Prevent bypassing YOURLS proxy URL filter, allowing to shorten non-self URLs
## 1.7.3 (2024-05-13)
* CHANGED: Various tweaks of the `bootstrap5` template, suggested by the community
* CHANGED: Upgrading libraries to: DOMpurify 3.1.3
* FIXED: Selected expiration not being applied, when using bootstrap template (#1309)
## 1.7.2 (2024-05-05)
* ADDED: Allow use of `shortenviayourls` in query parameters (#1267)
* ADDED: Input sanitation to some not yet filtered query and server parameters

View File

@@ -1,7 +1,7 @@
# License
PrivateBin consists of PHP and JS code which was originally written by Sébastien
Sauvage in 2012 and falls unter the Zlib/libpng license. Also included are
Sauvage in 2012 and falls under the Zlib/libpng license. Also included are
libraries that fall under the GPLv2 (rawinflate), BSD 3-clause (Showdown), MIT
(base64.js version 1.7, Bootstrap, Identicon, random_compat, composer, kjua,
base-x), Apache (prettify.js) and CC-BY (favicon, icon, logo) licenses. All of

View File

@@ -1,8 +1,8 @@
.PHONY: all coverage coverage-js coverage-php doc doc-js doc-php increment sign test test-js test-php help
CURRENT_VERSION = 1.7.2
VERSION ?= 1.7.3
VERSION_FILES = index.php bin/ cfg/ *.md doc/Installation.md css/ i18n/ img/ js/package.json js/privatebin.js lib/ Makefile tpl/ tst/
CURRENT_VERSION = 1.7.5
VERSION ?= 1.7.6
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")
@@ -29,12 +29,11 @@ doc-php: ## Generate JS code documentation.
phpdoc --visibility=public,protected,private --target=doc/phpdoc --directory=lib/
increment: ## Increment and commit new version number, set target version using `make increment VERSION=1.2.3`.
for F in `grep -l -R $(REGEX_CURRENT_VERSION) $(VERSION_FILES) | grep -v -e tst/log/ -e ":0" -e CHANGELOG.md`; \
for F in `grep -l -R $(REGEX_CURRENT_VERSION) $(VERSION_FILES)`; \
do \
sed -i "s/$(REGEX_CURRENT_VERSION)/$(REGEX_VERSION)/g" $$F; \
done
cd tst && phpunit --no-coverage && cd ..
git add $(VERSION_FILES) tpl/
git add $(VERSION_FILES) CHANGELOG.md
git commit -m "incrementing version"
sign: ## Sign a release.

View File

@@ -1,6 +1,6 @@
# [![PrivateBin](https://cdn.rawgit.com/PrivateBin/assets/master/images/preview/logoSmall.png)](https://privatebin.info/)
*Current version: 1.7.2*
*Current version: 1.7.5*
**PrivateBin** is a minimalist, open source online
[pastebin](https://en.wikipedia.org/wiki/Pastebin)

View File

@@ -4,8 +4,8 @@
| Version | Supported |
| ------- | ------------------ |
| 1.7.2 | :heavy_check_mark: |
| < 1.7.2 | :x: |
| 1.7.5 | :heavy_check_mark: |
| < 1.7.5 | :x: |
## Reporting a Vulnerability

View File

@@ -1,6 +1,5 @@
#!/usr/bin/env php
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -9,7 +8,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin;

View File

@@ -1,6 +1,14 @@
#!/usr/bin/env php
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
* a zero-knowledge paste bin
*
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
*
* generates a config unit test class
*
* This generator is meant to test all possible configuration combinations
@@ -405,7 +413,7 @@ class ConfigurationTestGenerator
private function _getHeader()
{
return <<<'EOT'
<?php
<?php declare(strict_types=1);
/**
* DO NOT EDIT: This file is generated automatically using configGenerator.php
*/

View File

@@ -1,9 +1,17 @@
#!/usr/bin/env php
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
* a zero-knowledge paste bin
*
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
*/
define('ITERATIONS', 100000);
require dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
use Identicon\Generator\GdGenerator;
use Identicon\Generator\ImageMagickGenerator;
@@ -12,8 +20,6 @@ use Identicon\Identicon;
use Jdenticon\Identicon as Jdenticon;
use PrivateBin\Vizhash16x16;
$vizhash = new Vizhash16x16();
$identiconGenerators = array(
'identicon GD' => new Identicon(new GdGenerator()),

View File

@@ -1,7 +1,16 @@
#!/usr/bin/env php
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
* a zero-knowledge paste bin
*
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
*/
// change this, if your php files and data is outside of your webservers document root
// change this, if your php files and data are outside of your webservers document root
define('PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR);
define('PUBLIC_PATH', __DIR__ . DIRECTORY_SEPARATOR);
@@ -191,9 +200,9 @@ Options:
-h, --help displays this help message
-n dry run, do not copy data
-v be verbose
<srcconfdir> use storage backend configration from conf.php found in
<srcconfdir> use storage backend configuration from conf.php found in
this directory as source
<dstconfdir> optionally, use storage backend configration from conf.php
<dstconfdir> optionally, use storage backend configuration from conf.php
found in this directory as destination; defaults to:
" . PATH . "cfg" . DIRECTORY_SEPARATOR . "conf.php
");

View File

@@ -18,7 +18,7 @@ discussion = true
; preselect the discussion feature, defaults to false
opendiscussion = false
; enable or disable the diplay of dates & times in the comments, defaults to true
; enable or disable the display of dates & times in the comments, defaults to true
; Note that internally the creation time will still get tracked in order to sort
; the comments by creation time, but you can choose not to display them.
; discussiondatedisplay = false
@@ -259,7 +259,7 @@ dir = PATH "data"
;version = "latest"
;bucket = "my-bucket"
[yourls]
;[yourls]
; When using YOURLS as a "urlshortener" config item:
; - By default, "urlshortener" will point to the YOURLS API URL, with or without
; credentials, and will be visible in public on the PrivateBin web page.
@@ -275,3 +275,9 @@ dir = PATH "data"
; signature = ""
; (optional) the URL of the YOURLS API, called to shorten a PrivateBin URL
; apiurl = "https://yourls.example.com/yourls-api.php"
;[sri]
; Subresource integrity (SRI) hashes used in template files. Uncomment and set
; these for all js files used. See:
; https://github.com/PrivateBin/PrivateBin/wiki/FAQ#user-content-how-to-make-privatebin-work-when-i-have-changed-some-javascript-files
;js/privatebin.js = "sha512-[…]"

View File

@@ -26,12 +26,12 @@
"require" : {
"php": "^7.3 || ^8.0",
"jdenticon/jdenticon": "1.0.2",
"mlocati/ip-lib": "1.18.0",
"mlocati/ip-lib": "1.18.1",
"yzalis/identicon": "2.0.0"
},
"suggest" : {
"google/cloud-storage" : "1.41.0",
"aws/aws-sdk-php" : "3.302.0"
"google/cloud-storage" : "1.43.0",
"aws/aws-sdk-php" : "3.325.0"
},
"require-dev" : {
"phpunit/phpunit" : "^9"

125
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "b76c0c25f93dc79c4525cb3c86e5af99",
"content-hash": "bb78267a7d61d23706111a91bc90d515",
"packages": [
{
"name": "jdenticon/jdenticon",
@@ -57,16 +57,16 @@
},
{
"name": "mlocati/ip-lib",
"version": "1.18.0",
"version": "1.18.1",
"source": {
"type": "git",
"url": "https://github.com/mlocati/ip-lib.git",
"reference": "c77bd0b1f3e3956c7e9661e75cb1f54ed67d95d2"
"reference": "08bb43b4949069c543ebdf099a6b2c322d0172ab"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mlocati/ip-lib/zipball/c77bd0b1f3e3956c7e9661e75cb1f54ed67d95d2",
"reference": "c77bd0b1f3e3956c7e9661e75cb1f54ed67d95d2",
"url": "https://api.github.com/repos/mlocati/ip-lib/zipball/08bb43b4949069c543ebdf099a6b2c322d0172ab",
"reference": "08bb43b4949069c543ebdf099a6b2c322d0172ab",
"shasum": ""
},
"require": {
@@ -112,7 +112,7 @@
],
"support": {
"issues": "https://github.com/mlocati/ip-lib/issues",
"source": "https://github.com/mlocati/ip-lib/tree/1.18.0"
"source": "https://github.com/mlocati/ip-lib/tree/1.18.1"
},
"funding": [
{
@@ -124,7 +124,7 @@
"type": "other"
}
],
"time": "2022-01-13T18:05:33+00:00"
"time": "2024-10-29T15:44:19+00:00"
},
{
"name": "yzalis/identicon",
@@ -257,16 +257,16 @@
},
{
"name": "myclabs/deep-copy",
"version": "1.11.1",
"version": "1.12.0",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
"shasum": ""
},
"require": {
@@ -274,11 +274,12 @@
},
"conflict": {
"doctrine/collections": "<1.6.8",
"doctrine/common": "<2.13.3 || >=3,<3.2.2"
"doctrine/common": "<2.13.3 || >=3 <3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
"phpspec/prophecy": "^1.10",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
@@ -304,7 +305,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
"source": "https://github.com/myclabs/DeepCopy/tree/1.12.0"
},
"funding": [
{
@@ -312,20 +313,20 @@
"type": "tidelift"
}
],
"time": "2023-03-08T13:26:56+00:00"
"time": "2024-06-12T14:39:25+00:00"
},
{
"name": "nikic/php-parser",
"version": "v4.19.1",
"version": "v4.19.4",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "4e1b88d21c69391150ace211e9eaf05810858d0b"
"reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b",
"reference": "4e1b88d21c69391150ace211e9eaf05810858d0b",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2",
"reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2",
"shasum": ""
},
"require": {
@@ -334,7 +335,7 @@
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
},
"bin": [
"bin/php-parse"
@@ -366,9 +367,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1"
"source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4"
},
"time": "2024-03-17T08:10:35+00:00"
"time": "2024-09-29T15:01:53+00:00"
},
{
"name": "phar-io/manifest",
@@ -490,35 +491,35 @@
},
{
"name": "phpunit/php-code-coverage",
"version": "9.2.31",
"version": "9.2.32",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "48c34b5d8d983006bd2adc2d0de92963b9155965"
"reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965",
"reference": "48c34b5d8d983006bd2adc2d0de92963b9155965",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5",
"reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
"nikic/php-parser": "^4.18 || ^5.0",
"nikic/php-parser": "^4.19.1 || ^5.1.0",
"php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2",
"sebastian/code-unit-reverse-lookup": "^2.0.2",
"sebastian/complexity": "^2.0",
"sebastian/environment": "^5.1.2",
"sebastian/lines-of-code": "^1.0.3",
"sebastian/version": "^3.0.1",
"theseer/tokenizer": "^1.2.0"
"phpunit/php-file-iterator": "^3.0.6",
"phpunit/php-text-template": "^2.0.4",
"sebastian/code-unit-reverse-lookup": "^2.0.3",
"sebastian/complexity": "^2.0.3",
"sebastian/environment": "^5.1.5",
"sebastian/lines-of-code": "^1.0.4",
"sebastian/version": "^3.0.2",
"theseer/tokenizer": "^1.2.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
"phpunit/phpunit": "^9.6"
},
"suggest": {
"ext-pcov": "PHP extension that provides line coverage",
@@ -527,7 +528,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "9.2-dev"
"dev-main": "9.2.x-dev"
}
},
"autoload": {
@@ -556,7 +557,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31"
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32"
},
"funding": [
{
@@ -564,7 +565,7 @@
"type": "github"
}
],
"time": "2024-03-02T06:37:42+00:00"
"time": "2024-08-22T04:23:01+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -809,45 +810,45 @@
},
{
"name": "phpunit/phpunit",
"version": "9.6.19",
"version": "9.6.21",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "a1a54a473501ef4cdeaae4e06891674114d79db8"
"reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8",
"reference": "a1a54a473501ef4cdeaae4e06891674114d79db8",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa",
"reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.3.1 || ^2",
"doctrine/instantiator": "^1.5.0 || ^2",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
"myclabs/deep-copy": "^1.10.1",
"phar-io/manifest": "^2.0.3",
"phar-io/version": "^3.0.2",
"myclabs/deep-copy": "^1.12.0",
"phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1",
"php": ">=7.3",
"phpunit/php-code-coverage": "^9.2.28",
"phpunit/php-file-iterator": "^3.0.5",
"phpunit/php-code-coverage": "^9.2.32",
"phpunit/php-file-iterator": "^3.0.6",
"phpunit/php-invoker": "^3.1.1",
"phpunit/php-text-template": "^2.0.3",
"phpunit/php-timer": "^5.0.2",
"sebastian/cli-parser": "^1.0.1",
"sebastian/code-unit": "^1.0.6",
"phpunit/php-text-template": "^2.0.4",
"phpunit/php-timer": "^5.0.3",
"sebastian/cli-parser": "^1.0.2",
"sebastian/code-unit": "^1.0.8",
"sebastian/comparator": "^4.0.8",
"sebastian/diff": "^4.0.3",
"sebastian/environment": "^5.1.3",
"sebastian/exporter": "^4.0.5",
"sebastian/global-state": "^5.0.1",
"sebastian/object-enumerator": "^4.0.3",
"sebastian/resource-operations": "^3.0.3",
"sebastian/type": "^3.2",
"sebastian/diff": "^4.0.6",
"sebastian/environment": "^5.1.5",
"sebastian/exporter": "^4.0.6",
"sebastian/global-state": "^5.0.7",
"sebastian/object-enumerator": "^4.0.4",
"sebastian/resource-operations": "^3.0.4",
"sebastian/type": "^3.2.1",
"sebastian/version": "^3.0.2"
},
"suggest": {
@@ -892,7 +893,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.19"
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21"
},
"funding": [
{
@@ -908,7 +909,7 @@
"type": "tidelift"
}
],
"time": "2024-04-05T04:35:58+00:00"
"time": "2024-09-19T10:50:18+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -1936,5 +1937,5 @@
"platform-overrides": {
"php": "7.3"
},
"plugin-api-version": "2.6.0"
"plugin-api-version": "2.3.0"
}

View File

@@ -6,7 +6,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
@import url("../common.css");
@@ -88,8 +87,14 @@ body.loading {
word-wrap: break-word;
}
#preview {
margin-bottom: 10px;
#message {
height: 70dvh;
}
@media ((max-width: 450px) and (max-height: 950px)) {
#message {
height: 55dvh;
}
}
#message, .replymessage {
@@ -101,10 +106,6 @@ body.loading {
margin: 5px 0;
}
#comments, #comments button {
margin-bottom: 10px;
}
.comment {
border-left: 1px solid #ccc;
padding: 5px 0 5px 10px;

View File

@@ -6,7 +6,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
@import url("../common.css");
@@ -33,8 +32,14 @@
word-wrap: break-word;
}
#preview {
margin-bottom: 10px;
#message {
height: 70dvh;
}
@media ((max-width: 450px) and (max-height: 950px)) {
#message {
height: 55dvh;
}
}
#message, .replymessage {
@@ -42,24 +47,29 @@
resize: vertical;
}
#nickname {
margin: 5px 0;
}
#comments, #comments button {
margin-bottom: 10px;
}
.comment {
border-left: 1px solid #ccc;
padding: 5px 0 5px 10px;
transition: background-color 0.75s ease-out;
}
li.L0, li.L1, li.L2, li.L3, li.L5, li.L6, li.L7, li.L8 {
.dropdown-menu {
--bs-dropdown-min-width: 23rem;
}
[data-bs-theme=light] pre, [data-bs-theme=light] .card {
background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1));
}
li.L0, li.L1, li.L2, li.L3, li.L4, li.L5, li.L6, li.L7, li.L8, li.L9 {
color: revert !important;
list-style-type: decimal !important;
}
[data-bs-theme=dark] li.L1, [data-bs-theme=dark] li.L3, [data-bs-theme=dark] li.L5,
[data-bs-theme=dark] li.L7, [data-bs-theme=dark] li.L9 {
background-color: var(--bs-gray-dark) !important;
}
.text-right button {
float: right;
}

View File

@@ -6,7 +6,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
#attachmentPreview img {

View File

@@ -6,7 +6,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
.noscript-hide {

View File

@@ -6,7 +6,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
@import url("common.css");

View File

@@ -201,7 +201,7 @@ CREATE INDEX parent ON prefix_comment(pasteid);
CREATE TABLE prefix_config (
id CHAR(16) NOT NULL, value TEXT, PRIMARY KEY (id)
);
INSERT INTO prefix_config VALUES('VERSION', '1.7.2');
INSERT INTO prefix_config VALUES('VERSION', '1.7.5');
```
In **PostgreSQL**, the `data`, `attachment`, `nickname` and `vizhash` columns

View File

@@ -43,6 +43,14 @@ Example for Debian and Ubuntu:
$ sudo apt install phpunit php-gd php-sqlite3 php-xdebug
```
Because the unit tests depend on this, you also need to install the optional. Otherwise they won't run:
```console
composer require google/cloud-storage
```
If you do this and want to develop further, please go into `.gitignore` and adjust it to ignore the whole
vendor directory. Otherwise your `git status` will be filled with lot's of unrelated PHP files.
To run the tests, change into the `tst` directory and run phpunit:
```console

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "خطأ في تحليل استجابة YOURLS.",
"This secret message can only be displayed once. Would you like to see it now?": "لا يمكن عرض اللصق احرقه بعد قراءته إلا مرة واحدة عند تحميله. هل تريد فتحه الآن؟",
"Yes, see it": "نعم، حمله",
"Dark Mode": "الوضع الداكن"
"Dark Mode": "الوضع الداكن",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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"
"Dark Mode": "Dark Mode",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -20,7 +20,7 @@
"Error saving comment. Sorry.": "S'ha produït un error en desar el comentari. Ho sento.",
"Error saving paste. Sorry.": "S'ha produït un error en desar l'enganxat. Ho sento.",
"Invalid paste ID.": "Identificador d'enganxament no vàlid.",
"Paste is not of burn-after-reading type.": "Paste is not of burn-after-reading type.",
"Paste is not of burn-after-reading type.": "La nota no és del tipus eliminar després de llegir.",
"Wrong deletion token. Paste was not deleted.": "El token d'eliminació és incorrecte. El Paste no s'ha eliminat.",
"Paste was properly deleted.": "El Paste s'ha esborrat correctament.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "Cal JavaScript perquè %s funcioni. Em sap greu les molèsties.",
@@ -92,7 +92,7 @@
"%d anys"
],
"Never": "Mai",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Nota: Aquest és un servei de prova. Les dades s'eliminaran. Molts gatets moriran si abuses d'aquest servei.",
"This document will expire in %d seconds.": [
"Aquest document caducarà d'aquí %d segon.",
"Aquest document caducarà d'aquí %d segons.",
@@ -154,7 +154,7 @@
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>",
"Delete data": "Esborrar les dades",
"Could not create paste: %s": "Could not create paste: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "No es pot desxifrar la nota: falta la clau de desxifrat a l'URL (vau utilitzar un adreçament o un escurçador d'URL que elimina part de l'URL?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
@@ -172,8 +172,8 @@
"Cloned: '%s'": "Cloned: '%s'",
"The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.",
"Attach a file": "Adjuntar un fitxer",
"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.",
"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.",
"Invalid attachment.": "Invalid attachment.",
@@ -211,11 +211,14 @@
"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.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"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\".",
"Your IP is not authorized to create pastes.": "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.",
"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?",
"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"
"Dark Mode": "Dark Mode",
"Error compressing paste, due to missing WebAssembly support.": "Error de compressió de la nota, no hi ha suport de WebAssembly.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -31,9 +31,9 @@
"Raw text": "Testu grossu",
"Expires": "Scadenza",
"Burn after reading": "Squassà dopu a lettura",
"Open discussion": "Apre una chjachjarata",
"Open discussion": "Apre una chjachjerata",
"Password (recommended)": "Parolla dintesa (ricumandata)",
"Discussion": "Chjachjarata",
"Discussion": "Chjachjerata",
"Toggle navigation": "Invertisce a navigazione",
"%d seconds": [
"%d seconda",
@@ -213,9 +213,12 @@
"Save paste": "Arregistrà lappiccicu",
"Your IP is not authorized to create pastes.": "U vostru indirizzu IP ùn hè micca auturizatu à creà lappiccichi.",
"Trying to shorten a URL that isn't pointing at our instance.": "Pruvate dammuzzà 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 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 lanalisa 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"
"Dark Mode": "Modu scuru",
"Error compressing paste, due to missing WebAssembly support.": "Sbagliu durante a cumpressione di lappiccicu, perchè WebAssembly ùn hè micca accettatu.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Sbagliu durante a scumpressione di lappiccicu, perchè u vostru navigatore ùn accetteghja micca WebAssembly. Ci vole à impiegà un altru navigatore per affissà stappiccicu.",
"Start over": "Principià torna"
}

View File

@@ -1,34 +1,34 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s je minimalistický open source 'pastebin' server, který neanalyzuje vložená data. Data jsou šifrována %sv prohlížeči%s pomocí 256 bitů AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Více informací na <a href=\"https://privatebin.info/\">stránce projetu</a>.",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s je minimalistický open source 'pastebin' server, který nemá přístup ke vloženým datům. Data jsou šifrována %sv prohlížeči%s pomocí 256bitového AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Více informací na <a href=\"https://privatebin.info/\">stránce projektu</a>.",
"Because ignorance is bliss": "Protože nevědomost je sladká",
"Paste does not exist, has expired or has been deleted.": "Vložený text neexistuje, expiroval nebo byl odstraněn.",
"%s requires php %s or above to work. Sorry.": "%s vyžaduje php %s nebo vyšší. Lituji.",
"%s requires configuration section [%s] to be present in configuration file.": "%s vyžaduje, aby byla v konfiguračním souboru přítomna sekce [%s].",
"%s requires configuration section [%s] to be present in configuration file.": "%s vyžaduje, aby byla v konfiguračním souboru přítomna sekce [%s].",
"Please wait %d seconds between each post.": [
"Počet sekund do dalšího příspěvku: %d.",
"Počet sekund do dalšího příspěvku: %d.",
"Počet sekund do dalšího příspěvku: %d.",
"Počet sekund do dalšího příspěvku: %d.",
"Počet sekund do dalšího příspěvku: %d.",
"Počet sekund do dalšího příspěvku: %d."
"Vyčkejte prosím %d sekundu mezi následujícími příspěvky.",
"Vyčkejte prosím %d sekundy mezi následujícími příspěvky.",
"Vyčkejte prosím %d sekund mezi následujícími příspěvky.",
"Vyčkejte prosím %d sekund mezi následujícími příspěvky.",
"Vyčkejte prosím %d sekund mezi následujícími příspěvky.",
"Vyčkejte prosím %d sekund mezi následujícími příspěvky."
],
"Paste is limited to %s of encrypted data.": "Příspěvek je limitován na %s šífrovaných dat",
"Invalid data.": "Chybná data.",
"You are unlucky. Try again.": "Lituji, zkuste to znovu.",
"Error saving comment. Sorry.": "Chyba při ukládání komentáře.",
"Error saving paste. Sorry.": "Chyba při ukládání příspěvku.",
"Invalid paste ID.": "Chybně vložené ID.",
"Paste is not of burn-after-reading type.": "Příspěvek není nastaven na smazaní po přečtení.",
"Error saving comment. Sorry.": "Chyba při ukládání komentáře. Promiňte.",
"Error saving paste. Sorry.": "Chyba při ukládání příspěvku. Promiňte.",
"Invalid paste ID.": "Chybné ID příspěvku.",
"Paste is not of burn-after-reading type.": "Příspěvek není nastaven na smazání po přečtení.",
"Wrong deletion token. Paste was not deleted.": "Chybný token pro odstranění. Příspěvek nebyl smazán.",
"Paste was properly deleted.": "Příspěvek byl řádně smazán.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "Pro fungování %s je vyžadován JavaScript. Omlouváme se za nepříjemnosti.",
"%s requires a modern browser to work.": "%%s requires a modern browser to work.",
"%s requires a modern browser to work.": "Pro fungování %s je vyžadován moderní prohlížeč.",
"New": "Nový",
"Create": "Vytvořit",
"Clone": "Klonovat",
"Raw text": "Pouze Text",
"Raw text": "Čistý text",
"Expires": "Expirace",
"Burn after reading": "Po přečtení smazat",
"Open discussion": "Povolit komentáře",
@@ -36,113 +36,113 @@
"Discussion": "Komentáře",
"Toggle navigation": "Přepnout navigaci",
"%d seconds": [
"%d sekuda",
"%d sekundy",
"%d sekund",
"%d sekund",
"%d sekund",
"%d sekund"
"%d sekunda",
"%d sekundy",
"%d sekund",
"%d sekund",
"%d sekund",
"%d sekund"
],
"%d minutes": [
"%d minuta",
"%d minuty",
"%d minut",
"%d minut",
"%d minut",
"%d minut"
"%d minuta",
"%d minuty",
"%d minut",
"%d minut",
"%d minut",
"%d minut"
],
"%d hours": [
"%d hodina",
"%d hodiny",
"%d hodin",
"%d hodin",
"%d hodin",
"%d hodin"
"%d hodina",
"%d hodiny",
"%d hodin",
"%d hodin",
"%d hodin",
"%d hodin"
],
"%d days": [
"%d den",
"%d dny",
"%d dní",
"%d dní",
"%d dní",
"%d dní"
"%d den",
"%d dny",
"%d dní",
"%d dní",
"%d dní",
"%d dní"
],
"%d weeks": [
"%d týden",
"%d týdeny",
"%d týdnů",
"%d týdnů",
"%d týdnů",
"%d týdnů"
"%d týden",
"%d týdny",
"%d týdnů",
"%d týdnů",
"%d týdnů",
"%d týdnů"
],
"%d months": [
"%d měsíc",
"%d měsíce",
"%d měsíců",
"%d měsíců",
"%d měsíců",
"%d měsíců"
"%d měsíc",
"%d měsíce",
"%d měsíců",
"%d měsíců",
"%d měsíců",
"%d měsíců"
],
"%d years": [
"%d rok",
"%d roky",
"%d roků",
"%d roků",
"%d roků",
"%d roků"
"%d rok",
"%d roky",
"%d let",
"%d let",
"%d let",
"%d let"
],
"Never": "Nikdy",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Poznámka: Tato služba sloí k vyzkoušení: Data mohou být kdykoliv smazána. Při zneužití této služby zemřou koťátka.",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Poznámka: Toto je testovací služba: Data mohou být kdykoliv smazána. Při zneužití této služby zemřou koťátka.",
"This document will expire in %d seconds.": [
"Tento dokument expiruje za %d sekundu.",
"Tento dokument expiruje za %d sekundy.",
"Tento dokument expiruje za %d sekund.",
"Tento dokument expiruje za %d sekund.",
"Tento dokument expiruje za %d sekund.",
"Tento dokument expiruje za %d sekund."
"Tento dokument expiruje za %d sekundu.",
"Tento dokument expiruje za %d sekundy.",
"Tento dokument expiruje za %d sekund.",
"Tento dokument expiruje za %d sekund.",
"Tento dokument expiruje za %d sekund.",
"Tento dokument expiruje za %d sekund."
],
"This document will expire in %d minutes.": [
"Tento dokument expiruje za %d minutu.",
"Tento dokument expiruje za %d minuty.",
"Tento dokument expiruje za %d minut.",
"Tento dokument expiruje za %d minut.",
"Tento dokument expiruje za %d minut.",
"Tento dokument expiruje za %d minut."
"Tento dokument expiruje za %d minutu.",
"Tento dokument expiruje za %d minuty.",
"Tento dokument expiruje za %d minut.",
"Tento dokument expiruje za %d minut.",
"Tento dokument expiruje za %d minut.",
"Tento dokument expiruje za %d minut."
],
"This document will expire in %d hours.": [
"Tento dokument expiruje za %d hodinu.",
"Tento dokument expiruje za %d hodiny.",
"Tento dokument expiruje za %d hodin.",
"Tento dokument expiruje za %d hodin.",
"Tento dokument expiruje za %d hodin.",
"Tento dokument expiruje za %d hodin."
"Tento dokument expiruje za %d hodinu.",
"Tento dokument expiruje za %d hodiny.",
"Tento dokument expiruje za %d hodin.",
"Tento dokument expiruje za %d hodin.",
"Tento dokument expiruje za %d hodin.",
"Tento dokument expiruje za %d hodin."
],
"This document will expire in %d days.": [
"Tento dokument expiruje za %d den.",
"Tento dokument expiruje za %d dny.",
"Tento dokument expiruje za %d dny.",
"Tento dokument expiruje za %d dny.",
"Tento dokument expiruje za %d dny.",
"Tento dokument expiruje za %d dny."
"Tento dokument expiruje za %d den.",
"Tento dokument expiruje za %d dny.",
"Tento dokument expiruje za %d dní.",
"Tento dokument expiruje za %d dní.",
"Tento dokument expiruje za %d dní.",
"Tento dokument expiruje za %d dní."
],
"This document will expire in %d months.": [
"Tento dokument expiruje za %d měsíc.",
"Tento dokument expiruje za %d měsíce.",
"Tento dokument expiruje za %d měsíců.",
"Tento dokument expiruje za %d měsíců.",
"Tento dokument expiruje za %d měsíců.",
"Tento dokument expiruje za %d měsíců."
"Tento dokument expiruje za %d měsíc.",
"Tento dokument expiruje za %d měsíce.",
"Tento dokument expiruje za %d měsíců.",
"Tento dokument expiruje za %d měsíců.",
"Tento dokument expiruje za %d měsíců.",
"Tento dokument expiruje za %d měsíců."
],
"Please enter the password for this paste:": "Zadejte prosím heslo:",
"Please enter the password for this paste:": "Zadejte prosím heslo k tomuto příspěvku:",
"Could not decrypt data (Wrong key?)": "Nepodařilo se dešifrovat data (Špatný klíč?)",
"Could not delete the paste, it was not stored in burn after reading mode.": "Nepodařilo se odstranit příspěvek, nebyl uložen v režimu smazání po přečtení.",
"Could not delete the paste, it was not stored in burn after reading mode.": "Nepodařilo se odstranit příspěvek, nebyl uložen v režimu smazání po přečtení.",
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "POUZE PRO VAŠE OČI. Nezavírejte toto okno, tuto zprávu nelze znovu zobrazit.",
"Could not decrypt comment; Wrong key?": "Nepodařilo se dešifrovat komentář; Špatný klíč?",
"Reply": "Odpovědět",
"Anonymous": "Anonym",
"Avatar generated from IP address": "Avatar vygenerován z IP adresy",
"Avatar generated from IP address": "Avatar vygenerován podle IP adresy",
"Add comment": "Přidat komentář",
"Optional nickname…": "Volitelný nickname…",
"Optional nickname…": "Nepovinná přezdívka…",
"Post comment": "Odeslat komentář",
"Sending comment…": "Odesílání komentáře…",
"Comment posted.": "Komentář odeslán.",
@@ -151,10 +151,10 @@
"server error or not responding": "Chyba na serveru nebo server neodpovídá",
"Could not post comment: %s": "Nelze odeslat komentář: %s",
"Sending paste…": "Odesílání příspěvku…",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Váš link je <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Stiskněte [Ctrl]+[c] pro zkopírování)</span>",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Váš příspěvek je <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Stiskněte [Ctrl]+[c] pro zkopírování)</span>",
"Delete data": "Odstranit data",
"Could not create paste: %s": "Nelze vytvořit příspěvek: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nepodařilo se dešifrovat příspěvek: V adrese chybí dešifrovací klíč (Možnou příčinou může být URL shortener?)",
"Could not create paste: %s": "Nepodařilo se vytvořit příspěvek: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nepodařilo se dešifrovat příspěvek: V adrese chybí dešifrovací klíč (Nepoužili jste přesměrovač nebo zkracovač URL, který maže části URL?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
@@ -165,57 +165,60 @@
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Formát",
"Plain Text": "Prostý Text",
"Plain Text": "Prostý text",
"Source Code": "Zdrojový kód",
"Markdown": "Markdown",
"Download attachment": "Stáhnout přílohu",
"Cloned: '%s'": "Klonováno: '%s'",
"The cloned file '%s' was attached to this paste.": "Naklonovaný soubor '%s' byl připojen k tomuto příspěvku.",
"Cloned: '%s'": "Naklonováno: '%s'",
"The cloned file '%s' was attached to this paste.": "Naklonovaný soubor %s byl připojen k tomuto příspěvku.",
"Attach a file": "Připojit soubor",
"alternatively drag & drop a file or paste an image from the clipboard": "alternativně 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.",
"Invalid attachment.": "Chybná příloha.",
"Options": "Volby",
"Options": "Možnosti",
"Shorten URL": "Zkrátit URL",
"Editor": "Editor",
"Preview": "Náhled",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s vyžaduje, aby PATH skončil s \"%s\". Aktualizujte PATH ve vašem souboru index.php.",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s vyžaduje, aby PATH končilo na „%s“. Aktualizujte PATH ve vašem souboru index.php.",
"Decrypt": "Dešifrovat",
"Enter password": "Zadejte heslo",
"Loading…": "Načítání…",
"Decrypting paste…": "Dešifruji příspěvek…",
"Preparing new paste…": "Připravuji nový příspěvek…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "V případě, že tato zpráva nezmizí, se podívejte na <a href=\"%s\">tyto často kladené otázky pro řešení</a>.",
"+++ no paste text +++": "+++ žádný vložený text +++",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Pokud tato zpráva nezmizí, podívejte se na <a href=\"%s\">tyto často kladené otázky pro řešení problémů</a>.",
"+++ no paste text +++": "+++ žádný text příspěvku +++",
"Could not get paste data: %s": "Nepodařilo se získat data příspěvku: %s",
"QR code": "QR kód",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Tato stránka používá nezabezpečený připojení HTTP! Použijte ji prosím jen pro testování.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Více informací naleznete <a href=\"%s\">v této položce FAQ</a>.",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Tato stránka používá nezabezpečené HTTP připojení! Použijte ji prosím jen pro testování.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Více informací naleznete <a href=\"%s\">v této položce FAQ</a>.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Váš prohlížeč může vyžadovat připojení HTTPS pro podporu WebCrypto API. Zkuste <a href=\"%s\">přepnout na HTTPS</a>.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Váš prohlížeč nepodporuje WebAssembly, který se používá pro zlib kompresi. Můžete vytvořit nekomprimované dokumenty, ale nebudete moct číst ty komprimované.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Váš prohlížeč nepodporuje WebAssembly, které se používá pro zlib kompresi. Můžete vytvořit nekomprimované dokumenty, ale nebudete moct číst ty komprimované.",
"waiting on user to provide a password": "čekám na zadání hesla",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Nepodařilo se dešifrovat data. Zadali jste špatné heslo? Zkuste to znovu pomocí tlačítka nahoře.",
"Retry": "Opakovat",
"Showing raw text…": "Zobrazuji surový text…",
"Showing raw text…": "Zobrazuji čistý text…",
"Notice:": "Upozornění:",
"This link will expire after %s.": "Tento odkaz vyprší za %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Tento odkaz je přístupný pouze jednou, nepoužívejte tlačítko zpět ani neobnovujte tuto stránku ve vašem prohlížeči.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Tento odkaz je přístupný pouze jednou, nepoužívejte tlačítko zpět ani neobnovujte tuto stránku v prohlížeči.",
"Link:": "Odkaz:",
"Recipient may become aware of your timezone, convert time to UTC?": "Příjemce se může dozvědět o vašem časovém pásmu, převést čas na UTC?",
"Recipient may become aware of your timezone, convert time to UTC?": "Příjemce může zjistit vaše časové pásmo, převést čas na UTC?",
"Use Current Timezone": "Použít aktuální časové pásmo",
"Convert To UTC": "Převést na UTC",
"Close": "Zavřít",
"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.": "Navštivte tento odkaz pro zobrazení poznámky. Přeposláním URL umožníte také jiným lidem přístup.",
"URL shortener may expose your decrypt key in URL.": "Zkracovač URL může odhalit váš dešifrovací klíč v URL.",
"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.",
"Save paste": "Uložit příspěvek",
"Your IP is not authorized to create pastes.": "Vaše IP adresa nemá oprávnění k vytvoření vložení.",
"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.",
"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"
"Your IP is not authorized to create pastes.": "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.",
"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",
"Error compressing paste, due to missing WebAssembly support.": "Chyba při komprimování příspěvku kvůli chybějící podpoře WebAssembly.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "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"
}

View File

@@ -2,7 +2,7 @@
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s ist ein minimalistischer, quelloffener \"Pastebin\"-artiger Dienst, bei dem der Server keinerlei Kenntnis der Inhalte hat. Die Daten werden %sim Browser%s mit 256 Bit AES ver- und entschlüsselt.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Weitere Informationen sind auf der <a href=\"https://privatebin.info/\">Projektseite</a> zu finden.",
"Because ignorance is bliss": "Unwissenheit ist ein Segen",
"Because ignorance is bliss": "Was ich nicht weiß, macht mich nicht heiß",
"Paste does not exist, has expired or has been deleted.": "Diesen Text gibt es nicht, er ist abgelaufen oder wurde gelöscht.",
"%s requires php %s or above to work. Sorry.": "%s benötigt PHP %s oder höher, um zu funktionieren. Sorry.",
"%s requires configuration section [%s] to be present in configuration file.": "%s benötigt den Konfigurationsabschnitt [%s] in der Konfigurationsdatei um zu funktionieren.",
@@ -217,5 +217,8 @@
"Error parsing YOURLS 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"
"Dark Mode": "Nachtmodus",
"Error compressing paste, due to missing WebAssembly support.": "Fehler beim Komprimieren des Textes, da WebAssembly-Unterstützung fehlt.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Fehler beim Dekomprimieren des Textes. Dein Browser unterstützt WebAssembly nicht. Bitte verwende einen anderen Browser, um diesen Text anzuzeigen.",
"Start over": "Neuen Text erstellen"
}

View File

@@ -1,6 +1,6 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s είναι ένα λιτό, ανοικτού λογισμικού διαδικτυακής υπηρεσίας επικόλλησης όπου ο διακομιστής έχει πλήρη άγνια του περιεχομένου που επικολλήθηκαν. Τα Δεδομένα κρυπτογραφούνται και αποκρυπτογραφούνται %sστον φιλομετρητή (browser)%s χρησιμοποιόντας 256 bits AES.",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "Το %s αποτελεί ένα εργαλείο επικόλλησης δεδομένων στο διαδίκτυο, που βασίζεται σε λογισμικό ανοιχτού κώδικα. Ο διακομιστής έχει πλήρη άγνοια αυτών των δεδομένων, τα οποία από/κρυπτογραφούνται %sστο πρόγραμμα περιήγησης%s, χρησιμοποιώντας τη μέθοδο 256-bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Περισσότερες πληροφορίες στον <a href=\"https://privatebin.info/\">ιστότοπο του εργαλείου</a>.",
"Because ignorance is bliss": "Επειδή η άγνοια είναι ευτυχία",
"Paste does not exist, has expired or has been deleted.": "Η επικόλληση δεν υπάρχει, έληξε ή διαγράφηκε",
@@ -212,10 +212,13 @@
"URL shortener may expose your decrypt key in URL.": "Συντομευτές συνδέσμων πιθανώς να δημοσιοποιήσουν το κλειδί αποκρυπτογράφισης στον σύνδεσμο.",
"Save paste": "Αποθήκευση επικόλλησης",
"Your IP is not authorized to create pastes.": "Η IP σας δεν επιτρέπεται να δημιουργεί επικολλήσεις.",
"Trying to shorten a URL that isn't pointing at our instance.": "Προσπαθώντας να συντομεύσει μια διεύθυνση URL που δεν δείχνει στην περίπτωσή μας.",
"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.",
"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": "Σκοτεινό Θέμα"
"Dark Mode": "Σκοτεινό Θέμα",
"Error compressing paste, due to missing WebAssembly support.": "Σφάλμα συμπίεσης επικόλλησης, λόγω έλλειψης υποστήριξης WebAssembly.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Σφάλμα αποσυμπίεσης της επικόλλησης, ο περιηγητής σας δεν υποστηρίζει WebAssembly. Παρακαλούμε χρησιμοποιήστε έναν άλλο περιηγητή για να δείτε αυτή την επικόλληση.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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"
"Dark Mode": "Dark Mode",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS 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"
"Dark Mode": "Modo nocturno",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Viga YOURLS vastuse parsimisel.",
"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": "Tume režiim"
"Dark Mode": "Tume režiim",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS 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"
"Dark Mode": "Tumma tila",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -212,10 +212,13 @@
"URL shortener may expose your decrypt key in URL.": "Raccourcir l'URL peut exposer votre clé de déchiffrement dans l'URL.",
"Save paste": "Sauver le paste",
"Your IP is not authorized to create pastes.": "Votre adresse IP n'est pas autorisée à créer des pastes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Essayer de raccourcir une URL qui ne pointe pas vers notre instance.",
"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.",
"This secret message can only be displayed once. Would you like to see it now?": "Les pastes 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, voyez le",
"Dark Mode": "Mode Sombre"
"Yes, see it": "Oui, le voir",
"Dark Mode": "Mode Sombre",
"Error compressing paste, due to missing WebAssembly support.": "Erreur lors de la compression du paste, en raison du support de WebAssembly manquant.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Erreur lors de la décompression du paste, votre navigateur ne supporte pas WebAssembly. Veuillez utiliser un autre navigateur pour voir ce paste.",
"Start over": "Recommencer"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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"
"Dark Mode": "Dark Mode",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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"
"Dark Mode": "Dark Mode",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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"
"Dark Mode": "Sötét mód",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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"
"Dark Mode": "Mode Gelap",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS 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"
"Dark Mode": "Tema Scuro",
"Error compressing paste, due to missing WebAssembly support.": "Errore nella compressione dell messaggio, a causa del supporto WebAssembly mancante.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Errore nella decompressione dell messaggio, il tuo browser non supporta WebAssembly. Utilizza un altro browser per visualizzare questo messaggio.",
"Start over": "Ricominciare"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS 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": "ダークモード"
"Dark Mode": "ダークモード",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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"
"Dark Mode": "Dark Mode",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

224
i18n/ko.json Normal file
View File

@@ -0,0 +1,224 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "More information on the <a href=\"https://privatebin.info/\">project page</a>.",
"Because ignorance is bliss": "Because ignorance is bliss",
"Paste does not exist, has expired or has been deleted.": "Paste does not exist, has expired or has been deleted.",
"%s requires php %s or above to work. Sorry.": "%s requires php %s or above to work. Sorry.",
"%s requires configuration section [%s] to be present in configuration file.": "%s requires configuration section [%s] to be present in configuration file.",
"Please wait %d seconds between each post.": [
"Please wait %d second between each post. (singular)",
"Please wait %d seconds between each post. (1st plural)",
"Please wait %d seconds between each post. (2nd plural)",
"Please wait %d seconds between each post. (3rd plural)",
"Please wait %d seconds between each post. (4th plural)",
"Please wait %d seconds between each post. (5th plural)"
],
"Paste is limited to %s of encrypted data.": "Paste is limited to %s of encrypted data.",
"Invalid data.": "Invalid data.",
"You are unlucky. Try again.": "You are unlucky. Try again.",
"Error saving comment. Sorry.": "Error saving comment. Sorry.",
"Error saving paste. Sorry.": "Error saving paste. Sorry.",
"Invalid paste ID.": "Invalid paste ID.",
"Paste is not of burn-after-reading type.": "Paste is not of burn-after-reading type.",
"Wrong deletion token. Paste was not deleted.": "Wrong deletion token. Paste was not deleted.",
"Paste was properly deleted.": "Paste was properly deleted.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript is required for %s to work. Sorry for the inconvenience.",
"%s requires a modern browser to work.": "%s requires a modern browser to work.",
"New": "New",
"Create": "Create",
"Clone": "Clone",
"Raw text": "Raw text",
"Expires": "Expires",
"Burn after reading": "Burn after reading",
"Open discussion": "Open discussion",
"Password (recommended)": "Password (recommended)",
"Discussion": "Discussion",
"Toggle navigation": "Toggle navigation",
"%d seconds": [
"%d second (singular)",
"%d seconds (1st plural)",
"%d seconds (2nd plural)",
"%d seconds (3rd plural)",
"%d seconds (4th plural)",
"%d seconds (5th plural)"
],
"%d minutes": [
"%d minute (singular)",
"%d minutes (1st plural)",
"%d minutes (2nd plural)",
"%d minutes (3rd plural)",
"%d minutes (4th plural)",
"%d minutes (5th plural)"
],
"%d hours": [
"%d hour (singular)",
"%d hours (1st plural)",
"%d hours (2nd plural)",
"%d hours (3rd plural)",
"%d hours (4th plural)",
"%d hours (5th plural)"
],
"%d days": [
"%d day (singular)",
"%d days (1st plural)",
"%d days (2nd plural)",
"%d days (3rd plural)",
"%d days (4th plural)",
"%d days (5th plural)"
],
"%d weeks": [
"%d week (singular)",
"%d weeks (1st plural)",
"%d weeks (2nd plural)",
"%d weeks (3rd plural)",
"%d weeks (4th plural)",
"%d weeks (5th plural)"
],
"%d months": [
"%d month (singular)",
"%d months (1st plural)",
"%d months (2nd plural)",
"%d months (3rd plural)",
"%d months (4th plural)",
"%d months (5th plural)"
],
"%d years": [
"%d year (singular)",
"%d years (1st plural)",
"%d years (2nd plural)",
"%d years (3rd plural)",
"%d years (4th plural)",
"%d years (5th plural)"
],
"Never": "Never",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.",
"This document will expire in %d seconds.": [
"This document will expire in %d second. (singular)",
"This document will expire in %d seconds. (1st plural)",
"This document will expire in %d seconds. (2nd plural)",
"This document will expire in %d seconds. (3rd plural)",
"This document will expire in %d seconds. (4th plural)",
"This document will expire in %d seconds. (5th plural)"
],
"This document will expire in %d minutes.": [
"This document will expire in %d minute. (singular)",
"This document will expire in %d minutes. (1st plural)",
"This document will expire in %d minutes. (2nd plural)",
"This document will expire in %d minutes. (3rd plural)",
"This document will expire in %d minutes. (4th plural)",
"This document will expire in %d minutes. (5th plural)"
],
"This document will expire in %d hours.": [
"This document will expire in %d hour. (singular)",
"This document will expire in %d hours. (1st plural)",
"This document will expire in %d hours. (2nd plural)",
"This document will expire in %d hours. (3rd plural)",
"This document will expire in %d hours. (4th plural)",
"This document will expire in %d hours. (5th plural)"
],
"This document will expire in %d days.": [
"This document will expire in %d day. (singular)",
"This document will expire in %d days. (1st plural)",
"This document will expire in %d days. (2nd plural)",
"This document will expire in %d days. (3rd plural)",
"This document will expire in %d days. (4th plural)",
"This document will expire in %d days. (5th plural)"
],
"This document will expire in %d months.": [
"This document will expire in %d month. (singular)",
"This document will expire in %d months. (1st plural)",
"This document will expire in %d months. (2nd plural)",
"This document will expire in %d months. (3rd plural)",
"This document will expire in %d months. (4th plural)",
"This document will expire in %d months. (5th plural)"
],
"Please enter the password for this paste:": "Please enter the password for this paste:",
"Could not decrypt data (Wrong key?)": "Could not decrypt data (Wrong key?)",
"Could not delete the paste, it was not stored in burn after reading mode.": "Could not delete the paste, it was not stored in burn after reading mode.",
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.",
"Could not decrypt comment; Wrong key?": "Could not decrypt comment; Wrong key?",
"Reply": "Reply",
"Anonymous": "Anonymous",
"Avatar generated from IP address": "Avatar generated from IP address",
"Add comment": "Add comment",
"Optional nickname…": "Optional nickname…",
"Post comment": "Post comment",
"Sending comment…": "Sending comment…",
"Comment posted.": "Comment posted.",
"Could not refresh display: %s": "Could not refresh display: %s",
"unknown status": "unknown status",
"server error or not responding": "server error or not responding",
"Could not post comment: %s": "Could not post comment: %s",
"Sending paste…": "Sending paste…",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>",
"Delete data": "Delete data",
"Could not create paste: %s": "Could not create paste: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Format",
"Plain Text": "Plain Text",
"Source Code": "Source Code",
"Markdown": "Markdown",
"Download attachment": "Download attachment",
"Cloned: '%s'": "Cloned: '%s'",
"The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.",
"Attach a file": "Attach a file",
"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.",
"Invalid attachment.": "Invalid attachment.",
"Options": "Options",
"Shorten URL": "Shorten URL",
"Editor": "Editor",
"Preview": "Preview",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.",
"Decrypt": "Decrypt",
"Enter password": "Enter password",
"Loading…": "Loading…",
"Decrypting paste…": "Decrypting paste…",
"Preparing new paste…": "Preparing new paste…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.",
"+++ no paste text +++": "+++ no paste text +++",
"Could not get paste data: %s": "Could not get paste data: %s",
"QR code": "QR code",
"This website is using an insecure HTTP connection! Please use it only for testing.": "This website is using an insecure HTTP connection! Please use it only for testing.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.",
"waiting on user to provide a password": "waiting on user to provide a password",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.",
"Retry": "Retry",
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "This link can only be accessed once, do not use back or refresh button in your browser.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?",
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"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.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"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.",
"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",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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": "جۆری ڕەش",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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"
"Dark Mode": "Dark Mode",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -26,7 +26,7 @@
"JavaScript is required for %s to work. Sorry for the inconvenience.": "%s darbui reikalinga JavaScript. Atsiprašome už nepatogumus.",
"%s requires a modern browser to work.": "%s savo darbui reikalauja šiuolaikinės naršyklės.",
"New": "Naujas",
"Create": "Kurti",
"Create": "Sukurti",
"Clone": "Dubliuoti",
"Raw text": "Neapdorotas tekstas",
"Expires": "Baigs galioti po",
@@ -215,7 +215,10 @@
"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ą.",
"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": "Tamsus režimas"
"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",
"Error compressing paste, due to missing WebAssembly support.": "Klaida glaudinant įdėjimą, nes trūksta WebAssembly palaikymo.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Klaida išglaudinant įdėjimą, jūsų naršyklė nepalaiko WebAssembly. Norėdami peržiūrėti šį įdėjimą, naudokite kitą naršyklę.",
"Start over": "Start over"
}

View File

@@ -26,7 +26,7 @@
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript vereist om %s te laten werken. Sorry voor het ongemak.",
"%s requires a modern browser to work.": "%s vereist een moderne browser om te kunnen werken.",
"New": "Nieuw",
"Create": "Maak",
"Create": "Aanmaken",
"Clone": "Klonen",
"Raw text": "Onbewerkte tekst",
"Expires": "Verloopt",
@@ -154,7 +154,7 @@
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Je paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Druk [Ctrl]+[c] om te kopiëren)</span>",
"Delete data": "Gegevens wissen",
"Could not create paste: %s": "Kon de paste niet aanmaken: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Kon de paste niet decoderen: Decoderingssleutel ontbreekt in URL (Heb je een redirector of een URL-verkorter gebruikt die een deel van de URL verwijdert?)",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Kon de paste niet decoderen: Decoderingssleutel ontbreekt in URL (Heb je een doorverwijzer of een URL-verkorter gebruikt die een deel van de URL verwijdert?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
@@ -215,7 +215,10 @@
"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?": "Brand na het lezen van de plagen kan slechts eenmaal worden weergegeven wanneer deze worden geladen. Wilt u het nu zien?",
"Yes, see it": "Ja, zie het",
"Dark Mode": "Donkere modus"
"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 paste, due to missing WebAssembly support.": "Fout bij het comprimeren van notitie door ontbrekende ondersteuning voor WebAssembly.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Fout bij het decomprimeren van de notitie, uw browser ondersteunt WebAssembly niet. Gebruik een andere browser om deze notitie te bekijken.",
"Start over": "Start over"
}

View File

@@ -215,7 +215,10 @@
"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 å ringe YOURLS. Sannsynligvis et konfigurasjonsproblem, som feil eller mangler, \"apiurl\" eller \"signatur\".",
"Error parsing YOURLS response.": "Feil ved analyse av YOURLS svar.",
"This secret message can only be displayed once. Would you like to see it now?": "Brenne etter lesing av pasta kan kun vises når den lastes inn. Vil du se den nå?",
"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"
"Dark Mode": "Mørk modus",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -215,7 +215,10 @@
"Trying to shorten a URL that isn't pointing at our instance.": "Ensag dabracar 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.",
"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"
"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",
"Error compressing paste, due to missing WebAssembly support.": "Error al moment de la compression de l'empegatge, a causa de la manca de presa en carga de WebAssembly.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error al moment de descompresar l'empegatge, vòstre navegador pren pas en carga WebAssembly. Mercés d'utilizar un autre navigador per visualizar aquesta pega.",
"Start over": "Start over"
}

View File

@@ -167,7 +167,7 @@
"Format": "Format",
"Plain Text": "Czysty tekst",
"Source Code": "Kod źródłowy",
"Markdown": "Markdown",
"Markdown": "Znakowanie",
"Download attachment": "Pobierz załącznik",
"Cloned: '%s'": "Sklonowano: '%s'",
"The cloned file '%s' was attached to this paste.": "Sklonowany plik '%s' był dołączony do tej wklejki.",
@@ -181,7 +181,7 @@
"Shorten URL": "Skróć adres URL",
"Editor": "Edytować",
"Preview": "Podgląd",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s wymaga zmiennej PATH zakończonej w \"%s\". Zaktualizuj zmienną PATH w index.php.",
"Decrypt": "Odszyfruj",
"Enter password": "Wpisz hasło",
"Loading…": "Wczytywanie…",
@@ -191,31 +191,34 @@
"+++ no paste text +++": "+++ brak wklejonego tekstu +++",
"Could not get paste data: %s": "Nie można było pobrać danych wklejki: %s",
"QR code": "Kod QR",
"This website is using an insecure HTTP connection! Please use it only for testing.": "This website is using an insecure HTTP connection! Please use it only for testing.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.",
"waiting on user to provide a password": "waiting on user to provide a password",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.",
"Retry": "Retry",
"Showing raw text…": "Showing raw text…",
"Notice:": "Notice:",
"This link will expire after %s.": "This link will expire after %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "This link can only be accessed once, do not use back or refresh button in your browser.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?",
"Use Current Timezone": "Use Current Timezone",
"Convert To UTC": "Convert To UTC",
"Close": "Close",
"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.",
"Save paste": "Save paste",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.",
"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.",
"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": "Ciemny motyw"
"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 <a href=\"%s\">see this FAQ entry</a>.": "Aby uzyskać więcej informacji, <a href=\"%s\">sprawdź to często zadawane pytanie</a>.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Twoja przeglądarka może wymagać połączenia HTTPS do obsługi API WebCrypto. Wypróbuj <a href=\"%s\">przełączenie na HTTPS</a>.",
"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.",
"Retry": "Ponów",
"Showing raw text…": "Pokazywanie nieprzetworzonego tekstu…",
"Notice:": "Uwaga:",
"This link will expire after %s.": "Ten odnośnik wygaśnie po %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Tego odnośnika można użyć tylko jeden raz. Nie cofaj ani nie odświeżaj strony w przeglądarce.",
"Link:": "Odnośnik:",
"Recipient may become aware of your timezone, convert time to UTC?": "Odbiorca może uzyskać informację o twojej strefie czasowej. Zamienić czas na UTC?",
"Use Current Timezone": "Użyj bieżącej strefy czasowej",
"Convert To UTC": "Zamień na UTC",
"Close": "Zamknij",
"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 paste": "Zapisz wklejenie",
"Your IP is not authorized to create pastes.": "Twój adres IP nie jest upoważniony do tworzenia wklejeń.",
"Trying to shorten a URL that isn't pointing at our instance.": "Próba skrócenia adresu URL wskazującego na inną instanc.",
"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 paste, due to missing WebAssembly support.": "Błąd kompresowania wklejenia przez brak obsługi WebAssembly.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Błąd dekompresowania wklejenia przez brak obsługi WebAssembly przez przeglądarkę. Użyj innej przeglądarki, aby zobaczyć to wklejenie.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS 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"
"Dark Mode": "Modo Noturno",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -26,7 +26,7 @@
"JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript este necesar pentru ca %s să funcționeze. Ne cerem scuze pentru neplăceri.",
"%s requires a modern browser to work.": "%s necesită un browser modern pentru a funcționa.",
"New": "Nou",
"Create": "Creează",
"Create": "Creați",
"Clone": "Clonați",
"Raw text": "Text brut",
"Expires": "Expiră",
@@ -215,7 +215,10 @@
"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.",
"This secret message can only be displayed once. Would you like to see it now?": "Paste-urile care se șterg după citire pot fi afișate numai o dată după încărcare. Doriți să o vedeți acum?",
"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"
"Dark Mode": "Mod întunecat",
"Error compressing paste, due to missing WebAssembly support.": "Eroare la compresia paste-ului din cauza incompatibilității cu WebAssembly.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Eroare la deschiderea paste-ului, browserul dvs. nu acceptă WebAssembly. Vă rugăm să utilizați un alt browser pentru a vedea acest paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Ошибка разбора ответа от YOURLS.",
"This secret message can only be displayed once. Would you like to see it now?": "Записи, удаляемые после прочтения, могут быть отображены после загрузки только один раз. Вы хотите открыть её сейчас?",
"Yes, see it": "Да, загрузить",
"Dark Mode": "Тёмная"
"Dark Mode": "Тёмная",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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": "Tmavý Režim"
"Dark Mode": "Tmavý Režim",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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"
"Dark Mode": "Temni način",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "Error parsing YOURLS 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"
"Dark Mode": "Mörkt Läge",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS 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": "Yes, see it",
"Dark Mode": "โหมดมืด"
"Dark Mode": "โหมดมืด",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -69,7 +69,7 @@
],
"%d weeks": [
"%d hafta",
"%d haftalar",
"%d hafta",
"%d hafta",
"%d hafta",
"%d hafta",
@@ -92,7 +92,7 @@
"%d yıl"
],
"Never": "Asla",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Not: Bu bir test hizmetidir: Veriler herhangi bir zamanda silinebilir. Bu hizmeti kötüye kullanırsanız, kedicikler ölebilir.",
"This document will expire in %d seconds.": [
"Bu belge %d saniyede silinecektir.",
"Bu belge %d saniyede silinecektir.",
@@ -172,50 +172,53 @@
"Cloned: '%s'": "Klonlandı: '%s'",
"The cloned file '%s' was attached to this paste.": "Klonlanmış dosya '%s' bu yazıya eklendi.",
"Attach a file": "Dosya ekle",
"alternatively drag & drop a file or paste an image from the clipboard": "alternatif olarak dosyasyı yapıştırabilir veya sürükleyip bırakabilirsin",
"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ı desteklemiyor.",
"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.",
"Invalid attachment.": "Geçersiz ek.",
"Options": "Seçenekler",
"Shorten URL": "URL kısaltma",
"Editor": "Düzenleyici",
"Preview": "Ön izleme",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s, PATH'in \"%s\" ile bitmesini gerektirir. Lütfen index.php dosyanızdaki PATH'i güncelleyin.",
"Decrypt": "Şifreyi çöz",
"Enter password": "Şifreyi girin",
"Loading…": "Yükleniyor…",
"Decrypting paste…": "Yazı şifresi çözülüyor…",
"Preparing new paste…": "Yeni yazı hazırlanıyor…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "Bu mesaj hiç kaybolmazsa, sorun giderme bilgileri için <a href=\"%s\">bu SSS'ye göz atın</a>.",
"+++ no paste text +++": "+++ yazı içeriği yok +++",
"Could not get paste data: %s": "Yazı verisi alınamıyor: %s",
"QR code": "QR kodu",
"This website is using an insecure HTTP connection! Please use it only for testing.": "This website is using an insecure HTTP connection! Please use it only for testing.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For more information <a href=\"%s\">see this FAQ entry</a>.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.",
"waiting on user to provide a password": "waiting on user to provide a password",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Dosya şifresi çözülemedi, doğru şifreyi kullandığınıza emin misiniz? Üstteki buton ile tekrar deneyin.",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Bu web sitesi güvensiz bir HTTP bağlantısı kullanıyor! Lütfen bunu yalnızca test için kullanın.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Daha fazla bilgi için <a href=\"%s\">bu SSS girişine bakın</a>.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Tarayıcınızın WebCrypto API'sini desteklemesi için HTTPS bağlantısına ihtiyacı olabilir. <a href=\"%s\">HTTPS'ye geçmeyi deneyin</a>.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Tarayıcınız zlib sıkıştırma için kullanılan WebAssembly'i desteklemiyor. Sıkıştırılmamış belgeler oluşturabilirsiniz, ancak sıkıştırılmış olanları okuyamazsınız.",
"waiting on user to provide a password": "kullanıcının şifre girmesi bekleniyor",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Şifre çözülemedi, yanlış şifre mi girdiniz? Üstteki butonla tekrar deneyin.",
"Retry": "Yeniden Dene",
"Showing raw text…": "Açık yazı gösteriliyor…",
"Notice:": "Bildirim:",
"This link will expire after %s.": "Bu bağlantı şu kadar zaman sonra etkisiz kalacaktır: %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Bu bağlantı sadece bir kere erişilebilir, lütfen sayfayı yenilemeyiniz.",
"This link will expire after %s.": "Bu bağlantı %s sonra geçersiz hale gelecektir.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Bu bağlantıya yalnızca bir kez erişilebilir, tarayıcınızda geri veya yenile butonunu kullanmayın.",
"Link:": "Bağlantı:",
"Recipient may become aware of your timezone, convert time to UTC?": "Alıcı zaman dilmini öğrenebilir, zaman dilimini UTC'ye çevirmek ister misin?",
"Use Current Timezone": "Şuanki zaman dilimini kullan",
"Convert To UTC": "UTC zaman dilimine çevir",
"Recipient may become aware of your timezone, convert time to UTC?": "Alıcı zaman diliminizi öğrenebilir, zamanı UTC'ye çevirmek ister misiniz?",
"Use Current Timezone": "Mevcut Zaman Dilimini Kullan",
"Convert To UTC": "UTC'ye Dönüştür",
"Close": "Kapat",
"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 et. Bağlantıya sahip olan birisi notu görebilir.",
"URL shortener may expose your decrypt key in URL.": "URL kısaltıcı şifreleme anahtarınızı URL içerisinde gösterebilir.",
"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.",
"Save paste": "Yazıyı kaydet",
"Your IP is not authorized to create pastes.": "IP adresinizin yazı oluşturmaya yetkisi yoktur.",
"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.",
"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": "Evet, görüyorum",
"Dark Mode": "Koyu Mod"
"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ı.",
"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",
"Error compressing paste, due to missing WebAssembly support.": "WebAssembly desteği eksik olduğundan yazı sıkıştırılamadı.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Yazıılırken hata oluştu, tarayıcınız WebAssembly'i desteklemiyor. Lütfen bu yazıyı görüntülemek için başka bir tarayıcı kullanın.",
"Start over": "Baştan başla"
}

View File

@@ -1,6 +1,6 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s це мінімалістичний Open Source проєкт для створення нотаток, де сервер не знає нічого про дані, що зберігаються. Дані шифруються/розшифровуються %sу переглядачі%s з використанням 256-бітного шифрувания AES.",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s це мінімалістичний Open Source проєкт для створення нотаток, де сервер не знає нічого про дані, що зберігаються. Дані шифруються/розшифровуються %sу браузері%s з використанням 256-бітного шифрування AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Подробиці можна дізнатися на <a href=\"https://privatebin.info/\">сайті проєкту</a>.",
"Because ignorance is bliss": "Бо незнання - благо",
"Paste does not exist, has expired or has been deleted.": "Допис не існує, протермінований чи був видалений.",
@@ -16,15 +16,15 @@
],
"Paste is limited to %s of encrypted data.": "Розмір допису обмежений %s зашифрованих даних.",
"Invalid data.": "Неправильні дані.",
"You are unlucky. Try again.": "Вам не пощастило. Спробуйте ще раз.",
"You are unlucky. Try again.": "Якась халепа! Спробуйте ще раз.",
"Error saving comment. Sorry.": "Помилка при збереженні коментаря. Вибачте.",
"Error saving paste. Sorry.": "Помилка при збереженні допису. Вибачте.",
"Invalid paste ID.": "Неправильний ID допису.",
"Paste is not of burn-after-reading type.": "Тип допису не \"Знищити після прочитання\".",
"Wrong deletion token. Paste was not deleted.": "Неправильний ключ вилучення допису. Допис не вилучено.",
"Wrong deletion token. Paste was not deleted.": "Неправильний жетон вилучення допису. Допис не вилучено.",
"Paste was properly deleted.": "Допис був вилучений повністю.",
"JavaScript is required for %s to work. Sorry for the inconvenience.": "Для роботи %s потрібен увімкнутий JavaScript. Вибачте.",
"%s requires a modern browser to work.": "Для роботи %s потрібен більш сучасний переглядач.",
"%s requires a modern browser to work.": "Для роботи %s потрібен більш сучасний браузер.",
"New": "Новий допис",
"Create": "Створити",
"Clone": "Дублювати",
@@ -36,8 +36,8 @@
"Discussion": "Обговорення",
"Toggle navigation": "Перемкнути навігацію",
"%d seconds": [
"%d секунду",
"%d секунди",
"%d секунд",
"%d секунд",
"%d секунд",
"%d секунд",
"%d секунд",
@@ -134,7 +134,7 @@
"Документ буде вилучений через %d місяців."
],
"Please enter the password for this paste:": "Будь ласка, введіть пароль від допису:",
"Could not decrypt data (Wrong key?)": "Неможливо розшифрувати дані (Неправильний ключ?)",
"Could not decrypt data (Wrong key?)": "Неможливо розшифрувати дані (можливо, невірний ключ?)",
"Could not delete the paste, it was not stored in burn after reading mode.": "Неможливо вилучити допис, він не був збережений в режимі знищити після прочитання.",
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "ЛИШЕ ДЛЯ ВАШИХ ОЧЕЙ. Не закривайте це вікно, це повідомлення не може бути показано знову.",
"Could not decrypt comment; Wrong key?": "Неможливо розшифрувати коментар; Неправильний ключ?",
@@ -166,7 +166,7 @@
"YiB": "Йбайт",
"Format": "Формат",
"Plain Text": "Звичайний текст",
"Source Code": "Джерельний код",
"Source Code": "Вихідний код",
"Markdown": "Мова розмітки",
"Download attachment": "Звантажити прикріплений файл",
"Cloned: '%s'": "Дубльовано: '%s'",
@@ -213,9 +213,12 @@
"Save paste": "Зберегти вставку",
"Your IP is not authorized to create pastes.": "Вашому 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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Помилка виклику YOURLS. Ймовірно проблема з налаштуванням, наприклад \"apiurl\" чи \"signature\".",
"Error parsing YOURLS response.": "Помилка розбору відповіді YOURLS.",
"This secret message can only be displayed once. Would you like to see it now?": "Спалити після вставки читання можна вивести лише один раз під час завантаження. Відкрити його зараз?",
"Yes, see it": "Так, завантажити",
"Dark Mode": "Темний режим"
"This secret message can only be displayed once. Would you like to see it now?": "Це таємне повідомлення можна надіслати лише один раз. Хочете переглянути його зараз?",
"Yes, see it": "Так, побачити",
"Dark Mode": "Темний режим",
"Error compressing paste, due to missing WebAssembly support.": "Помилка при стисканні допису, через відсутність підтримки WebAssembly сервера.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Помилка при розпакуванні допису, бо ваш браузер не підтримує WebAssembly. Будь ласка, відкрийте в іншому браузері для перегляду цього допису.",
"Start over": "Start over"
}

View File

@@ -217,5 +217,8 @@
"Error parsing YOURLS response.": "解析 YOURLS 响应时出错。",
"This secret message can only be displayed once. Would you like to see it now?": "读取粘贴后只能在加载时显示一次。您想现在打开吗?",
"Yes, see it": "是的,加载它",
"Dark Mode": "暗黑模式"
"Dark Mode": "暗黑模式",
"Error compressing paste, due to missing WebAssembly support.": "Error compressing paste, due to missing WebAssembly support.",
"Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.": "Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.",
"Start over": "Start over"
}

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
// change this, if your php files and data is outside of your webservers document root

View File

@@ -17,7 +17,7 @@ require('./prettify');
global.prettyPrint = window.PR.prettyPrint;
global.prettyPrintOne = window.PR.prettyPrintOne;
global.showdown = require('./showdown-2.1.0');
global.DOMPurify = require('./purify-3.1.2');
global.DOMPurify = require('./purify-3.1.7');
global.baseX = require('./base-x-4.0.0').baseX;
global.Legacy = require('./legacy').Legacy;
require('./bootstrap-3.4.1');

View File

@@ -68,9 +68,10 @@
} else {
delStoredPrettifyTheme()
}
setTheme(getStoredPreferredTheme())
const toggle = document.querySelector('#bd-theme')
toggle.checked = getStoredTheme() === 'dark'
const theme = getStoredPreferredTheme()
setTheme(theme)
toggle.checked = (theme === 'dark')
toggle.addEventListener('change', (event) => {
const theme = event.currentTarget.checked ? 'dark' : 'light'
setStoredTheme(theme)

8
js/package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "privatebin",
"version": "1.6.2",
"version": "1.7.5",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "privatebin",
"version": "1.6.2",
"version": "1.7.5",
"license": "zlib-acknowledgement",
"devDependencies": {
"@peculiar/webcrypto": "^1.1.1",
@@ -49,7 +49,7 @@
"@peculiar/json-schema": "^1.1.12",
"pvtsutils": "^1.3.2",
"tslib": "^2.4.0",
"webcrypto-core": "^1.7.4"
"webcrypto-core": "^1.7.5"
},
"engines": {
"node": ">=10.12.0"
@@ -1012,7 +1012,7 @@
"@peculiar/json-schema": "^1.1.12",
"pvtsutils": "^1.3.2",
"tslib": "^2.4.0",
"webcrypto-core": "^1.7.4"
"webcrypto-core": "^1.7.5"
}
},
"abab": {

View File

@@ -1,6 +1,6 @@
{
"name": "privatebin",
"version": "1.7.2",
"version": "1.7.5",
"description": "PrivateBin is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bit AES in Galois Counter mode (GCM).",
"main": "privatebin.js",
"directories": {
@@ -15,7 +15,8 @@
"@peculiar/webcrypto": "^1.1.1"
},
"scripts": {
"test": "mocha"
"test": "mocha",
"ci-test": "mocha --reporter xunit --reporter-option output=mocha-results.xml"
},
"repository": {
"type": "git",

View File

@@ -6,7 +6,6 @@
* @see {@link https://github.com/PrivateBin/PrivateBin}
* @copyright 2012 Sébastien SAUVAGE ({@link http://sebsauvage.net})
* @license {@link https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License}
* @version 1.7.2
* @name PrivateBin
* @namespace
*/
@@ -1068,7 +1067,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
if (mode === 'zlib' || mode === 'none') {
if (mode === 'zlib') {
if (typeof zlib === 'undefined') {
throw 'Error decompressing paste, due to missing WebAssembly support.'
throw 'Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.'
}
data = zlib.inflate(
new Uint8Array(data)
@@ -1305,7 +1304,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
spec[1] = atob(spec[1]);
if (spec[7] === 'zlib') {
if (typeof zlib === 'undefined') {
throw 'Error decompressing paste, due to missing WebAssembly support.'
throw 'Error decompressing paste, your browser does not support WebAssembly. Please use another browser to view this paste.'
}
}
try {
@@ -3767,6 +3766,18 @@ jQuery.PrivateBin = (function($, RawDeflate) {
}
}
/**
* Clear the password input in the top navigation
*
* @name TopNav.clearPasswordInput
* @function
*/
function clearPasswordInput()
{
$passwordInput.val('');
}
/**
* Clear the attachment input in the top navigation.
@@ -3831,7 +3842,8 @@ jQuery.PrivateBin = (function($, RawDeflate) {
*/
function downloadText()
{
var filename='paste-' + Model.getPasteId() + '.txt';
var fileFormat = PasteViewer.getFormat() === 'markdown' ? '.md' : '.txt';
var filename='paste-' + Model.getPasteId() + fileFormat;
var text = PasteViewer.getText();
var element = document.createElement('a');
@@ -3976,7 +3988,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
}
emailBody += I18n._('Link:');
emailBody += EOL;
emailBody += $('#pasteurl').attr('href'); // might have been shortened
emailBody += $('#pasteurl').attr('href') || window.location.href; // href is tried first as it might have been shortened
return emailBody;
}
@@ -4348,6 +4360,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
me.resetInput = function()
{
clearAttachmentInput();
clearPasswordInput();
$burnAfterReading.prop('checked', burnAfterReadingDefault);
$openDiscussion.prop('checked', openDiscussionDefault);
if (openDiscussionDefault || !burnAfterReadingDefault) $openDiscussionOption.removeClass('buttondisabled');
@@ -4371,7 +4384,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
*/
me.getExpiration = function()
{
return Model.getExpirationDefault() || pasteExpiration;
return pasteExpiration;
};
/**
@@ -4554,6 +4567,10 @@ jQuery.PrivateBin = (function($, RawDeflate) {
// bootstrap template drop downs
$('ul.dropdown-menu li a', $('#expiration').parent()).click(updateExpiration);
$('ul.dropdown-menu li a', $('#formatter').parent()).click(updateFormat);
// bootstrap5 & page drop downs
$('#pasteExpiration').on('change', function() {
pasteExpiration = Model.getExpirationDefault();
});
$('#pasteFormatter').on('change', function() {
PasteViewer.setFormat(Model.getFormatDefault());
});
@@ -4565,7 +4582,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
// get default values from template or fall back to set value
burnAfterReadingDefault = me.getBurnAfterReading();
openDiscussionDefault = me.getOpenDiscussion();
pasteExpiration = Model.getExpirationDefault() || pasteExpiration;
pasteExpiration = Model.getExpirationDefault();
createButtonsDisplayed = false;
viewButtonsDisplayed = false;
@@ -5609,8 +5626,11 @@ jQuery.PrivateBin = (function($, RawDeflate) {
me.initZ();
// if delete token is passed (i.e. paste has been deleted by this
// access), there is nothing more to do
// access), add an event listener for the 'new' paste button in the alert
if (Model.hasDeleteToken()) {
$("#new-from-alert").on("click", function () {
UiHelper.reloadHome();
});
return;
}

File diff suppressed because one or more lines are too long

2
js/purify-3.1.7.js Normal file

File diff suppressed because one or more lines are too long

View File

@@ -456,8 +456,14 @@ describe('TopNav', function () {
it(
'returns the currently selected expiration date',
function () {
$('body').html(
'<select id="pasteExpiration" name="pasteExpiration">' +
'<option value="1day">1 day</option>' +
'<option value="never">Never</option></select>'
);
$.PrivateBin.TopNav.init();
assert.ok($.PrivateBin.TopNav.getExpiration() === null);
assert.ok($.PrivateBin.TopNav.getExpiration() === '1day');
cleanup();
}
);
});
@@ -606,7 +612,6 @@ describe('TopNav', function () {
);
});
describe('getPassword', function () {
before(function () {
cleanup();
@@ -675,4 +680,67 @@ describe('TopNav', function () {
}
);
});
describe('hideAllButtons', function () {
before(function () {
cleanup();
});
it(
'hides all buttons correctly',
function () {
// Insert any setup code needed for the hideAllButtons function
// Example: Initialize the DOM elements required for testing
$('body').html(
'<nav class="navbar navbar-inverse navbar-static-top">' +
'<div id="navbar" class="navbar-collapse collapse"><ul ' +
'class="nav navbar-nav"><li><button id="newbutton" ' +
'type="button" class="hidden btn btn-warning navbar-btn">' +
'<span class="glyphicon glyphicon-file" aria-hidden="true">' +
'</span> New</button><button id="clonebutton" type="button"' +
' class="hidden btn btn-warning navbar-btn">' +
'<span class="glyphicon glyphicon-duplicate" ' +
'aria-hidden="true"></span> Clone</button><button ' +
'id="rawtextbutton" type="button" class="hidden btn ' +
'btn-warning navbar-btn"><span class="glyphicon ' +
'glyphicon-text-background" aria-hidden="true"></span> ' +
'Raw text</button><button id="qrcodelink" type="button" ' +
'data-toggle="modal" data-target="#qrcodemodal" ' +
'class="hidden btn btn-warning navbar-btn"><span ' +
'class="glyphicon glyphicon-qrcode" aria-hidden="true">' +
'</span> QR code</button></li></ul></div></nav>'
);
$.PrivateBin.TopNav.init();
$.PrivateBin.TopNav.hideAllButtons();
assert.ok($('#newbutton').hasClass('hidden'));
assert.ok($('#clonebutton').hasClass('hidden'));
assert.ok($('#rawtextbutton').hasClass('hidden'));
assert.ok($('#qrcodelink').hasClass('hidden'));
cleanup();
}
);
});
describe('rawText', function () {
before(function () {
cleanup();
});
it(
'displays raw text view correctly',
function () {
const clean = jsdom('', {url: 'https://privatebin.net/?0123456789abcdef#0'});
global.URL = require('jsdom-url').URL;
$('body').html('<button id="rawtextbutton"></button>');
const sample = 'example';
$.PrivateBin.PasteViewer.setText(sample);
$.PrivateBin.Helper.reset();
$.PrivateBin.TopNav.init();
$('#rawtextbutton').click();
assert.equal($('pre').text(), sample);
clean();
}
);
});
});

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,13 +7,11 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin;
use Exception;
use PDO;
/**
* Configuration
@@ -99,6 +97,23 @@ class Configuration
'signature' => '',
'apiurl' => '',
),
// update this array when adding/changing/removing js files
'sri' => array(
'js/base-x-4.0.0.js' => 'sha512-nNPg5IGCwwrveZ8cA/yMGr5HiRS5Ps2H+s0J/mKTPjCPWUgFGGw7M5nqdnPD3VsRwCVysUh3Y8OWjeSKGkEQJQ==',
'js/base64-1.7.js' => 'sha512-JdwsSP3GyHR+jaCkns9CL9NTt4JUJqm/BsODGmYhBcj5EAPKcHYh+OiMfyHbcDLECe17TL0hjXADFkusAqiYgA==',
'js/bootstrap-3.4.1.js' => 'sha512-oBTprMeNEKCnqfuqKd6sbvFzmFQtlXS3e0C/RGFV0hD6QzhHV+ODfaQbAlmY6/q0ubbwlAM/nCJjkrgA3waLzg==',
'js/bootstrap-5.3.3.js' => 'sha512-in2rcOpLTdJ7/pw5qjF4LWHFRtgoBDxXCy49H4YGOcVdGiPaQucGIbOqxt1JvmpvOpq3J/C7VTa0FlioakB2gQ==',
'js/dark-mode-switch.js' => 'sha512-CCbdHdeWDbDO7aqFFmhgnvFESzaILHbUYmbhNjTpcjyO/XYdouQ9Pw8W9rpV8oJT1TsK5FbwSHU1oazmnb7BWA==',
'js/jquery-3.7.1.js' => 'sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==',
'js/kjua-0.9.0.js' => 'sha512-CVn7af+vTMBd9RjoS4QM5fpLFEOtBCoB0zPtaqIDC7sF4F8qgUSRFQQpIyEDGsr6yrjbuOLzdf20tkHHmpaqwQ==',
'js/legacy.js' => 'sha512-LYos+qXHIRqFf5ZPNphvtTB0cgzHUizu2wwcOwcwz/VIpRv9lpcBgPYz4uq6jx0INwCAj6Fbnl5HoKiLufS2jg==',
'js/prettify.js' => 'sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==',
'js/privatebin.js' => 'sha512-JUj/Sbl/bMHlIoIUT1U9e89JU33fDBxCxLSGxwwaeydBFXOBHyfdF7hwSIjgbPxb4d9CO7CSe4meouTIRMy8Vg==',
'js/purify-3.1.7.js' => 'sha512-LegvqULiMtOfboJZw9MpETN/b+xnLRXZI90gG7oIFHW+yAeHmKvRtEUbiMFx2WvUqQoL9XB3gwU+hWXUT0X+8A==',
'js/rawinflate-0.3.js' => 'sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==',
'js/showdown-2.1.0.js' => 'sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==',
'js/zlib-1.3.1.js' => 'sha512-Z90oppVx/mn0DG2k9airjFVQuliELlXLeT3SRiO6MLiUSbhGlAq+UFwmYbG4i9mwW87dkG8fgJPapGwnUq7Osg==',
),
);
/**
@@ -150,7 +165,7 @@ class Configuration
'tbl' => null,
'usr' => null,
'pwd' => null,
'opt' => array(PDO::ATTR_PERSISTENT => true),
'opt' => array(),
);
} elseif (
$section == 'model_options' && in_array(
@@ -194,6 +209,10 @@ class Configuration
}
// check for missing keys and set defaults if necessary
else {
// preserve configured SRI hashes
if ($section == 'sri' && array_key_exists($section, $config)) {
$this->_configuration[$section] = $config[$section];
}
foreach ($values as $key => $val) {
if ($key == 'dir') {
$val = PATH . $val;
@@ -215,6 +234,8 @@ class Configuration
$result = (int) $config[$section][$key];
} elseif (is_string($val) && !empty($config[$section][$key])) {
$result = (string) $config[$section][$key];
} elseif (is_array($val) && is_array($config[$section][$key])) {
$result = $config[$section][$key];
}
}
$this->_configuration[$section][$key] = $result;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin;
@@ -28,7 +27,7 @@ class Controller
*
* @const string
*/
const VERSION = '1.7.2';
const VERSION = '1.7.5';
/**
* minimal required PHP version
@@ -68,6 +67,14 @@ class Controller
*/
private $_status = '';
/**
* status message
*
* @access private
* @var bool
*/
private $_is_deleted = false;
/**
* JSON message
*
@@ -309,7 +316,8 @@ class Controller
if (hash_equals($paste->getDeleteToken(), $deletetoken)) {
// Paste exists and deletion token is valid: Delete the paste.
$paste->delete();
$this->_status = 'Paste was properly deleted.';
$this->_status = 'Paste was properly deleted.';
$this->_is_deleted = true;
} else {
$this->_error = 'Wrong deletion token. Paste was not deleted.';
}
@@ -413,6 +421,7 @@ class Controller
}
$page->assign('BASEPATH', I18n::_($this->_conf->getKey('basepath')));
$page->assign('STATUS', I18n::_($this->_status));
$page->assign('ISDELETED', I18n::_(json_encode($this->_is_deleted)));
$page->assign('VERSION', self::VERSION);
$page->assign('DISCUSSION', $this->_conf->getKey('discussion'));
$page->assign('OPENDISCUSSION', $this->_conf->getKey('opendiscussion'));
@@ -437,6 +446,7 @@ class Controller
$page->assign('HTTPWARNING', $this->_conf->getKey('httpwarning'));
$page->assign('HTTPSLINK', 'https://' . $this->_request->getHost() . $this->_request->getRequestUri());
$page->assign('COMPRESSION', $this->_conf->getKey('compression'));
$page->assign('SRI', $this->_conf->getSection('sri'));
$page->draw($this->_conf->getKey('template'));
}

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin\Data;
@@ -182,7 +181,7 @@ abstract class AbstractData
protected function getOpenSlot(array &$comments, $postdate)
{
if (array_key_exists($postdate, $comments)) {
$parts = explode('.', $postdate, 2);
$parts = explode('.', (string) $postdate, 2);
if (!array_key_exists(1, $parts)) {
$parts[1] = 0;
}

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin\Data;
@@ -73,7 +72,9 @@ class Database extends AbstractData
// set default options
$options['opt'][PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$options['opt'][PDO::ATTR_EMULATE_PREPARES] = false;
$options['opt'][PDO::ATTR_PERSISTENT] = true;
if (!array_key_exists(PDO::ATTR_PERSISTENT, $options['opt'])) {
$options['opt'][PDO::ATTR_PERSISTENT] = true;
}
$db_tables_exist = true;
// setup type and dabase connection
@@ -505,8 +506,8 @@ class Database extends AbstractData
private function _exec($sql, array $params)
{
$statement = $this->_db->prepare($sql);
foreach ($params as $key => &$parameter) {
$position = $key + 1;
$position = 1;
foreach ($params as &$parameter) {
if (is_int($parameter)) {
$statement->bindParam($position, $parameter, PDO::PARAM_INT);
} elseif (is_string($parameter) && strlen($parameter) >= 4000) {
@@ -514,6 +515,7 @@ class Database extends AbstractData
} else {
$statement->bindParam($position, $parameter);
}
++$position;
}
$result = $statement->execute();
$statement->closeCursor();
@@ -599,18 +601,8 @@ class Database extends AbstractData
$sql = 'SELECT table_name FROM all_tables';
break;
case 'pgsql':
$sql = 'SELECT c."relname" AS "table_name" '
. 'FROM "pg_class" c, "pg_user" u '
. 'WHERE c."relowner" = u."usesysid" AND c."relkind" = \'r\' '
. 'AND NOT EXISTS (SELECT 1 FROM "pg_views" WHERE "viewname" = c."relname") '
. "AND c.\"relname\" !~ '^(pg_|sql_)' "
. 'UNION '
. 'SELECT c."relname" AS "table_name" '
. 'FROM "pg_class" c '
. "WHERE c.\"relkind\" = 'r' "
. 'AND NOT EXISTS (SELECT 1 FROM "pg_views" WHERE "viewname" = c."relname") '
. 'AND NOT EXISTS (SELECT 1 FROM "pg_user" WHERE "usesysid" = c."relowner") '
. "AND c.\"relname\" !~ '^pg_'";
$sql = 'SELECT "tablename" FROM "pg_catalog"."pg_tables" '
. 'WHERE "schemaname" NOT IN (\'pg_catalog\', \'information_schema\')';
break;
case 'sqlite':
$sql = 'SELECT "name" FROM "sqlite_master" WHERE "type"=\'table\' '
@@ -853,90 +845,87 @@ class Database extends AbstractData
{
$dataType = $this->_getDataType();
$attachmentType = $this->_getAttachmentType();
switch ($oldversion) {
case '0.21':
// create the meta column if necessary (pre 0.21 change)
try {
$this->_db->exec(
'SELECT "meta" FROM "' . $this->_sanitizeIdentifier('paste') . '" ' .
($this->_type === 'oci' ? 'FETCH NEXT 1 ROWS ONLY' : 'LIMIT 1')
);
} catch (PDOException $e) {
$this->_db->exec('ALTER TABLE "' . $this->_sanitizeIdentifier('paste') . '" ADD COLUMN "meta" TEXT');
}
// SQLite only allows one ALTER statement at a time...
if (version_compare($oldversion, '0.21', '<=')) {
// create the meta column if necessary (pre 0.21 change)
try {
$this->_db->exec(
'SELECT "meta" FROM "' . $this->_sanitizeIdentifier('paste') . '" ' .
($this->_type === 'oci' ? 'FETCH NEXT 1 ROWS ONLY' : 'LIMIT 1')
);
} catch (PDOException $e) {
$this->_db->exec('ALTER TABLE "' . $this->_sanitizeIdentifier('paste') . '" ADD COLUMN "meta" TEXT');
}
// SQLite only allows one ALTER statement at a time...
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') .
"\" ADD COLUMN \"attachment\" $attachmentType"
);
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') . "\" ADD COLUMN \"attachmentname\" $dataType"
);
// SQLite doesn't support MODIFY, but it allows TEXT of similar
// size as BLOB, so there is no need to change it there
if ($this->_type !== 'sqlite') {
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') .
"\" ADD COLUMN \"attachment\" $attachmentType"
"\" ADD PRIMARY KEY (\"dataid\"), MODIFY COLUMN \"data\" $dataType"
);
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') . "\" ADD COLUMN \"attachmentname\" $dataType"
'ALTER TABLE "' . $this->_sanitizeIdentifier('comment') .
"\" ADD PRIMARY KEY (\"dataid\"), MODIFY COLUMN \"data\" $dataType, " .
"MODIFY COLUMN \"nickname\" $dataType, MODIFY COLUMN \"vizhash\" $dataType"
);
// SQLite doesn't support MODIFY, but it allows TEXT of similar
// size as BLOB, so there is no need to change it there
if ($this->_type !== 'sqlite') {
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') .
"\" ADD PRIMARY KEY (\"dataid\"), MODIFY COLUMN \"data\" $dataType"
);
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('comment') .
"\" ADD PRIMARY KEY (\"dataid\"), MODIFY COLUMN \"data\" $dataType, " .
"MODIFY COLUMN \"nickname\" $dataType, MODIFY COLUMN \"vizhash\" $dataType"
);
} else {
$this->_db->exec(
'CREATE UNIQUE INDEX IF NOT EXISTS "' .
$this->_sanitizeIdentifier('paste_dataid') . '" ON "' .
$this->_sanitizeIdentifier('paste') . '" ("dataid")'
);
$this->_db->exec(
'CREATE UNIQUE INDEX IF NOT EXISTS "' .
$this->_sanitizeIdentifier('comment_dataid') . '" ON "' .
$this->_sanitizeIdentifier('comment') . '" ("dataid")'
);
}
// CREATE INDEX IF NOT EXISTS not supported as of Oracle MySQL <= 8.0
} else {
$this->_db->exec(
'CREATE INDEX "' .
$this->_sanitizeIdentifier('comment_parent') . '" ON "' .
$this->_sanitizeIdentifier('comment') . '" ("pasteid")'
'CREATE UNIQUE INDEX IF NOT EXISTS "' .
$this->_sanitizeIdentifier('paste_dataid') . '" ON "' .
$this->_sanitizeIdentifier('paste') . '" ("dataid")'
);
// no break, continue with updates for 0.22 and later
case '1.3':
// SQLite doesn't support MODIFY, but it allows TEXT of similar
// size as BLOB and PostgreSQL uses TEXT, so there is no need
// to change it there
if ($this->_type !== 'sqlite' && $this->_type !== 'pgsql') {
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') .
"\" MODIFY COLUMN \"data\" $attachmentType"
);
}
// no break, continue with updates for all newer versions
case '1.7.2':
$supportsDropColumn = true;
if ($this->_type === 'sqlite') {
try {
$row = $this->_select('SELECT sqlite_version() AS "v"', array(), true);
$supportsDropColumn = version_compare($row['v'], '3.35.0', '>=');
} catch (PDOException $e) {
$supportsDropColumn = false;
}
}
if ($supportsDropColumn) {
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') .
'" DROP COLUMN "postdate"'
);
}
// no break, continue with updates for all newer versions
default:
$this->_exec(
'UPDATE "' . $this->_sanitizeIdentifier('config') .
'" SET "value" = ? WHERE "id" = ?',
array(Controller::VERSION, 'VERSION')
$this->_db->exec(
'CREATE UNIQUE INDEX IF NOT EXISTS "' .
$this->_sanitizeIdentifier('comment_dataid') . '" ON "' .
$this->_sanitizeIdentifier('comment') . '" ("dataid")'
);
}
// CREATE INDEX IF NOT EXISTS not supported as of Oracle MySQL <= 8.0
$this->_db->exec(
'CREATE INDEX "' .
$this->_sanitizeIdentifier('comment_parent') . '" ON "' .
$this->_sanitizeIdentifier('comment') . '" ("pasteid")'
);
}
if (version_compare($oldversion, '1.3', '<=')) {
// SQLite doesn't support MODIFY, but it allows TEXT of similar
// size as BLOB and PostgreSQL uses TEXT, so there is no need
// to change it there
if ($this->_type !== 'sqlite' && $this->_type !== 'pgsql') {
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') .
"\" MODIFY COLUMN \"data\" $attachmentType"
);
}
}
if (version_compare($oldversion, '1.7.1', '<=')) {
$supportsDropColumn = true;
if ($this->_type === 'sqlite') {
try {
$row = $this->_select('SELECT sqlite_version() AS "v"', array(), true);
$supportsDropColumn = version_compare($row['v'], '3.35.0', '>=');
} catch (PDOException $e) {
$supportsDropColumn = false;
}
}
if ($supportsDropColumn) {
$this->_db->exec(
'ALTER TABLE "' . $this->_sanitizeIdentifier('paste') .
'" DROP COLUMN "postdate"'
);
}
}
$this->_exec(
'UPDATE "' . $this->_sanitizeIdentifier('config') .
'" SET "value" = ? WHERE "id" = ?',
array(Controller::VERSION, 'VERSION')
);
}
}

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin\Data;

View File

@@ -1,4 +1,13 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
* a zero-knowledge paste bin
*
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
*/
namespace PrivateBin\Data;

View File

@@ -1,15 +1,15 @@
<?php
<?php declare(strict_types=1);
/**
* S3.php
* PrivateBin
*
* an S3 compatible data backend for PrivateBin with CEPH/RadosGW in mind
* see https://docs.ceph.com/en/latest/radosgw/s3/php/
* based on lib/Data/GoogleCloudStorage.php from PrivateBin version 1.7.2
* a zero-knowledge paste bin
*
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2022 Felix J. Ogris (https://ogris.de/)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.4.1
*
* an S3 compatible data backend for PrivateBin with CEPH/RadosGW in mind
* see https://docs.ceph.com/en/latest/radosgw/s3/php/
*
* Installation:
* 1. Make sure you have composer.lock and composer.json in the document root of your PasteBin

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin\Model;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin\Model;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin\Model;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin\Persistence;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin\Persistence;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin\Persistence;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
@@ -8,7 +8,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin\Persistence;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin;
@@ -84,6 +83,7 @@ class Request
{
foreach ($_GET as $key => $value) {
// only return if value is empty and key is 16 hex chars
$key = (string) $key;
if (($value === '') && strlen($key) === 16 && ctype_xdigit($key)) {
return $key;
}

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin;
@@ -58,4 +57,23 @@ class View
extract($this->_variables);
include $path;
}
/**
* echo script tag incl. SRI hash for given script file
*
* @access private
* @param string $file
* @param string $attributes additional attributes to add into the script tag
*/
private function _scriptTag($file, $attributes = '')
{
$sri = array_key_exists($file, $this->_variables['SRI']) ?
' integrity="' . $this->_variables['SRI'][$file] . '"' : '';
// if the file isn't versioned (ends in a digit), add our own version
$cacheBuster = ctype_digit(substr($file, -4, 1)) ?
'' : '?' . rawurlencode($this->_variables['VERSION']);
echo '<script ', $attributes,
' type="text/javascript" data-cfasync="false" src="', $file,
$cacheBuster, '"', $sri, ' crossorigin="anonymous"></script>', PHP_EOL;
}
}

View File

@@ -1,14 +1,13 @@
<?php
<?php declare(strict_types=1);
/**
* VizHash_GD
*
* Visual Hash implementation in php4+GD,
* stripped down and modified version for PrivateBin
* stripped down from version 0.0.5 beta, modified for PrivateBin
*
* @link https://sebsauvage.net/wiki/doku.php?id=php:vizhash_gd
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.0.5 beta PrivateBin 1.7.2
*/
namespace PrivateBin;

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
/**
* PrivateBin
*
@@ -7,7 +7,6 @@
* @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.7.2
*/
namespace PrivateBin;
@@ -48,7 +47,7 @@ class YourlsProxy
*/
public function __construct(Configuration $conf, $link)
{
if (strpos($link, $conf->getKey('basepath') . '?') === false) {
if (strpos($link, $conf->getKey('basepath') . '?') !== 0) {
$this->_error = 'Trying to shorten a URL that isn\'t pointing at our instance.';
return;
}

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
use PrivateBin\I18n;
$isCpct = substr($template, 9, 8) === '-compact';
$isDark = substr($template, 9, 5) === '-dark';
@@ -42,38 +42,38 @@ if ($SYNTAXHIGHLIGHTING) :
endif;
?>
<noscript><link type="text/css" rel="stylesheet" href="css/noscript.css" /></noscript>
<script type="text/javascript" data-cfasync="false" src="js/jquery-3.7.1.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/jquery-3.7.1.js', 'defer'); ?>
<?php
if ($QRCODE) :
?>
<script async type="text/javascript" data-cfasync="false" src="js/kjua-0.9.0.js" integrity="sha512-CVn7af+vTMBd9RjoS4QM5fpLFEOtBCoB0zPtaqIDC7sF4F8qgUSRFQQpIyEDGsr6yrjbuOLzdf20tkHHmpaqwQ==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/kjua-0.9.0.js', 'async'); ?>
<?php
endif;
if ($ZEROBINCOMPATIBILITY) :
?>
<script type="text/javascript" data-cfasync="false" src="js/base64-1.7.js" integrity="sha512-JdwsSP3GyHR+jaCkns9CL9NTt4JUJqm/BsODGmYhBcj5EAPKcHYh+OiMfyHbcDLECe17TL0hjXADFkusAqiYgA==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/base64-1.7.js', 'async'); ?>
<?php
endif;
?>
<script type="text/javascript" data-cfasync="false" src="js/zlib-1.3.1.js" integrity="sha512-Z90oppVx/mn0DG2k9airjFVQuliELlXLeT3SRiO6MLiUSbhGlAq+UFwmYbG4i9mwW87dkG8fgJPapGwnUq7Osg==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/base-x-4.0.0.js" integrity="sha512-nNPg5IGCwwrveZ8cA/yMGr5HiRS5Ps2H+s0J/mKTPjCPWUgFGGw7M5nqdnPD3VsRwCVysUh3Y8OWjeSKGkEQJQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/rawinflate-0.3.js" integrity="sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/bootstrap-3.4.1.js" integrity="sha512-oBTprMeNEKCnqfuqKd6sbvFzmFQtlXS3e0C/RGFV0hD6QzhHV+ODfaQbAlmY6/q0ubbwlAM/nCJjkrgA3waLzg==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/zlib-1.3.1.js', 'async'); ?>
<?php $this->_scriptTag('js/base-x-4.0.0.js', 'defer'); ?>
<?php $this->_scriptTag('js/rawinflate-0.3.js', 'defer'); ?>
<?php $this->_scriptTag('js/bootstrap-3.4.1.js', 'defer'); ?>
<?php
if ($SYNTAXHIGHLIGHTING) :
?>
<script type="text/javascript" data-cfasync="false" src="js/prettify.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/prettify.js', 'async'); ?>
<?php
endif;
if ($MARKDOWN) :
?>
<script type="text/javascript" data-cfasync="false" src="js/showdown-2.1.0.js" integrity="sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/showdown-2.1.0.js', 'async'); ?>
<?php
endif;
?>
<script type="text/javascript" data-cfasync="false" src="js/purify-3.1.2.js" integrity="sha512-voYCOVXik5/jcT+McTiptsB00iB0NWQrhBmSwSEfj0IH3UDphU8w12JV8w1y+m8FRaozbzW4efHSEWKZpOA+JQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/legacy.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-LYos+qXHIRqFf5ZPNphvtTB0cgzHUizu2wwcOwcwz/VIpRv9lpcBgPYz4uq6jx0INwCAj6Fbnl5HoKiLufS2jg==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-scyuqq0YPpGgWRgFIEl1TpTbA2dV1Z0qcBLsl3N6He/j+PvAEe18uV0Gnf/73Muj6GP9f7/iCR43XHYHNoWXGg==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/purify-3.1.7.js', 'async'); ?>
<?php $this->_scriptTag('js/legacy.js', 'async'); ?>
<?php $this->_scriptTag('js/privatebin.js', 'defer'); ?>
<!-- icon -->
<link rel="apple-touch-icon" href="<?php echo I18n::encode($BASEPATH); ?>img/apple-touch-icon.png" sizes="180x180" />
<link rel="icon" type="image/png" href="img/favicon-32x32.png" sizes="32x32" />
@@ -490,9 +490,16 @@ if ($FILEUPLOAD) :
<?php
endif;
?>
<div id="status" role="alert" class="alert alert-info<?php echo empty($STATUS) ? ' hidden' : '' ?>">
<div id="status" role="alert" class="clearfix alert alert-<?php echo (bool)$ISDELETED ? 'success' : 'info'; echo empty($STATUS) ? ' hidden' : '' ?>">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
<?php echo I18n::encode($STATUS), PHP_EOL; ?>
<?php
if ((bool)$ISDELETED):
?>
<button type="button" class="btn btn-default pull-right" id="new-from-alert">
<span class="glyphicon glyphicon-repeat"></span> <?php echo I18n::_('Start over'), PHP_EOL; ?>
</button>
<?php endif; ?>
</div>
<div id="errormessage" role="alert" class="<?php echo empty($ERROR) ? 'hidden' : '' ?> alert alert-danger">
<span class="glyphicon glyphicon-alert" aria-hidden="true"></span>

View File

@@ -1,7 +1,7 @@
<?php
<?php declare(strict_types=1);
use PrivateBin\I18n;
?><!DOCTYPE html>
<html lang="<?php echo I18n::getLanguage(); ?>"<?php echo I18n::isRtl() ? ' dir="rtl"' : ''; ?>>
<html lang="<?php echo I18n::getLanguage(); ?>"<?php echo I18n::isRtl() ? ' dir="rtl"' : ''; ?> class="h-100">
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Security-Policy" content="<?php echo I18n::encode($CSPHEADER); ?>">
@@ -25,39 +25,39 @@ if ($SYNTAXHIGHLIGHTING) :
endif;
?>
<noscript><link type="text/css" rel="stylesheet" href="css/noscript.css" /></noscript>
<script type="text/javascript" data-cfasync="false" src="js/jquery-3.7.1.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/jquery-3.7.1.js', 'defer'); ?>
<?php
if ($QRCODE) :
?>
<script async type="text/javascript" data-cfasync="false" src="js/kjua-0.9.0.js" integrity="sha512-CVn7af+vTMBd9RjoS4QM5fpLFEOtBCoB0zPtaqIDC7sF4F8qgUSRFQQpIyEDGsr6yrjbuOLzdf20tkHHmpaqwQ==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/kjua-0.9.0.js', 'async'); ?>
<?php
endif;
if ($ZEROBINCOMPATIBILITY) :
?>
<script type="text/javascript" data-cfasync="false" src="js/base64-1.7.js" integrity="sha512-JdwsSP3GyHR+jaCkns9CL9NTt4JUJqm/BsODGmYhBcj5EAPKcHYh+OiMfyHbcDLECe17TL0hjXADFkusAqiYgA==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/base64-1.7.js', 'defer'); ?>
<?php
endif;
?>
<script type="text/javascript" data-cfasync="false" src="js/zlib-1.3.1.js" integrity="sha512-Z90oppVx/mn0DG2k9airjFVQuliELlXLeT3SRiO6MLiUSbhGlAq+UFwmYbG4i9mwW87dkG8fgJPapGwnUq7Osg==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/base-x-4.0.0.js" integrity="sha512-nNPg5IGCwwrveZ8cA/yMGr5HiRS5Ps2H+s0J/mKTPjCPWUgFGGw7M5nqdnPD3VsRwCVysUh3Y8OWjeSKGkEQJQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/rawinflate-0.3.js" integrity="sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/bootstrap-5.3.3.js" integrity="sha512-in2rcOpLTdJ7/pw5qjF4LWHFRtgoBDxXCy49H4YGOcVdGiPaQucGIbOqxt1JvmpvOpq3J/C7VTa0FlioakB2gQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/dark-mode-switch.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-xdW325H1OW06oUf/Lc4ccJXOUW41tU08iyXVOiVL3SbTufQtKVWi1/cQPrWZ3FagPTNL2CwDMqZsHNmXruHnHg==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/zlib-1.3.1.js', 'defer'); ?>
<?php $this->_scriptTag('js/base-x-4.0.0.js', 'defer'); ?>
<?php $this->_scriptTag('js/rawinflate-0.3.js', 'defer'); ?>
<?php $this->_scriptTag('js/bootstrap-5.3.3.js', 'async'); ?>
<?php $this->_scriptTag('js/dark-mode-switch.js', 'defer'); ?>
<?php
if ($SYNTAXHIGHLIGHTING) :
?>
<script type="text/javascript" data-cfasync="false" src="js/prettify.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/prettify.js', 'async'); ?>
<?php
endif;
if ($MARKDOWN) :
?>
<script type="text/javascript" data-cfasync="false" src="js/showdown-2.1.0.js" integrity="sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/showdown-2.1.0.js', 'async'); ?>
<?php
endif;
?>
<script type="text/javascript" data-cfasync="false" src="js/purify-3.1.2.js" integrity="sha512-voYCOVXik5/jcT+McTiptsB00iB0NWQrhBmSwSEfj0IH3UDphU8w12JV8w1y+m8FRaozbzW4efHSEWKZpOA+JQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/legacy.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-LYos+qXHIRqFf5ZPNphvtTB0cgzHUizu2wwcOwcwz/VIpRv9lpcBgPYz4uq6jx0INwCAj6Fbnl5HoKiLufS2jg==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-scyuqq0YPpGgWRgFIEl1TpTbA2dV1Z0qcBLsl3N6He/j+PvAEe18uV0Gnf/73Muj6GP9f7/iCR43XHYHNoWXGg==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/purify-3.1.7.js', 'defer'); ?>
<?php $this->_scriptTag('js/legacy.js', 'async'); ?>
<?php $this->_scriptTag('js/privatebin.js', 'defer'); ?>
<!-- icon -->
<link rel="apple-touch-icon" href="<?php echo I18n::encode($BASEPATH); ?>img/apple-touch-icon.png" sizes="180x180" />
<link rel="icon" type="image/png" href="img/favicon-32x32.png" sizes="32x32" />
@@ -80,7 +80,7 @@ endif;
<meta property="og:image:width" content="180" />
<meta property="og:image:height" content="180" />
</head>
<body role="document" data-compression="<?php echo rawurlencode($COMPRESSION); ?>">
<body role="document" data-compression="<?php echo rawurlencode($COMPRESSION); ?>" class="d-flex flex-column h-100">
<div id="passwordmodal" tabindex="-1" class="modal fade" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
@@ -150,7 +150,7 @@ if ($EMAIL) :
<?php
endif;
?>
<nav class="navbar navbar-expand-lg bg-body-tertiary">
<nav class="navbar navbar-expand-lg bg-body-tertiary text-nowrap">
<div class="container-fluid">
<a class="reloadlink navbar-brand" href="">
<img alt="<?php echo I18n::_($NAME); ?>" src="img/icon.svg" height="38" />
@@ -159,48 +159,48 @@ endif;
<span class="navbar-toggler-icon"></span>
</button>
<div id="navbar" class="collapse navbar-collapse">
<ul class="navbar-nav me-auto">
<ul class="navbar-nav me-auto gap-2 align-items-lg-center align-items-stretch">
<li id="loadingindicator" class="navbar-text hidden me-auto">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#clock" /></svg>
<?php echo I18n::_('Loading…'), PHP_EOL; ?>
</li>
<li class="nav-item me-2">
<li class="nav-item d-flex flex-lg-row flex-column">
<button id="retrybutton" type="button" class="reloadlink hidden btn btn-primary">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#repeat" /></svg> <?php echo I18n::_('Retry'), PHP_EOL; ?>
</button>
</li>
<li class="nav-item">
<button id="newbutton" type="button" class="hidden btn btn-secondary me-2">
<li class="nav-item d-flex flex-lg-row flex-column gap-2">
<button id="newbutton" type="button" class="hidden btn btn-secondary flex-fill">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#file-earmark" /></svg> <?php echo I18n::_('New'), PHP_EOL; ?>
</button>
<button id="clonebutton" type="button" class="hidden btn btn-secondary me-2">
<button id="clonebutton" type="button" class="hidden btn btn-secondary flex-fill">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#copy" /></svg> <?php echo I18n::_('Clone'), PHP_EOL; ?>
</button>
<button id="rawtextbutton" type="button" class="hidden btn btn-secondary me-2">
<button id="rawtextbutton" type="button" class="hidden btn btn-secondary flex-fill">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#filetype-txt" /></svg> <?php echo I18n::_('Raw text'), PHP_EOL; ?>
</button>
<button id="downloadtextbutton" type="button" class="hidden btn btn-secondary me-2">
<button id="downloadtextbutton" type="button" class="hidden btn btn-secondary flex-fill">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#download" /></svg> <?php echo I18n::_('Save paste'), PHP_EOL; ?>
</button>
<?php
if ($EMAIL) :
?>
<button id="emaillink" type="button" class="hidden btn btn-secondary me-2">
<button id="emaillink" type="button" class="hidden btn btn-secondary flex-fill">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#envelope" /></svg> <?php echo I18n::_('Email'), PHP_EOL; ?>
</button>
<?php
endif;
if ($QRCODE) :
?>
<button id="qrcodelink" type="button" data-toggle="modal" data-target="#qrcodemodal" class="hidden btn btn-secondary me-2">
<button id="qrcodelink" type="button" data-toggle="modal" data-target="#qrcodemodal" class="hidden btn btn-secondary flex-fill">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#qr-code" /></svg> <?php echo I18n::_('QR code'), PHP_EOL; ?>
</button>
<?php
endif;
?>
</li>
<li id="expiration" class="nav-item me-2 d-flex hidden">
<li id="expiration" class="nav-item d-flex hidden">
<label for="pasteExpiration" class="form-label my-auto me-1"><?php echo I18n::_('Expires'); ?>:</label>
<select id="pasteExpiration" name="pasteExpiration" class="form-select">
<?php
@@ -216,7 +216,7 @@ endforeach;
?>
</select>
</li>
<li class="nav-item me-2">
<li class="nav-item">
<div id="burnafterreadingoption" class="navbar-text form-check hidden">
<input class="form-check-input" type="checkbox" id="burnafterreading" name="burnafterreading"<?php
if ($BURNAFTERREADINGSELECTED) :
@@ -231,7 +231,7 @@ endif;
<?php
if ($DISCUSSION) :
?>
<li class="nav-item me-2">
<li class="nav-item">
<div id="opendiscussionoption" class="navbar-text form-check hidden">
<input class="form-check-input" type="checkbox" id="opendiscussion" name="opendiscussion"<?php
if ($OPENDISCUSSION) :
@@ -247,7 +247,7 @@ if ($DISCUSSION) :
endif;
if ($PASSWORD) :
?>
<li class="nav-item me-2">
<li class="nav-item">
<div id="password" class="navbar-form hidden">
<input type="password" id="passwordinput" placeholder="<?php echo I18n::_('Password (recommended)'); ?>" class="form-control" size="23" />
</div>
@@ -256,9 +256,9 @@ if ($PASSWORD) :
endif;
if ($FILEUPLOAD) :
?>
<li id="attach" class="nav-item hidden dropdown me-2">
<li id="attach" class="nav-item hidden dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown" role="button" aria-expanded="false"><?php echo I18n::_('Attach a file'); ?></a>
<ul class="dropdown-menu">
<ul class="dropdown-menu px-2">
<li id="filewrap">
<div>
<input type="file" id="file" name="file" class="form-control" />
@@ -276,7 +276,7 @@ if ($FILEUPLOAD) :
<?php
endif;
?>
<li id="formatter" class="nav-item me-2 d-flex hidden">
<li id="formatter" class="nav-item d-flex hidden">
<label for="pasteFormatter" class="form-label my-auto me-1"><?php echo I18n::_('Format'); ?>:</label>
<select id="pasteFormatter" name="pasteFormatter" class="form-select">
<?php
@@ -293,7 +293,7 @@ endif;
</select>
</li>
</ul>
<ul class="navbar-nav">
<ul class="navbar-nav gap-2">
<li class="nav-item">
<div class="form-check form-switch navbar-text">
<input id="bd-theme" type="checkbox" class="form-check-input">
@@ -303,7 +303,7 @@ endif;
<?php
if (!empty($LANGUAGESELECTION)) :
?>
<li id="language" class="nav-item dropdown ms-2">
<li id="language" class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown" role="button" aria-expanded="false">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#flag" /></svg> <?php echo $LANGUAGES[$LANGUAGESELECTION][0], PHP_EOL; ?>
</a>
@@ -329,7 +329,7 @@ endif;
</div>
</nav>
<main>
<section class="container mt-2">
<section class="container-fluid mt-2">
<?php
if (!empty($NOTICE)) :
?>
@@ -353,9 +353,18 @@ if ($FILEUPLOAD) :
<?php
endif;
?>
<div id="status" role="alert" class="alert alert-info<?php echo empty($STATUS) ? ' hidden' : '' ?>">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#info-circle" /></svg>
<?php echo I18n::encode($STATUS), PHP_EOL; ?>
<div id="status" role="alert" class="d-flex justify-content-between align-items-center alert alert-<?php echo (bool)$ISDELETED ? 'success' : 'info'; echo empty($STATUS) ? ' hidden' : '' ?>">
<div>
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#info-circle" /></svg>
<?php echo I18n::encode($STATUS), PHP_EOL; ?>
</div>
<?php
if ((bool)$ISDELETED):
?>
<button type="button" class="btn btn-secondary" id="new-from-alert">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#repeat" /></svg> <?php echo I18n::_('Start over'), PHP_EOL; ?>
</button>
<?php endif; ?>
</div>
<div id="errormessage" role="alert" class="<?php echo empty($ERROR) ? 'hidden' : '' ?> alert alert-danger">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#exclamation-triangle" /></svg>
@@ -422,52 +431,52 @@ endif;
</li>
</ul>
</section>
<section class="container">
<article class="row">
<section class="container-fluid">
<article>
<div id="placeholder" class="col-md-12 hidden"><?php echo I18n::_('+++ no paste text +++'); ?></div>
<div id="attachmentPreview" class="col-md-12 text-center hidden"></div>
<div id="prettymessage" class="col-md-12 hidden">
<pre id="prettyprint" class="col-md-12 prettyprint linenums:1"></pre>
<div id="prettymessage" class="card col-md-12 hidden">
<pre id="prettyprint" class="card-body col-md-12 prettyprint linenums:1"></pre>
</div>
<div id="plaintext" class="col-md-12 hidden"></div>
<p class="col-md-12"><textarea id="message" name="message" cols="80" rows="25" class="form-control hidden"></textarea></p>
</article>
</section>
<section class="container">
<section class="container-fluid">
<div id="discussion" class="hidden">
<h4><?php echo I18n::_('Discussion'); ?></h4>
<div id="commentcontainer"></div>
</div>
</section>
<section class="container">
<section class="container-fluid">
<div id="noscript" role="alert" class="alert alert-info noscript-hide">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#exclamation-circle" /></svg>
<?php echo I18n::_('Loading…'); ?><br />
<span class="small"><?php echo I18n::_('In case this message never disappears please have a look at <a href="%s">this FAQ for information to troubleshoot</a>.', 'https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-the-loading-message-not-go-away'); ?></span>
</div>
</section>
<footer class="container">
<div class="row">
<h4 class="col-md-5 col-xs-8"><?php echo I18n::_($NAME); ?> <small>- <?php echo I18n::_('Because ignorance is bliss'); ?></small></h4>
<p class="col-md-1 col-xs-4 text-center"><?php echo $VERSION; ?></p>
<p id="aboutbox" class="col-md-6 col-xs-12">
<?php echo sprintf(
I18n::_('%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.',
I18n::_($NAME),
'%s', '%s'
),
'<i>', '</i>'), ' ', $INFO, PHP_EOL;
?>
</p>
</div>
</footer>
</main>
<footer class="container-fluid mt-auto">
<div class="row">
<h5 class="col-md-5 col-xs-8"><?php echo I18n::_($NAME); ?> <small>- <?php echo I18n::_('Because ignorance is bliss'); ?></small></h5>
<p class="col-md-1 col-xs-4 text-center"><?php echo $VERSION; ?></p>
<p id="aboutbox" class="col-md-6 col-xs-12">
<?php echo sprintf(
I18n::_('%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.',
I18n::_($NAME),
'%s', '%s'
),
'<i>', '</i>'), ' ', $INFO, PHP_EOL;
?>
</p>
</div>
</footer>
<?php
if ($DISCUSSION) :
?>
<div id="serverdata" class="hidden" aria-hidden="true">
<div id="templates">
<article id="commenttemplate" class="comment">
<article id="commenttemplate" class="comment px-2 pb-3">
<div class="commentmeta">
<span class="nickname">name</span>
<span class="commentdate">0000-00-00</span>
@@ -475,11 +484,11 @@ if ($DISCUSSION) :
<div class="commentdata">c</div>
<button class="btn btn-secondary btn-sm"><?php echo I18n::_('Reply'); ?></button>
</article>
<p id="commenttailtemplate" class="comment">
<p id="commenttailtemplate" class="comment px-2 pb-3">
<button class="btn btn-secondary btn-sm"><?php echo I18n::_('Add comment'); ?></button>
</p>
<div id="replytemplate" class="reply hidden">
<input type="text" id="nickname" class="form-control" title="<?php echo I18n::_('Optional nickname…'); ?>" placeholder="<?php echo I18n::_('Optional nickname…'); ?>" />
<input type="text" id="nickname" class="form-control my-2" title="<?php echo I18n::_('Optional nickname…'); ?>" placeholder="<?php echo I18n::_('Optional nickname…'); ?>" />
<textarea id="replymessage" class="replymessage form-control" cols="80" rows="7"></textarea><br />
<div id="replystatus" role="alert" class="statusmessage hidden alert">
<svg width="16" height="16" fill="currentColor" aria-hidden="true"><use href="img/bootstrap-icons.svg#info-circle" /></svg>

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
use PrivateBin\I18n;
?><!DOCTYPE html>
<html lang="<?php echo I18n::getLanguage(); ?>"<?php echo I18n::isRtl() ? ' dir="rtl"' : ''; ?>>
@@ -21,37 +21,37 @@ if ($SYNTAXHIGHLIGHTING):
endif;
endif;
?>
<script type="text/javascript" data-cfasync="false" src="js/jquery-3.7.1.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/jquery-3.7.1.js', 'defer'); ?>
<?php
if ($QRCODE):
?>
<script async type="text/javascript" data-cfasync="false" src="js/kjua-0.9.0.js" integrity="sha512-CVn7af+vTMBd9RjoS4QM5fpLFEOtBCoB0zPtaqIDC7sF4F8qgUSRFQQpIyEDGsr6yrjbuOLzdf20tkHHmpaqwQ==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/kjua-0.9.0.js', 'async'); ?>
<?php
endif;
if ($ZEROBINCOMPATIBILITY):
?>
<script type="text/javascript" data-cfasync="false" src="js/base64-1.7.js" integrity="sha512-JdwsSP3GyHR+jaCkns9CL9NTt4JUJqm/BsODGmYhBcj5EAPKcHYh+OiMfyHbcDLECe17TL0hjXADFkusAqiYgA==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/base64-1.7.js', 'async'); ?>
<?php
endif;
?>
<script type="text/javascript" data-cfasync="false" src="js/zlib-1.3.1.js" integrity="sha512-Z90oppVx/mn0DG2k9airjFVQuliELlXLeT3SRiO6MLiUSbhGlAq+UFwmYbG4i9mwW87dkG8fgJPapGwnUq7Osg==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/base-x-4.0.0.js" integrity="sha512-nNPg5IGCwwrveZ8cA/yMGr5HiRS5Ps2H+s0J/mKTPjCPWUgFGGw7M5nqdnPD3VsRwCVysUh3Y8OWjeSKGkEQJQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/rawinflate-0.3.js" integrity="sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/zlib-1.3.1.js', 'async'); ?>
<?php $this->_scriptTag('js/base-x-4.0.0.js', 'async'); ?>
<?php $this->_scriptTag('js/rawinflate-0.3.js', 'async'); ?>
<?php
if ($SYNTAXHIGHLIGHTING):
?>
<script type="text/javascript" data-cfasync="false" src="js/prettify.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/prettify.js', 'async'); ?>
<?php
endif;
if ($MARKDOWN):
?>
<script type="text/javascript" data-cfasync="false" src="js/showdown-2.1.0.js" integrity="sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/showdown-2.1.0.js', 'async'); ?>
<?php
endif;
?>
<script type="text/javascript" data-cfasync="false" src="js/purify-3.1.2.js" integrity="sha512-voYCOVXik5/jcT+McTiptsB00iB0NWQrhBmSwSEfj0IH3UDphU8w12JV8w1y+m8FRaozbzW4efHSEWKZpOA+JQ==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/legacy.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-LYos+qXHIRqFf5ZPNphvtTB0cgzHUizu2wwcOwcwz/VIpRv9lpcBgPYz4uq6jx0INwCAj6Fbnl5HoKiLufS2jg==" crossorigin="anonymous"></script>
<script type="text/javascript" data-cfasync="false" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-scyuqq0YPpGgWRgFIEl1TpTbA2dV1Z0qcBLsl3N6He/j+PvAEe18uV0Gnf/73Muj6GP9f7/iCR43XHYHNoWXGg==" crossorigin="anonymous"></script>
<?php $this->_scriptTag('js/purify-3.1.7.js', 'async'); ?>
<?php $this->_scriptTag('js/legacy.js', 'async'); ?>
<?php $this->_scriptTag('js/privatebin.js', 'defer'); ?>
<!-- icon -->
<link rel="apple-touch-icon" href="img/apple-touch-icon.png?<?php echo rawurlencode($VERSION); ?>" sizes="180x180" />
<link rel="icon" type="image/png" href="img/favicon-32x32.png?<?php echo rawurlencode($VERSION); ?>" sizes="32x32" />

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
use PrivateBin\I18n;
?><!DOCTYPE html>
<html lang="<?php echo I18n::getLanguage(); ?>"<?php echo I18n::isRtl() ? ' dir="rtl"' : ''; ?>>

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
use Google\Cloud\Core\Exception\BadRequestException;
use Google\Cloud\Core\Exception\NotFoundException;
@@ -28,94 +28,389 @@ require PATH . 'vendor/autoload.php';
Helper::updateSubresourceIntegrity();
/**
* Class StorageClientStub provides a limited stub for performing the unit test
* Class Helper provides unit tests pastes and comments of various formats
*/
class StorageClientStub extends StorageClient
class Helper
{
private $_config = null;
private $_connection = null;
private static $_buckets = array();
/**
* example ID of a paste
*
* @var string
*/
private static $pasteid = '5b65a01b43987bc2';
public function __construct(array $config = array())
{
$this->_config = $config;
$this->_connection = new ConnectionInterfaceStub();
}
/**
* example paste version 1
*
* @var array
*/
private static $pasteV1 = array(
'data' => '{"iv":"EN39/wd5Nk8HAiSG2K5AsQ","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"QKN1DBXe5PI","ct":"8hA83xDdXjD7K2qfmw5NdA"}',
'attachment' => '{"iv":"Pd4pOKWkmDTT9uPwVwd5Ag","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"6nOCU3peNDclDDpFtJEBKA"}',
'attachmentname' => '{"iv":"76MkAtOGC4oFogX/aSMxRA","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"b6Ae/U1xJdsX/+lATud4sQ"}',
'meta' => array(
'formatter' => 'plaintext',
'postdate' => 1344803344,
'opendiscussion' => true,
),
);
public function bucket($name, $userProject = false)
/**
* example paste version 2
*
* @var array
*/
private static $pasteV2 = array(
'adata' => array(
array(
'gMSNoLOk4z0RnmsYwXZ8mw==',
'TZO+JWuIuxs=',
100000,
256,
128,
'aes',
'gcm',
'zlib',
),
'plaintext',
1,
0,
),
'meta' => array(
'expire' => '5min',
),
'v' => 2,
'ct' => 'ME5JF/YBEijp2uYMzLZozbKtWc5wfy6R59NBb7SmRig=',
);
/**
* example ID of a comment
*
* @var string
*/
private static $commentid = '5a52eebf11c4c94b';
/**
* example comment
*
* @var array
*/
private static $commentV1 = array(
'data' => '{"iv":"Pd4pOKWkmDTT9uPwVwd5Ag","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"6nOCU3peNDclDDpFtJEBKA"}',
'meta' => array(
'nickname' => '{"iv":"76MkAtOGC4oFogX/aSMxRA","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"b6Ae/U1xJdsX/+lATud4sQ"}',
'vizhash' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGUlEQVQokWOsl5/94983CNKQMjnxaOePf98MeKwPfNjkLZ3AgARab6b9+PeNEVnDj3/ff/z7ZiHnzsDA8Pv7H2TVPJw8EAYLAwb48OaVgIgYKycLsrYv378wMDB8//qdCVMDRA9EKSsnCwRBxNsepaLboMFlyMDAICAi9uHNK24GITQ/MDAwoNhgIGMLtwGrzegaLjw5jMz9+vUdnN17uwDCQDhJgk0O07yvX9+teDX1x79v6DYIsIjgcgMaYGFgYOBg4kJx2JejkAiBxAw+PzAwMNz4dp6wDXDw4MdNNOl0rWYsNkD89OLXI/xmo9sgzatJjAYmBgYGDiauD3/ePP18nVgb4MF89+M5ZX6js293wUMpnr8KTQMAxsCJnJ30apMAAAAASUVORK5CYII=',
'postdate' => 1344803528,
),
);
/**
* JS files and their SRI hashes
*
* @var array
*/
private static $hashes = array();
/**
* get example paste ID
*
* @return string
*/
public static function getPasteId(): string
{
if (!key_exists($name, self::$_buckets)) {
$b = new BucketStub($this->_connection, $name, array(), $this);
self::$_buckets[$name] = $b;
}
return self::$_buckets[$name];
return self::$pasteid;
}
/**
* @throws \Google\Cloud\Core\Exception\NotFoundException
* get example paste, as stored on server
*
* @param int $version
* @param array $meta
* @return array
*/
public function deleteBucket($name)
public static function getPaste($version = 2, array $meta = array()): array
{
if (key_exists($name, self::$_buckets)) {
unset(self::$_buckets[$name]);
$example = self::getPasteWithAttachment($version, $meta);
// v1 has the attachment stored in a separate property
if ($version === 1) {
unset($example['attachment'], $example['attachmentname']);
}
return $example;
}
/**
* get example paste with attachment, as stored on server
*
* @param int $version
* @param array $meta
* @return array
*/
public static function getPasteWithAttachment($version = 2, array $meta = array()): array
{
$example = $version === 1 ? self::$pasteV1 : self::$pasteV2;
$example['meta']['salt'] = ServerSalt::generate();
$example['meta'] = array_merge($example['meta'], $meta);
return $example;
}
/**
* get example paste, as decoded from POST by the request object
*
* @param int $version
* @param array $meta
* @return array
*/
public static function getPastePost($version = 2, array $meta = array()): array
{
$example = self::getPaste($version, $meta);
if ($version == 2) {
$example['meta'] = array('expire' => $example['meta']['expire']);
} else {
throw new NotFoundException();
unset($example['meta']['postdate']);
}
return $example;
}
/**
* get example paste, as received via POST by the user
*
* @param int $version
* @param array $meta
* @return string
*/
public static function getPasteJson($version = 2, array $meta = array()): string
{
return json_encode(self::getPastePost($version, $meta));
}
/**
* get example paste ID
*
* @return string
*/
public static function getCommentId(): string
{
return self::$commentid;
}
/**
* get example comment, as stored on server
*
* @param int $version
* @param array $meta
* @return array
*/
public static function getComment($version = 2, array $meta = array()): array
{
$example = $version === 1 ? self::$commentV1 : self::$pasteV2;
if ($version === 2) {
$example['adata'] = $example['adata'][0];
$example['pasteid'] = $example['parentid'] = self::getPasteId();
$example['meta']['created'] = self::$commentV1['meta']['postdate'];
$example['meta']['icon'] = self::$commentV1['meta']['vizhash'];
unset($example['meta']['expire']);
}
$example['meta'] = array_merge($example['meta'], $meta);
return $example;
}
/**
* get example comment, as decoded from POST by the request object
*
* @param int $version
* @return array
*/
public static function getCommentPost(): array
{
$example = self::getComment();
unset($example['meta']);
return $example;
}
/**
* get example comment, as received via POST by user
*
* @param int $version
* @return string
*/
public static function getCommentJson(): string
{
return json_encode(self::getCommentPost());
}
/**
* Returns 16 random hexadecimal characters.
*
* @return string
*/
public static function getRandomId(): string
{
// 8 binary bytes are 16 characters long in hex
return bin2hex(random_bytes(8));
}
/**
* delete directory and all its contents recursively
*
* @param string $path
* @throws Exception
* @return void
*/
public static function rmDir($path): void
{
if (is_dir($path)) {
$path .= DIRECTORY_SEPARATOR;
$dir = dir($path);
while (false !== ($file = $dir->read())) {
if ($file != '.' && $file != '..') {
if (is_dir($path . $file)) {
self::rmDir($path . $file);
} elseif (is_file($path . $file)) {
if (!unlink($path . $file)) {
throw new Exception('Error deleting file "' . $path . $file . '".');
}
}
}
}
$dir->close();
if (!rmdir($path)) {
throw new Exception('Error deleting directory "' . $path . '".');
}
}
}
public function buckets(array $options = array())
/**
* create a backup of the config file
*
* @return void
*/
public static function confBackup(): void
{
throw new BadMethodCallException('not supported by this stub');
}
public function registerStreamWrapper($protocol = null)
{
throw new BadMethodCallException('not supported by this stub');
}
public function unregisterStreamWrapper($protocol = null)
{
throw new BadMethodCallException('not supported by this stub');
}
public function signedUrlUploader($uri, $data, array $options = array())
{
throw new BadMethodCallException('not supported by this stub');
}
public function timestamp(\DateTimeInterface $timestamp, $nanoSeconds = null)
{
throw new BadMethodCallException('not supported by this stub');
}
public function getServiceAccount(array $options = array())
{
throw new BadMethodCallException('not supported by this stub');
}
public function hmacKeys(array $options = array())
{
throw new BadMethodCallException('not supported by this stub');
}
public function hmacKey($accessId, $projectId = null, array $metadata = array())
{
throw new BadMethodCallException('not supported by this stub');
}
public function createHmacKey($serviceAccountEmail, array $options = array())
{
throw new BadMethodCallException('not supported by this stub');
}
public function createBucket($name, array $options = array())
{
if (key_exists($name, self::$_buckets)) {
throw new BadRequestException('already exists');
if (!is_file(CONF . '.bak') && is_file(CONF)) {
rename(CONF, CONF . '.bak');
}
if (!is_file(CONF_SAMPLE . '.bak') && is_file(CONF_SAMPLE)) {
copy(CONF_SAMPLE, CONF_SAMPLE . '.bak');
}
}
/**
* restor backup of the config file
*
* @return void
*/
public static function confRestore(): void
{
if (is_file(CONF . '.bak')) {
rename(CONF . '.bak', CONF);
}
if (is_file(CONF_SAMPLE . '.bak')) {
rename(CONF_SAMPLE . '.bak', CONF_SAMPLE);
}
}
/**
* create ini file
*
* @param string $pathToFile
* @param array $values
*/
public static function createIniFile($pathToFile, array $values): void
{
if (count($values)) {
@unlink($pathToFile);
$ini = fopen($pathToFile, 'a');
foreach ($values as $section => $options) {
fwrite($ini, "[$section]" . PHP_EOL);
foreach ($options as $option => $setting) {
if (is_null($setting)) {
continue;
} elseif (is_string($setting)) {
$setting = '"' . $setting . '"';
} elseif (is_array($setting)) {
foreach ($setting as $key => $value) {
if (is_null($value)) {
$value = 'null';
} elseif (is_string($value)) {
$value = '"' . $value . '"';
} else {
$value = var_export($value, true);
}
fwrite($ini, $option . "[$key] = $value" . PHP_EOL);
}
continue;
} else {
$setting = var_export($setting, true);
}
fwrite($ini, "$option = $setting" . PHP_EOL);
}
fwrite($ini, PHP_EOL);
}
fclose($ini);
}
}
/**
* a var_export that returns arrays without line breaks
* by linus@flowingcreativity.net via php.net
*
* @param mixed $var
* @param bool $return
* @return void|string
*/
public static function varExportMin($var, $return = false): string
{
if (is_array($var)) {
$toImplode = array();
foreach ($var as $key => $value) {
$toImplode[] = var_export($key, true) . ' => ' . self::varExportMin($value, true);
}
$code = 'array(' . implode(', ', $toImplode) . ')';
if ($return) {
return $code;
} else {
echo $code;
}
} else {
return var_export($var, $return);
}
}
/**
* update all templates with the latest SRI hashes for all JS files
*
* @return void
*/
public static function updateSubresourceIntegrity(): void
{
foreach (new GlobIterator(PATH . 'js' . DIRECTORY_SEPARATOR . '*.js') as $file) {
if ($file->getBasename() == 'common.js') {
continue; // ignore JS unit test bootstrap
}
self::$hashes[$file->getBasename()] = base64_encode(
hash('sha512', file_get_contents($file->getPathname()), true)
);
}
$counter = 0;
$file = PATH . 'lib' . DIRECTORY_SEPARATOR . 'Configuration.php';
$content = preg_replace_callback(
'#\'js/([a-z0-9.-]+.js)(\' +)=\> \'[^\']*\',#',
function ($matches) use (&$counter) {
if (array_key_exists($matches[1], Helper::$hashes)) {
++$counter;
return '\'js/' . $matches[1] . $matches[2] .
'=> \'sha512-' . Helper::$hashes[$matches[1]] . '\',';
} else {
throw new Exception('SRI hash for file js/' . $matches[1] . ' not found, please add the missing file or remove it from lib/Configuration.php.');
}
},
file_get_contents($file)
);
file_put_contents($file, $content);
if ($counter != count(self::$hashes)) {
throw new Exception('Mismatch between ' . count(self::$hashes) . ' found js files and ' . $counter . ' SRI hashes in lib/Configuration.php, please update lib/Configuration.php to match the list of js files.');
}
$b = new BucketStub($this->_connection, $name, array(), $this);
self::$_buckets[$name] = $b;
return $b;
}
}
@@ -610,385 +905,93 @@ class ConnectionInterfaceStub implements ConnectionInterface
}
/**
* Class Helper provides unit tests pastes and comments of various formats
* Class StorageClientStub provides a limited stub for performing the unit test
*/
class Helper
class StorageClientStub extends StorageClient
{
/**
* example ID of a paste
*
* @var string
*/
private static $pasteid = '5b65a01b43987bc2';
private $_config = null;
private $_connection = null;
private static $_buckets = array();
/**
* example paste version 1
*
* @var array
*/
private static $pasteV1 = array(
'data' => '{"iv":"EN39/wd5Nk8HAiSG2K5AsQ","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"QKN1DBXe5PI","ct":"8hA83xDdXjD7K2qfmw5NdA"}',
'attachment' => '{"iv":"Pd4pOKWkmDTT9uPwVwd5Ag","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"6nOCU3peNDclDDpFtJEBKA"}',
'attachmentname' => '{"iv":"76MkAtOGC4oFogX/aSMxRA","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"b6Ae/U1xJdsX/+lATud4sQ"}',
'meta' => array(
'formatter' => 'plaintext',
'postdate' => 1344803344,
'opendiscussion' => true,
),
);
/**
* example paste version 2
*
* @var array
*/
private static $pasteV2 = array(
'adata' => array(
array(
'gMSNoLOk4z0RnmsYwXZ8mw==',
'TZO+JWuIuxs=',
100000,
256,
128,
'aes',
'gcm',
'zlib',
),
'plaintext',
1,
0,
),
'meta' => array(
'expire' => '5min',
),
'v' => 2,
'ct' => 'ME5JF/YBEijp2uYMzLZozbKtWc5wfy6R59NBb7SmRig=',
);
/**
* example ID of a comment
*
* @var string
*/
private static $commentid = '5a52eebf11c4c94b';
/**
* example comment
*
* @var array
*/
private static $commentV1 = array(
'data' => '{"iv":"Pd4pOKWkmDTT9uPwVwd5Ag","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"6nOCU3peNDclDDpFtJEBKA"}',
'meta' => array(
'nickname' => '{"iv":"76MkAtOGC4oFogX/aSMxRA","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"ZIUhFTliVz4","ct":"b6Ae/U1xJdsX/+lATud4sQ"}',
'vizhash' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGUlEQVQokWOsl5/94983CNKQMjnxaOePf98MeKwPfNjkLZ3AgARab6b9+PeNEVnDj3/ff/z7ZiHnzsDA8Pv7H2TVPJw8EAYLAwb48OaVgIgYKycLsrYv378wMDB8//qdCVMDRA9EKSsnCwRBxNsepaLboMFlyMDAICAi9uHNK24GITQ/MDAwoNhgIGMLtwGrzegaLjw5jMz9+vUdnN17uwDCQDhJgk0O07yvX9+teDX1x79v6DYIsIjgcgMaYGFgYOBg4kJx2JejkAiBxAw+PzAwMNz4dp6wDXDw4MdNNOl0rWYsNkD89OLXI/xmo9sgzatJjAYmBgYGDiauD3/ePP18nVgb4MF89+M5ZX6js293wUMpnr8KTQMAxsCJnJ30apMAAAAASUVORK5CYII=',
'postdate' => 1344803528,
),
);
/**
* JS files and their SRI hashes
*
* @var array
*/
private static $hashes = array();
/**
* get example paste ID
*
* @return string
*/
public static function getPasteId()
public function __construct(array $config = array())
{
return self::$pasteid;
$this->_config = $config;
$this->_connection = new ConnectionInterfaceStub();
}
/**
* get example paste, as stored on server
*
* @param int $version
* @param array $meta
* @return array
*/
public static function getPaste($version = 2, array $meta = array())
public function bucket($name, $userProject = false)
{
$example = self::getPasteWithAttachment($version, $meta);
// v1 has the attachment stored in a separate property
if ($version === 1) {
unset($example['attachment'], $example['attachmentname']);
if (!key_exists($name, self::$_buckets)) {
$b = new BucketStub($this->_connection, $name, array(), $this);
self::$_buckets[$name] = $b;
}
return $example;
return self::$_buckets[$name];
}
/**
* get example paste with attachment, as stored on server
*
* @param int $version
* @param array $meta
* @return array
* @throws \Google\Cloud\Core\Exception\NotFoundException
*/
public static function getPasteWithAttachment($version = 2, array $meta = array())
public function deleteBucket($name)
{
$example = $version === 1 ? self::$pasteV1 : self::$pasteV2;
$example['meta']['salt'] = ServerSalt::generate();
$example['meta'] = array_merge($example['meta'], $meta);
return $example;
}
/**
* get example paste, as decoded from POST by the request object
*
* @param int $version
* @param array $meta
* @return array
*/
public static function getPastePost($version = 2, array $meta = array())
{
$example = self::getPaste($version, $meta);
if ($version == 2) {
$example['meta'] = array('expire' => $example['meta']['expire']);
if (key_exists($name, self::$_buckets)) {
unset(self::$_buckets[$name]);
} else {
unset($example['meta']['postdate']);
}
return $example;
}
/**
* get example paste, as received via POST by the user
*
* @param int $version
* @param array $meta
* @return array
*/
public static function getPasteJson($version = 2, array $meta = array())
{
return json_encode(self::getPastePost($version, $meta));
}
/**
* get example paste ID
*
* @return string
*/
public static function getCommentId()
{
return self::$commentid;
}
/**
* get example comment, as stored on server
*
* @param int $version
* @param array $meta
* @return array
*/
public static function getComment($version = 2, array $meta = array())
{
$example = $version === 1 ? self::$commentV1 : self::$pasteV2;
if ($version === 2) {
$example['adata'] = $example['adata'][0];
$example['pasteid'] = $example['parentid'] = self::getPasteId();
$example['meta']['created'] = self::$commentV1['meta']['postdate'];
$example['meta']['icon'] = self::$commentV1['meta']['vizhash'];
unset($example['meta']['expire']);
}
$example['meta'] = array_merge($example['meta'], $meta);
return $example;
}
/**
* get example comment, as decoded from POST by the request object
*
* @param int $version
* @return array
*/
public static function getCommentPost()
{
$example = self::getComment();
unset($example['meta']);
return $example;
}
/**
* get example comment, as received via POST by user
*
* @param int $version
* @return array
*/
public static function getCommentJson()
{
return json_encode(self::getCommentPost());
}
/**
* delete directory and all its contents recursively
*
* @param string $path
* @throws Exception
*/
public static function rmDir($path)
{
if (is_dir($path)) {
$path .= DIRECTORY_SEPARATOR;
$dir = dir($path);
while (false !== ($file = $dir->read())) {
if ($file != '.' && $file != '..') {
if (is_dir($path . $file)) {
self::rmDir($path . $file);
} elseif (is_file($path . $file)) {
if (!unlink($path . $file)) {
throw new Exception('Error deleting file "' . $path . $file . '".');
}
}
}
}
$dir->close();
if (!rmdir($path)) {
throw new Exception('Error deleting directory "' . $path . '".');
}
throw new NotFoundException();
}
}
/**
* create a backup of the config file
*
* @return void
*/
public static function confBackup()
public function buckets(array $options = array())
{
if (!is_file(CONF . '.bak') && is_file(CONF)) {
rename(CONF, CONF . '.bak');
}
if (!is_file(CONF_SAMPLE . '.bak') && is_file(CONF_SAMPLE)) {
copy(CONF_SAMPLE, CONF_SAMPLE . '.bak');
}
throw new BadMethodCallException('not supported by this stub');
}
/**
* restor backup of the config file
*
* @return void
*/
public static function confRestore()
public function registerStreamWrapper($protocol = null)
{
if (is_file(CONF . '.bak')) {
rename(CONF . '.bak', CONF);
}
if (is_file(CONF_SAMPLE . '.bak')) {
rename(CONF_SAMPLE . '.bak', CONF_SAMPLE);
}
throw new BadMethodCallException('not supported by this stub');
}
/**
* create ini file
*
* @param string $pathToFile
* @param array $values
*/
public static function createIniFile($pathToFile, array $values)
public function unregisterStreamWrapper($protocol = null)
{
if (count($values)) {
@unlink($pathToFile);
$ini = fopen($pathToFile, 'a');
foreach ($values as $section => $options) {
fwrite($ini, "[$section]" . PHP_EOL);
foreach ($options as $option => $setting) {
if (is_null($setting)) {
continue;
} elseif (is_string($setting)) {
$setting = '"' . $setting . '"';
} elseif (is_array($setting)) {
foreach ($setting as $key => $value) {
if (is_null($value)) {
$value = 'null';
} elseif (is_string($value)) {
$value = '"' . $value . '"';
} else {
$value = var_export($value, true);
}
fwrite($ini, $option . "[$key] = $value" . PHP_EOL);
}
continue;
} else {
$setting = var_export($setting, true);
}
fwrite($ini, "$option = $setting" . PHP_EOL);
}
fwrite($ini, PHP_EOL);
}
fclose($ini);
}
throw new BadMethodCallException('not supported by this stub');
}
/**
* a var_export that returns arrays without line breaks
* by linus@flowingcreativity.net via php.net
*
* @param mixed $var
* @param bool $return
* @return void|string
*/
public static function varExportMin($var, $return = false)
public function signedUrlUploader($uri, $data, array $options = array())
{
if (is_array($var)) {
$toImplode = array();
foreach ($var as $key => $value) {
$toImplode[] = var_export($key, true) . ' => ' . self::varExportMin($value, true);
}
$code = 'array(' . implode(', ', $toImplode) . ')';
if ($return) {
return $code;
} else {
echo $code;
}
} else {
return var_export($var, $return);
}
throw new BadMethodCallException('not supported by this stub');
}
/**
* update all templates with the latest SRI hashes for all JS files
*
* @return void
*/
public static function updateSubresourceIntegrity()
public function timestamp(\DateTimeInterface $timestamp, $nanoSeconds = null)
{
$dir = dir(PATH . 'js');
while (false !== ($file = $dir->read())) {
if (substr($file, -3) === '.js') {
self::$hashes[$file] = base64_encode(
hash('sha512', file_get_contents(
PATH . 'js' . DIRECTORY_SEPARATOR . $file
), true)
);
}
}
throw new BadMethodCallException('not supported by this stub');
}
$dir = dir(PATH . 'tpl');
while (false !== ($file = $dir->read())) {
if (substr($file, -4) === '.php') {
$content = file_get_contents(
PATH . 'tpl' . DIRECTORY_SEPARATOR . $file
);
$content = preg_replace_callback(
'#<script ([^>]+) src="js/([a-z0-9.-]+.js)([^"]*)"( integrity="[^"]+" crossorigin="[^"]+")?></script>#',
function ($matches) {
if (array_key_exists($matches[2], Helper::$hashes)) {
return '<script ' . $matches[1] . ' src="js/' .
$matches[2] . $matches[3] .
'" integrity="sha512-' . Helper::$hashes[$matches[2]] .
'" crossorigin="anonymous"></script>';
} else {
return $matches[0];
}
},
$content
);
file_put_contents(
PATH . 'tpl' . DIRECTORY_SEPARATOR . $file,
$content
);
}
public function getServiceAccount(array $options = array())
{
throw new BadMethodCallException('not supported by this stub');
}
public function hmacKeys(array $options = array())
{
throw new BadMethodCallException('not supported by this stub');
}
public function hmacKey($accessId, $projectId = null, array $metadata = array())
{
throw new BadMethodCallException('not supported by this stub');
}
public function createHmacKey($serviceAccountEmail, array $options = array())
{
throw new BadMethodCallException('not supported by this stub');
}
public function createBucket($name, array $options = array())
{
if (key_exists($name, self::$_buckets)) {
throw new BadRequestException('already exists');
}
$b = new BucketStub($this->_connection, $name, array(), $this);
self::$_buckets[$name] = $b;
return $b;
}
}

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;
use PrivateBin\Configuration;
@@ -120,9 +120,15 @@ class ConfigurationTest extends TestCase
unset($options['expire_options']['1week']);
unset($options['expire_options']['1year']);
unset($options['expire_options']['never']);
$sri_key = array_key_first($options['sri']);
$valid_sri = $options['sri'][$sri_key];
$options['sri'][$sri_key] = ''; // empty string should get replaced with default
$options['sri']['js/example.js'] = 'some invalid SRI hash';
Helper::createIniFile(CONF, $options);
$conf = new Configuration;
// restore expected results
$options['expire']['default'] = '5min';
$options['sri'][$sri_key] = $valid_sri;
$this->assertEquals($options, $conf->get(), 'not overriding "missing" subkeys');
}

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;
use PrivateBin\Controller;

Some files were not shown because too many files have changed in this diff Show More