Compare commits

...

199 Commits

Author SHA1 Message Date
El RIDO
aad975a721
incrementing version 2024-02-11 15:31:11 +01:00
El RIDO
5c29619fee
post-release cleanup
- prep changelog for future changes
- composer changes from re-running composer on the repo, testing deps
- change to phpunit coverage make target, required with newer releases
2024-02-11 15:10:01 +01:00
El RIDO
a3ee624d3a
incrementing version 2024-02-11 14:17:27 +01:00
El RIDO
1eee8032c7
Merge pull request #1240 from PrivateBin/crowdin-translation
New Crowdin updates
2024-02-09 07:19:21 +01:00
PrivateBin Translator Bot
f3fba1c0f5 New translations en.json (Corsican) 2024-02-09 00:48:48 +01:00
PrivateBin Translator Bot
a54a55a9a1 New translations en.json (Italian) 2024-02-08 07:21:52 +01:00
PrivateBin Translator Bot
56f0ec7d52 New translations en.json (German) 2024-02-08 07:21:51 +01:00
PrivateBin Translator Bot
208c922e04 New translations en.json (French) 2024-02-08 07:21:50 +01:00
El RIDO
4db0db320b Merge branch 'master' into crowdin-translation 2024-02-08 05:29:53 +01:00
PrivateBin Translator Bot
772ab96364 New translations en.json (Corsican) 2024-02-07 20:47:56 +01:00
PrivateBin Translator Bot
dc2db9e622 New translations en.json (Occitan) 2024-02-07 20:47:55 +01:00
PrivateBin Translator Bot
6d559c3043 New translations en.json (Latin) 2024-02-07 20:47:54 +01:00
PrivateBin Translator Bot
096a5118d1 New translations en.json (Lojban) 2024-02-07 20:47:54 +01:00
PrivateBin Translator Bot
5084ab7a07 New translations en.json (Hindi) 2024-02-07 20:47:53 +01:00
PrivateBin Translator Bot
fbe4ac5a6c New translations en.json (Estonian) 2024-02-07 20:47:52 +01:00
PrivateBin Translator Bot
4e21e980de New translations en.json (Thai) 2024-02-07 20:47:51 +01:00
PrivateBin Translator Bot
a3243b3165 New translations en.json (Indonesian) 2024-02-07 20:47:50 +01:00
PrivateBin Translator Bot
223ef02a43 New translations en.json (Chinese Simplified) 2024-02-07 20:47:49 +01:00
PrivateBin Translator Bot
c7da424ef9 New translations en.json (Ukrainian) 2024-02-07 20:47:48 +01:00
PrivateBin Translator Bot
e1c74457e5 New translations en.json (Turkish) 2024-02-07 20:47:47 +01:00
PrivateBin Translator Bot
1a6c3dd8d8 New translations en.json (Swedish) 2024-02-07 20:47:46 +01:00
PrivateBin Translator Bot
146b2513c1 New translations en.json (Slovenian) 2024-02-07 20:47:45 +01:00
PrivateBin Translator Bot
5ec8a57c60 New translations en.json (Slovak) 2024-02-07 20:47:44 +01:00
PrivateBin Translator Bot
cd67d81ae3 New translations en.json (Russian) 2024-02-07 20:47:43 +01:00
PrivateBin Translator Bot
218e68a604 New translations en.json (Portuguese) 2024-02-07 20:47:42 +01:00
PrivateBin Translator Bot
9611991748 New translations en.json (Polish) 2024-02-07 20:47:41 +01:00
PrivateBin Translator Bot
b613d9558c New translations en.json (Norwegian) 2024-02-07 20:47:40 +01:00
PrivateBin Translator Bot
5523ba9a45 New translations en.json (Dutch) 2024-02-07 20:47:39 +01:00
PrivateBin Translator Bot
421342396f New translations en.json (Lithuanian) 2024-02-07 20:47:38 +01:00
PrivateBin Translator Bot
4e3b469c08 New translations en.json (Kurdish) 2024-02-07 20:47:37 +01:00
PrivateBin Translator Bot
cb0edf4f2b New translations en.json (Japanese) 2024-02-07 20:47:37 +01:00
PrivateBin Translator Bot
a0f8e0a566 New translations en.json (Italian) 2024-02-07 20:47:36 +01:00
PrivateBin Translator Bot
089652382a New translations en.json (Hungarian) 2024-02-07 20:47:35 +01:00
PrivateBin Translator Bot
a1408601d9 New translations en.json (Hebrew) 2024-02-07 20:47:34 +01:00
PrivateBin Translator Bot
3d4887e5f0 New translations en.json (Finnish) 2024-02-07 20:47:33 +01:00
PrivateBin Translator Bot
5c876df2ea New translations en.json (Greek) 2024-02-07 20:47:32 +01:00
PrivateBin Translator Bot
fe4a64529a New translations en.json (German) 2024-02-07 20:47:31 +01:00
PrivateBin Translator Bot
a25bfd4cce New translations en.json (Czech) 2024-02-07 20:47:30 +01:00
PrivateBin Translator Bot
53639b913e New translations en.json (Catalan) 2024-02-07 20:47:29 +01:00
PrivateBin Translator Bot
9379a73632 New translations en.json (Bulgarian) 2024-02-07 20:47:28 +01:00
PrivateBin Translator Bot
efd6c3f8c4 New translations en.json (Arabic) 2024-02-07 20:47:27 +01:00
PrivateBin Translator Bot
51f68f0c78 New translations en.json (Spanish) 2024-02-07 20:47:26 +01:00
PrivateBin Translator Bot
ad2de3a135 New translations en.json (French) 2024-02-07 20:47:25 +01:00
PrivateBin Translator Bot
ea7f1fca6e New translations en.json (Romanian) 2024-02-07 20:47:25 +01:00
El RIDO
57b1890815 Merge branch 'master' into ask-before-burn 2024-02-07 19:45:54 +01:00
El RIDO
7bb913acdf
Merge pull request #1236 from PrivateBin/bump-libs
bump libraries to DOMpurify 3.0.8 & zlib 1.3.1, increase compression level
2024-02-07 19:30:25 +01:00
El RIDO
25de89c954
change loading confirm prefix, fix password modal focus, again 2024-02-06 20:22:47 +01:00
El RIDO
950c0b56b4
revert changing compression level
as per discussion with @rugk, see:
https://github.com/PrivateBin/PrivateBin/pull/1236#discussion_r1473639960
2024-02-06 19:21:14 +01:00
El RIDO
070ae2e5ec
Merge pull request #1228 from PrivateBin/crowdin-translation
New Crowdin updates
2024-01-27 19:23:34 +01:00
El RIDO
239f6da73c
Merge branch 'master' into crowdin-translation 2024-01-27 19:19:08 +01:00
El RIDO
257fc5d2b6
enable Romanian translation and credit it 2024-01-27 19:15:40 +01:00
El RIDO
03d2291ec7
Merge branch 'master' into ask-before-burn 2024-01-27 18:56:52 +01:00
El RIDO
56f5b2386c
document changes 2024-01-27 18:51:12 +01:00
El RIDO
d0e03e5167
change logic into asking for loading confirmation
also:
- fixes #1039 - email buttons overlapping in some languages
- fixes #1191 - language change URL mangling
- adds focus to password input in modal
- prevents needless reload on visiting default URL
2024-01-27 18:26:19 +01:00
El RIDO
0d2376cd88
bump libraries to DOMpurify 3.0.8 & zlib 1.3.1, increase compression level to 9 2024-01-27 11:33:54 +01:00
El RIDO
df703dfe4b
Merge pull request #1234 from PrivateBin/dependabot/composer/phpunit/phpunit-9.6.16
Bump phpunit/phpunit from 9.6.15 to 9.6.16
2024-01-20 08:50:57 +01:00
dependabot[bot]
3ff3db72a1
Bump phpunit/phpunit from 9.6.15 to 9.6.16
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.6.15 to 9.6.16.
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/9.6.16/ChangeLog-9.6.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.6.15...9.6.16)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-19 11:44:19 +00:00
El RIDO
a27cb0cffc
Merge pull request #1233 from PrivateBin/dependabot/github_actions/actions/cache-4
Bump actions/cache from 3 to 4
2024-01-18 18:23:52 +01:00
dependabot[bot]
ba25ab8fa9
Bump actions/cache from 3 to 4
Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-18 11:21:35 +00:00
El RIDO
d091382313
Merge pull request #1229 from PrivateBin/shortener-sort
add YOURLS API samples for extractUrl validation
2024-01-09 06:36:32 +01:00
Tobias Gurtzick
2a508cb7bf
burn after reading only
Signed-off-by: Tobias Gurtzick <magic@wizardtales.com>
2024-01-08 12:38:48 +01:00
Tobias Gurtzick
8516a3f4a4
Merge branch '162' into encrypt-browser 2024-01-08 12:29:06 +01:00
Tobias Gurtzick
2cc2cf0de7
working browser password
Signed-off-by: Tobias Gurtzick <magic@wizardtales.com>
2024-01-08 12:28:41 +01:00
Tobias Gurtzick
e1e8618015
Merge branch 'change' into 162 2024-01-08 11:10:11 +01:00
Tobias Gurtzick
7fddefeb05
password
Signed-off-by: Tobias Gurtzick <magic@wizardtales.com>
2024-01-08 10:36:59 +01:00
El RIDO
4e62e1f6ef address jsverify rngState 87ab3f64de258190c7, fixes #1139 2024-01-08 08:09:29 +01:00
El RIDO
405479642f add YOURLS API samples for extractUrl validation 2024-01-07 17:45:01 +01:00
El RIDO
fd82b937a9 refactor URL generators 2024-01-07 16:06:24 +01:00
El RIDO
d493ba7337 refactor URL generators 2024-01-07 15:47:29 +01:00
El RIDO
37ee3b1c7c refactor URL generators 2024-01-07 14:10:43 +01:00
PrivateBin Translator Bot
7ab20c23e9 New translations en.json (Romanian) 2024-01-06 23:17:48 +01:00
PrivateBin Translator Bot
cc5c81afbc New translations en.json (Romanian) 2024-01-06 22:12:59 +01:00
El RIDO
9fb7aee589
Merge pull request #1227 from PrivateBin/shortener-idn
Shortener URL validation improvement
2024-01-06 17:35:09 +01:00
El RIDO
ba17e94c5e use the newer function, if possible 2024-01-05 06:40:12 +01:00
El RIDO
c3331070cb codestyle, let's use readable variable names
Co-authored-by: rugk <rugk+git@posteo.de>
2024-01-05 06:30:21 +01:00
El RIDO
cc0b6e387a avoid use of bleeding edge function
only supported in Firefox & Chrome >= 120 & node >= 19.9.0 & 18.17.0
2024-01-04 23:23:47 +01:00
El RIDO
a80bd4e4ea fix url filter, IDN URL unit test 2024-01-04 23:08:17 +01:00
PrivateBin Translator Bot
b3b97b69c6 New translations en.json (Romanian) 2024-01-04 20:47:08 +01:00
El RIDO
8427c1136c document change 2024-01-04 06:52:27 +01:00
El RIDO
7cb1f8ca67 relax URL regex to support finding IDN domains, filter using built in function, removing non-URLs 2024-01-04 06:48:34 +01:00
El RIDO
9a707e288a
Merge pull request #1225 from PrivateBin/crowdin-translation
New Crowdin updates
2024-01-02 07:50:28 +01:00
El RIDO
83a1de271a
Merge pull request #1223 from PrivateBin/install-cloud-libs
improve SDK install docs
2024-01-02 07:49:26 +01:00
PrivateBin Translator Bot
c264904f77 New translations en.json (Chinese Simplified) 2024-01-01 12:29:13 +01:00
El RIDO
712715caba improve SDK install docs
fixes #1222
2023-12-27 18:58:39 +01:00
El RIDO
2985305dbb
Merge pull request #1220 from PrivateBin/en-default-test
prevent regression around presence or absence of en.json
2023-12-23 13:06:05 +01:00
El RIDO
0581522414
Merge pull request #1221 from PrivateBin/zlib-1.3
updating zlib to 1.3
2023-12-19 21:39:13 +01:00
El RIDO
dc8cb66adc
updating zlib to 1.3 2023-12-19 06:22:30 +01:00
El RIDO
54585549e0
Merge pull request #1218 from PrivateBin/detect-broken-pastes
detect and report on damaged pastes
2023-12-19 05:39:39 +01:00
El RIDO
d49be80ffb
prevent regression around presence or absence of en.json
it gets excluded in the release archive, it's absence should not make
any difference
2023-12-18 21:49:21 +01:00
El RIDO
a17529c7e1
document change 2023-12-18 21:02:27 +01:00
El RIDO
0a7a341fda
Merge pull request #1217 from PrivateBin/releasedoc
Created doc for “how to verify and how to do release” (release doc)
2023-12-18 20:57:11 +01:00
El RIDO
d88945663e detect and report on damaged pastes
May occur during statistics or purge, when existing pastes get parsed, addresses #1214
2023-12-16 07:38:09 +01:00
El RIDO
255fd4b12b updated release document
- removed duplicate content
- clarified what is signed and since which release
- updated verification sample output (also in wiki) using the output of https://github.com/PrivateBin/docker-nginx-fpm-alpine/actions/runs/7228527399/job/19698112056#step:7:156
- Corrected release process - we trigger the release on the push of the tag, not a branch (fixed point in time instead of a moving target)
2023-12-16 07:02:21 +01:00
rugk
43d162f452
Created doc for “how to verify and how to do release” (release doc) (WIP)
This documents/should document:
* what the signatures are and what they proof
* how to verify them
* how to build releases (I know more of a maintainer doc, but yeah, I found it a good place here, if you want a separate one feel free)

This should also make it easier for other maintainers to create releases or so.

@elrido feel free to adjust/push to the branch if you want to have some details fixed. I have left some TODOs of stuff where I am unsure.
2023-12-15 14:17:51 +01:00
El RIDO
9b07e3ff62
Merge pull request #1215 from PrivateBin/dependabot/github_actions/github/codeql-action-3
Bump github/codeql-action from 2 to 3
2023-12-15 08:13:08 +01:00
El RIDO
d0420fb418
1.6.2 release 2023-12-15 07:20:20 +01:00
El RIDO
3b17dfc6ef
Merge pull request #1213 from PrivateBin/en-lang-selection
ensure English is always added to available languages, fixes #1208
2023-12-15 07:03:06 +01:00
dependabot[bot]
03e3e4fa06
Bump github/codeql-action from 2 to 3
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-14 11:52:46 +00:00
El RIDO
879c7400bf
Merge pull request #1212 from joeskeen/conf-view-as-ini
add workspace settings with config files treated as INI
2023-12-09 12:17:51 +01:00
El RIDO
46d8d7d781
Merge pull request #1210 from joeskeen/devcontainer-postcreate
move postCreateCommands to a separate file
2023-12-09 12:16:21 +01:00
El RIDO
684924e9e5
apply StyleCI patch 2023-12-09 12:00:57 +01:00
El RIDO
a7f720d825
ensure English is always added to available languages, fixes #1208
bug got introduced in 3668f1e3f4 and
started affecting release after 896a49c8cf
2023-12-09 11:58:29 +01:00
El RIDO
826444bef7
fix shasum in release pipeline, hope this fixes #1169 2023-12-09 10:50:49 +01:00
Joe Skeen
10c6841f8a
Update .devcontainer/postCreateCommand.sh
Co-authored-by: rugk <rugk+git@posteo.de>
2023-12-08 15:31:45 -07:00
Joe Skeen
49a87c6038 add workspace settings with config files treated as INI 2023-12-08 16:30:45 +00:00
Joe Skeen
7a5036d957 move postCreateCommands to a separate file 2023-12-08 15:34:00 +00:00
El RIDO
f8c2f58604
typo 2023-12-04 21:24:12 +01:00
El RIDO
edec91de1c
Merge branch 'master' of github.com:PrivateBin/PrivateBin 2023-12-04 21:17:32 +01:00
El RIDO
3bd570bd6a
incrementing version 2023-12-04 21:07:17 +01:00
El RIDO
8131518ba1
Merge pull request #1204 from PrivateBin/crowdin-translation
New Crowdin updates
2023-12-04 19:10:18 +01:00
PrivateBin Translator Bot
bb89eb7fba New translations en.json (Finnish) 2023-12-04 18:46:19 +01:00
El RIDO
94d1908777
Merge pull request #1203 from PrivateBin/dependabot/composer/phpunit/phpunit-9.6.15
Bump phpunit/phpunit from 9.6.14 to 9.6.15
2023-12-04 17:39:48 +01:00
PrivateBin Translator Bot
5b2f788e48 New translations en.json (Finnish) 2023-12-04 16:43:03 +01:00
PrivateBin Translator Bot
33e9025d09 New translations en.json (Finnish) 2023-12-04 15:14:57 +01:00
dependabot[bot]
6133f6c35c
Bump phpunit/phpunit from 9.6.14 to 9.6.15
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.6.14 to 9.6.15.
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/9.6.15/ChangeLog-9.6.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.6.14...9.6.15)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-04 11:37:40 +00:00
El RIDO
0107b1258e
forgot to update SRI hashes
caused in b150450fac
2023-12-04 06:10:47 +01:00
El RIDO
65f289e516
Merge pull request #1202 from PrivateBin/release-prep
1.6.1 release preparations
2023-12-03 17:07:19 +01:00
El RIDO
b150450fac
address nodejs unit testing issue
mocha tests started failing as of node 20.10.0, likely due to this change:
https://github.com/nodejs/node/pull/49936

Error was:
node:internal/deps/undici/undici:11730
    Error.captureStackTrace(err, this);
          ^

TypeError: Failed to parse URL from js/zlib-1.2.13.wasm
    at Object.fetch (node:internal/deps/undici/undici:11730:11)
    at async initialize (/home/runner/work/PrivateBin/PrivateBin/js/zlib-1.2.13.js:31:26) {
  [cause]: TypeError: Invalid URL: js/zlib-1.2.13.wasm
      at new URLImpl (/home/runner/work/PrivateBin/PrivateBin/js/node_modules/jsdom-url/node_modules/whatwg-url/lib/URL-impl.js:21:13)
      at new URLImplCore (/home/runner/work/PrivateBin/PrivateBin/js/node_modules/jsdom-url/lib/URLImpl.js:18:9)
      at new URLCore (/home/runner/work/PrivateBin/PrivateBin/js/node_modules/jsdom-url/lib/URL.js:28:9)
      at Object.construct (/home/runner/work/PrivateBin/PrivateBin/js/node_modules/class-proxy/index.js:18:23)
      at new Request (node:internal/deps/undici/undici:5270:25)
      at fetch (node:internal/deps/undici/undici:9508:25)
      at Object.fetch (node:internal/deps/undici/undici:11728:18)
      at fetch (node:internal/process/pre_execution:314:27)
      at initialize (/home/runner/work/PrivateBin/PrivateBin/js/zlib-1.2.13.js:31:32)
      at Object.<anonymous> (/home/runner/work/PrivateBin/PrivateBin/js/zlib-1.2.13.js:145:17)
      at Object.<anonymous> (/home/runner/work/PrivateBin/PrivateBin/js/zlib-1.2.13.js:146:4)
[...]

Notice that the error occurs on line 31, meaning that fetch is not
undefined anymore. Node works on supporting fetch, which would make our
workaround using fs.readFileSync obsolete, but it (or rather the undici
library) currently doesn't support relative URLs.
2023-12-03 14:40:59 +01:00
El RIDO
aa1a44e329
upgrading DOMpurify to 3.0.6 2023-12-03 14:02:30 +01:00
El RIDO
ee151ad29d
fix phpdoc parameters for newer releases 2023-12-03 13:54:35 +01:00
El RIDO
c090f8d27f
fixed comments
so that these functions end up on the correct jsdoc page
2023-12-03 13:41:17 +01:00
El RIDO
8c1310c334
update unit test doc & PHP 8 fixes
having had to re-do all of these steps on a new environment, I noticed
some inconsistencies and updated the doc:
- moved unit testing doc into common doc folder, so it is easier to find
- removed no longer supported Janitor reference
- removed note regarding generated test duration, current version takes
  less than a minute
- addressed each function removal & phpunit deprecations
2023-12-03 13:40:04 +01:00
El RIDO
c895c511c1
Merge pull request #1201 from PrivateBin/dependabot/composer/phpunit/phpunit-9.6.14
Bump phpunit/phpunit from 9.6.13 to 9.6.14
2023-12-02 18:20:58 +01:00
dependabot[bot]
421fd4901f
Bump phpunit/phpunit from 9.6.13 to 9.6.14
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.6.13 to 9.6.14.
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/9.6.14/ChangeLog-9.6.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.6.13...9.6.14)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 11:58:32 +00:00
El RIDO
b2bf90d14e
Merge pull request #1200 from PrivateBin/php83
enable unit testing on PHP 8.3 &  8.4 nightly
2023-11-28 20:48:19 +01:00
El RIDO
8d97569de0
enable testing on PHP 8.3 and 8.4
at this time both are still installed out of nightly builds, though 8.3
got released last week, see:
https://github.com/shivammathur/setup-php#tada-php-support
2023-11-26 09:54:28 +01:00
El RIDO
d34f9c0b8c
new phpdoc temp file location 2023-11-26 09:50:36 +01:00
El RIDO
9614ee90f2
Merge pull request #1190 from PrivateBin/node20
Use Node20 for tests
2023-10-25 12:43:33 +02:00
El RIDO
95d6a0d3b9
Merge pull request #1189 from PrivateBin/dependabot/github_actions/actions/setup-node-4
Bump actions/setup-node from 3 to 4
2023-10-25 12:39:56 +02:00
rugk
b9d74ecd35
Use Node20 for tests
A try following https://github.com/PrivateBin/PrivateBin/pull/1189#pullrequestreview-1695447526
2023-10-24 19:03:47 +02:00
dependabot[bot]
9114ca00bf
Bump actions/setup-node from 3 to 4
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-24 11:05:40 +00:00
El RIDO
0fb40d5d3a
Merge pull request #1183 from PrivateBin/crowdin-translation
New Crowdin updates
2023-10-22 14:19:20 +02:00
PrivateBin Translator Bot
cb4e95b917 New translations en.json (Japanese) 2023-10-19 10:37:44 +02:00
PrivateBin Translator Bot
52b0e0b369 New translations en.json (Japanese) 2023-10-19 08:18:59 +02:00
PrivateBin Translator Bot
515bfd8122 New translations en.json (Japanese) 2023-10-19 07:11:36 +02:00
PrivateBin Translator Bot
fbc302c0a1 New translations en.json (Japanese) 2023-10-19 06:07:25 +02:00
PrivateBin Translator Bot
b62e9dbc6e New translations en.json (Japanese) 2023-10-19 01:05:19 +02:00
PrivateBin Translator Bot
5c2496d474 New translations en.json (Japanese) 2023-10-18 05:59:11 +02:00
PrivateBin Translator Bot
f3eb2759ce New translations en.json (Japanese) 2023-10-18 04:26:14 +02:00
PrivateBin Translator Bot
cdb7ec0443 New translations en.json (Japanese) 2023-10-17 18:47:08 +02:00
PrivateBin Translator Bot
05dc1dd32e New translations en.json (Japanese) 2023-10-17 17:27:56 +02:00
El RIDO
b70be94538
Merge pull request #1181 from voidquark/master
Update Ansible Galaxy links in Installation.md
2023-10-02 06:45:04 +02:00
VoidQuark
9a4c5b30c6
Update Ansible Galaxy links in Installation.md 2023-10-01 20:43:11 +02:00
El RIDO
4ef0318495
Merge pull request #1179 from PrivateBin/dependabot/github_actions/actions/checkout-4
Bump actions/checkout from 3 to 4
2023-09-24 07:36:04 +02:00
dependabot[bot]
58f919ecdd
Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-22 11:33:49 +00:00
El RIDO
7518ea74c5
Merge pull request #1175 from PrivateBin/slsa-release
release workflow for SLSA & changelog
2023-09-22 05:24:04 +02:00
El RIDO
7e1dfdb012
Merge pull request #1178 from PrivateBin/crowdin-translation
New Crowdin updates
2023-09-20 22:12:53 +02:00
El RIDO
1a4e2f8f06 Merge branch 'master' into crowdin-translation 2023-09-20 22:09:59 +02:00
PrivateBin Translator Bot
8053daec14 New translations en.json (Corsican) 2023-09-20 07:33:00 +02:00
PrivateBin Translator Bot
9612637881 New translations en.json (Occitan) 2023-09-20 07:32:59 +02:00
PrivateBin Translator Bot
fb1ea260ba New translations en.json (Latin) 2023-09-20 07:32:58 +02:00
PrivateBin Translator Bot
17b629018c New translations en.json (Lojban) 2023-09-20 07:32:57 +02:00
PrivateBin Translator Bot
a92407ea4e New translations en.json (Hindi) 2023-09-20 07:32:56 +02:00
PrivateBin Translator Bot
441ac9d8d9 New translations en.json (Estonian) 2023-09-20 07:32:56 +02:00
PrivateBin Translator Bot
046ccf2000 New translations en.json (Thai) 2023-09-20 07:32:55 +02:00
PrivateBin Translator Bot
6c7c0ec09c New translations en.json (Indonesian) 2023-09-20 07:32:54 +02:00
PrivateBin Translator Bot
b0f4a63705 New translations en.json (Chinese Simplified) 2023-09-20 07:32:53 +02:00
PrivateBin Translator Bot
1b772d0404 New translations en.json (Ukrainian) 2023-09-20 07:32:52 +02:00
PrivateBin Translator Bot
8dbf954870 New translations en.json (Turkish) 2023-09-20 07:32:51 +02:00
PrivateBin Translator Bot
69efa00d7f New translations en.json (Swedish) 2023-09-20 07:32:50 +02:00
PrivateBin Translator Bot
d17a0f091b New translations en.json (Slovenian) 2023-09-20 07:32:49 +02:00
PrivateBin Translator Bot
6a1371822a New translations en.json (Slovak) 2023-09-20 07:32:48 +02:00
PrivateBin Translator Bot
0cc5880354 New translations en.json (Russian) 2023-09-20 07:32:47 +02:00
PrivateBin Translator Bot
eb17f75793 New translations en.json (Portuguese) 2023-09-20 07:32:46 +02:00
PrivateBin Translator Bot
0568d10bca New translations en.json (Polish) 2023-09-20 07:32:45 +02:00
PrivateBin Translator Bot
ac681d6aa9 New translations en.json (Norwegian) 2023-09-20 07:32:44 +02:00
PrivateBin Translator Bot
6f9496511a New translations en.json (Dutch) 2023-09-20 07:32:43 +02:00
PrivateBin Translator Bot
31cfa5b6e3 New translations en.json (Lithuanian) 2023-09-20 07:32:42 +02:00
PrivateBin Translator Bot
d27f43eb1d New translations en.json (Kurdish) 2023-09-20 07:32:41 +02:00
PrivateBin Translator Bot
e395717a54 New translations en.json (Japanese) 2023-09-20 07:32:40 +02:00
PrivateBin Translator Bot
6a68d59d8b New translations en.json (Italian) 2023-09-20 07:32:39 +02:00
PrivateBin Translator Bot
bc7a346aa0 New translations en.json (Hungarian) 2023-09-20 07:32:38 +02:00
PrivateBin Translator Bot
0a24df6adb New translations en.json (Hebrew) 2023-09-20 07:32:37 +02:00
PrivateBin Translator Bot
4cdf21ecd1 New translations en.json (Finnish) 2023-09-20 07:32:36 +02:00
PrivateBin Translator Bot
e2fac1be9d New translations en.json (Greek) 2023-09-20 07:32:35 +02:00
PrivateBin Translator Bot
fa714c03dd New translations en.json (German) 2023-09-20 07:32:34 +02:00
PrivateBin Translator Bot
c025c83e33 New translations en.json (Czech) 2023-09-20 07:32:33 +02:00
PrivateBin Translator Bot
76e7ca4942 New translations en.json (Catalan) 2023-09-20 07:32:32 +02:00
PrivateBin Translator Bot
7aceed6a03 New translations en.json (Bulgarian) 2023-09-20 07:32:31 +02:00
PrivateBin Translator Bot
1795c1cf1a New translations en.json (Arabic) 2023-09-20 07:32:30 +02:00
PrivateBin Translator Bot
fd95445831 New translations en.json (Spanish) 2023-09-20 07:32:29 +02:00
PrivateBin Translator Bot
70ca60089f New translations en.json (French) 2023-09-20 07:32:28 +02:00
El RIDO
4f8c19c80e Merge branch 'master' into slsa-release 2023-09-20 07:19:20 +02:00
El RIDO
7a6aa84b76
Merge pull request #1176 from PrivateBin/rtl
add basic right-to-left (RTL) support
2023-09-20 07:12:31 +02:00
El RIDO
f255905a6f
Merge pull request #1177 from PrivateBin/dependabot/composer/phpunit/phpunit-9.6.13
Bump phpunit/phpunit from 9.6.12 to 9.6.13
2023-09-20 07:12:03 +02:00
dependabot[bot]
b4ca795b6a
Bump phpunit/phpunit from 9.6.12 to 9.6.13
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.6.12 to 9.6.13.
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/9.6.13/ChangeLog-9.6.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.6.12...9.6.13)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-19 11:24:56 +00:00
El RIDO
80546bf629
add some basic RTL CSS overrides 2023-09-19 07:29:49 +02:00
El RIDO
5c97443d1d
add basic RTL support, drop default language key 2023-09-19 07:29:00 +02:00
El RIDO
896a49c8cf
en.json is not used at runtime 2023-09-19 06:35:50 +02:00
El RIDO
ad50950b3c
Extract latest changelog entry and attach it to draft 2023-09-18 20:50:14 +02:00
El RIDO
73c13af10d
add workflow attaching SLSA provinence to draft release 2023-09-18 20:47:16 +02:00
El RIDO
8a03c85708
Merge pull request #1173 from PrivateBin/bugreport
Also add FAQ section/tick box requirement for bug template
2023-09-15 06:26:28 +02:00
El RIDO
6a454c1765
Merge pull request #1172 from PrivateBin/patchqaagain
Fix error message about QA template
2023-09-15 06:23:25 +02:00
El RIDO
f862e062cd
Merge pull request #1171 from PrivateBin/dependabot/composer/phpunit/phpunit-9.6.12
Bump phpunit/phpunit from 9.6.11 to 9.6.12
2023-09-14 05:31:40 +02:00
rugk
db2d8f1598
Also add FAQ sectiontick box requirement for bug template
It's apparently not enough to have in the Q/A, best is we have it here to.

The next step would be converting that into the same form like the QA template. After all, it may mostly just be copy paste as it is nearly identical but well…
2023-09-14 00:02:01 +02:00
rugk
168fb46767
Fix error message about QA template
GitHub complains:
> title must be of type String and cannot be empty. Learn more about this error.

Well then… as we don't want to provide a default title (see https://github.com/PrivateBin/PrivateBin/pull/1155) let's remove it.
2023-09-13 23:56:35 +02:00
dependabot[bot]
ff6b9b8e01
Bump phpunit/phpunit from 9.6.11 to 9.6.12
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.6.11 to 9.6.12.
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/9.6.12/ChangeLog-9.6.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.6.11...9.6.12)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-13 11:39:25 +00:00
El RIDO
b998820957
Merge pull request #1168 from tristanlatr/patch-1
Fix install docs
2023-09-12 21:05:44 +02:00
tristanlatr
edc86ffd72
Fix install docs
CONFIG_PATH should actually point to the directory that contains the conf.php file.
2023-09-11 17:58:13 -04:00
104 changed files with 1708 additions and 965 deletions

View File

@ -40,11 +40,7 @@
"forwardPorts": [ "forwardPorts": [
8080 8080
], ],
"postCreateCommand": [ "postCreateCommand": ".devcontainer/postCreateCommand.sh",
"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"
],
// alternatiuve: apache2ctl start (but requires root) // alternatiuve: apache2ctl start (but requires root)
"postAttachCommand": "php -S 0.0.0.0:8080" "postAttachCommand": "php -S 0.0.0.0:8080"
} }

View File

@ -0,0 +1,5 @@
#!/bin/sh
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

1
.gitattributes vendored
View File

@ -2,6 +2,7 @@ bin/configuration-test-generator export-ignore
bin/icon-test export-ignore bin/icon-test export-ignore
doc/ export-ignore doc/ export-ignore
tst/ export-ignore tst/ export-ignore
i18n/en.json export-ignore
img/browserstack.svg export-ignore img/browserstack.svg export-ignore
js/.istanbul.yml export-ignore js/.istanbul.yml export-ignore
js/.nycrc.yml export-ignore js/.nycrc.yml export-ignore

View File

@ -1,4 +1,3 @@
title: ""
labels: ["question/support"] labels: ["question/support"]
body: body:
- type: markdown - type: markdown

View File

@ -10,6 +10,9 @@ assignees: ''
<!-- Please make sure to **only** use this template when it is about bugs in the PrivateBin PHP project. <!-- Please make sure to **only** use this template when it is about bugs in the PrivateBin PHP project.
Otherwise, for help and support issues e.g. for deployment issues, please go back and chose the appropiate category. --> Otherwise, for help and support issues e.g. for deployment issues, please go back and chose the appropiate category. -->
**Did you use the FAQ section?**
- [ ] Yes, I have read [the FAQ](https://github.com/PrivateBin/PrivateBin/wiki/FAQ) and I found no solution/answer there.
<!-- Describe the bug: A clear and concise description of what the bug is. --> <!-- Describe the bug: A clear and concise description of what the bug is. -->
## Steps to reproduce ## Steps to reproduce

View File

@ -37,7 +37,7 @@ jobs:
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@v2 uses: github/codeql-action/init@v3
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file. # If you wish to specify custom queries, you can do so here or in a config file.
@ -46,4 +46,4 @@ jobs:
# queries: ./path/to/local/query, your-org/your-repo/queries@main # queries: ./path/to/local/query, your-org/your-repo/queries@main
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2 uses: github/codeql-action/analyze@v3

50
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,50 @@
name: Draft Release
on:
push:
tags: '[0-9]+.[0-9]?[0-9]?[0-9]?.?[0-9]+'
jobs:
draft:
runs-on: ubuntu-latest
steps:
- name: Fetch changelog from tag
uses: actions/checkout@v4
with:
sparse-checkout: CHANGELOG.md
sparse-checkout-cone-mode: false
- name: Extract latest changelog entry and attach it to draft
uses: taiki-e/create-gh-release-action@v1
with:
changelog: CHANGELOG.md
draft: true
token: ${{ secrets.GITHUB_TOKEN }}
release:
outputs:
hashes: ${{ steps.hash.outputs.hashes }}
runs-on: ubuntu-latest
steps:
- name: Collect artifacts
run: |
wget -q https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${GITHUB_REF_NAME}.tar.gz
wget -q https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${GITHUB_REF_NAME}.zip
- name: Generate hashes
shell: bash
id: hash
run: echo "hashes=$(sha256sum ${GITHUB_REF_NAME}.* | base64 -w0)" >> "$GITHUB_OUTPUT"
provenance:
needs:
- release
permissions:
actions: read
id-token: write
contents: write
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.9.0
with:
base64-subjects: "${{ needs.release.outputs.hashes }}"
draft-release: true
upload-assets: true

View File

@ -24,6 +24,6 @@ jobs:
with: with:
args: --sarif-file-output=snyk.sarif args: --sarif-file-output=snyk.sarif
- name: Upload result to GitHub Code Scanning - name: Upload result to GitHub Code Scanning
uses: github/codeql-action/upload-sarif@v2 uses: github/codeql-action/upload-sarif@v3
with: with:
sarif_file: snyk.sarif sarif_file: snyk.sarif

View File

@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
php-versions: ['7.3', '7.4', '8.0', '8.1', '8.2'] php-versions: ['7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4']
name: PHP ${{ matrix.php-versions }} unit tests on ${{ matrix.operating-system }} name: PHP ${{ matrix.php-versions }} unit tests on ${{ matrix.operating-system }}
env: env:
extensions: gd, sqlite3 extensions: gd, sqlite3
@ -41,7 +41,7 @@ jobs:
key: ${{ runner.os }}-${{ env.extensions-cache-key }} key: ${{ runner.os }}-${{ env.extensions-cache-key }}
- name: Cache extensions - name: Cache extensions
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ${{ steps.extcache.outputs.dir }} path: ${{ steps.extcache.outputs.dir }}
key: ${{ steps.extcache.outputs.key }} key: ${{ steps.extcache.outputs.key }}
@ -76,7 +76,7 @@ jobs:
shell: bash shell: bash
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ${{ steps.composer-cache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ steps.get-date.outputs.date }}-${{ hashFiles('**/composer.json') }} key: ${{ runner.os }}-composer-${{ steps.get-date.outputs.date }}-${{ hashFiles('**/composer.json') }}
@ -102,9 +102,9 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v3 uses: actions/setup-node@v4
with: with:
node-version: '16' node-version: '20'
cache: 'npm' cache: 'npm'
cache-dependency-path: 'js/package-lock.json' cache-dependency-path: 'js/package-lock.json'

1
.gitignore vendored
View File

@ -35,6 +35,7 @@ tst/.phpunit.result.cache
.settings .settings
.buildpath .buildpath
.project .project
.phpdoc
.externalToolBuilders .externalToolBuilders
.c9 .c9
/.idea/ /.idea/

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"files.associations": {
"**/cfg/conf*.php": "ini"
}
}

View File

@ -1,294 +1,349 @@
# PrivateBin version history # PrivateBin version history
* **1.6.0 (2023-09-11)** ## 1.7.1 (2024-02-11)
* ADDED: Translations for Japanese & Arabic * FIXED: zlib 1.3.1 wasm file reference
* ADDED: Configuration option to disable Email button (#1164)
* CHANGED: Minimum required PHP version is 7.3, due to upgrading PHPunit (#707) ## 1.7.0 (2024-02-11)
* CHANGED: Removed PHP 5 polyfill for random_bytes() * ADDED: Translations for Romanian
* **1.5.2 (2023-07-09)** * ADDED: Detect and report on damaged pastes (#1218)
* ADDED: Allow AWS SDK to use default credential provider chain for S3Storage (#1070) * CHANGED: Ask for confirmation, before loading burn after reading pastes (#1237)
* CHANGED: Upgrading libraries to: DOMpurify 3.0.4 & jQuery 3.7.0 * CHANGED: Focus on password input in modal dialog
* FIXED: Addressed PHP 8.2 deprecation warnings (#1092) * CHANGED: Upgrading libraries to: DOMpurify 3.0.8 & zlib 1.3.1
* FIXED: Expose types JSON-LD incl. configured expiration dates (#1045) * FIXED: Support more types of valid URLs for shorteners, incl. IDN ones (#1224)
* **1.5.1 (2022-12-24)** * FIXED: Email timezone buttons overlapping in some languages (#1039)
* ADDED: script for administrative tasks: deleting pastes (#274), removing empty directories (#277), purging expired pastes (#276) & statistics (#319) * FIXED: Changing language mangles URL (#1191)
* FIXED: Revert Filesystem purge to limited and randomized lookup (#1030) * FIXED: Needless reload when visiting default URL
* FIXED: Catch JSON decode errors when invalid data gets sent to the API (#1030)
* FIXED: Support sorting v1 format in mixed version comments in Filesystem backend (#1030) ## 1.6.2 (2023-12-15)
* **1.5 (2022-12-11)** * FIXED: English not selectable when `languageselection` enabled (#1208)
* ADDED: script for data storage backend migrations (#1012) * FIXED: SRI mismatch due to cached file having changed (#1207)
* ADDED: Translations for Turkish, Slovak, Greek and Thai
* ADDED: S3 Storage backend (#994) ## 1.6.1 (2023-12-04)
* ADDED: Jdenticons as an option for comment icons (#793) * ADDED: Right-To-Left (RTL) support for Arabic & Hebrew (#1174)
* CHANGED: Avoid `SUPER` privilege for setting the `sql_mode` for MariaDB/MySQL (#919) * CHANGED: Upgrading libraries to: DOMpurify 3.0.6
* CHANGED: Upgrading libraries to: DOMpurify 2.4.6, jQuery 3.6.1, Showdown 2.1.0 & zlib 1.2.13
* FIXED: Revert to CREATE INDEX without IF NOT EXISTS clauses, to support MySQL (#943) ## 1.6.0 (2023-09-11)
* FIXED: Apply table prefix to indexes as well, to support multiple instances sharing a single database (#943) * ADDED: Translations for Japanese & Arabic
* FIXED: YOURLS integration via new proxy, storing signature in configuration (#725) * ADDED: Configuration option to disable Email button (#1164)
* **1.4 (2022-04-09)** * CHANGED: Minimum required PHP version is 7.3, due to upgrading PHPunit (#707)
* ADDED: Translations for Corsican, Estonian, Finnish and Lojban * CHANGED: Removed PHP 5 polyfill for random_bytes()
* ADDED: new HTTP headers improving security (#765)
* ADDED: Download button for paste text (#774) ## 1.5.2 (2023-07-09)
* ADDED: Opt-out of federated learning of cohorts (FLoC) (#776) * ADDED: Allow AWS SDK to use default credential provider chain for S3Storage (#1070)
* ADDED: Configuration option to exempt IPs from the rate-limiter (#787) * CHANGED: Upgrading libraries to: DOMpurify 3.0.4 & jQuery 3.7.0
* ADDED: Google Cloud Storage backend support (#795) * FIXED: Addressed PHP 8.2 deprecation warnings (#1092)
* ADDED: Oracle database support (#868) * FIXED: Expose types JSON-LD incl. configured expiration dates (#1045)
* ADDED: Configuration option to limit paste creation and commenting to certain IPs (#883)
* ADDED: Set CSP also as meta tag, to deal with misconfigured webservers mangling the HTTP header ## 1.5.1 (2022-12-24)
* ADDED: Sanitize SVG preview, preventing script execution in instance context * ADDED: script for administrative tasks: deleting pastes (#274), removing empty directories (#277), purging expired pastes (#276) & statistics (#319)
* CHANGED: Language selection cookie only transmitted over HTTPS (#472) * FIXED: Revert Filesystem purge to limited and randomized lookup (#1030)
* CHANGED: Upgrading libraries to: base-x 4.0.0, bootstrap 3.4.1 (JS), DOMpurify 2.3.6, ip-lib 1.18.0, jQuery 3.6.0, random_compat 2.0.21, Showdown 2.0.3 & zlib 1.2.12 * FIXED: Catch JSON decode errors when invalid data gets sent to the API (#1030)
* CHANGED: Removed automatic `.ini` configuration file migration (#808) * FIXED: Support sorting v1 format in mixed version comments in Filesystem backend (#1030)
* CHANGED: Removed configurable `dir` for `traffic` & `purge` limiters (#419)
* CHANGED: Server salt, traffic and purge limiter now stored in the storage backend (#419) ## 1.5 (2022-12-11)
* CHANGED: Drop support for attachment download in IE * ADDED: script for data storage backend migrations (#1012)
* FIXED: Error when attachments are disabled, but paste with attachment gets displayed * ADDED: Translations for Turkish, Slovak, Greek and Thai
* **1.3.5 (2021-04-05)** * ADDED: S3 Storage backend (#994)
* ADDED: Translations for Hebrew, Lithuanian, Indonesian and Catalan * ADDED: Jdenticons as an option for comment icons (#793)
* ADDED: Make the project info configurable (#681) * CHANGED: Avoid `SUPER` privilege for setting the `sql_mode` for MariaDB/MySQL (#919)
* CHANGED: Upgrading libraries to: DOMpurify 2.2.7, kjua 0.9.0 & random_compat 2.0.18 * CHANGED: Upgrading libraries to: DOMpurify 2.4.6, jQuery 3.6.1, Showdown 2.1.0 & zlib 1.2.13
* CHANGED: Open all links in new window (#630) * FIXED: Revert to CREATE INDEX without IF NOT EXISTS clauses, to support MySQL (#943)
* FIXED: PDF display in Firefox (#630) * FIXED: Apply table prefix to indexes as well, to support multiple instances sharing a single database (#943)
* FIXED: Allow pasting into password input dialog (#630) * FIXED: YOURLS integration via new proxy, storing signature in configuration (#725)
* FIXED: Display of expiration date in email (#630)
* FIXED: Allow display of durations in weeks (#630) ## 1.4 (2022-04-09)
* FIXED: Avoid exposing burn-after-reading messages from cache (#630) * ADDED: Translations for Corsican, Estonian, Finnish and Lojban
* FIXED: Only display the dropzone when it should (#630) * ADDED: new HTTP headers improving security (#765)
* FIXED: Detect delete token properly (#630) * ADDED: Download button for paste text (#774)
* FIXED: Sanitize output from `Helper.urls2links()` (#630) * ADDED: Opt-out of federated learning of cohorts (FLoC) (#776)
* FIXED: Avoid recreation of existing pasteurl element when calling URL shortener (#630) * ADDED: Configuration option to exempt IPs from the rate-limiter (#787)
* FIXED: Downloads in Chrome >= 83 (#634) * ADDED: Google Cloud Storage backend support (#795)
* FIXED: Display of empty files (#663) * ADDED: Oracle database support (#868)
* FIXED: Improve OpenGraph attributes (#651) * ADDED: Configuration option to limit paste creation and commenting to certain IPs (#883)
* FIXED: Reset to configured burn-after-reading, discussion and expiration settings (#682) * ADDED: Set CSP also as meta tag, to deal with misconfigured webservers mangling the HTTP header
* FIXED: Italic segment of project information (#756) * ADDED: Sanitize SVG preview, preventing script execution in instance context
* **1.3.4 (2020-03-22)** * CHANGED: Language selection cookie only transmitted over HTTPS (#472)
* CHANGED: Minimum required PHP version is 5.6, due to a change in the identicon library and to use php's native hash_equals() * CHANGED: Upgrading libraries to: base-x 4.0.0, bootstrap 3.4.1 (JS), DOMpurify 2.3.6, ip-lib 1.18.0, jQuery 3.6.0, random_compat 2.0.21, Showdown 2.0.3 & zlib 1.2.12
* CHANGED: Upgrading libraries to: identicon 2.0.0 * CHANGED: Removed automatic `.ini` configuration file migration (#808)
* FIXED: Support custom expiration options in email function (#586) * CHANGED: Removed configurable `dir` for `traffic` & `purge` limiters (#419)
* FIXED: Regression with encoding of HTML entities (#588) * CHANGED: Server salt, traffic and purge limiter now stored in the storage backend (#419)
* FIXED: Unable to paste password on paste with attachment (#565 & #595) * CHANGED: Drop support for attachment download in IE
* **1.3.3 (2020-02-16)** * FIXED: Error when attachments are disabled, but paste with attachment gets displayed
* CHANGED: Upgrading libraries to: DOMpurify 2.0.8
* CHANGED: Several translations got updated with missing messages ## 1.3.5 (2021-04-05)
* CHANGED: Introduce HTML entity encoding on server side (#581) * ADDED: Translations for Hebrew, Lithuanian, Indonesian and Catalan
* FIXED: HTML entity double encoding issues introduced in 1.3.2 (#560) * ADDED: Make the project info configurable (#681)
* **1.2.3 (2020-02-16)** * CHANGED: Upgrading libraries to: DOMpurify 2.2.7, kjua 0.9.0 & random_compat 2.0.18
* CHANGED: Upgrading libraries to: DOMpurify 2.0.8 * CHANGED: Open all links in new window (#630)
* CHANGED: Introduce HTML entity encoding on server side (#581) * FIXED: PDF display in Firefox (#630)
* FIXED: HTML entity double encoding issues introduced in 1.3.2 (#560) * FIXED: Allow pasting into password input dialog (#630)
* **1.3.2 (2020-01-11)** * FIXED: Display of expiration date in email (#630)
* ADDED: Translation for Ukrainian (#533) * FIXED: Allow display of durations in weeks (#630)
* ADDED: Option to send a mail with the link, when creating a paste (#398) * FIXED: Avoid exposing burn-after-reading messages from cache (#630)
* ADDED: Add support for CONFIG_PATH environment variable (#552) * FIXED: Only display the dropzone when it should (#630)
* CHANGED: Upgrading libraries to: base-x 3.0.7, DOMpurify 2.0.7 & Showdown 1.9.1 * FIXED: Detect delete token properly (#630)
* FIXED: HTML injection via unescaped attachment filename (#554) * FIXED: Sanitize output from `Helper.urls2links()` (#630)
* FIXED: Password disabling option (#527) * FIXED: Avoid recreation of existing pasteurl element when calling URL shortener (#630)
* **1.2.2 (2020-01-11)** * FIXED: Downloads in Chrome >= 83 (#634)
* CHANGED: Upgrading libraries to: bootstrap 3.4.1 (CSS), DOMpurify 2.0.7, jQuery 3.4.1, kjua 0.6.0, Showdown 1.9.1 & SJCL 1.0.8 * FIXED: Display of empty files (#663)
* FIXED: HTML injection via unescaped attachment filename (#554) * FIXED: Improve OpenGraph attributes (#651)
* **1.3.1 (2019-09-22)** * FIXED: Reset to configured burn-after-reading, discussion and expiration settings (#682)
* ADDED: Translation for Bulgarian (#455) * FIXED: Italic segment of project information (#756)
* CHANGED: Improved mobile UI - obscured send button and hard to click shortener button (#477)
* CHANGED: Enhanced URL shortener integration (#479) ## 1.3.4 (2020-03-22)
* CHANGED: Improved file upload drag & drop UI (#317) * CHANGED: Minimum required PHP version is 5.6, due to a change in the identicon library and to use php's native hash_equals()
* CHANGED: Increased default size limit from 2 to 10 MiB, switch data from BLOB to MEDIUMBLOB in MySQL (#458) * CHANGED: Upgrading libraries to: identicon 2.0.0
* CHANGED: Upgrading libraries to: DOMpurify 2.0.1 * FIXED: Support custom expiration options in email function (#586)
* FIXED: Enabling browsers without WASM to create pastes and read uncompressed ones (#454) * FIXED: Regression with encoding of HTML entities (#588)
* FIXED: Cloning related issues (#489, #491, #493, #494) * FIXED: Unable to paste password on paste with attachment (#565 & #595)
* FIXED: Enable file operation only when editing (#497)
* FIXED: Clicking 'New' on a previously submitted paste does not blank address bar (#354) ## 1.3.3 (2020-02-16)
* FIXED: Clear address bar when create new paste from existing paste (#479) * CHANGED: Upgrading libraries to: DOMpurify 2.0.8
* FIXED: Discussion section not hiding when new/clone paste is clicked on (#484) * CHANGED: Several translations got updated with missing messages
* FIXED: Showdown.js error when posting svg qrcode (#485) * CHANGED: Introduce HTML entity encoding on server side (#581)
* FIXED: Failed to handle the case where user cancelled attachment selection properly (#487) * FIXED: HTML entity double encoding issues introduced in 1.3.2 (#560)
* FIXED: Displaying the appropriate errors in older browsers (#508)
* **1.3 (2019-07-09)** ## 1.2.3 (2020-02-16)
* ADDED: Translation for Czech (#424) * CHANGED: Upgrading libraries to: DOMpurify 2.0.8
* ADDED: Threat modeled the application (#177) * CHANGED: Introduce HTML entity encoding on server side (#581)
* ADDED: Made compression configurable (#38) * FIXED: HTML entity double encoding issues introduced in 1.3.2 (#560)
* CHANGED: Minimum required PHP version is 5.5, due to a change in the identicon library
* CHANGED: Minimum required browser versions are Firefox 54, Chrome 57, Opera 44, Safari 11, Edge 16, due to use of WebCrypto API, async/await, ES6 & WebAssembly features - all Internet Explorer versions are incompatible ## 1.3.2 (2020-01-11)
* CHANGED: JSON and encryption formats were changed to replace SJCL library by browser integrated WebCrypto API (#28, #74) * ADDED: Translation for Ukrainian (#533)
* CHANGED: Replaced rawdeflate.js with zlib.wasm to resolve decompression failures and gain compatibility with standard deflate implementations (#193, #260, #328, #434, #440) * ADDED: Option to send a mail with the link, when creating a paste (#398)
* CHANGED: Increase PBKDF2 iterations to 100k (#350) * ADDED: Add support for CONFIG_PATH environment variable (#552)
* CHANGED: Replaced last use of MD5 with FowlerNollVo checksum which produces the exact length we need for the paste ID (#49) * CHANGED: Upgrading libraries to: base-x 3.0.7, DOMpurify 2.0.7 & Showdown 1.9.1
* CHANGED: Simplified some PHP code & renamed PrivateBin class into Controller, to make MVC pattern use more obvious (#342) * FIXED: HTML injection via unescaped attachment filename (#554)
* CHANGED: Upgrading libraries to: identicon 1.2.0, random_compat 2.0.18, jQuery 3.4.1, Showdown 1.9.0, DOMpurify 1.0.11 & kjua 0.6.0 * FIXED: Password disabling option (#527)
* FIXED: Prevent Chrome from sending content of paste to Google for translation (#378)
* FIXED: To support attachments larger then 2 MiB in newer Chrome versions, we switched to blob instead of data URIs (#432) ## 1.2.2 (2020-01-11)
* FIXED: Since Outlook strips trailing equal signs in links, the key in URL hash is now base58 encoded, instead of base64 (#377) * CHANGED: Upgrading libraries to: bootstrap 3.4.1 (CSS), DOMpurify 2.0.7, jQuery 3.4.1, kjua 0.6.0, Showdown 1.9.1 & SJCL 1.0.8
* FIXED: Facebooks started injecting parameters into shared URLs for tracking that lead to inaccessible pastes (#396) * FIXED: HTML injection via unescaped attachment filename (#554)
* FIXED: Properly escaped HTML in raw text mode (#358)
* FIXED: Made download links better readable in the dark bootstrap theme (#364) ## 1.3.1 (2019-09-22)
* FIXED: Allow Letsencrypt bot to access on apache servers (#413) * ADDED: Translation for Bulgarian (#455)
* **1.2.1 (2018-08-11)** * CHANGED: Improved mobile UI - obscured send button and hard to click shortener button (#477)
* ADDED: Add support for mega.nz links in pastes and comments (#331) * CHANGED: Enhanced URL shortener integration (#479)
* CHANGED: Added some missing Russian translations (#348) * CHANGED: Improved file upload drag & drop UI (#317)
* CHANGED: Minor PHP refactoring: Rename PrivateBin class to Controller, improved logic of some persistence classes (#342) * CHANGED: Increased default size limit from 2 to 10 MiB, switch data from BLOB to MEDIUMBLOB in MySQL (#458)
* CHANGED: Upgrading DOMpurify library to 1.0.7 * CHANGED: Upgrading libraries to: DOMpurify 2.0.1
* FIXED: Ensure legacy browsers without webcrypto support can't create paste keys with insufficient entropy (#346) * FIXED: Enabling browsers without WASM to create pastes and read uncompressed ones (#454)
* FIXED: Re-add support for old browsers (Firefox&lt;21, Chrome&lt;31, Safari&lt;7, IE&lt;11), broken in 1.2, will be removed again in 1.3 * FIXED: Cloning related issues (#489, #491, #493, #494)
* **1.2 (2018-07-22)** * FIXED: Enable file operation only when editing (#497)
* ADDED: Translations for Spanish, Occitan, Norwegian, Portuguese, Dutch and Hungarian * FIXED: Clicking 'New' on a previously submitted paste does not blank address bar (#354)
* ADDED: Option in configuration to change the default "PrivateBin" title of the site * FIXED: Clear address bar when create new paste from existing paste (#479)
* ADDED: Added display of video, audio & PDF, drag & drop, preview of attachments (#182) * FIXED: Discussion section not hiding when new/clone paste is clicked on (#484)
* ADDED: QR code generation (#169) * FIXED: Showdown.js error when posting svg qrcode (#485)
* ADDED: Introduced DOMpurify library to sanitize generated HTML before display (#183) * FIXED: Failed to handle the case where user cancelled attachment selection properly (#487)
* CHANGED: Force JSON request for getting paste data & password retry (#216) * FIXED: Displaying the appropriate errors in older browsers (#508)
* CHANGED: Minimum required PHP version is 5.4 (#186)
* CHANGED: Shipped .htaccess files were updated for Apache 2.4 (#192) ## 1.3 (2019-07-09)
* CHANGED: Cleanup of bootstrap template variants and moved icons to `img` directory * ADDED: Translation for Czech (#424)
* CHANGED: Removed option to hide clone button on expiring pastes, since this requires reading the paste for rendering the template, which leaks information on the pastes state * ADDED: Threat modeled the application (#177)
* CHANGED: Upgrading libraries to: SJCL 1.0.7, jQuery 3.3.1, Base64 2.4.5, Showdown 1.8.6, DOMpurify 1.0.5 & Prettify 453bd5f * ADDED: Made compression configurable (#38)
* CHANGED: Refactored JavaScript code, making it modular with private and public functions, making it much easier to maintain (#178) * CHANGED: Minimum required PHP version is 5.5, due to a change in the identicon library
* FIXED: To counteract regressions introduced by the refactoring, we finally introduced property based unit testing for the JavaScript code, this caught several regressions, but also some very old bugs not found so far (#32) * CHANGED: Minimum required browser versions are Firefox 54, Chrome 57, Opera 44, Safari 11, Edge 16, due to use of WebCrypto API, async/await, ES6 & WebAssembly features - all Internet Explorer versions are incompatible
* **1.1.1 (2017-10-06)** * CHANGED: JSON and encryption formats were changed to replace SJCL library by browser integrated WebCrypto API (#28, #74)
* CHANGED: Switched to `.php` file extension for configuration file, to avoid leaking configuration data in unprotected installation. * CHANGED: Replaced rawdeflate.js with zlib.wasm to resolve decompression failures and gain compatibility with standard deflate implementations (#193, #260, #328, #434, #440)
* **1.1 (2016-12-26)** * CHANGED: Increase PBKDF2 iterations to 100k (#350)
* ADDED: Translations for Italian and Russian * CHANGED: Replaced last use of MD5 with FowlerNollVo checksum which produces the exact length we need for the paste ID (#49)
* ADDED: Loading message displayed until decryption succeeded for slower (in terms of CPU or network) systems * CHANGED: Simplified some PHP code & renamed PrivateBin class into Controller, to make MVC pattern use more obvious (#342)
* ADDED: Dockerfile for docker container creation * CHANGED: Upgrading libraries to: identicon 1.2.0, random_compat 2.0.18, jQuery 3.4.1, Showdown 1.9.0, DOMpurify 1.0.11 & kjua 0.6.0
* CHANGED: Using modal dialog to request password input instead of native JS input window (#69) * FIXED: Prevent Chrome from sending content of paste to Google for translation (#378)
* CHANGED: Suppressed referrer HTTP header sending when following links in a paste or comment (#96) and added additional HTTP headers for XSS mitigation (#91) * FIXED: To support attachments larger then 2 MiB in newer Chrome versions, we switched to blob instead of data URIs (#432)
* CHANGED: Updated random_compat and jQuery libraries * FIXED: Since Outlook strips trailing equal signs in links, the key in URL hash is now base58 encoded, instead of base64 (#377)
* FIXED: XSS using JavaScript stored as markdown formatted paste, after clicking on Raw paste button (#137) * FIXED: Facebooks started injecting parameters into shared URLs for tracking that lead to inaccessible pastes (#396)
* FIXED: Automatic purging deleting non-expiring pastes, when using database store (#149) * FIXED: Properly escaped HTML in raw text mode (#358)
* **1.0 (2016-08-25)** * FIXED: Made download links better readable in the dark bootstrap theme (#364)
* ADDED: Translations for Slowene and Chinese * FIXED: Allow Letsencrypt bot to access on apache servers (#413)
* ADDED: re-introduced (optional) URL shortener support, which was removed back in version 0.16 for privacy concerns
* ADDED: Preview tab, helpful for writing markdown code or check the source code rendering ## 1.2.1 (2018-08-11)
* ADDED: Automatic purging of expired pastes, done on paste creation * ADDED: Add support for mega.nz links in pastes and comments (#331)
* ADDED: Option to disable icons in discussions (will only affect newly created pastes) * CHANGED: Added some missing Russian translations (#348)
* ADDED: Composer support * CHANGED: Minor PHP refactoring: Rename PrivateBin class to Controller, improved logic of some persistence classes (#342)
* CHANGED: Renamed the ZeroBin fork to PrivateBin * CHANGED: Upgrading DOMpurify library to 1.0.7
* CHANGED: Removed unmaintained RainTPL template engine, replacing the templates with straight forward PHP files * FIXED: Ensure legacy browsers without webcrypto support can't create paste keys with insufficient entropy (#346)
* CHANGED: New logo and favicons * FIXED: Re-add support for old browsers (Firefox&lt;21, Chrome&lt;31, Safari&lt;7, IE&lt;11), broken in 1.2, will be removed again in 1.3
* CHANGED: Upgrading SJCL library to 1.0.4
* CHANGED: Switched to GCM instead of CCM mode for AES encryption for newly created pastes ## 1.2 (2018-07-22)
* CHANGED: Use backported random bytes function from PHP7 for older PHP versions instead of mcrypt * ADDED: Translations for Spanish, Occitan, Norwegian, Portuguese, Dutch and Hungarian
* CHANGED: Switched to a SHA256 HMAC of the IP in traffic limiter instead of storing it in plain text on the server * ADDED: Option in configuration to change the default "PrivateBin" title of the site
* CHANGED: Introduced content security policy header to reduce cross site scripting (XSS) risks * ADDED: Added display of video, audio & PDF, drag & drop, preview of attachments (#182)
* CHANGED: Added SHA512 subresource integrity hashes for all javascript includes to reduce the risk of manipulated scripts and easier detection of such * ADDED: QR code generation (#169)
* CHANGED: Refactored PHP code to conform to PSR-4 and PSR-2 standards * ADDED: Introduced DOMpurify library to sanitize generated HTML before display (#183)
* CHANGED: Switched to Identicons as the default for comments with nicknames * CHANGED: Force JSON request for getting paste data & password retry (#216)
* CHANGED: Vizhash is now optional and based on (128 byte) SHA512 HMAC instead of (144 byte) combination of MD5, SHA1 and a reversal of that string * CHANGED: Minimum required PHP version is 5.4 (#186)
* FIXED: Content-type negociation for HTML in certain uncommon browser configurations * CHANGED: Shipped .htaccess files were updated for Apache 2.4 (#192)
* FIXED: JavaScript error displayed before page is loaded or during attachment load * CHANGED: Cleanup of bootstrap template variants and moved icons to `img` directory
* FIXED: Don't strip space characters at beginning or end of optional password * CHANGED: Removed option to hide clone button on expiring pastes, since this requires reading the paste for rendering the template, which leaks information on the pastes state
* FIXED: Various UI glitches in mobile version or on smaller desktops with language menu, button spacing and long URLs * CHANGED: Upgrading libraries to: SJCL 1.0.7, jQuery 3.3.1, Base64 2.4.5, Showdown 1.8.6, DOMpurify 1.0.5 & Prettify 453bd5f
* FIXED: Back button now works as expected after switching to raw text view of a paste * CHANGED: Refactored JavaScript code, making it modular with private and public functions, making it much easier to maintain (#178)
* FIXED: Reactivated second error message above send comment button to ensure its visibility when the main error message is outside the viewport * FIXED: To counteract regressions introduced by the refactoring, we finally introduced property based unit testing for the JavaScript code, this caught several regressions, but also some very old bugs not found so far (#32)
* FIXED: Raw text now displays original markdown instead of rendered HTML
* FIXED: Removed unused code detected with the help of various code review tools ## 1.1.1 (2017-10-06)
* FIXED: Table format for PostgreSQL, making it possible to use PostgreSQL as backend in addition to MySQL, SQLite and flat files * CHANGED: Switched to `.php` file extension for configuration file, to avoid leaking configuration data in unprotected installation.
* **0.22 (2015-11-09)**:
* ADDED: Tab character input support ## 1.1 (2016-12-26)
* ADDED: Dark bootstrap theme * ADDED: Translations for Italian and Russian
* ADDED: Option to hide clone button on expiring pastes * ADDED: Loading message displayed until decryption succeeded for slower (in terms of CPU or network) systems
* ADDED: Option to set a different default language then English and/or enforce it as the only language * ADDED: Dockerfile for docker container creation
* ADDED: Database now contains version to allow automatic update of structure, only if necessary; removing database structure check on each request * CHANGED: Using modal dialog to request password input instead of native JS input window (#69)
* ADDED: Favicons * CHANGED: Suppressed referrer HTTP header sending when following links in a paste or comment (#96) and added additional HTTP headers for XSS mitigation (#91)
* FIXING: Regressions in database layer, prohibiting pastes from being stored * CHANGED: Updated random_compat and jQuery libraries
* FIXING: Fixing "missing" comments when they were posted during the same second to the same paste * FIXED: XSS using JavaScript stored as markdown formatted paste, after clicking on Raw paste button (#137)
* FIXING: JS failing when password input disabled * FIXED: Automatic purging deleting non-expiring pastes, when using database store (#149)
* CHANGED: Switching positions of "New" and "Send" button, highlighting the latter to improve workflow
* CHANGED: Renamed config file to make updates easier ## 1.0 (2016-08-25)
* CHANGED: Switching to JSON-based REST-API * ADDED: Translations for Slowene and Chinese
* CHANGED: Database structure to store attachments, allowing larger attachments to be stored (depending on maximum BLOB size of database backend) * ADDED: re-introduced (optional) URL shortener support, which was removed back in version 0.16 for privacy concerns
* CHANGED: Refactored data model, traffic limiting & request handling * ADDED: Preview tab, helpful for writing markdown code or check the source code rendering
* **0.21.1 (2015-09-21)**: * ADDED: Automatic purging of expired pastes, done on paste creation
* FIXING: lost meta data when using DB model instead of flat files * ADDED: Option to disable icons in discussions (will only affect newly created pastes)
* FIXING: mobile navbar getting triggered on load * ADDED: Composer support
* CHANGED: database table "paste" gets automatically extended with a "meta" column * CHANGED: Renamed the ZeroBin fork to PrivateBin
* CHANGED: navbar of "bootstrap" template now spans full width of view port on large screens * CHANGED: Removed unmaintained RainTPL template engine, replacing the templates with straight forward PHP files
* **0.21 (2015-09-19)**: * CHANGED: New logo and favicons
* ADDED: Translations for German, French and Polish, language selection menu (optional) * CHANGED: Upgrading SJCL library to 1.0.4
* ADDED: File upload and image display support (optional) * CHANGED: Switched to GCM instead of CCM mode for AES encryption for newly created pastes
* ADDED: Markdown format support * CHANGED: Use backported random bytes function from PHP7 for older PHP versions instead of mcrypt
* ADDED: "bootstrap-compact" template that hides some of the options in a drop down menu to ensure the nav bar fitting on one line on smaller screen sizes * CHANGED: Switched to a SHA256 HMAC of the IP in traffic limiter instead of storing it in plain text on the server
* FIXING: Various usability issues with different screen sizes / device types in the "bootstrap" template * CHANGED: Introduced content security policy header to reduce cross site scripting (XSS) risks
* CHANGED: Instead of having different options to enable and preselect certain formats there is now a generic `[formatter_options]` section where formats can be added to the displayed format drop down menu. A `defaultformatter` can be set, it defaults to "plaintext". The `syntaxhighlighting` configuration got deprecated. * CHANGED: Added SHA512 subresource integrity hashes for all javascript includes to reduce the risk of manipulated scripts and easier detection of such
* `zerobin.js` got a major refactoring: * CHANGED: Refactored PHP code to conform to PSR-4 and PSR-2 standards
* moved from global namespace into anonymous function * CHANGED: Switched to Identicons as the default for comments with nicknames
* events are no longer set via "onclick" attributes in the templates, but bound by from JS side * CHANGED: Vizhash is now optional and based on (128 byte) SHA512 HMAC instead of (144 byte) combination of MD5, SHA1 and a reversal of that string
* for simpler maintenance the functions were grouped into objects: zerobin (display logic, event handling), filter (compression, * FIXED: Content-type negociation for HTML in certain uncommon browser configurations
* FIXED: JavaScript error displayed before page is loaded or during attachment load
* FIXED: Don't strip space characters at beginning or end of optional password
* FIXED: Various UI glitches in mobile version or on smaller desktops with language menu, button spacing and long URLs
* FIXED: Back button now works as expected after switching to raw text view of a paste
* FIXED: Reactivated second error message above send comment button to ensure its visibility when the main error message is outside the viewport
* FIXED: Raw text now displays original markdown instead of rendered HTML
* FIXED: Removed unused code detected with the help of various code review tools
* FIXED: Table format for PostgreSQL, making it possible to use PostgreSQL as backend in addition to MySQL, SQLite and flat files
## 0.22 (2015-11-09):
* ADDED: Tab character input support
* ADDED: Dark bootstrap theme
* ADDED: Option to hide clone button on expiring pastes
* ADDED: Option to set a different default language then English and/or enforce it as the only language
* ADDED: Database now contains version to allow automatic update of structure, only if necessary; removing database structure check on each request
* ADDED: Favicons
* FIXING: Regressions in database layer, prohibiting pastes from being stored
* FIXING: Fixing "missing" comments when they were posted during the same second to the same paste
* FIXING: JS failing when password input disabled
* CHANGED: Switching positions of "New" and "Send" button, highlighting the latter to improve workflow
* CHANGED: Renamed config file to make updates easier
* CHANGED: Switching to JSON-based REST-API
* CHANGED: Database structure to store attachments, allowing larger attachments to be stored (depending on maximum BLOB size of database backend)
* CHANGED: Refactored data model, traffic limiting & request handling
## 0.21.1 (2015-09-21):
* FIXING: lost meta data when using DB model instead of flat files
* FIXING: mobile navbar getting triggered on load
* CHANGED: database table "paste" gets automatically extended with a "meta" column
* CHANGED: navbar of "bootstrap" template now spans full width of view port on large screens
## 0.21 (2015-09-19):
* ADDED: Translations for German, French and Polish, language selection menu (optional)
* ADDED: File upload and image display support (optional)
* ADDED: Markdown format support
* ADDED: "bootstrap-compact" template that hides some of the options in a drop down menu to ensure the nav bar fitting on one line on smaller screen sizes
* FIXING: Various usability issues with different screen sizes / device types in the "bootstrap" template
* CHANGED: Instead of having different options to enable and preselect certain formats there is now a generic `[formatter_options]` section where formats can be added to the displayed format drop down menu. A `defaultformatter` can be set, it defaults to "plaintext". The `syntaxhighlighting` configuration got deprecated.
* `zerobin.js` got a major refactoring:
* moved from global namespace into anonymous function
* events are no longer set via "onclick" attributes in the templates, but bound by from JS side
* for simpler maintenance the functions were grouped into objects: zerobin (display logic, event handling), filter (compression,
encryption), i18n (translation, counterpart of i18n.php) and helper (stateless utilities) encryption), i18n (translation, counterpart of i18n.php) and helper (stateless utilities)
* Wiki pages were added to address common topics: * Wiki pages were added to address common topics:
* [Upgrading from ZeroBin 0.19 Alpha](https://github.com/PrivateBin/PrivateBin/wiki/Upgrading-from-ZeroBin-0.19-Alpha) * [Upgrading from ZeroBin 0.19 Alpha](https://github.com/PrivateBin/PrivateBin/wiki/Upgrading-from-ZeroBin-0.19-Alpha)
* [Directory of public PrivateBin servers](https://github.com/PrivateBin/PrivateBin/wiki/PrivateBin-Directory) * [Directory of public PrivateBin servers](https://github.com/PrivateBin/PrivateBin/wiki/PrivateBin-Directory)
* [Translation](https://github.com/PrivateBin/PrivateBin/wiki/Translation) * [Translation](https://github.com/PrivateBin/PrivateBin/wiki/Translation)
* [Templates](https://github.com/PrivateBin/PrivateBin/wiki/Templates) * [Templates](https://github.com/PrivateBin/PrivateBin/wiki/Templates)
* **0.20 (2015-09-03)**:
* ADDED: Password protected pastes (optional) ## 0.20 (2015-09-03):
* ADDED: configuration options for highlighting, password, discussions, expiration times, rate limiting * ADDED: Password protected pastes (optional)
* ADDED: JSON-only retrieval of paste incl. discussion, used to be able to refresh paste when posting a comment * ADDED: configuration options for highlighting, password, discussions, expiration times, rate limiting
* ADDED: bootstrap CSS based template * ADDED: JSON-only retrieval of paste incl. discussion, used to be able to refresh paste when posting a comment
* CHANGED: "Burn after reading" pastes are now deleted only after the paste was successfully decrypted via callback. This prevents accidental deletion by chatbots following URLs and the like. Usage of a password is suggested to ensure only the desired recipient is able to encrypt it. * ADDED: bootstrap CSS based template
* CHANGED: the "opendiscussion" option now only controls if the discussion checkbox is preselected. Use "discussion = false" to disable the discussion feature completely (which also removes the checkbox from the template). * CHANGED: "Burn after reading" pastes are now deleted only after the paste was successfully decrypted via callback. This prevents accidental deletion by chatbots following URLs and the like. Usage of a password is suggested to ensure only the desired recipient is able to encrypt it.
* FIXING: Behaviour of several conflicting configuration options. As a general measure unit tests for 9 of the options and all their possible configurations were added via a unit test generator. * CHANGED: the "opendiscussion" option now only controls if the discussion checkbox is preselected. Use "discussion = false" to disable the discussion feature completely (which also removes the checkbox from the template).
* updated JS libraries: jquery to 1.11.3, sjcl to 1.0.2, base64.js to 2.1.9, deflate to 0.5, inflate to 0.3 and prettify to latest * FIXING: Behaviour of several conflicting configuration options. As a general measure unit tests for 9 of the options and all their possible configurations were added via a unit test generator.
* generally improved documentation, both inline phpdoc / JSdoc source code documentation, as well as Wiki pages on installation, configuration, development and JSON-API * updated JS libraries: jquery to 1.11.3, sjcl to 1.0.2, base64.js to 2.1.9, deflate to 0.5, inflate to 0.3 and prettify to latest
* **Alpha 0.19 (2013-07-05)**: * generally improved documentation, both inline phpdoc / JSdoc source code documentation, as well as Wiki pages on installation, configuration, development and JSON-API
* Corrected XSS security flaw which affected IE<10. Other browsers were not affected.
* Corrected spacing display in IE<10. ## Alpha 0.19 (2013-07-05):
* **Alpha 0.18 (2013-02-24)**: * Corrected XSS security flaw which affected IE<10. Other browsers were not affected.
* ADDED: The resulting URL is automatically selected after pressing "Send". You just have to press CTRL+C. * Corrected spacing display in IE<10.
* ADDED: Automatic syntax highlighting for 53 languages using highlight.js
* ADDED: "5 minutes" and "1 week" expirations. ## Alpha 0.18 (2013-02-24):
* ADDED: "Raw text" button. * ADDED: The resulting URL is automatically selected after pressing "Send". You just have to press CTRL+C.
* jQuery upgraded to 1.9.1 * ADDED: Automatic syntax highlighting for 53 languages using highlight.js
* sjcl upgraded to GitHub master 2013-02-23 * ADDED: "5 minutes" and "1 week" expirations.
* base64.js upgraded to 1.7 * ADDED: "Raw text" button.
* FIXED: Dates in discussion are now proper local dates. * jQuery upgraded to 1.9.1
* ADDED: Robot meta tags in HTML to prevent search engines indexing. * sjcl upgraded to GitHub master 2013-02-23
* ADDED: Better json checking (including entropy). * base64.js upgraded to 1.7
* ADDED: Added version to js/css assets URLs in order to prevent some abusive caches to serve an obsolete version of these files when ZeroBin is upgraded. * FIXED: Dates in discussion are now proper local dates.
* "Burn after reading" option has been moved out of Expiration combo to a separate checkbox. Reason is: You can prevent a read-once paste to be available ad vitam eternam on the net. * ADDED: Robot meta tags in HTML to prevent search engines indexing.
* **Alpha 0.17 (2013-02-23)**: * ADDED: Better json checking (including entropy).
* ADDED: Deletion URL. * ADDED: Added version to js/css assets URLs in order to prevent some abusive caches to serve an obsolete version of these files when ZeroBin is upgraded.
* small refactoring. * "Burn after reading" option has been moved out of Expiration combo to a separate checkbox. Reason is: You can prevent a read-once paste to be available ad vitam eternam on the net.
* improved regex checks.
* larger server alt on installation. ## Alpha 0.17 (2013-02-23):
* **Alpha 0.16**: * ADDED: Deletion URL.
* FIXED minor php warnings. * small refactoring.
* FIXED: zerobin.js reformated and properly commented. * improved regex checks.
* FIXED: Directory structure re-organized. * larger server alt on installation.
* CHANGED: URL shortening button was removed. (It was bad for privacy.)
* **Alpha 0.15 (2012-04-20):** ## Alpha 0.16:
* FIXED: 2 minor corrections to avoid notices in php log. * FIXED minor php warnings.
* FIXED: Sources converted to UTF-8. * FIXED: zerobin.js reformated and properly commented.
* **Alpha 0.14 (2012-04-20):** * FIXED: Directory structure re-organized.
* ADDED: GD presence is checked. * CHANGED: URL shortening button was removed. (It was bad for privacy.)
* CHANGED: Traffic limiter data files moved to data/ (→easier rights management)
* ADDED: "Burn after reading" implemented. Opening the URL will display the paste and immediately destroy it on server. ## Alpha 0.15 (2012-04-20):
* **Alpha 0.13 (2012-04-18):** * FIXED: 2 minor corrections to avoid notices in php log.
* FIXED: ''imageantialias()'' call removed because it's not really usefull and can be a problem on most hosts (if GD is not compiled in php). * FIXED: Sources converted to UTF-8.
* FIXED: $error not properly initialized in index.php
* **Alpha 0.12 (2012-04-18):** ## Alpha 0.14 (2012-04-20):
* **DISCUSSIONS !** Now you can enable discussions on your pastes. Of course, posted comments and nickname are also encrypted and the server cannot see them. * ADDED: GD presence is checked.
* This feature implies a change in storage format. You will have to delete all previous pastes in your ZeroBin. * CHANGED: Traffic limiter data files moved to data/ (→easier rights management)
* Added [[php:vizhash_gd|Vizhash]] as avatars, so you can match posters IP addresses without revealing them. (Same image = same IP). Of course the IP address cannot be deduced from the Vizhash. * ADDED: "Burn after reading" implemented. Opening the URL will display the paste and immediately destroy it on server.
* Remaining time before expiration is now displayed.
* Explicit tags were added to CSS and jQuery selectors (eg. div#aaa instead of #aaa) to speed up browser. ## Alpha 0.13 (2012-04-18):
* Better cleaning of the URL (to make sure the key is not broken by some stupid redirection service) * FIXED: ''imageantialias()'' call removed because it's not really usefull and can be a problem on most hosts (if GD is not compiled in php).
* **Alpha 0.11 (2012-04-12):** * FIXED: $error not properly initialized in index.php
* Automatically ignore parameters (such as &utm_source=...) added //after// the anchor by some stupid Web 2.0 services.
* First public release. ## Alpha 0.12 (2012-04-18):
* **Alpha 0.10 (2012-04-12):** ## DISCUSSIONS ! Now you can enable discussions on your pastes. Of course, posted comments and nickname are also encrypted and the server cannot see them.
* IE9 does not seem to correctly support ''pre-wrap'' either. Special handling mode activated for all version of IE<10. (Note: **ALL other browsers** correctly support this feature.) * This feature implies a change in storage format. You will have to delete all previous pastes in your ZeroBin.
* **Alpha 0.9 (2012-04-11):** * Added [[php:vizhash_gd|Vizhash]] as avatars, so you can match posters IP addresses without revealing them. (Same image = same IP). Of course the IP address cannot be deduced from the Vizhash.
* Oh bummer... IE 8 is as shitty as IE6/7: Its does not seem to support ''white-space:pre-wrap'' correctly. I had to activate the special handling mode. I still have to test IE 9. * Remaining time before expiration is now displayed.
* **Alpha 0.8 (2012-04-11):** * Explicit tags were added to CSS and jQuery selectors (eg. div#aaa instead of #aaa) to speed up browser.
* Source code not published yet. * Better cleaning of the URL (to make sure the key is not broken by some stupid redirection service)
* Interface completely redesigned. Icons added.
* Now properly supports IE6/7 (ugly display, but it works. "Clone" button is disabled though.) ## Alpha 0.11 (2012-04-12):
* Added one level of depth for storage directories (This is better for higher load servers). * Automatically ignore parameters (such as &utm_source=...) added //after// the anchor by some stupid Web 2.0 services.
* php version is now checked (min: 5.2.6) * First public release.
* Better checks on posted json data on server.
* Added "1 year" expiration. ## Alpha 0.10 (2012-04-12):
* URLs are now converted to clickable links. This include http, https, ftp and magnet links. * IE9 does not seem to correctly support ''pre-wrap'' either. Special handling mode activated for all version of IE<10. (Note: ALL other browsers correctly support this feature.)
* Clickable links include ''rel="nofollow"'' to discourage SEO.
* On my public service (http://sebsauvage.net/paste/) ## Alpha 0.9 (2012-04-11):
* All data will be deleted (you were warned - this is a test service) * Oh bummer... IE 8 is as shitty as IE6/7: Its does not seem to support ''white-space:pre-wrap'' correctly. I had to activate the special handling mode. I still have to test IE 9.
* Default paste expiration is now 1 month to prevent clogging-up my host.
## Alpha 0.8 (2012-04-11):
* Source code not published yet.
* Interface completely redesigned. Icons added.
* Now properly supports IE6/7 (ugly display, but it works. "Clone" button is disabled though.)
* Added one level of depth for storage directories (This is better for higher load servers).
* php version is now checked (min: 5.2.6)
* Better checks on posted json data on server.
* Added "1 year" expiration.
* URLs are now converted to clickable links. This include http, https, ftp and magnet links.
* Clickable links include ''rel="nofollow"'' to discourage SEO.
* On my public service (http://sebsauvage.net/paste/)
* All data will be deleted (you were warned - this is a test service)
* Default paste expiration is now 1 month to prevent clogging-up my host.

View File

@ -65,3 +65,4 @@
* jaideejung007 - Thai * jaideejung007 - Thai
* Nicolas Le Gall - Japanese * Nicolas Le Gall - Japanese
* lazerns - Arabic * lazerns - Arabic
* Edward205 - Romanian

View File

@ -1,7 +1,7 @@
.PHONY: all coverage coverage-js coverage-php doc doc-js doc-php increment sign test test-js test-php help .PHONY: all coverage coverage-js coverage-php doc doc-js doc-php increment sign test test-js test-php help
CURRENT_VERSION = 1.6.0 CURRENT_VERSION = 1.7.1
VERSION ?= 1.6.1 VERSION ?= 1.7.2
VERSION_FILES = index.php bin/ cfg/ *.md doc/Installation.md css/ i18n/ img/ js/package.json js/privatebin.js lib/ Makefile tpl/ tst/ VERSION_FILES = index.php bin/ cfg/ *.md doc/Installation.md css/ i18n/ img/ js/package.json js/privatebin.js lib/ Makefile tpl/ tst/
REGEX_CURRENT_VERSION := $(shell echo $(CURRENT_VERSION) | sed "s/\./\\\./g") REGEX_CURRENT_VERSION := $(shell echo $(CURRENT_VERSION) | sed "s/\./\\\./g")
REGEX_VERSION := $(shell echo $(VERSION) | sed "s/\./\\\./g") REGEX_VERSION := $(shell echo $(VERSION) | sed "s/\./\\\./g")
@ -17,8 +17,8 @@ coverage-js: ## Run JS unit tests and generate code coverage reports.
cd js && nyc mocha cd js && nyc mocha
coverage-php: ## Run PHP unit tests and generate code coverage reports. coverage-php: ## Run PHP unit tests and generate code coverage reports.
cd tst && phpunit 2> /dev/null cd tst && XDEBUG_MODE=coverage phpunit 2> /dev/null
cd tst/log/php-coverage-report && sed -i "s#$(CURDIR)##g" *.html */*.html cd tst/log/php-coverage-report && sed -i "s#$(CURDIR)/##g" *.html */*.html
doc: doc-js doc-php ## Generate all code documentation. doc: doc-js doc-php ## Generate all code documentation.
@ -26,7 +26,7 @@ doc-js: ## Generate JS code documentation.
jsdoc -p -d doc/jsdoc js/privatebin.js js/legacy.js jsdoc -p -d doc/jsdoc js/privatebin.js js/legacy.js
doc-php: ## Generate JS code documentation. doc-php: ## Generate JS code documentation.
phpdoc --visibility public,protected,private -t doc/phpdoc -d lib/ 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`. 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) | grep -v -e tst/log/ -e ":0" -e CHANGELOG.md`; \

View File

@ -1,6 +1,6 @@
# [![PrivateBin](https://cdn.rawgit.com/PrivateBin/assets/master/images/preview/logoSmall.png)](https://privatebin.info/) # [![PrivateBin](https://cdn.rawgit.com/PrivateBin/assets/master/images/preview/logoSmall.png)](https://privatebin.info/)
*Current version: 1.6.0* *Current version: 1.7.1*
**PrivateBin** is a minimalist, open source online **PrivateBin** is a minimalist, open source online
[pastebin](https://en.wikipedia.org/wiki/Pastebin) [pastebin](https://en.wikipedia.org/wiki/Pastebin)
@ -55,7 +55,7 @@ without losing any data.
paste (first) might still be disclosed via access logs. paste (first) might still be disclosed via access logs.
- In case of a server breach your data is secure as it is only stored encrypted - In case of a server breach your data is secure as it is only stored encrypted
on the server. However, the server could be absused or the server admin could on the server. However, the server could be abused or the server admin could
be legally forced into sending malicious code to their users, which logs be legally forced into sending malicious code to their users, which logs
the decryption key and sends it to a server when a user accesses a paste. the decryption key and sends it to a server when a user accesses a paste.
Therefore, do not access any PrivateBin instance if you think it has been Therefore, do not access any PrivateBin instance if you think it has been

View File

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

View File

@ -9,11 +9,12 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;
use Exception;
use PrivateBin\Configuration; use PrivateBin\Configuration;
use PrivateBin\Data\AbstractData; use PrivateBin\Data\AbstractData;
use PrivateBin\Model\Paste; use PrivateBin\Model\Paste;
@ -195,6 +196,7 @@ EOT, PHP_EOL;
{ {
$counters = array( $counters = array(
'burn' => 0, 'burn' => 0,
'damaged' => 0,
'discussion' => 0, 'discussion' => 0,
'expired' => 0, 'expired' => 0,
'md' => 0, 'md' => 0,
@ -217,7 +219,12 @@ EOT, PHP_EOL;
echo "Total:\t\t\t{$counters['total']}", PHP_EOL; echo "Total:\t\t\t{$counters['total']}", PHP_EOL;
foreach ($ids as $pasteid) { foreach ($ids as $pasteid) {
$paste = $this->_store->read($pasteid); try {
$paste = $this->_store->read($pasteid);
} catch (Exception $e) {
echo "Error reading paste {$pasteid}: ", $e->getMessage(), PHP_EOL;
++$counters['damaged'];
}
++$counters['progress']; ++$counters['progress'];
if ( if (
@ -271,6 +278,9 @@ Plain Text:\t\t{$counters['plain']}
Source Code:\t\t{$counters['syntax']} Source Code:\t\t{$counters['syntax']}
Markdown:\t\t{$counters['md']} Markdown:\t\t{$counters['md']}
EOT, PHP_EOL; EOT, PHP_EOL;
if ($counters['damaged'] > 0) {
echo "Damaged:\t\t{$counters['damaged']}", PHP_EOL;
}
if ($counters['unknown'] > 0) { if ($counters['unknown'] > 0) {
echo "Unknown format:\t\t{$counters['unknown']}", PHP_EOL; echo "Unknown format:\t\t{$counters['unknown']}", PHP_EOL;
} }
@ -305,7 +315,12 @@ EOT, PHP_EOL;
} }
if ($this->_option('p', 'purge') !== null) { if ($this->_option('p', 'purge') !== null) {
$this->_store->purge(PHP_INT_MAX); try {
$this->_store->purge(PHP_INT_MAX);
} catch (Exception $e) {
echo 'Error purging pastes: ', $e->getMessage(), PHP_EOL,
'Run the statistics to find damaged paste IDs and either delete them or restore them from backup.', PHP_EOL;
}
exit('purging of expired pastes concluded' . PHP_EOL); exit('purging of expired pastes concluded' . PHP_EOL);
} }

View File

@ -23,7 +23,7 @@ new ConfigurationTestGenerator(array(
'tests' => array( 'tests' => array(
array( array(
'conditions' => array('steps' => $vd), 'conditions' => array('steps' => $vd),
'type' => 'RegExp', 'type' => 'MatchesRegularExpression',
'args' => array( 'args' => array(
'#<div[^>]*id="opendiscussionoption"[^>]*>#', '#<div[^>]*id="opendiscussionoption"[^>]*>#',
'$content', '$content',
@ -53,7 +53,7 @@ new ConfigurationTestGenerator(array(
'setting' => false, 'setting' => false,
'tests' => array( 'tests' => array(
array( array(
'type' => 'NotRegExp', 'type' => 'DoesNotMatchRegularExpression',
'args' => array( 'args' => array(
'#<div[^>]*id="opendiscussionoption"[^>]*>#', '#<div[^>]*id="opendiscussionoption"[^>]*>#',
'$content', '$content',
@ -70,7 +70,7 @@ new ConfigurationTestGenerator(array(
'tests' => array( 'tests' => array(
array( array(
'conditions' => array('main/discussion' => true), 'conditions' => array('main/discussion' => true),
'type' => 'RegExp', 'type' => 'MatchesRegularExpression',
'args' => array( 'args' => array(
'#<input[^>]+id="opendiscussion"[^>]*checked="checked"[^>]*>#', '#<input[^>]+id="opendiscussion"[^>]*checked="checked"[^>]*>#',
'$content', '$content',
@ -84,7 +84,7 @@ new ConfigurationTestGenerator(array(
'tests' => array( 'tests' => array(
array( array(
'conditions' => array('main/discussion' => true), 'conditions' => array('main/discussion' => true),
'type' => 'NotRegExp', 'type' => 'DoesNotMatchRegularExpression',
'args' => array( 'args' => array(
'#<input[^>]+id="opendiscussion"[^>]*checked="checked"[^>]*>#', '#<input[^>]+id="opendiscussion"[^>]*checked="checked"[^>]*>#',
'$content', '$content',
@ -100,7 +100,7 @@ new ConfigurationTestGenerator(array(
'setting' => true, 'setting' => true,
'tests' => array( 'tests' => array(
array( array(
'type' => 'RegExp', 'type' => 'MatchesRegularExpression',
'args' => array( 'args' => array(
'#<input[^>]+id="burnafterreading"[^>]*checked="checked"[^>]*>#', '#<input[^>]+id="burnafterreading"[^>]*checked="checked"[^>]*>#',
'$content', '$content',
@ -113,7 +113,7 @@ new ConfigurationTestGenerator(array(
'setting' => false, 'setting' => false,
'tests' => array( 'tests' => array(
array( array(
'type' => 'NotRegExp', 'type' => 'DoesNotMatchRegularExpression',
'args' => array( 'args' => array(
'#<input[^>]+id="burnafterreading"[^>]*checked="checked"[^>]*>#', '#<input[^>]+id="burnafterreading"[^>]*checked="checked"[^>]*>#',
'$content', '$content',
@ -129,7 +129,7 @@ new ConfigurationTestGenerator(array(
'setting' => true, 'setting' => true,
'tests' => array( 'tests' => array(
array( array(
'type' => 'RegExp', 'type' => 'MatchesRegularExpression',
'args' => array( 'args' => array(
'#<div[^>]*id="password"[^>]*>#', '#<div[^>]*id="password"[^>]*>#',
'$content', '$content',
@ -143,7 +143,7 @@ new ConfigurationTestGenerator(array(
'tests' => array( 'tests' => array(
array( array(
'conditions' => array('main/discussion' => true), 'conditions' => array('main/discussion' => true),
'type' => 'NotRegExp', 'type' => 'DoesNotMatchRegularExpression',
'args' => array( 'args' => array(
'#<div[^>]*id="password"[^>]*>#', '#<div[^>]*id="password"[^>]*>#',
'$content', '$content',
@ -159,14 +159,14 @@ new ConfigurationTestGenerator(array(
'setting' => 'page', 'setting' => 'page',
'tests' => array( 'tests' => array(
array( array(
'type' => 'RegExp', 'type' => 'MatchesRegularExpression',
'args' => array( 'args' => array(
'#<link[^>]+type="text/css"[^>]+rel="stylesheet"[^>]+href="css/privatebin\.css\\?\d[\d\.]+\d+"[^>]*/>#', '#<link[^>]+type="text/css"[^>]+rel="stylesheet"[^>]+href="css/privatebin\.css\\?\d[\d\.]+\d+"[^>]*/>#',
'$content', '$content',
'outputs "page" stylesheet correctly', 'outputs "page" stylesheet correctly',
), ),
), array( ), array(
'type' => 'NotRegExp', 'type' => 'DoesNotMatchRegularExpression',
'args' => array( 'args' => array(
'#<link[^>]+type="text/css"[^>]+rel="stylesheet"[^>]+href="css/bootstrap/bootstrap-\d[\d\.]+\d\.css"[^>]*/>#', '#<link[^>]+type="text/css"[^>]+rel="stylesheet"[^>]+href="css/bootstrap/bootstrap-\d[\d\.]+\d\.css"[^>]*/>#',
'$content', '$content',
@ -179,14 +179,14 @@ new ConfigurationTestGenerator(array(
'setting' => 'bootstrap', 'setting' => 'bootstrap',
'tests' => array( 'tests' => array(
array( array(
'type' => 'NotRegExp', 'type' => 'DoesNotMatchRegularExpression',
'args' => array( 'args' => array(
'#<link[^>]+type="text/css"[^>]+rel="stylesheet"[^>]+href="css/privatebin\.css\\?\d[\d\.]+\d+"[^>]*/>#', '#<link[^>]+type="text/css"[^>]+rel="stylesheet"[^>]+href="css/privatebin\.css\\?\d[\d\.]+\d+"[^>]*/>#',
'$content', '$content',
'removes "page" stylesheet correctly', 'removes "page" stylesheet correctly',
), ),
), array( ), array(
'type' => 'RegExp', 'type' => 'MatchesRegularExpression',
'args' => array( 'args' => array(
'#<link[^>]+type="text/css"[^>]+rel="stylesheet"[^>]+href="css/bootstrap/bootstrap-\d[\d\.]+\d\.css"[^>]*/>#', '#<link[^>]+type="text/css"[^>]+rel="stylesheet"[^>]+href="css/bootstrap/bootstrap-\d[\d\.]+\d\.css"[^>]*/>#',
'$content', '$content',
@ -361,7 +361,7 @@ class ConfigurationTestGenerator
} }
// skip if not all test conditions are met // skip if not all test conditions are met
if (array_key_exists('conditions', $test)) { if (array_key_exists('conditions', $test)) {
while (list($path, $setting) = each($test['conditions'])) { foreach ($test['conditions'] as $path => $setting) {
if ($path == 'steps' && !in_array($step, $setting)) { if ($path == 'steps' && !in_array($step, $setting)) {
continue 2; continue 2;
} elseif ($path != 'steps') { } elseif ($path != 'steps') {
@ -591,8 +591,9 @@ EOT;
return $this->_configurations; return $this->_configurations;
} }
echo "generateConfigurations: iteration $this->_iterationCount", PHP_EOL; echo "generateConfigurations: iteration $this->_iterationCount", PHP_EOL;
$continue = list($path, $settings) = each($this->_options); $path = key($this->_options);
if ($continue === false) { $settings = current($this->_options);
if (next($this->_options) === false) {
return $this->_configurations; return $this->_configurations;
} }
list($section, $option) = explode('/', $path); list($section, $option) = explode('/', $path);

View File

@ -24,10 +24,10 @@
"docs" : "https://privatebin.info/codedoc/" "docs" : "https://privatebin.info/codedoc/"
}, },
"require" : { "require" : {
"php" : "^7.3 || ^8.0", "php": "^7.3 || ^8.0",
"yzalis/identicon" : "2.0.0", "jdenticon/jdenticon": "1.0.2",
"mlocati/ip-lib" : "1.18.0", "mlocati/ip-lib": "1.18.0",
"jdenticon/jdenticon": "1.0.2" "yzalis/identicon": "2.0.0"
}, },
"suggest" : { "suggest" : {
"google/cloud-storage" : "1.32.0", "google/cloud-storage" : "1.32.0",

82
composer.lock generated
View File

@ -316,16 +316,16 @@
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
"version": "v4.17.1", "version": "v4.18.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nikic/PHP-Parser.git", "url": "https://github.com/nikic/PHP-Parser.git",
"reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999",
"reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -366,9 +366,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/nikic/PHP-Parser/issues", "issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0"
}, },
"time": "2023-08-13T19:53:39+00:00" "time": "2023-12-10T21:03:43+00:00"
}, },
{ {
"name": "phar-io/manifest", "name": "phar-io/manifest",
@ -483,23 +483,23 @@
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "9.2.27", "version": "9.2.30",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1" "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b0a88255cb70d52653d80c890bd7f38740ea50d1", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089",
"reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1", "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*", "ext-libxml": "*",
"ext-xmlwriter": "*", "ext-xmlwriter": "*",
"nikic/php-parser": "^4.15", "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3", "php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3", "phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2", "phpunit/php-text-template": "^2.0.2",
@ -549,7 +549,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.27" "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30"
}, },
"funding": [ "funding": [
{ {
@ -557,7 +557,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-07-26T13:44:30+00:00" "time": "2023-12-22T06:47:57+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
@ -802,16 +802,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "9.6.11", "version": "9.6.16",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "810500e92855eba8a7a5319ae913be2da6f957b0" "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/810500e92855eba8a7a5319ae913be2da6f957b0", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3767b2c56ce02d01e3491046f33466a1ae60a37f",
"reference": "810500e92855eba8a7a5319ae913be2da6f957b0", "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -826,7 +826,7 @@
"phar-io/manifest": "^2.0.3", "phar-io/manifest": "^2.0.3",
"phar-io/version": "^3.0.2", "phar-io/version": "^3.0.2",
"php": ">=7.3", "php": ">=7.3",
"phpunit/php-code-coverage": "^9.2.13", "phpunit/php-code-coverage": "^9.2.28",
"phpunit/php-file-iterator": "^3.0.5", "phpunit/php-file-iterator": "^3.0.5",
"phpunit/php-invoker": "^3.1.1", "phpunit/php-invoker": "^3.1.1",
"phpunit/php-text-template": "^2.0.3", "phpunit/php-text-template": "^2.0.3",
@ -885,7 +885,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.11" "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.16"
}, },
"funding": [ "funding": [
{ {
@ -901,7 +901,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-08-19T07:10:56+00:00" "time": "2024-01-19T07:03:14+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
@ -1146,20 +1146,20 @@
}, },
{ {
"name": "sebastian/complexity", "name": "sebastian/complexity",
"version": "2.0.2", "version": "2.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git", "url": "https://github.com/sebastianbergmann/complexity.git",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88" "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88", "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"nikic/php-parser": "^4.7", "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3" "php": ">=7.3"
}, },
"require-dev": { "require-dev": {
@ -1191,7 +1191,7 @@
"homepage": "https://github.com/sebastianbergmann/complexity", "homepage": "https://github.com/sebastianbergmann/complexity",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues", "issues": "https://github.com/sebastianbergmann/complexity/issues",
"source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
}, },
"funding": [ "funding": [
{ {
@ -1199,7 +1199,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2020-10-26T15:52:27+00:00" "time": "2023-12-22T06:19:30+00:00"
}, },
{ {
"name": "sebastian/diff", "name": "sebastian/diff",
@ -1473,20 +1473,20 @@
}, },
{ {
"name": "sebastian/lines-of-code", "name": "sebastian/lines-of-code",
"version": "1.0.3", "version": "1.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git", "url": "https://github.com/sebastianbergmann/lines-of-code.git",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"nikic/php-parser": "^4.6", "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3" "php": ">=7.3"
}, },
"require-dev": { "require-dev": {
@ -1518,7 +1518,7 @@
"homepage": "https://github.com/sebastianbergmann/lines-of-code", "homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
}, },
"funding": [ "funding": [
{ {
@ -1526,7 +1526,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2020-11-28T06:42:11+00:00" "time": "2023-12-22T06:20:34+00:00"
}, },
{ {
"name": "sebastian/object-enumerator", "name": "sebastian/object-enumerator",
@ -1869,16 +1869,16 @@
}, },
{ {
"name": "theseer/tokenizer", "name": "theseer/tokenizer",
"version": "1.2.1", "version": "1.2.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/theseer/tokenizer.git", "url": "https://github.com/theseer/tokenizer.git",
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96",
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1907,7 +1907,7 @@
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": { "support": {
"issues": "https://github.com/theseer/tokenizer/issues", "issues": "https://github.com/theseer/tokenizer/issues",
"source": "https://github.com/theseer/tokenizer/tree/1.2.1" "source": "https://github.com/theseer/tokenizer/tree/1.2.2"
}, },
"funding": [ "funding": [
{ {
@ -1915,7 +1915,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2021-07-28T10:34:58+00:00" "time": "2023-11-20T00:12:19+00:00"
} }
], ],
"aliases": [], "aliases": [],
@ -1930,5 +1930,5 @@
"platform-overrides": { "platform-overrides": {
"php": "7.3" "php": "7.3"
}, },
"plugin-api-version": "2.3.0" "plugin-api-version": "2.6.0"
} }

View File

@ -6,7 +6,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
body { body {
@ -113,6 +113,7 @@ body.loading {
#qrcodemodalClose { #qrcodemodalClose {
float: right; float: right;
} }
#qrcode-display { #qrcode-display {
width: 200px; width: 200px;
height: 200px; height: 200px;
@ -205,3 +206,23 @@ li.L0, li.L1, li.L2, li.L3, li.L5, li.L6, li.L7, li.L8 {
.modal .modal-content button { .modal .modal-content button {
margin: 0.5em 0; margin: 0.5em 0;
} }
/* right-to-left overrides */
html[dir="rtl"] .checkbox label {
padding-left: inherit;
padding-right: 20px;
}
html[dir="rtl"] .checkbox input[type="checkbox"] {
margin-left: inherit;
margin-right: -20px;
}
html[dir="rtl"] #language {
margin-left: inherit;
margin-right: 8px;
}
html[dir="rtl"] #deletelink, html[dir="rtl"] #qrcodemodalClose {
float: left;
}

View File

@ -6,7 +6,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
/* When there is no script at all other */ /* When there is no script at all other */

View File

@ -6,7 +6,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
/* CSS Reset from YUI 3.4.1 (build 4118) - Copyright 2011 Yahoo! Inc. All rights reserved. /* CSS Reset from YUI 3.4.1 (build 4118) - Copyright 2011 Yahoo! Inc. All rights reserved.
@ -261,6 +261,7 @@ button img {
#newbutton { #newbutton {
float: right; float: right;
margin-left: 0;
margin-right: 0; margin-right: 0;
margin-bottom: 5px; margin-bottom: 5px;
display: inline; display: inline;
@ -488,3 +489,17 @@ img.vizhash {
#cleartext h3 { #cleartext h3 {
font-size: 1.2em; font-size: 1.2em;
} }
/* right-to-left overrides */
html[dir="rtl"] #aboutbox, html[dir="rtl"] #deletelink, html[dir="rtl"] #newbutton {
float: left;
}
html[dir="rtl"] button, html[dir="rtl"] .button, html[dir="rtl"] button img {
margin-left: 5px;
margin-right: inherit;
}
html[dir="rtl"] button img {
margin-left: 8px;
}

View File

@ -21,7 +21,7 @@ $ sudo pear install phpdoc/phpDocumentor
To generate the documentation, change into the main directory and run phpdoc: To generate the documentation, change into the main directory and run phpdoc:
```console ```console
$ cd PrivateBin $ cd PrivateBin
$ phpdoc --visibility public,protected,private -t doc/phpdoc -d lib/ $ phpdoc --visibility=public,protected,private --target=doc/phpdoc --directory=lib/
``` ```
**Note:** When used with PHP 7, the prerelease of phpDocumentator 2.9 needs to be **Note:** When used with PHP 7, the prerelease of phpDocumentator 2.9 needs to be

View File

@ -15,9 +15,9 @@ for more information.
**NOTE:** There are Ansible roles available for installing and configuring PrivateBin on your server. You can choose from the following options: **NOTE:** There are Ansible roles available for installing and configuring PrivateBin on your server. You can choose from the following options:
- [Podman Rootless - PrivateBin by @voidquark](https://galaxy.ansible.com/voidquark/privatebin) ([Github source code](https://github.com/voidquark/privatebin)): Simplifies the deployment and management of a secure PrivateBin service using a rootless Podman container. Key features include root-less deployment, ensuring security within a user namespace, idempotent deployment for consistent state, out-of-the-box setup for Red Hat systems, and the flexibility to customize PrivateBin configurations. It has been tested on EL9. - [Podman Rootless - PrivateBin by @voidquark](https://galaxy.ansible.com/ui/standalone/roles/voidquark/privatebin/) ([Github source code](https://github.com/voidquark/privatebin)): Simplifies the deployment and management of a secure PrivateBin service using a rootless Podman container. Key features include root-less deployment, ensuring security within a user namespace, idempotent deployment for consistent state, out-of-the-box setup for Red Hat systems, and the flexibility to customize PrivateBin configurations. It has been tested on EL9.
- [Config Configuration - PrivateBin by @e1mo](https://galaxy.ansible.com/e1mo/privatebin) ([Github source code](https://git.sr.ht/~e1mo/ansible-role-privatebin)): Deploy PrivateBin configuration to disk with a customized configuration. - [Config Configuration - PrivateBin by @e1mo](https://galaxy.ansible.com/ui/standalone/roles/e1mo/privatebin/) ([Github source code](https://git.sr.ht/~e1mo/ansible-role-privatebin)): Deploy PrivateBin configuration to disk with a customized configuration.
### Minimal Requirements ### Minimal Requirements
@ -59,7 +59,7 @@ accessible to your webserver and PHP process (see also
In situations where you want to keep the PrivateBin static files separate from the In situations where you want to keep the PrivateBin static files separate from the
rest of your data, or you want to reuse the installation files on multiple vhosts, rest of your data, or you want to reuse the installation files on multiple vhosts,
you may only want to change the `conf.php`. In this case, you can set the you may only want to change the `conf.php`. In this case, you can set the
`CONFIG_PATH` environment variable to the absolute path to the `conf.php` file. `CONFIG_PATH` environment variable to the absolute path to the directory containing the `conf.php` file.
This can be done in your web server's virtual host config, the PHP config, or in This can be done in your web server's virtual host config, the PHP config, or in
the index.php, if you choose to customize it. the index.php, if you choose to customize it.
@ -68,13 +68,13 @@ wherever it may be.
> #### CONFIG_PATH example > #### CONFIG_PATH example
> Setting the value in an Apache Vhost: > Setting the value in an Apache Vhost:
> SetEnv CONFIG_PATH /var/lib/privatebin/conf.php > SetEnv CONFIG_PATH /var/lib/privatebin/
> >
> In a php-fpm pool config: > In a php-fpm pool config:
> env[CONFIG_PATH] = /var/lib/privatebin/conf.php > env[CONFIG_PATH] = /var/lib/privatebin/
> >
> In the index.php, near the top: > In the index.php, near the top:
> putenv('CONFIG_PATH=/var/lib/privatebin/conf.php'); > putenv('CONFIG_PATH=/var/lib/privatebin/');
### Transport security ### Transport security
@ -201,7 +201,7 @@ CREATE INDEX parent ON prefix_comment(pasteid);
CREATE TABLE prefix_config ( CREATE TABLE prefix_config (
id CHAR(16) NOT NULL, value TEXT, PRIMARY KEY (id) id CHAR(16) NOT NULL, value TEXT, PRIMARY KEY (id)
); );
INSERT INTO prefix_config VALUES('VERSION', '1.6.0'); INSERT INTO prefix_config VALUES('VERSION', '1.7.1');
``` ```
In **PostgreSQL**, the `data`, `attachment`, `nickname` and `vizhash` columns In **PostgreSQL**, the `data`, `attachment`, `nickname` and `vizhash` columns
@ -213,11 +213,25 @@ to be `CLOB` and not `BLOB` or `MEDIUMBLOB`, the `id` column in the `config`
table needs to be `VARCHAR2(16)` and the `meta` column in the `paste` table table needs to be `VARCHAR2(16)` and the `meta` column in the `paste` table
and the `value` column in the `config` table need to be `VARCHAR2(4000)`. and the `value` column in the `config` table need to be `VARCHAR2(4000)`.
### Cloud Storage Backends
Due to the large size of the respective cloud SDKs required for these, we didn't
include these in the `vendor` directory shipped in our release archives. To use
these in your manual installation, you will need [composer installed](https://getcomposer.org/)
and require the used library (see instructions below).
This is not required if using the dedicated container images that have these SDKs
preinstalled.
#### Using Google Cloud Storage #### Using Google Cloud Storage
If you want to deploy PrivateBin in a serverless manner in the Google Cloud, you If you want to deploy PrivateBin in a serverless manner in the Google Cloud, you
can choose the `GoogleCloudStorage` as backend. To use this backend, you create can choose the `GoogleCloudStorage` as backend.
a GCS bucket and specify the name as the model option `bucket`. Alternatively,
you can set the name through the environment variable `PRIVATEBIN_GCS_BUCKET`. To use this backend, you first have to install the SDK from the installation
directory of PrivateBin: `composer require google/cloud-storage`
You have to create a GCS bucket and specify the name as the model option `bucket`.
Alternatively, you can set the name through the environment variable `PRIVATEBIN_GCS_BUCKET`.
The default prefix for pastes stored in the bucket is `pastes`. To change the The default prefix for pastes stored in the bucket is `pastes`. To change the
prefix, specify the option `prefix`. prefix, specify the option `prefix`.
@ -226,15 +240,15 @@ Google Cloud Storage buckets may be significantly slower than a `FileSystem` or
`Database` backend. The big advantage is that the deployment on Google Cloud `Database` backend. The big advantage is that the deployment on Google Cloud
Platform using Google Cloud Run is easy and cheap. Platform using Google Cloud Run is easy and cheap.
To use the Google Cloud Storage backend you have to install the suggested
library using the command `composer require google/cloud-storage`.
#### Using S3 Storage #### Using S3 Storage
Similar to Google Cloud Storage, you can choose S3 as storage backend. It uses Similar to Google Cloud Storage, you can choose S3 as storage backend. It uses
the AWS SDK for PHP, but can also talk to a Rados gateway as part of a CEPH the AWS SDK for PHP, but can also talk to a Rados gateway as part of a Ceph
cluster. To use this backend, you first have to install the SDK in the cluster.
document root of PrivateBin: `composer require aws/aws-sdk-php`. You have to
create the S3 bucket on the CEPH cluster before using the S3 backend. To use this backend, you first have to install the SDK from the installation
directory of PrivateBin: `composer require aws/aws-sdk-php`
You have to create an S3 bucket on the Ceph cluster before using the S3 backend.
In the `[model]` section of cfg/conf.php, set `class` to `S3Storage`. In the `[model]` section of cfg/conf.php, set `class` to `S3Storage`.
@ -256,7 +270,7 @@ data beneath this prefix.
For AWS, you have to provide at least `region`, `bucket`, `accesskey`, and For AWS, you have to provide at least `region`, `bucket`, `accesskey`, and
`secretkey`. `secretkey`.
For CEPH, follow this example: For Ceph, follow this example:
``` ```
region = "" region = ""

View File

@ -31,7 +31,7 @@ Know how for participating in PrivateBins development.
How to generate the source code API documentation, as found on the project How to generate the source code API documentation, as found on the project
website for [PHP](https://privatebin.info/codedoc/) and [JS](https://privatebin.info/jsdoc/) website for [PHP](https://privatebin.info/codedoc/) and [JS](https://privatebin.info/jsdoc/)
### [Running Unit Tests](https://github.com/PrivateBin/PrivateBin/blob/master/tst/README.md#running-all-unit-tests) ### [Running Unit Tests](https://github.com/PrivateBin/PrivateBin/blob/master/doc/Running Unit Tests.md#running-all-unit-tests)
How to run the PHP & JS unit tests, including a brief introduction to property How to run the PHP & JS unit tests, including a brief introduction to property
based unit testing. based unit testing.

44
doc/Release.md Normal file
View File

@ -0,0 +1,44 @@
# Release
## Overview of Supply-Chain Security
As of the PrivateBin 1.0 release we [cryptographically sign](https://git-scm.com/book/uz/v2/Git-Tools-Signing-Your-Work) our git commits and tags, so that you can verify we actually developed the software. Later, we also [started signing the release archives on GitHub](https://github.com/PrivateBin/PrivateBin/issues/219) and retroactively signed all releases from 1.0 forward.
Since [release 1.6.2](https://github.com/PrivateBin/PrivateBin/releases/tag/1.6.2) our release assets additionally also are [verified with the SLSA (Supply-chain Levels for Software Artifacts) framework](https://slsa.dev/), providing an in-toto manifest of the release archive.
This achieves the following:
1. It ensures no maintainer has gone rogue and has modified/tampered with the source code before “building” the release.
2. It ensures the release is build exactly according to the source as defined by the branch that was used for the release.
This includes the workflow file defining how the release is done itself.
3. Our release should achieve [SLSA build level 3](https://slsa.dev/spec/v1.0/levels#build-l3) as it [runs on GitHub](https://slsa.dev/spec/v1.0/threats). Some more properties [are thus achieved](https://slsa.dev/spec/v1.0/threats).
For more information [see the corresponding issue](https://github.com/PrivateBin/PrivateBin/issues/1169) and [the GitHub workflow file](/.github/workflows/release.yml).
## Reproducible builds
All releases `.tar.gz` and `.zip` archives since 1.0 come with corresponding `.asc` signatures that can be used to confirm the authenticity of the fact that the release has been issued by a PrivateBin maintainer.
This uses traditional [PGP](https://en.wikipedia.org/wiki/Pretty_Good_Privacy) signatures.
## Verification
You can use the gpg signatures for verifying the reproducibility and that a maintainer in posession with that PGP private key created the release with that content:
```
$ gpg2 --verify 1.6.2.tar.gz.asc
gpg: assuming signed data in '1.6.2.tar.gz'
gpg: Signature made Fri Dec 15 06:21:08 2023 UTC
gpg: using RSA key 28CA7C964938EA5C1481D42AE11B7950E9E183DB
gpg: Good signature from "PrivateBin release (solely used for signing releases)" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 28CA 7C96 4938 EA5C 1481 D42A E11B 7950 E9E1 83DB
```
For a more step-by-step guide in detail [see this FAQ](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#how-can-i-securely-clonedownload-your-project).
SLSA verification can be performed using the [SLSA verifier](https://github.com/slsa-framework/slsa-verifier#verification-of-slsa-provenance).
## Release process
The release process is outlined in the [release checklist](https://github.com/PrivateBin/PrivateBin/wiki/Release-Checklist). The key manual steps are performed using a [Makefile](https://github.com/PrivateBin/PrivateBin/blob/master/Makefile#L31-L43) and using a [shell script](https://github.com/rugk/gittools/blob/master/signrelease.sh).

View File

@ -28,11 +28,6 @@ docker run --rm --read-only -v ~/PrivateBin:/srv:ro privatebin/unit-testing phpu
docker run --rm --read-only -v ~/PrivateBin:/srv:ro privatebin/unit-testing mocha docker run --rm --read-only -v ~/PrivateBin:/srv:ro privatebin/unit-testing mocha
``` ```
We also provide a Janitor image that includes the Cloud9 and Theia WebIDEs as
well as the integrated unit testing utilities. See our [docker wiki
page](https://github.com/PrivateBin/PrivateBin/wiki/Docker#janitor-image-with-cloud9-and-theia-webide-janitortechnologyprivatebin)
for further details on this.
## Running PHP Unit Tests ## Running PHP Unit Tests
In order to run these tests, you will need to install the following packages In order to run these tests, you will need to install the following packages
@ -61,18 +56,15 @@ configurations defined in its constructor, it generates the unit test file
of these configurations and tests for (most of the) valid combinations. Some of of these configurations and tests for (most of the) valid combinations. Some of
combinations can't be tested with this method, i.e. a valid option combined with combinations can't be tested with this method, i.e. a valid option combined with
an invalid one. Other very specific test cases (i.e. to trigger multiple errors) an invalid one. Other very specific test cases (i.e. to trigger multiple errors)
are covered in `tst/PrivateBinTest.php`. Here is how to generate the are covered in `tst/ControllerTest.php`. Here is how to generate the
configuration test and run it: configuration test and run it:
```console ```console
$ cd PrivateBin/tst $ cd PrivateBin/tst
$ php ConfigurationTestGenerator.php $ ../bin/configuration-test-generator
$ phpunit ConfigurationCombinationsTest.php $ phpunit ConfigurationCombinationsTest.php
``` ```
Note that it can take an hour or longer to run the several thousand tests.
## Running JavaScript Unit Tests ## Running JavaScript Unit Tests
In order to run these tests, you will need to install the following packages In order to run these tests, you will need to install the following packages

View File

@ -3,7 +3,6 @@
"%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 بت 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 بت AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "مزيد من المعلومات على <a href=\"https://privatebin.info/\">صفحة المشروع</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "مزيد من المعلومات على <a href=\"https://privatebin.info/\">صفحة المشروع</a>.",
"Because ignorance is bliss": "لأن الجهل نعمة", "Because ignorance is bliss": "لأن الجهل نعمة",
"en": "ar",
"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 يتطلب php %s أو أعلى للعمل. آسف.", "%s requires php %s or above to work. Sorry.": "%s يتطلب php %s أو أعلى للعمل. آسف.",
"%s requires configuration section [%s] to be present in configuration file.": "%s يتطلب وجود قسم [%s] تضبيط في ملف تضبيط.", "%s requires configuration section [%s] to be present in configuration file.": "%s يتطلب وجود قسم [%s] تضبيط في ملف تضبيط.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "عنوان IP الخاص بك غير مصرح له بإنشاء لصُق.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "خطأ في الاتصال بـ YOURLS. ربما تكون هناك مشكلة في التضبيط، مثل \"apiurl\" أو \"التوقيع\" الخاطئ أو المفقود.",
"Error parsing YOURLS response.": "خطأ في تحليل استجابة YOURLS." "Error parsing YOURLS response.": "خطأ في تحليل استجابة YOURLS.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 е изчистен и изцяло достъпен като отворен код, онлайн \"paste\" услуга, където сървъра не знае подадената информация. Тя се шифрова/дешифрова %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 е изчистен и изцяло достъпен като отворен код, онлайн \"paste\" услуга, където сървъра не знае подадената информация. Тя се шифрова/дешифрова %sвъв браузъра%s използвайки 256 битов AES алгоритъм.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Повече информация може да намерите на <a href=\"https://privatebin.info/\">страницата на проекта (Английски)</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Повече информация може да намерите на <a href=\"https://privatebin.info/\">страницата на проекта (Английски)</a>.",
"Because ignorance is bliss": "Невежеството е блаженство", "Because ignorance is bliss": "Невежеството е блаженство",
"en": "bg",
"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 има нужда от PHP %s или по-нова, за да работи. Съжалявам.", "%s requires php %s or above to work. Sorry.": "%s има нужда от PHP %s или по-нова, за да работи. Съжалявам.",
"%s requires configuration section [%s] to be present in configuration file.": "%s задължава отдела от настройките [%s] да съществува във файла със настройките.", "%s requires configuration section [%s] to be present in configuration file.": "%s задължава отдела от настройките [%s] да съществува във файла със настройките.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 un pastebin en línia de codi obert i minimalista on el servidor no té coneixement de les dades enganxades. Les dades estan encriptades/desxifrades %sen el navegador%s utilitzant AES de 256 bits.", "%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 un pastebin en línia de codi obert i minimalista on el servidor no té coneixement de les dades enganxades. Les dades estan encriptades/desxifrades %sen el navegador%s utilitzant AES de 256 bits.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Més informació a la <a href=\"https://privatebin.info/\">pàgina del projecte</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Més informació a la <a href=\"https://privatebin.info/\">pàgina del projecte</a>.",
"Because ignorance is bliss": "Perquè la ignorància és felicitat", "Because ignorance is bliss": "Perquè la ignorància és felicitat",
"en": "ca",
"Paste does not exist, has expired or has been deleted.": "El paste no existeix, ha caducat o s'ha eliminat.", "Paste does not exist, has expired or has been deleted.": "El paste no existeix, ha caducat o s'ha eliminat.",
"%s requires php %s or above to work. Sorry.": "%s requereix php %s o superior per funcionar. Ho sento.", "%s requires php %s or above to work. Sorry.": "%s requereix php %s o superior per funcionar. Ho sento.",
"%s requires configuration section [%s] to be present in configuration file.": "%s requereix que la secció de configuració [%s] sigui present al fitxer de configuració.", "%s requires configuration section [%s] to be present in configuration file.": "%s requereix que la secció de configuració [%s] sigui present al fitxer de configuració.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 hè un serviziu in linea di tipu « pastebin » (ghjestiunariu dappiccicu di pezzi di testu è di codice di fonte) minimalistu è à fonte aperta induve u servitore ùn hà micca cunnuscenza di i dati mandati. I dati sò cifrati è dicifrati %sin u navigatore%s cù una cifratura AES di 256 bit.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s hè un serviziu in linea di tipu « pastebin » (ghjestiunariu dappiccicu di pezzi di testu è di codice di fonte) minimalistu è à fonte aperta induve u servitore ùn hà micca cunnuscenza di i dati mandati. I dati sò cifrati è dicifrati %sin u navigatore%s cù una cifratura AES di 256 bit.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Più dinfurmazione annantà a <a href=\"https://privatebin.info/\">pagina di u prughjettu</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Più dinfurmazione annantà a <a href=\"https://privatebin.info/\">pagina di u prughjettu</a>.",
"Because ignorance is bliss": "Perchè lignurenza hè una campa", "Because ignorance is bliss": "Perchè lignurenza hè una campa",
"en": "co",
"Paste does not exist, has expired or has been deleted.": "Lappiccicu ùn esiste micca, hè scadutu o hè statu squassatu.", "Paste does not exist, has expired or has been deleted.": "Lappiccicu ùn esiste micca, hè scadutu o hè statu squassatu.",
"%s requires php %s or above to work. Sorry.": "Per disgrazzia, %s richiede php %s o più recente per funziunà.", "%s requires php %s or above to work. Sorry.": "Per disgrazzia, %s richiede php %s o più recente per funziunà.",
"%s requires configuration section [%s] to be present in configuration file.": "%s richiede a presenza di a sezzione di cunfigurazione [%s] in a schedariu di cunfigurazione.", "%s requires configuration section [%s] to be present in configuration file.": "%s richiede a presenza di a sezzione di cunfigurazione [%s] in a schedariu di cunfigurazione.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "U vostru indirizzu IP ùn hè micca auturizatu à creà lappiccichi.", "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.", "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." "Error parsing YOURLS response.": "Sbagliu durante lanalisa di a risposta di YOURLS.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Si pò affissà lappiccichi « Squassà dopu a lettura » solu dopu u so caricamentu. Vulete aprelu subitu ?",
"Yes, load it": "Iè, caricatelu"
} }

View File

@ -3,7 +3,6 @@
"%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.", "%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>.", "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>.",
"Because ignorance is bliss": "Protože nevědomost je sladká", "Because ignorance is bliss": "Protože nevědomost je sladká",
"en": "cs",
"Paste does not exist, has expired or has been deleted.": "Vložený text neexistuje, expiroval nebo byl odstraněn.", "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 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].",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Vaše IP adresa nemá oprávnění k vytvoření vložení.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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.", "%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.", "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": "Unwissenheit ist ein Segen",
"en": "de",
"Paste does not exist, has expired or has been deleted.": "Diesen Text gibt es nicht, er ist abgelaufen oder wurde gelöscht.", "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 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.", "%s requires configuration section [%s] to be present in configuration file.": "%s benötigt den Konfigurationsabschnitt [%s] in der Konfigurationsdatei um zu funktionieren.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Deine IP ist nicht berechtigt, Texte zu erstellen.", "Your IP is not authorized to create pastes.": "Deine IP ist nicht berechtigt, Texte zu erstellen.",
"Trying to shorten a URL that isn't pointing at our instance.": "Versuch eine URL zu verkürzen, die nicht auf unsere Instanz zeigt.", "Trying to shorten a URL that isn't pointing at our instance.": "Versuch eine URL zu verkürzen, die nicht auf unsere Instanz zeigt.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Fehler beim Aufruf von YOURLS. Wahrscheinlich ein Konfigurationsproblem, wie eine falsche oder fehlende \"apiurl\" oder \"signature\".", "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Fehler beim Aufruf von YOURLS. Wahrscheinlich ein Konfigurationsproblem, wie eine falsche oder fehlende \"apiurl\" oder \"signature\".",
"Error parsing YOURLS response.": "Fehler beim Verarbeiten der YOURLS-Antwort." "Error parsing YOURLS response.": "Fehler beim Verarbeiten der YOURLS-Antwort.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Texte des \"Einmal\"-Typs können nach dem Herunterladen nur einmal angezeigt werden. Möchtest Du ihn jetzt öffnen?",
"Yes, load it": "Ja, jetzt öffnen"
} }

View File

@ -3,7 +3,6 @@
"%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στον φιλομετρητή (browser)%s χρησιμοποιόντας 256 bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Περισσότερες πληροφορίες στον <a href=\"https://privatebin.info/\">ιστότοπο του εργαλείου</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Περισσότερες πληροφορίες στον <a href=\"https://privatebin.info/\">ιστότοπο του εργαλείου</a>.",
"Because ignorance is bliss": "Επειδή η άγνοια είναι ευτυχία", "Because ignorance is bliss": "Επειδή η άγνοια είναι ευτυχία",
"en": "el",
"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 απαιτεί php %s ή νεότερη για να λειτουργήσει. Συγγνώμη.", "%s requires php %s or above to work. Sorry.": "%s απαιτεί php %s ή νεότερη για να λειτουργήσει. Συγγνώμη.",
"%s requires configuration section [%s] to be present in configuration file.": "%s απαιτεί οι ρυθμίσεις [%s] να υπάρχουν στο αρχείο ρυθμίσεων.", "%s requires configuration section [%s] to be present in configuration file.": "%s απαιτεί οι ρυθμίσεις [%s] να υπάρχουν στο αρχείο ρυθμίσεων.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Η IP σας δεν επιτρέπεται να δημιουργεί επικολλήσεις.", "Your IP is not authorized to create pastes.": "Η IP σας δεν επιτρέπεται να δημιουργεί επικολλήσεις.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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.", "%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>.", "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", "Because ignorance is bliss": "Because ignorance is bliss",
"en": "en",
"Paste does not exist, has expired or has been deleted.": "Paste does not exist, has expired or has been deleted.", "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 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.", "%s requires configuration section [%s] to be present in configuration file.": "%s requires configuration section [%s] to be present in configuration file.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 es un \"pastebin\" en línea minimalista de código abierto, donde el servidor no tiene ningún conocimiento de los datos guardados. Los datos son cifrados/descifrados %sen el navegador%s usando 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 es un \"pastebin\" en línea minimalista de código abierto, donde el servidor no tiene ningún conocimiento de los datos guardados. Los datos son cifrados/descifrados %sen el navegador%s usando 256 bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Más información en la <a href=\"https://privatebin.info/\">página del proyecto</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Más información en la <a href=\"https://privatebin.info/\">página del proyecto</a>.",
"Because ignorance is bliss": "Porque la ignorancia es felicidad", "Because ignorance is bliss": "Porque la ignorancia es felicidad",
"en": "es",
"Paste does not exist, has expired or has been deleted.": "El \"paste\" no existe, ha caducado o ha sido eliminado.", "Paste does not exist, has expired or has been deleted.": "El \"paste\" no existe, ha caducado o ha sido eliminado.",
"%s requires php %s or above to work. Sorry.": "%s requiere php %s o superior para funcionar. Lo siento.", "%s requires php %s or above to work. Sorry.": "%s requiere php %s o superior para funcionar. Lo siento.",
"%s requires configuration section [%s] to be present in configuration file.": "%s requiere que la sección de configuración [%s] esté presente en el archivo de configuración.", "%s requires configuration section [%s] to be present in configuration file.": "%s requiere que la sección de configuración [%s] esté presente en el archivo de configuración.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Tu IP no está autorizada para crear contenido.", "Your IP is not authorized to create pastes.": "Tu IP no está autorizada para crear contenido.",
"Trying to shorten a URL that isn't pointing at our instance.": "Intentando acortar una URL que no apunta a nuestra instancia.", "Trying to shorten a URL that isn't pointing at our instance.": "Intentando acortar una URL que no apunta a nuestra instancia.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error 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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 on minimalistlik, avatud lähtekoodiga online pastebin, kus serveril pole kleebitud andmete kohta teadmist. Andmed krüpteeritakse/dekrüpteeritakse %sbrauseris%s kasutades 256-bitist AES-i.", "%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 on minimalistlik, avatud lähtekoodiga online pastebin, kus serveril pole kleebitud andmete kohta teadmist. Andmed krüpteeritakse/dekrüpteeritakse %sbrauseris%s kasutades 256-bitist AES-i.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Lisateave <a href=\"https://privatebin.info/\">projekti lehel</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Lisateave <a href=\"https://privatebin.info/\">projekti lehel</a>.",
"Because ignorance is bliss": "Kuna teadmatus on õndsus", "Because ignorance is bliss": "Kuna teadmatus on õndsus",
"en": "et",
"Paste does not exist, has expired or has been deleted.": "Kleebet ei eksisteeri, on aegunud või on kustutatud.", "Paste does not exist, has expired or has been deleted.": "Kleebet ei eksisteeri, on aegunud või on kustutatud.",
"%s requires php %s or above to work. Sorry.": "%s vajab, et oleks php %s või kõrgem, et töötada. Vabandame.", "%s requires php %s or above to work. Sorry.": "%s vajab, et oleks php %s või kõrgem, et töötada. Vabandame.",
"%s requires configuration section [%s] to be present in configuration file.": "%s vajab, et [%s] seadistamise jaotis oleks olemas konfiguratsioonifailis.", "%s requires configuration section [%s] to be present in configuration file.": "%s vajab, et [%s] seadistamise jaotis oleks olemas konfiguratsioonifailis.",
@ -212,8 +211,10 @@
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Kirja nägemiseks külasta seda linki. Teistele URL-i andmine lubab ka neil ligi pääseda kirjale.", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Kirja nägemiseks külasta seda linki. Teistele URL-i andmine lubab ka neil ligi pääseda kirjale.",
"URL shortener may expose your decrypt key in URL.": "URL-i lühendaja võib paljastada sinu dekrüpteerimisvõtme URL-is.", "URL shortener may expose your decrypt key in URL.": "URL-i lühendaja võib paljastada sinu dekrüpteerimisvõtme URL-is.",
"Save paste": "Salvesta kleebe", "Save paste": "Salvesta kleebe",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "Your IP is not authorized to create pastes.": "Su IP-l ei ole lubatud kleepeid luua.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", "Trying to shorten a URL that isn't pointing at our instance.": "Püüame lühendada URL-i, mis ei viita meie instantsile.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "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\".": "Viga YOURLS-i kutsumisel. Tõenäoliselt konfiguratsiooniprobleem, näiteks vale või puuduv \"apiurl\" või \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Viga YOURLS vastuse parsimisel.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 on minimalistinen, avoimen lähdekoodin online pastebin jossa palvelimella ei ole tietoa syötetystä datasta. Data salataan/puretaan %sselaimessa%s käyttäen 256-bittistä 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 on minimalistinen, avoimen lähdekoodin online pastebin jossa palvelimella ei ole tietoa syötetystä datasta. Data salataan/puretaan %sselaimessa%s käyttäen 256-bittistä AES:ää.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Lisää tietoa <a href=\"https://privatebin.info/\">projektisivulla</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Lisää tietoa <a href=\"https://privatebin.info/\">projektisivulla</a>.",
"Because ignorance is bliss": "Koska tieto lisää tuskaa", "Because ignorance is bliss": "Koska tieto lisää tuskaa",
"en": "fi",
"Paste does not exist, has expired or has been deleted.": "Pastea ei ole olemassa, se on vanhentunut tai se on poistettu.", "Paste does not exist, has expired or has been deleted.": "Pastea ei ole olemassa, se on vanhentunut tai se on poistettu.",
"%s requires php %s or above to work. Sorry.": "%s vaatii php:n %s-version tai uudemman toimiakseen. Anteeksi.", "%s requires php %s or above to work. Sorry.": "%s vaatii php:n %s-version tai uudemman toimiakseen. Anteeksi.",
"%s requires configuration section [%s] to be present in configuration file.": "%s vaatii konfiguraatio-osion [%s] olevan läsnä konfiguraatiotiedostossa.", "%s requires configuration section [%s] to be present in configuration file.": "%s vaatii konfiguraatio-osion [%s] olevan läsnä konfiguraatiotiedostossa.",
@ -209,11 +208,13 @@
"Convert To UTC": "Muuta UTC:ksi", "Convert To UTC": "Muuta UTC:ksi",
"Close": "Sulje", "Close": "Sulje",
"Encrypted note on %s": "Salattu viesti %sissä", "Encrypted note on %s": "Salattu viesti %sissä",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Käy tässä linkissä nähdäksesi viestin. URL:n antaminen kenellekään antaa heidänkin päästä katsomeen viestiä. ", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Vieraile tässä linkissä nähdäksesi viestin. URL:n antaminen kenellekään antaa heidänkin päästä katsomaan viestiä.",
"URL shortener may expose your decrypt key in URL.": "URL-lyhentäjä voi paljastaa purkuavaimesi URL:ssä.", "URL shortener may expose your decrypt key in URL.": "URL-lyhentäjä voi paljastaa purkuavaimesi URL:ssä.",
"Save paste": "Tallenna paste", "Save paste": "Tallenna paste",
"Your IP is not authorized to create pastes.": "IP:llesi ei ole annettu oikeutta luoda pasteja.", "Your IP is not authorized to create pastes.": "IP:llesi ei ole annettu oikeutta luoda pasteja.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", "Trying to shorten a URL that isn't pointing at our instance.": "Yritetään lyhentää URL-osoite, joka ei osoita meidän instanssiiin.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "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\".": "Virhe kutsuttaessa YOURLS. Luultavasti asetusongelma kuten väärä tai puuttuuva \"apiurl\" tai \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Virhe jäsennettäessä YOURLS-vastausta.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 est un 'pastebin' (ou gestionnaire d'extraits de texte et de code source) minimaliste et open source, dans lequel le serveur n'a aucune connaissance des données envoyées. Les données sont chiffrées/déchiffrées %sdans le navigateur%s par un chiffrement AES 256 bits.", "%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 est un 'pastebin' (ou gestionnaire d'extraits de texte et de code source) minimaliste et open source, dans lequel le serveur n'a aucune connaissance des données envoyées. Les données sont chiffrées/déchiffrées %sdans le navigateur%s par un chiffrement AES 256 bits.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Plus d'informations sur <a href=\"https://privatebin.info/\">la page du projet</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Plus d'informations sur <a href=\"https://privatebin.info/\">la page du projet</a>.",
"Because ignorance is bliss": "Vivons heureux, vivons cachés", "Because ignorance is bliss": "Vivons heureux, vivons cachés",
"en": "fr",
"Paste does not exist, has expired or has been deleted.": "Le paste n'existe pas, a expiré, ou a été supprimé.", "Paste does not exist, has expired or has been deleted.": "Le paste n'existe pas, a expiré, ou a été supprimé.",
"%s requires php %s or above to work. Sorry.": "Désolé, %s nécessite php %s ou supérieur pour fonctionner.", "%s requires php %s or above to work. Sorry.": "Désolé, %s nécessite php %s ou supérieur pour fonctionner.",
"%s requires configuration section [%s] to be present in configuration file.": "%s a besoin de la section de configuration [%s] dans le fichier de configuration pour fonctionner.", "%s requires configuration section [%s] to be present in configuration file.": "%s a besoin de la section de configuration [%s] dans le fichier de configuration pour fonctionner.",
@ -213,7 +212,9 @@
"URL shortener may expose your decrypt key in URL.": "Raccourcir l'URL peut exposer votre clé de déchiffrement dans l'URL.", "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", "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.", "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.": "Trying to shorten a URL that isn't pointing at our instance.", "Trying to shorten a URL that isn't pointing at our instance.": "Essayer 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\".": "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\".": "Erreur lors de l'appel de YOURLS. Peut-être un problème de configuration, comme \"apiurl\" ou \"signature\" manquant.",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Erreur d'analyse de la réponse YOURLS.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Effacer après la lecture des paste ne peut être affiché qu'une seule fois lors du chargement. Voulez-vous l'ouvrir maintenant ?",
"Yes, load it": "Oui, chargez-le"
} }

View File

@ -3,7 +3,6 @@
"%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.", "%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>.", "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": "כיוון שבורות היא ברכה",
"en": "he",
"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 דורש PHP %s כדי לפעול.", "%s requires php %s or above to work. Sorry.": "%s דורש PHP %s כדי לפעול.",
"%s requires configuration section [%s] to be present in configuration file.": "%s דורש שסעיף ההגדרות [%s] יהיה קיים בקובץ ההגדרות.", "%s requires configuration section [%s] to be present in configuration file.": "%s דורש שסעיף ההגדרות [%s] יהיה קיים בקובץ ההגדרות.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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.", "%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>.", "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", "Because ignorance is bliss": "Because ignorance is bliss",
"en": "hi",
"Paste does not exist, has expired or has been deleted.": "Paste does not exist, has expired or has been deleted.", "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 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.", "%s requires configuration section [%s] to be present in configuration file.": "%s requires configuration section [%s] to be present in configuration file.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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.": "A %s egy minimalista, nyílt forráskódú adattároló szoftver, ahol a szerver semmilyen információt nem tárol a feltett adatról. Azt ugyanis a %sböngésződ%s segítségével titkosítja és oldja fel 256 bit hosszú titkosítási kulcsú AES-t használva.", "%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.": "A %s egy minimalista, nyílt forráskódú adattároló szoftver, ahol a szerver semmilyen információt nem tárol a feltett adatról. Azt ugyanis a %sböngésződ%s segítségével titkosítja és oldja fel 256 bit hosszú titkosítási kulcsú AES-t használva.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "További információt a <a href=\"https://privatebin.info/\">projekt oldalán</a> találsz.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "További információt a <a href=\"https://privatebin.info/\">projekt oldalán</a> találsz.",
"Because ignorance is bliss": "A titok egyfajta hatalom.", "Because ignorance is bliss": "A titok egyfajta hatalom.",
"en": "hu",
"Paste does not exist, has expired or has been deleted.": "A bejegyzés nem létezik, lejárt vagy törölve lett.", "Paste does not exist, has expired or has been deleted.": "A bejegyzés nem létezik, lejárt vagy törölve lett.",
"%s requires php %s or above to work. Sorry.": "Bocs, de a %s működéséhez %s vagy ezt meghaladó verziójú php-s környezet szükséges.", "%s requires php %s or above to work. Sorry.": "Bocs, de a %s működéséhez %s vagy ezt meghaladó verziójú php-s környezet szükséges.",
"%s requires configuration section [%s] to be present in configuration file.": "A %s megfelelő működéséhez a konfigurációs fájlban a [%s] résznek léteznie kell.", "%s requires configuration section [%s] to be present in configuration file.": "A %s megfelelő működéséhez a konfigurációs fájlban a [%s] résznek léteznie kell.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 adalah sebuah pastebin online sumber terbuka dan minimalis, dimana servernya tersebut tidak punya pengetahuan tentang data yang ditempelkan. Data tersebut di enkrip/dekrip %sdi dalam browser%s menggunakan metode enkrip AES 256 bit.", "%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 adalah sebuah pastebin online sumber terbuka dan minimalis, dimana servernya tersebut tidak punya pengetahuan tentang data yang ditempelkan. Data tersebut di enkrip/dekrip %sdi dalam browser%s menggunakan metode enkrip AES 256 bit.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Infomasi lebih lanjut pada <a href=\"https://privatebin.info/\">halaman proyek</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Infomasi lebih lanjut pada <a href=\"https://privatebin.info/\">halaman proyek</a>.",
"Because ignorance is bliss": "Karena ketidaktahuan adalah kebahagiaan, gitu loh", "Because ignorance is bliss": "Karena ketidaktahuan adalah kebahagiaan, gitu loh",
"en": "id",
"Paste does not exist, has expired or has been deleted.": "Paste tidak ada, telah kedaluwarsa atau telah dihapus.", "Paste does not exist, has expired or has been deleted.": "Paste tidak ada, telah kedaluwarsa atau telah dihapus.",
"%s requires php %s or above to work. Sorry.": "%s memerlukan php %s atau versi diatasnya untuk dapat dijalankan. Maaf.", "%s requires php %s or above to work. Sorry.": "%s memerlukan php %s atau versi diatasnya untuk dapat dijalankan. Maaf.",
"%s requires configuration section [%s] to be present in configuration file.": "%s membutuhkan bagian konfigurasi [%s] untuk ada di file konfigurasi.", "%s requires configuration section [%s] to be present in configuration file.": "%s membutuhkan bagian konfigurasi [%s] untuk ada di file konfigurasi.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 è un sistema di tipo \"Pastebin\" online, open source, minimalista. Il server non possiede alcuna conoscenza (\"Zero Knowledge\") del contenuto dei dati inviati. I dati sono cifrati/decifrati %snel Browser%s con algoritmo AES a 256 Bit.", "%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 è un sistema di tipo \"Pastebin\" online, open source, minimalista. Il server non possiede alcuna conoscenza (\"Zero Knowledge\") del contenuto dei dati inviati. I dati sono cifrati/decifrati %snel Browser%s con algoritmo AES a 256 Bit.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Per ulteriori informazioni, vedi <a href=\"https://privatebin.info/\">Sito del progetto</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Per ulteriori informazioni, vedi <a href=\"https://privatebin.info/\">Sito del progetto</a>.",
"Because ignorance is bliss": "Perché l'ignoranza è una benedizione (Because ignorance is bliss)", "Because ignorance is bliss": "Perché l'ignoranza è una benedizione (Because ignorance is bliss)",
"en": "it",
"Paste does not exist, has expired or has been deleted.": "Questo messaggio non esiste, è scaduto o è stato cancellato.", "Paste does not exist, has expired or has been deleted.": "Questo messaggio non esiste, è scaduto o è stato cancellato.",
"%s requires php %s or above to work. Sorry.": "%s richiede php %s o superiore per funzionare. Ci spiace.", "%s requires php %s or above to work. Sorry.": "%s richiede php %s o superiore per funzionare. Ci spiace.",
"%s requires configuration section [%s] to be present in configuration file.": "%s richiede la presenza della sezione [%s] nei file di configurazione.", "%s requires configuration section [%s] to be present in configuration file.": "%s richiede la presenza della sezione [%s] nei file di configurazione.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Il tuo IP non è autorizzato a creare dei messaggi.", "Your IP is not authorized to create pastes.": "Il tuo IP non è autorizzato a creare dei messaggi.",
"Trying to shorten a URL that isn't pointing at our instance.": "Tantativo in corso di accorciare un URL che non punta alla nostra istanza.", "Trying to shorten a URL that isn't pointing at our instance.": "Tantativo in corso di accorciare un URL che non punta alla nostra istanza.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Errore nella chiamata a YOURLS. Probabilmente un problema di configurazione, come un \"apiurl\" o una \"signature\" sbagliati o mancanti.", "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Errore nella chiamata a YOURLS. Probabilmente un problema di configurazione, come un \"apiurl\" o una \"signature\" sbagliati o mancanti.",
"Error parsing YOURLS response.": "Errore nell'analizzare la risposta YOURLS." "Error parsing YOURLS response.": "Errore nell'analizzare la risposta YOURLS.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Messaggi di tipo Distruggi-dopo-lettura piovono essere visualizzata solo una volta al caricamento. Vuoi aprirle ora?",
"Yes, load it": "Sì, caricalo"
} }

View File

@ -1,63 +1,62 @@
{ {
"PrivateBin": "PrivateBin", "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.", "%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 はミニマリストで、オープンソースのオンラインデータ貼り付けサービスです。サーバーに、貼り付けられたデータの中身を読み取ることはできません。データは、256ビットのAESを用いて%sブラウザー上で%s暗号化、または復号化されます。",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "More information on the <a href=\"https://privatebin.info/\">project page</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "詳細については<a href=\"https://privatebin.info/\">プロジェクトのページ</a>をご覧ください。",
"Because ignorance is bliss": "Because ignorance is bliss", "Because ignorance is bliss": "知らぬが仏",
"en": "ja", "Paste does not exist, has expired or has been deleted.": "ペーストが存在しないか、期限切れ、または削除されました。",
"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 の動作には php %s 以上が必要です。申し訳ありません。",
"%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には設定ファイルに[%s]の設定セクションが必要です。",
"%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 seconds between each post.": [
"Please wait %d second between each post. (singular)", "投稿ごとに%d秒間お待ちください。",
"Please wait %d seconds between each post. (1st plural)", "投稿ごとに%d秒間お待ちください。",
"Please wait %d seconds between each post. (2nd plural)", "投稿ごとに%d秒間お待ちください。",
"Please wait %d seconds between each post. (3rd plural)", "投稿ごとに%d秒間お待ちください。",
"Please wait %d seconds between each post. (4th plural)", "投稿ごとに%d秒間お待ちください。",
"Please wait %d seconds between each post. (5th plural)" "投稿ごとに%d秒間お待ちください。"
], ],
"Paste is limited to %s of encrypted data.": "Paste is limited to %s of encrypted data.", "Paste is limited to %s of encrypted data.": "ペーストは暗号化されたデータの%sに制限されています。",
"Invalid data.": "Invalid data.", "Invalid data.": "無効なデータです。",
"You are unlucky. Try again.": "You are unlucky. Try again.", "You are unlucky. Try again.": "何か問題が発生しました。もう一度やり直してください。",
"Error saving comment. Sorry.": "Error saving comment. Sorry.", "Error saving comment. Sorry.": "コメントの保存中にエラーが発生しました。申し訳ありません。",
"Error saving paste. Sorry.": "Error saving paste. Sorry.", "Error saving paste. Sorry.": "ペーストの保存中にエラーが発生しました。申し訳ありません。",
"Invalid paste ID.": "Invalid paste ID.", "Invalid paste ID.": "無効なペーストIDです。",
"Paste is not of burn-after-reading type.": "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.", "Wrong deletion token. Paste was not deleted.": "不正な削除トークンです。ペーストは削除されませんでした。",
"Paste was properly 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.", "JavaScript is required for %s to work. Sorry for the inconvenience.": "%s の動作にはJavaScriptが必要です。ご迷惑をおかけして申し訳ありません。",
"%s requires a modern browser to work.": "%s requires a modern browser to work.", "%s requires a modern browser to work.": "%s の動作には最近のブラウザが必要です。",
"New": "新しい", "New": "新",
"Send": "送", "Send": "送",
"Clone": "Clone", "Clone": "複製",
"Raw text": "Raw text", "Raw text": "未加工テキスト",
"Expires": "Expires", "Expires": "有効期限",
"Burn after reading": "Burn after reading", "Burn after reading": "読み込んだ後に消去",
"Open discussion": "Open discussion", "Open discussion": "ディスカッションを開く",
"Password (recommended)": "Password (recommended)", "Password (recommended)": "パスワード(推奨)",
"Discussion": "Discussion", "Discussion": "ディスカッション",
"Toggle navigation": "Toggle navigation", "Toggle navigation": "ナビゲーションを切り替え",
"%d seconds": [ "%d seconds": [
"%d second (singular)", "%d",
"%d seconds (1st plural)", "%d",
"%d seconds (2nd plural)", "%d",
"%d seconds (3rd plural)", "%d",
"%d seconds (4th plural)", "%d",
"%d seconds (5th plural)" "%d"
], ],
"%d minutes": [ "%d minutes": [
"%d 分", "%d分",
"%d 分", "%d分",
"%d 分", "%d分",
"%d 分", "%d分",
"%d 分", "%d分",
"%d 分" "%d分"
], ],
"%d hours": [ "%d hours": [
"%d 時間", "%d時間",
"%d 時間", "%d時間",
"%d 時間", "%d時間",
"%d 時間", "%d時間",
"%d 時間", "%d時間",
"%d 時間" "%d 時間"
], ],
"%d days": [ "%d days": [
@ -69,93 +68,93 @@
"%d 日" "%d 日"
], ],
"%d weeks": [ "%d weeks": [
"%d week (singular)", "%d週間",
"%d weeks (1st plural)", "%d週間",
"%d weeks (2nd plural)", "%d週間",
"%d weeks (3rd plural)", "%d週間",
"%d weeks (4th plural)", "%d週間",
"%d weeks (5th plural)" "%d週間"
], ],
"%d months": [ "%d months": [
"%d month (singular)", "%dか月",
"%d months (1st plural)", "%dか月",
"%d months (2nd plural)", "%dか月",
"%d months (3rd plural)", "%dか月",
"%d months (4th plural)", "%dか月",
"%d months (5th plural)" "%dか月"
], ],
"%d years": [ "%d years": [
"%d year (singular)", "%d",
"%d years (1st plural)", "%d",
"%d years (2nd plural)", "%d",
"%d years (3rd plural)", "%d",
"%d years (4th plural)", "%d",
"%d years (5th plural)" "%d"
], ],
"Never": "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.", "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "注意これはテストサービスです。データはいつでも削除される可能性があります。このサービスを悪用するとKittensの動作は停止します。",
"This document will expire in %d seconds.": [ "This document will expire in %d seconds.": [
"This document will expire in %d second. (singular)", "このドキュメントは%d秒後に失効します。",
"This document will expire in %d seconds. (1st plural)", "このドキュメントは%d秒後に失効します。",
"This document will expire in %d seconds. (2nd plural)", "このドキュメントは%d秒後に失効します。",
"This document will expire in %d seconds. (3rd plural)", "このドキュメントは%d秒後に失効します。",
"This document will expire in %d seconds. (4th plural)", "このドキュメントは%d秒後に失効します。",
"This document will expire in %d seconds. (5th plural)" "このドキュメントは%d秒後に失効します。"
], ],
"This document will expire in %d minutes.": [ "This document will expire in %d minutes.": [
"This document will expire in %d minute. (singular)", "このドキュメントは%d分後に失効します。",
"This document will expire in %d minutes. (1st plural)", "このドキュメントは%d分後に失効します。",
"This document will expire in %d minutes. (2nd plural)", "このドキュメントは%d分後に失効します。",
"This document will expire in %d minutes. (3rd plural)", "このドキュメントは%d分後に失効します。",
"This document will expire in %d minutes. (4th plural)", "このドキュメントは%d分後に失効します。",
"This document will expire in %d minutes. (5th plural)" "このドキュメントは%d分後に失効します。"
], ],
"This document will expire in %d hours.": [ "This document will expire in %d hours.": [
"This document will expire in %d hour. (singular)", "このドキュメントは%d時間後に失効します。",
"This document will expire in %d hours. (1st plural)", "このドキュメントは%d時間後に失効します。",
"This document will expire in %d hours. (2nd plural)", "このドキュメントは%d時間後に失効します。",
"This document will expire in %d hours. (3rd plural)", "このドキュメントは%d時間後に失効します。",
"This document will expire in %d hours. (4th plural)", "このドキュメントは%d時間後に失効します。",
"This document will expire in %d hours. (5th plural)" "このドキュメントは%d時間後に失効します。"
], ],
"This document will expire in %d days.": [ "This document will expire in %d days.": [
"This document will expire in %d day. (singular)", "このドキュメントは%d日後に失効します。",
"This document will expire in %d days. (1st plural)", "このドキュメントは%d日後に失効します。",
"This document will expire in %d days. (2nd plural)", "このドキュメントは%d日後に失効します。",
"This document will expire in %d days. (3rd plural)", "このドキュメントは%d日後に失効します。",
"This document will expire in %d days. (4th plural)", "このドキュメントは%d日後に失効します。",
"This document will expire in %d days. (5th plural)" "このドキュメントは%d日後に失効します。"
], ],
"This document will expire in %d months.": [ "This document will expire in %d months.": [
"This document will expire in %d month. (singular)", "このドキュメントは%dか月後に失効します。",
"This document will expire in %d months. (1st plural)", "このドキュメントは%dか月後に失効します。",
"This document will expire in %d months. (2nd plural)", "このドキュメントは%dか月後に失効します。",
"This document will expire in %d months. (3rd plural)", "このドキュメントは%dか月後に失効します。",
"This document will expire in %d months. (4th plural)", "このドキュメントは%dか月後に失効します。",
"This document will expire in %d months. (5th plural)" "このドキュメントは%dか月後に失効します。"
], ],
"Please enter the password for this paste:": "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 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.", "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.", "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?", "Could not decrypt comment; Wrong key?": "コメントを復号することができませんでした。間違った鍵ですか?",
"Reply": "Reply", "Reply": "返信",
"Anonymous": "Anonymous", "Anonymous": "匿名",
"Avatar generated from IP address": "Avatar generated from IP address", "Avatar generated from IP address": "IPアドレスから生成したアバター",
"Add comment": "Add comment", "Add comment": "コメントを追加",
"Optional nickname…": "Optional nickname…", "Optional nickname…": "任意のニックネーム…",
"Post comment": "Post comment", "Post comment": "コメントを投稿",
"Sending comment…": "Sending comment…", "Sending comment…": "コメントを送信しています…",
"Comment posted.": "Comment posted.", "Comment posted.": "コメントを投稿しました。",
"Could not refresh display: %s": "Could not refresh display: %s", "Could not refresh display: %s": "表示を更新できませんでした:%s",
"unknown status": "unknown status", "unknown status": "不明な状態",
"server error or not responding": "server error or not responding", "server error or not responding": "サーバーエラーまたは応答しません",
"Could not post comment: %s": "Could not post comment: %s", "Could not post comment: %s": "コメントを投稿できませんでした:%s",
"Sending paste…": "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>", "Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "ペーストは<a id=\"pasteurl\" href=\"%s\">%s</a>です<span id=\"copyhint\">(コピーするには[Ctrl]+[c]を押してください)</span>",
"Delete data": "Delete data", "Delete data": "データを削除",
"Could not create paste: %s": "Could not create paste: %s", "Could not create paste: %s": "ペーストを作成できませんでした:%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?)": "ペーストを復号化できません復号化キーがURLにありませんURLの一部を削除するリダイレクト機能またはURLの短縮アプリケーションを使いましたか",
"B": "B", "B": "B",
"KiB": "KiB", "KiB": "KiB",
"MiB": "MiB", "MiB": "MiB",
@ -165,55 +164,57 @@
"EiB": "EiB", "EiB": "EiB",
"ZiB": "ZiB", "ZiB": "ZiB",
"YiB": "YiB", "YiB": "YiB",
"Format": "Format", "Format": "形式",
"Plain Text": "Plain Text", "Plain Text": "プレーンテキスト",
"Source Code": "Source Code", "Source Code": "ソースコード",
"Markdown": "Markdown", "Markdown": "Markdown",
"Download attachment": "Download attachment", "Download attachment": "添付ファイルをダウンロード",
"Cloned: '%s'": "Cloned: '%s'", "Cloned: '%s'": "複製済:'%s'",
"The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.", "The cloned file '%s' was attached to this paste.": "複製されたファイル '%s' がこのペーストに添付されました。",
"Attach a file": "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", "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.", "File too large, to display a preview. Please download the attachment.": "ファイルが大きすぎるため、プレビューを表示できません。ダウンロードしてください。",
"Remove 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.", "Your browser does not support uploading encrypted files. Please use a newer browser.": "お使いのブラウザーは暗号化されたファイルのアップロードをサポートしていません。新しいブラウザーを使用してください。",
"Invalid attachment.": "Invalid attachment.", "Invalid attachment.": "不正な添付ファイルです。",
"Options": "Options", "Options": "設定",
"Shorten URL": "Shorten URL", "Shorten URL": "URLを短縮",
"Editor": "Editor", "Editor": "エディター",
"Preview": "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.", "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s は「%s」で終わるPATHが必要です。index.phpのPATHを更新してください。",
"Decrypt": "Decrypt", "Decrypt": "復号化",
"Enter password": "Enter password", "Enter password": "パスワードを入力",
"Loading…": "Loading…", "Loading…": "読み込んでいます…",
"Decrypting paste…": "Decrypting paste…", "Decrypting paste…": "ペーストを復号化しています…",
"Preparing new 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>.", "In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "このメッセージが消去されない場合、<a href=\"%s\">トラブルシュート用のFAQ</a>をご確認ください。",
"+++ no paste text +++": "+++ no paste text +++", "+++ no paste text +++": "+++ ペーストのテキストはありません +++",
"Could not get paste data: %s": "Could not get paste data: %s", "Could not get paste data: %s": "ペーストのデータを取得できませんでした:%s",
"QR code": "QR code", "QR code": "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.", "This website is using an insecure HTTP connection! Please use it only for testing.": "このウェブサイトは安全でない HTTP 接続を使用しています!テストにのみ使用してください。",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "For more information <a href=\"%s\">see this FAQ entry</a>.", "For more information <a href=\"%s\">see this FAQ entry</a>.": "詳細については、<a href=\"%s\">こちらのFAQエントリー</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 may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "お使いのブラウザーはWebCrypto APIのサポートにHTTPS接続を必要とするかもしれません。<a href=\"%s\">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.", "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "お使いのブラウザーはzlib圧縮に必要なWebAssemblyをサポートしていません。圧縮されていないドキュメントを作成することはできますが、圧縮されたドキュメントを読み込むことはできません。",
"waiting on user to provide a password": "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.", "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "データを復号できませんでした。パスワードが間違っていましたか? 上部のボタンで再試行してください。",
"Retry": "Retry", "Retry": "再試行",
"Showing raw text…": "Showing raw text…", "Showing raw text…": "未加工テキストを表示しています…",
"Notice:": "Notice:", "Notice:": "注意:",
"This link will expire after %s.": "This link will expire after %s.", "This link will expire after %s.": "このリンクは%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.", "This link can only be accessed once, do not use back or refresh button in your browser.": "このリンクは一度だけアクセスできます。ブラウザで戻ったり更新したりしないでください。",
"Link:": "Link:", "Link:": "リンク:",
"Recipient may become aware of your timezone, convert time to UTC?": "Recipient may become aware of your timezone, convert time to UTC?", "Recipient may become aware of your timezone, convert time to UTC?": "受信する人はあなたのタイムゾーンに気づくかもしれません。時間をUTCに変換しますか",
"Use Current Timezone": "Use Current Timezone", "Use Current Timezone": "現在のタイムゾーンを使用",
"Convert To UTC": "Convert To UTC", "Convert To UTC": "UTCに変換",
"Close": "Close", "Close": "閉じる",
"Encrypted note on %s": "Encrypted note on %s", "Encrypted note on %s": "%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.", "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "メモを見るには、このリンクを参照してください。誰でもURLからこのメモにアクセスできます。",
"URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL.", "URL shortener may expose your decrypt key in URL.": "URLの短縮アプリケーションを使うと、復号用のキーが漏洩するおそれがあります。",
"Save paste": "Save paste", "Save paste": "ペーストを保存",
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "Your IP is not authorized to create pastes.": "あなたのIPアドレスにはペーストを作成する権限がありません。",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", "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\".": "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\".": "YOURLSの呼び出し中にエラーが発生しました。\"apiurl\"または\"signature\"等の設定に問題がある可能性があります。",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "YOURLSレスポンスの解析中にエラーが発生しました。",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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.": ".i la %s mupli lo sorcu lo'e se setca kibro .i ji'a zo'e se zancari gi'e fingubni .i lo samse'u na djuno lo datni selru'e cu .i ba'e %sle brauzero%s ku mipri le do datni ku fi la'oi AES poi bitni li 256", "%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.": ".i la %s mupli lo sorcu lo'e se setca kibro .i ji'a zo'e se zancari gi'e fingubni .i lo samse'u na djuno lo datni selru'e cu .i ba'e %sle brauzero%s ku mipri le do datni ku fi la'oi AES poi bitni li 256",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "More information on the <a href=\"https://privatebin.info/\">project page</a>.", "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": ".i ki'u le ka na djuno cu ka saxfri", "Because ignorance is bliss": ".i ki'u le ka na djuno cu ka saxfri",
"en": "jbo",
"Paste does not exist, has expired or has been deleted.": "Paste does not exist, has expired or has been deleted.", "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 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.", "%s requires configuration section [%s] to be present in configuration file.": "%s requires configuration section [%s] to be present in configuration file.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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.", "%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>.", "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", "Because ignorance is bliss": "Because ignorance is bliss",
"en": "ku",
"Paste does not exist, has expired or has been deleted.": "Paste does not exist, has expired or has been deleted.", "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 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.", "%s requires configuration section [%s] to be present in configuration file.": "%s requires configuration section [%s] to be present in configuration file.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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.", "%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>.", "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", "Because ignorance is bliss": "Because ignorance is bliss",
"en": "la",
"Paste does not exist, has expired or has been deleted.": "Paste does not exist, has expired or has been deleted.", "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 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.", "%s requires configuration section [%s] to be present in configuration file.": "%s requires configuration section [%s] to be present in configuration file.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 yra minimalistinis, atvirojo kodo internetinis įdėjimų dėklas, kurį naudojant, serveris nieko nenutuokia apie įdėtus duomenis. Duomenys yra šifruojami/iššifruojami %snaršyklėje%s naudojant 256 bitų 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 yra minimalistinis, atvirojo kodo internetinis įdėjimų dėklas, kurį naudojant, serveris nieko nenutuokia apie įdėtus duomenis. Duomenys yra šifruojami/iššifruojami %snaršyklėje%s naudojant 256 bitų AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Daugiau informacijos rasite <a href=\"https://privatebin.info/\">projekto puslapyje</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Daugiau informacijos rasite <a href=\"https://privatebin.info/\">projekto puslapyje</a>.",
"Because ignorance is bliss": "Nes nežinojimas yra palaima", "Because ignorance is bliss": "Nes nežinojimas yra palaima",
"en": "lt",
"Paste does not exist, has expired or has been deleted.": "Įdėjimo nėra, jis nebegalioja arba buvo ištrintas.", "Paste does not exist, has expired or has been deleted.": "Įdėjimo nėra, jis nebegalioja arba buvo ištrintas.",
"%s requires php %s or above to work. Sorry.": "%s savo darbui reikalauja php %s arba naujesnės versijos. Apgailestaujame.", "%s requires php %s or above to work. Sorry.": "%s savo darbui reikalauja php %s arba naujesnės versijos. Apgailestaujame.",
"%s requires configuration section [%s] to be present in configuration file.": "%s reikalauja, kad konfigūracijos faile būtų [%s] konfigūracijos sekcija.", "%s requires configuration section [%s] to be present in configuration file.": "%s reikalauja, kad konfigūracijos faile būtų [%s] konfigūracijos sekcija.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Jūsų IP adresas neturi įgaliojimų kurti įdėjimų.", "Your IP is not authorized to create pastes.": "Jūsų IP adresas neturi įgaliojimų kurti įdėjimų.",
"Trying to shorten a URL that isn't pointing at our instance.": "Bandoma sutrumpinti URL adresą, kuris nenurodo į mūsų egzempliorių.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Klaida iškviečiant YOURLS. Tikriausiai, konfigūracijos klaida, pavyzdžiui, neteisingi „apiurl“ ar „signature“, arba jų nėra.",
"Error parsing YOURLS response.": "Klaida nagrinėjant YOURLS atsaką." "Error parsing YOURLS response.": "Klaida nagrinėjant YOURLS atsaką.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 een minimalistische, open source online pastebin waarbij de server geen kennis heeft van de paste data zelf. Gegevens worden gecodeerd/gedecodeerd %s in de browser %s met behulp van 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 is een minimalistische, open source online pastebin waarbij de server geen kennis heeft van de paste data zelf. Gegevens worden gecodeerd/gedecodeerd %s in de browser %s met behulp van 256-bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Meer informatie is te vinden op de <a href=\"https://privatebin.info/\">projectpagina</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Meer informatie is te vinden op de <a href=\"https://privatebin.info/\">projectpagina</a>.",
"Because ignorance is bliss": "Onwetendheid is een zegen", "Because ignorance is bliss": "Onwetendheid is een zegen",
"en": "nl",
"Paste does not exist, has expired or has been deleted.": "Paste bestaat niet, is verlopen of verwijderd.", "Paste does not exist, has expired or has been deleted.": "Paste bestaat niet, is verlopen of verwijderd.",
"%s requires php %s or above to work. Sorry.": "%s vereist PHP %s of hoger om te kunnen werken. Sorry", "%s requires php %s or above to work. Sorry.": "%s vereist PHP %s of hoger om te kunnen werken. Sorry",
"%s requires configuration section [%s] to be present in configuration file.": "%s vereist dat de configuratiesectie [%s] aanwezig is in het configuratiebestand", "%s requires configuration section [%s] to be present in configuration file.": "%s vereist dat de configuratiesectie [%s] aanwezig is in het configuratiebestand",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Je IP-adres is niet gemachtigd om pastes te maken.", "Your IP is not authorized to create pastes.": "Je IP-adres is niet gemachtigd om pastes te maken.",
"Trying to shorten a URL that isn't pointing at our instance.": "Proberen om een URL te verkorten dat niet naar ons systeem wijst.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Foutmelding ophalen YOURLS. Waarschijnlijk een configuratiefout, zoals een verkeerde of missende \"apiurl\" of \"signature\".",
"Error parsing YOURLS response.": "Foutmelding bij parsen van YOURLS respons." "Error parsing YOURLS response.": "Foutmelding bij parsen van YOURLS respons.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 er en minimalistisk, åpen kildekode, elektronisk tilgjengelig pastebin hvor serveren ikke har kunnskap om dataene som limes inn. Dataene krypteres/dekrypteres %si nettleseren%s ved hjelp av 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 er en minimalistisk, åpen kildekode, elektronisk tilgjengelig pastebin hvor serveren ikke har kunnskap om dataene som limes inn. Dataene krypteres/dekrypteres %si nettleseren%s ved hjelp av 256 bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Mer informasjon om prosjektet på <a href=\"https://privatebin.info/\">prosjektsiden</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Mer informasjon om prosjektet på <a href=\"https://privatebin.info/\">prosjektsiden</a>.",
"Because ignorance is bliss": "Fordi uvitenhet er lykke", "Because ignorance is bliss": "Fordi uvitenhet er lykke",
"en": "no",
"Paste does not exist, has expired or has been deleted.": "Innlegget eksisterer ikke, er utløpt eller har blitt slettet.", "Paste does not exist, has expired or has been deleted.": "Innlegget eksisterer ikke, er utløpt eller har blitt slettet.",
"%s requires php %s or above to work. Sorry.": "Beklager, %s krever php %s eller nyere for å kjøre.", "%s requires php %s or above to work. Sorry.": "Beklager, %s krever php %s eller nyere for å kjøre.",
"%s requires configuration section [%s] to be present in configuration file.": "%s krever konfigurasjonsdel [%s] å være til stede i konfigurasjonsfilen .", "%s requires configuration section [%s] to be present in configuration file.": "%s krever konfigurasjonsdel [%s] å være til stede i konfigurasjonsfilen .",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 es un 'pastebin' (o gestionari dextrachs de tèxte e còdi font) minimalista e open source, dins lo qual lo servidor a pas cap de coneissença de las donadas mandadas. Las donadas son chifradas/deschifradas %sdins lo navigator%s per un chiframent AES 256 bits.", "%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 es un 'pastebin' (o gestionari dextrachs de tèxte e còdi font) minimalista e open source, dins lo qual lo servidor a pas cap de coneissença de las donadas mandadas. Las donadas son chifradas/deschifradas %sdins lo navigator%s per un chiframent AES 256 bits.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Mai informacions sus <a href=\"https://privatebin.info/\">la pagina del projècte</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Mai informacions sus <a href=\"https://privatebin.info/\">la pagina del projècte</a>.",
"Because ignorance is bliss": "Perque lo bonaür es lignorància", "Because ignorance is bliss": "Perque lo bonaür es lignorància",
"en": "oc",
"Paste does not exist, has expired or has been deleted.": "Lo tèxte existís pas, a expirat, o es estat suprimit.", "Paste does not exist, has expired or has been deleted.": "Lo tèxte existís pas, a expirat, o es estat suprimit.",
"%s requires php %s or above to work. Sorry.": "O planhèm, %s necessita php %s o superior per foncionar.", "%s requires php %s or above to work. Sorry.": "O planhèm, %s necessita php %s o superior per foncionar.",
"%s requires configuration section [%s] to be present in configuration file.": "%s fa besonh de la seccion de configuracion [%s] dins lo fichièr de configuracion per foncionar.", "%s requires configuration section [%s] to be present in configuration file.": "%s fa besonh de la seccion de configuracion [%s] dins lo fichièr de configuracion per foncionar.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Vòstra adreça IP a pas lautorizacion de crear de tèxtes.", "Your IP is not authorized to create pastes.": "Vòstra adreça IP a pas lautorizacion de crear de tèxtes.",
"Trying to shorten a URL that isn't pointing at our instance.": "Ensag dabracar una URL que mena pas a nòstra instància.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error en cridant YOURLS. Es probablament un problèma de configuracion, quicòm coma « apirul » o « signature » marrit o absent.",
"Error parsing YOURLS response.": "Error d'analisi de la responsa YOURLS." "Error parsing YOURLS response.": "Error d'analisi de la responsa YOURLS.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 jest minimalistycznym, otwartoźródłowym serwisem typu pastebin, w którym serwer nie ma jakichkolwiek informacji o tym, co jest wklejane. Dane są szyfrowane i deszyfrowane %sw przeglądarce%s z użyciem 256-bitowego klucza AES.", "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s jest minimalistycznym, otwartoźródłowym serwisem typu pastebin, w którym serwer nie ma jakichkolwiek informacji o tym, co jest wklejane. Dane są szyfrowane i deszyfrowane %sw przeglądarce%s z użyciem 256-bitowego klucza AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Więcej informacji na <a href=\"https://privatebin.info/\">stronie projektu</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Więcej informacji na <a href=\"https://privatebin.info/\">stronie projektu</a>.",
"Because ignorance is bliss": "Ponieważ ignorancja jest cnotą", "Because ignorance is bliss": "Ponieważ ignorancja jest cnotą",
"en": "pl",
"Paste does not exist, has expired or has been deleted.": "Wklejka nie istnieje, wygasła albo została usunięta.", "Paste does not exist, has expired or has been deleted.": "Wklejka nie istnieje, wygasła albo została usunięta.",
"%s requires php %s or above to work. Sorry.": "%s wymaga PHP w wersji %s lub nowszej. Przykro mi.", "%s requires php %s or above to work. Sorry.": "%s wymaga PHP w wersji %s lub nowszej. Przykro mi.",
"%s requires configuration section [%s] to be present in configuration file.": "%s wymaga obecności sekcji [%s] w pliku konfiguracyjnym.", "%s requires configuration section [%s] to be present in configuration file.": "%s wymaga obecności sekcji [%s] w pliku konfiguracyjnym.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 é um serviço minimalista e de código aberto do tipo \"pastebin\", em que o servidor tem zero conhecimento dos dados copiados. Os dados são cifrados e decifrados %sno navegador%s usando 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 é um serviço minimalista e de código aberto do tipo \"pastebin\", em que o servidor tem zero conhecimento dos dados copiados. Os dados são cifrados e decifrados %sno navegador%s usando 256 bits AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Mais informações na <a href=\"https://privatebin.info/\">página do projeto</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Mais informações na <a href=\"https://privatebin.info/\">página do projeto</a>.",
"Because ignorance is bliss": "Porque a ignorância é uma benção", "Because ignorance is bliss": "Porque a ignorância é uma benção",
"en": "pt",
"Paste does not exist, has expired or has been deleted.": "A cópia não existe, expirou ou já foi excluída.", "Paste does not exist, has expired or has been deleted.": "A cópia não existe, expirou ou já foi excluída.",
"%s requires php %s or above to work. Sorry.": "%s requer php %s ou superior para funcionar. Desculpa.", "%s requires php %s or above to work. Sorry.": "%s requer php %s ou superior para funcionar. Desculpa.",
"%s requires configuration section [%s] to be present in configuration file.": "%s requer que a seção de configuração [% s] esteja no arquivo de configuração.", "%s requires configuration section [%s] to be present in configuration file.": "%s requer que a seção de configuração [% s] esteja no arquivo de configuração.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Seu IP não está autorizado a criar cópias.", "Your IP is not authorized to create pastes.": "Seu IP não está autorizado a criar cópias.",
"Trying to shorten a URL that isn't pointing at our instance.": "Tentando encurtar uma URL que não aponta para a nossa instância.", "Trying to shorten a URL that isn't pointing at our instance.": "Tentando encurtar uma URL que não aponta para a nossa instância.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

220
i18n/ro.json Normal file
View File

@ -0,0 +1,220 @@
{
"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 este un pastebin online, minimalist și cu sursă deschisă unde serverul are zero acces la datele introduse. Datele sunt criptate/decriptate %sîn browser%s folosind AES cu 256 de biți.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Mai multe informații pe <a href=\"https://privatebin.info/\">pagina proiectului</a>.",
"Because ignorance is bliss": "Ignoranța este o binecuvântare",
"Paste does not exist, has expired or has been deleted.": "Paste-ul nu există, a expirat sau a fost șters.",
"%s requires php %s or above to work. Sorry.": "%s necesită php %s sau mai nou pentru a funcționa. Scuze.",
"%s requires configuration section [%s] to be present in configuration file.": "%s necesită ca secțiunea de configurare [%s] să fie prezentă în fișierul de configurare.",
"Please wait %d seconds between each post.": [
"Vă rugăm să așteptați %d secundă între fiecare postare",
"Vă rugăm să așteptați %d secunde între fiecare postare",
"Vă rugăm să așteptați %d de secunde între fiecare postare",
"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-ul este limitat la %s de date criptate.",
"Invalid data.": "Date invalide.",
"You are unlucky. Try again.": "Ați avut ghinion. Încercați din nou.",
"Error saving comment. Sorry.": "Eroare la salvarea comentariului. Ne pare rău.",
"Error saving paste. Sorry.": "Eroare la salvarea paste-ului. Ne pare rău.",
"Invalid paste ID.": "ID paste invalid.",
"Paste is not of burn-after-reading type.": "Paste-ul nu se șterge după citire.",
"Wrong deletion token. Paste was not deleted.": "Token de ștergere incorect. Paste-ul nu a fost șters.",
"Paste was properly deleted.": "Paste-ul a fost șters cu succes.",
"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",
"Send": "Trimiteți",
"Clone": "Clonați",
"Raw text": "Text brut",
"Expires": "Expiră",
"Burn after reading": "Ștergere după citire",
"Open discussion": "Deschideți discuția",
"Password (recommended)": "Parolă (recomandată)",
"Discussion": "Discuție",
"Toggle navigation": "Comutați navigarea",
"%d seconds": [
"%d secundă",
"%d secunde",
"%d de secunde",
"%d seconds (3rd plural)",
"%d seconds (4th plural)",
"%d seconds (5th plural)"
],
"%d minutes": [
"%d minut",
"%d minute",
"%d de minute",
"%d minutes (3rd plural)",
"%d minutes (4th plural)",
"%d minutes (5th plural)"
],
"%d hours": [
"%d oră",
"%d ore",
"%d de ore",
"%d hours (3rd plural)",
"%d hours (4th plural)",
"%d hours (5th plural)"
],
"%d days": [
"%d zi",
"%d zile",
"%d de zile",
"%d days (3rd plural)",
"%d days (4th plural)",
"%d days (5th plural)"
],
"%d weeks": [
"%d week (singular)",
"%d săptămână",
"%d săptămâni",
"%d de săptămâni",
"%d weeks (4th plural)",
"%d weeks (5th plural)"
],
"%d months": [
"%d lună",
"%d luni",
"%d de luni",
"%d months (3rd plural)",
"%d months (4th plural)",
"%d months (5th plural)"
],
"%d years": [
"%d an",
"%d ani",
"%d de ani",
"%d years (3rd plural)",
"%d years (4th plural)",
"%d years (5th plural)"
],
"Never": "Niciodată",
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Notă: Acesta este un serviciu de test: Datele ar putea fi șterse oricând. Vor muri niște pisicuțe dacă abuzați acest serviciu.",
"This document will expire in %d seconds.": [
"Acest document va expira în %d secundă.",
"Acest document va expira în %d secunde.",
"Acest document va expira în %d de secunde.",
"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.": [
"Acest document va expira în %d oră.",
"Acest document va expira în %d ore.",
"Acest document va expira în %d de ore.",
"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.": [
"Acest document va expira în %d zi.",
"Acest document va expira în %d zile.",
"Acest document va expira în %d de zile.",
"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.": [
"Acest document va expira în %d lună.",
"Acest document va expira în %d luni.",
"Acest document va expira în %d de luni.",
"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:": "Va rugăm să introduceți parola pentru acest paste:",
"Could not decrypt data (Wrong key?)": "Nu s-au putut decripta datele (Cheie gresită?)",
"Could not delete the paste, it was not stored in burn after reading mode.": "Nu s-a putut șterge paste-ul, nu a fost stocat în modul de ștergere după citire.",
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "NUMAI PENTRU OCHII DVS. Nu închideți această fereastră, acest mesaj nu poate fi afișat din nou.",
"Could not decrypt comment; Wrong key?": "Nu s-a putut decripta comentariul; Cheie greșită?",
"Reply": "Răspundeți",
"Anonymous": "Anonim",
"Avatar generated from IP address": "Avatar generat din adresa IP",
"Add comment": "Adăugați un comentariu",
"Optional nickname…": "Poreclă opțională…",
"Post comment": "Postați comentariul",
"Sending comment…": "Se trimite comentariul…",
"Comment posted.": "Comentariul a fost postat.",
"Could not refresh display: %s": "Nu s-a putut actualiza afișarea: %s",
"unknown status": "stare necunoscută",
"server error or not responding": "eroare de server sau nu răspunde",
"Could not post comment: %s": "Nu s-a putut posta comentariul: %s",
"Sending paste…": "Se trimite paste-ul…",
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>": "Paste-ul dvs. este <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Apăsați [Ctrl]+[c] pentru a copia)</span>",
"Delete data": "Ștergeți datele",
"Could not create paste: %s": "Nu s-a putut crea paste-ul: %s",
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nu s-a putut decripta paste-ul: Cheia de decriptare lipsește din URL (Ați folosit un redirector sau un scurtător de URL care a tăiat o parte din URL?)",
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB",
"PiB": "PiB",
"EiB": "EiB",
"ZiB": "ZiB",
"YiB": "YiB",
"Format": "Formatare",
"Plain Text": "Text neformatat",
"Source Code": "Cod sursă",
"Markdown": "Markdown",
"Download attachment": "Descărcați fișierul atașat",
"Cloned: '%s'": "S-a clonat: '%s'",
"The cloned file '%s' was attached to this paste.": "Fișierul clonat '%s' a fost atașat la acest paste.",
"Attach a file": "Atașați un fișier",
"alternatively drag & drop a file or paste an image from the clipboard": "alternativ, trageți și plasați un fișier sau lipiți o imagine din clipboard",
"File too large, to display a preview. Please download the attachment.": "Fișierul este prea mare pentru a afișa o previzualizare. Vă rugăm să descărcaţi fișierul.",
"Remove attachment": "Eliminați fișierul atașat",
"Your browser does not support uploading encrypted files. Please use a newer browser.": "Browserul dvs. nu acceptă încărcarea fișierelor criptate. Vă rugăm să folosiți un browser mai nou.",
"Invalid attachment.": "Fișier invalid.",
"Options": "Opţiuni",
"Shorten URL": "Scurtați URL-ul",
"Editor": "Editor",
"Preview": "Previzualizare",
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s necesită ca PATH să se termine cu \"%s\". Vă rugăm să actualizați PATH în index.php.",
"Decrypt": "Decriptare",
"Enter password": "Introduceţi parola",
"Loading…": "Se încarcă…",
"Decrypting paste…": "Se decriptează paste-ul…",
"Preparing new paste…": "Se pregătește un paste nou…",
"In case this message never disappears please have a look at <a href=\"%s\">this FAQ for information to troubleshoot</a>.": "În cazul în care acest mesaj nu dispare niciodată, vă rugăm să aruncaţi o privire la <a href=\"%s\">acest FAQ pentru informații de depanare</a>.",
"+++ no paste text +++": "+++ fără text +++",
"Could not get paste data: %s": "Nu s-a putut obține datele paste-ului: %s",
"QR code": "Cod QR",
"This website is using an insecure HTTP connection! Please use it only for testing.": "Acest website folosește o conexiune HTTP nesigură! Vă rugăm să îl folosiți doar pentru teste.",
"For more information <a href=\"%s\">see this FAQ entry</a>.": "Pentru mai multe informații <a href=\"%s\">a se vedea secțiunea FAQ</a>.",
"Your browser may require an HTTPS connection to support the WebCrypto API. Try <a href=\"%s\">switching to HTTPS</a>.": "Este posibil ca browserul dvs. să necesite o conexiune HTTPS pentru a suporta API-ul WebCrypto. Încercați să <a href=\"%s\">comutați la HTTPS</a>.",
"Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Browserul dvs. nu acceptă WebAssembly folosit pentru compresia zlib. Puteți crea documente necompresate, dar nu le puteți citi pe cele compresate.",
"waiting on user to provide a password": "se așteaptă ca utilizatorul să furnizeze o parolă",
"Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Nu s-au putut decripta datele. Ați introdus parola greșită? Reîncercați folosind butonul de sus.",
"Retry": "Reîncercați",
"Showing raw text…": "Se afișează textul brut…",
"Notice:": "Observaţie:",
"This link will expire after %s.": "Acest link va expira după %s.",
"This link can only be accessed once, do not use back or refresh button in your browser.": "Acest link poate fi accesat o singură dată, nu folosiți butonul înapoi sau reîmprospătare din browserul dvs.",
"Link:": "Link:",
"Recipient may become aware of your timezone, convert time to UTC?": "Destinatarul vă poate afla fusul dvs. orar, convertiți timpul în UTC?",
"Use Current Timezone": "Se folosește fusul orar actual",
"Convert To UTC": "Convertire la UTC",
"Close": "Închideți",
"Encrypted note on %s": "Notă criptată pe %s",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Accesați acest link pentru a vedea nota. Nota poate fi accesată de către oricine care are acest URL.",
"URL shortener may expose your decrypt key in URL.": "Scurtătorul de URL ar putea să vă expună cheia de decriptare din URL.",
"Save paste": "Salvați paste-ul",
"Your IP is not authorized to create pastes.": "Adresa dvs. IP nu este autorizată să creeze paste-uri.",
"Trying to shorten a URL that isn't pointing at our instance.": "Încercarea de a scurta un URL care nu direcționează spre instanța noastră.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Eroare la apelarea YOURLS. Probabil o problemă de configurare, cum ar fi \"apiurl\" sau \"signature\" greșite sau lipsă.",
"Error parsing YOURLS response.": "Eroare la analizarea răspunsului YOURLS.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
}

View File

@ -3,7 +3,6 @@
"%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>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Подробнее можно узнать на <a href=\"https://privatebin.info/\">сайте проекта</a>.",
"Because ignorance is bliss": "Потому что неведение - благо", "Because ignorance is bliss": "Потому что неведение - благо",
"en": "ru",
"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 требуется php %s или выше. Извините.", "%s requires php %s or above to work. Sorry.": "Для работы %s требуется php %s или выше. Извините.",
"%s requires configuration section [%s] to be present in configuration file.": "%s необходимо наличие секции [%s] в конфигурационном файле.", "%s requires configuration section [%s] to be present in configuration file.": "%s необходимо наличие секции [%s] в конфигурационном файле.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Вашему IP адресу не разрешено создавать записи.", "Your IP is not authorized to create pastes.": "Вашему IP адресу не разрешено создавать записи.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 online pastebin, kde server nemá žiadne znalosti o vložených údajoch. Údaje sú šifrované/dešifrované %sv prehliadači%s pomocou 256-bitového 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 je minimalistický, open source online pastebin, kde server nemá žiadne znalosti o vložených údajoch. Údaje sú šifrované/dešifrované %sv prehliadači%s pomocou 256-bitového AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Viac informácií na <a href=\"https://privatebin.info/\">stránke projektu</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Viac informácií na <a href=\"https://privatebin.info/\">stránke projektu</a>.",
"Because ignorance is bliss": "Pretože nevedomosť je sladká", "Because ignorance is bliss": "Pretože nevedomosť je sladká",
"en": "sk",
"Paste does not exist, has expired or has been deleted.": "Vložený text neexistuje, jeho platnosť vypršala alebo bol vymazaný.", "Paste does not exist, has expired or has been deleted.": "Vložený text neexistuje, jeho platnosť vypršala alebo bol vymazaný.",
"%s requires php %s or above to work. Sorry.": "%s vyžaduje php %s alebo vyššie. Prepáčte.", "%s requires php %s or above to work. Sorry.": "%s vyžaduje php %s alebo vyššie. Prepáčte.",
"%s requires configuration section [%s] to be present in configuration file.": "%s vyžaduje, aby bola v konfiguračnom súbore prítomná sekcia [%s].", "%s requires configuration section [%s] to be present in configuration file.": "%s vyžaduje, aby bola v konfiguračnom súbore prítomná sekcia [%s].",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Vaša IP adresa nie je oprávnená vytvárať príspevky.", "Your IP is not authorized to create pastes.": "Vaša IP adresa nie je oprávnená vytvárať príspevky.",
"Trying to shorten a URL that isn't pointing at our instance.": "Pokúšate sa skrátiť adresu URL, ktorá neukazuje na túto inštanciu.", "Trying to shorten a URL that isn't pointing at our instance.": "Pokúšate sa skrátiť adresu URL, ktorá neukazuje na túto inštanciu.",
"Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".", "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 minimalističen, odprtokodni spletni 'pastebin', kjer server ne ve ničesar o prilepljenih podatkih. Podatki so zakodirani/odkodirani %sv brskalniku%s z uporabo 256 bitnega 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 je minimalističen, odprtokodni spletni 'pastebin', kjer server ne ve ničesar o prilepljenih podatkih. Podatki so zakodirani/odkodirani %sv brskalniku%s z uporabo 256 bitnega AES.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Več informacij na <a href=\"https://privatebin.info/\">spletni strani projekta.</a>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Več informacij na <a href=\"https://privatebin.info/\">spletni strani projekta.</a>.",
"Because ignorance is bliss": "Ker kar ne veš ne boli.", "Because ignorance is bliss": "Ker kar ne veš ne boli.",
"en": "sl",
"Paste does not exist, has expired or has been deleted.": "Prilepek ne obstaja, mu je potekla življenjska doba, ali pa je izbrisan.", "Paste does not exist, has expired or has been deleted.": "Prilepek ne obstaja, mu je potekla življenjska doba, ali pa je izbrisan.",
"%s requires php %s or above to work. Sorry.": "Oprosti, %s za delovanje potrebuje vsaj php %s.", "%s requires php %s or above to work. Sorry.": "Oprosti, %s za delovanje potrebuje vsaj php %s.",
"%s requires configuration section [%s] to be present in configuration file.": "%s potrebuje sekcijo konfiguracij [%s] v konfiguracijski datoteki.", "%s requires configuration section [%s] to be present in configuration file.": "%s potrebuje sekcijo konfiguracij [%s] v konfiguracijski datoteki.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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.", "%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>.", "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", "Because ignorance is bliss": "Because ignorance is bliss",
"en": "sv",
"Paste does not exist, has expired or has been deleted.": "Paste does not exist, has expired or has been deleted.", "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 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.", "%s requires configuration section [%s] to be present in configuration file.": "%s requires configuration section [%s] to be present in configuration file.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Your IP is not authorized to create pastes.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 เป็น pastebin ออนไลน์แบบโอเพ่นซอร์สที่มีรูปแบบการใช้งานที่เรียบง่าย เซิร์ฟเวอร์ไม่สามารถรู้ได้ว่าข้อมูลโค้ดที่มาฝากนั้นเป็นข้อมูลอะไร โดยจะถูกเข้ารหัส/ถอดรหัสด้วยกระบวนการ AES จำนวน 256 บิต%sผ่านเบราว์เซอร์%s", "%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 เป็น pastebin ออนไลน์แบบโอเพ่นซอร์สที่มีรูปแบบการใช้งานที่เรียบง่าย เซิร์ฟเวอร์ไม่สามารถรู้ได้ว่าข้อมูลโค้ดที่มาฝากนั้นเป็นข้อมูลอะไร โดยจะถูกเข้ารหัส/ถอดรหัสด้วยกระบวนการ AES จำนวน 256 บิต%sผ่านเบราว์เซอร์%s",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "ข้อมูลเพิ่มเติม ดูได้ที่<a href=\"https://privatebin.info/\">หน้าโครงการ</a>", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "ข้อมูลเพิ่มเติม ดูได้ที่<a href=\"https://privatebin.info/\">หน้าโครงการ</a>",
"Because ignorance is bliss": "ไม่รู้ไม่ชี้ดีที่สุด", "Because ignorance is bliss": "ไม่รู้ไม่ชี้ดีที่สุด",
"en": "th",
"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 ต้องใช้ PHP %s ขึ้นไปจึงจะใช้งานได้", "%s requires php %s or above to work. Sorry.": "ขออภัย %s ต้องใช้ PHP %s ขึ้นไปจึงจะใช้งานได้",
"%s requires configuration section [%s] to be present in configuration file.": "%s จำเป็นต้องตั้งค่าตัวแปร [%s] ในไฟล์กำหนดค่า", "%s requires configuration section [%s] to be present in configuration file.": "%s จำเป็นต้องตั้งค่าตัวแปร [%s] ในไฟล์กำหนดค่า",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "IP ของคุณไม่ได้รับอนุญาตให้สร้างการฝากโค้ด", "Your IP is not authorized to create pastes.": "IP ของคุณไม่ได้รับอนุญาตให้สร้างการฝากโค้ด",
"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\".": "เกิดข้อผิดพลาดในการเรียก 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" "Error parsing YOURLS response.": "เกิดข้อผิดพลาดในการแยกวิเคราะห์การตอบสนองของ YOURLS",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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 sunucunun burada paylaştığınız veriyi görmediği, minimal, açık kaynak bir pastebindir. Veriler tarayıcıda 256 bit AES kullanılarak şifrelenir/çözülür.", "%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 sunucunun burada paylaştığınız veriyi görmediği, minimal, açık kaynak bir pastebindir. Veriler tarayıcıda 256 bit AES kullanılarak şifrelenir/çözülür.",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Daha fazla bilgi için <a href=\"https://privatebin.info/\">proje sayfası</a>'na göz atabilirsiniz.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Daha fazla bilgi için <a href=\"https://privatebin.info/\">proje sayfası</a>'na göz atabilirsiniz.",
"Because ignorance is bliss": "Çünkü, cehalet mutluluktur", "Because ignorance is bliss": "Çünkü, cehalet mutluluktur",
"en": "tr",
"Paste does not exist, has expired or has been deleted.": "Paste does not exist, has expired or has been deleted.", "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 PHP %s veya daha üstünü gerektirir.", "%s requires php %s or above to work. Sorry.": "%s PHP %s veya daha üstünü gerektirir.",
"%s requires configuration section [%s] to be present in configuration file.": "%s konfigürasyon bölümünün [%s] bulunmasını gerektir.", "%s requires configuration section [%s] to be present in configuration file.": "%s konfigürasyon bölümünün [%s] bulunmasını gerektir.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "IP adresinizin yazı oluşturmaya yetkisi yoktur.", "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.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -3,7 +3,6 @@
"%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>.", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "Подробиці можна дізнатися на <a href=\"https://privatebin.info/\">сайті проєкту</a>.",
"Because ignorance is bliss": "Бо незнання - благо", "Because ignorance is bliss": "Бо незнання - благо",
"en": "uk",
"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 потрібен php %s и вище. Вибачте.", "%s requires php %s or above to work. Sorry.": "Для роботи %s потрібен php %s и вище. Вибачте.",
"%s requires configuration section [%s] to be present in configuration file.": "%s потрібна секція [%s] в конфігураційному файлі.", "%s requires configuration section [%s] to be present in configuration file.": "%s потрібна секція [%s] в конфігураційному файлі.",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "Вашому IP не дозволено створювати вставки.", "Your IP is not authorized to create pastes.": "Вашому IP не дозволено створювати вставки.",
"Trying to shorten a URL that isn't pointing at our instance.": "Trying to shorten a URL that isn't pointing at our instance.", "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 calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".",
"Error parsing YOURLS response.": "Error parsing YOURLS response." "Error parsing YOURLS response.": "Error parsing YOURLS response.",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

@ -2,8 +2,7 @@
"PrivateBin": "PrivateBin", "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在浏览器内%s进行 AES-256 加密和解密。", "%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进行 AES-256 加密和解密。",
"More information on the <a href=\"https://privatebin.info/\">project page</a>.": "更多信息请查看<a href=\"https://privatebin.info/\">项目主页</a>。", "More information on the <a href=\"https://privatebin.info/\">project page</a>.": "更多信息请查看<a href=\"https://privatebin.info/\">项目主页</a>。",
"Because ignorance is bliss": "因为无知是福", "Because ignorance is bliss": "以不知为幸",
"en": "zh",
"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 需要 PHP %s 及以上版本才能运行。", "%s requires php %s or above to work. Sorry.": "抱歉,%s 需要 PHP %s 及以上版本才能运行。",
"%s requires configuration section [%s] to be present in configuration file.": "%s 需要设置配置文件中的 [%s] 部分。", "%s requires configuration section [%s] to be present in configuration file.": "%s 需要设置配置文件中的 [%s] 部分。",
@ -215,5 +214,7 @@
"Your IP is not authorized to create pastes.": "您的 IP 无权创建粘贴。", "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”或“signature”错误或缺失。", "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "调用 YOURLS 时出错。可能是配置问题例如“apiurl”或“signature”错误或缺失。",
"Error parsing YOURLS response.": "解析 YOURLS 响应时出错。" "Error parsing YOURLS response.": "解析 YOURLS 响应时出错。",
"Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?": "Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?",
"Yes, load it": "Yes, load it"
} }

View File

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

View File

@ -12,12 +12,12 @@ global.WebCrypto = require('@peculiar/webcrypto').Crypto;
// application libraries to test // application libraries to test
global.$ = global.jQuery = require('./jquery-3.7.0'); global.$ = global.jQuery = require('./jquery-3.7.0');
global.RawDeflate = require('./rawinflate-0.3').RawDeflate; global.RawDeflate = require('./rawinflate-0.3').RawDeflate;
global.zlib = require('./zlib-1.2.13').zlib; global.zlib = require('./zlib-1.3.1').zlib;
require('./prettify'); require('./prettify');
global.prettyPrint = window.PR.prettyPrint; global.prettyPrint = window.PR.prettyPrint;
global.prettyPrintOne = window.PR.prettyPrintOne; global.prettyPrintOne = window.PR.prettyPrintOne;
global.showdown = require('./showdown-2.1.0'); global.showdown = require('./showdown-2.1.0');
global.DOMPurify = require('./purify-3.0.4'); global.DOMPurify = require('./purify-3.0.8');
global.baseX = require('./base-x-4.0.0').baseX; global.baseX = require('./base-x-4.0.0').baseX;
global.Legacy = require('./legacy').Legacy; global.Legacy = require('./legacy').Legacy;
require('./bootstrap-3.4.1'); require('./bootstrap-3.4.1');
@ -37,7 +37,7 @@ var a2zString = ['a','b','c','d','e','f','g','h','i','j','k','l','m',
}) })
), ),
schemas = ['ftp','http','https'], schemas = ['ftp','http','https'],
supportedLanguages = ['de', 'es', 'fr', 'it', 'no', 'pl', 'pt', 'oc', 'ru', 'sl', 'zh'], supportedLanguages = ['ar', 'bg', 'ca', 'co', 'cs', 'de', 'el', 'es', 'et', 'fi', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'jbo', 'lt', 'no', 'nl', 'pl', 'pt', 'oc', 'ru', 'sk', 'sl', 'th', 'tr', 'uk', 'zh'],
mimeTypes = ['image/png', 'application/octet-stream'], mimeTypes = ['image/png', 'application/octet-stream'],
formats = ['plaintext', 'markdown', 'syntaxhighlighting'], formats = ['plaintext', 'markdown', 'syntaxhighlighting'],
mimeFile = fs.createReadStream('/etc/mime.types'), mimeFile = fs.createReadStream('/etc/mime.types'),
@ -113,8 +113,8 @@ exports.jscBase64String = function() {
}; };
// provides a random URL schema supported by the whatwg-url library // provides a random URL schema supported by the whatwg-url library
exports.jscSchemas = function() { exports.jscSchemas = function(withFtp = true) {
return jsc.elements(schemas); return jsc.elements(withFtp ? schemas : schemas.slice(1));
}; };
// provides a random supported language string // provides a random supported language string
@ -131,3 +131,24 @@ exports.jscMimeTypes = function() {
exports.jscFormats = function() { exports.jscFormats = function() {
return jsc.elements(formats); return jsc.elements(formats);
}; };
// provides random URLs
exports.jscUrl = function(withFragment = true, withQuery = true) {
let url = {
schema: exports.jscSchemas(),
address: jsc.nearray(exports.jscA2zString()),
};
if (withFragment) {
url.fragment = jsc.string;
}
if(withQuery) {
url.query = jsc.array(exports.jscQueryString());
}
return jsc.record(url);
};
exports.urlToString = function (url) {
return url.schema + '://' + url.address.join('') + '/' + (url.query ? '?' +
encodeURI(url.query.join('').replace(/^&+|&+$/gm,'')) : '') +
(url.fragment ? '#' + encodeURI(url.fragment) : '');
};

4
js/package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "privatebin", "name": "privatebin",
"version": "1.5.2", "version": "1.6.2",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "privatebin", "name": "privatebin",
"version": "1.5.2", "version": "1.6.2",
"license": "zlib-acknowledgement", "license": "zlib-acknowledgement",
"devDependencies": { "devDependencies": {
"@peculiar/webcrypto": "^1.1.1", "@peculiar/webcrypto": "^1.1.1",

View File

@ -1,6 +1,6 @@
{ {
"name": "privatebin", "name": "privatebin",
"version": "1.6.0", "version": "1.7.1",
"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).", "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", "main": "privatebin.js",
"directories": { "directories": {

View File

@ -6,7 +6,7 @@
* @see {@link https://github.com/PrivateBin/PrivateBin} * @see {@link https://github.com/PrivateBin/PrivateBin}
* @copyright 2012 Sébastien SAUVAGE ({@link http://sebsauvage.net}) * @copyright 2012 Sébastien SAUVAGE ({@link http://sebsauvage.net})
* @license {@link https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License} * @license {@link https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License}
* @version 1.6.0 * @version 1.7.1
* @name PrivateBin * @name PrivateBin
* @namespace * @namespace
*/ */
@ -77,10 +77,17 @@ jQuery.PrivateBin = (function($, RawDeflate) {
} }
}; };
/**
* URL fragment prefix requiring load confirmation
*
* @private
*/
const loadConfirmPrefix = '#-';
/** /**
* CryptoData class * CryptoData class
* *
* bundles helper fuctions used in both paste and comment formats * bundles helper functions used in both paste and comment formats
* *
* @name CryptoData * @name CryptoData
* @class * @class
@ -95,7 +102,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
/** /**
* gets the cipher data (cipher text + adata) * gets the cipher data (cipher text + adata)
* *
* @name Paste.getCipherData * @name CryptoData.getCipherData
* @function * @function
* @return {Array}|{string} * @return {Array}|{string}
*/ */
@ -108,7 +115,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
/** /**
* Paste class * Paste class
* *
* bundles helper fuctions around the paste formats * bundles helper functions around the paste formats
* *
* @name Paste * @name Paste
* @class * @class
@ -171,7 +178,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
/** /**
* Comment class * Comment class
* *
* bundles helper fuctions around the comment formats * bundles helper functions around the comment formats
* *
* @name Comment * @name Comment
* @class * @class
@ -183,7 +190,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
/** /**
* gets the UNIX timestamp of the comment creation * gets the UNIX timestamp of the comment creation
* *
* @name Paste.getCreated * @name Comment.getCreated
* @function * @function
* @return {int} * @return {int}
*/ */
@ -195,7 +202,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
/** /**
* gets the icon of the comment submitter * gets the icon of the comment submitter
* *
* @name Paste.getIcon * @name Comment.getIcon
* @function * @function
* @return {string} * @return {string}
*/ */
@ -228,7 +235,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
'<': '&lt;', '<': '&lt;',
'>': '&gt;', '>': '&gt;',
'"': '&quot;', '"': '&quot;',
"'": '&#39;', '\'': '&#39;',
'/': '&#x2F;', '/': '&#x2F;',
'`': '&#x60;', '`': '&#x60;',
'=': '&#x3D;' '=': '&#x3D;'
@ -627,7 +634,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
* @prop {string[]} * @prop {string[]}
* @readonly * @readonly
*/ */
const supportedLanguages = ['ar', 'bg', 'ca', 'co', 'cs', 'de', 'el', 'es', 'et', 'fi', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'jbo', 'lt', 'no', 'nl', 'pl', 'pt', 'oc', 'ru', 'sk', 'sl', 'th', 'tr', 'uk', 'zh']; const supportedLanguages = ['ar', 'bg', 'ca', 'co', 'cs', 'de', 'el', 'es', 'et', 'fi', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'jbo', 'lt', 'no', 'nl', 'pl', 'pt', 'oc', 'ro', 'ru', 'sk', 'sl', 'th', 'tr', 'uk', 'zh'];
/** /**
* built in language * built in language
@ -790,6 +797,18 @@ jQuery.PrivateBin = (function($, RawDeflate) {
return output; return output;
}; };
/**
* get currently loaded language
*
* @name I18n.getLanguage
* @function
* @return {string}
*/
me.getLanguage = function()
{
return language;
};
/** /**
* per language functions to use to determine the plural form * per language functions to use to determine the plural form
* *
@ -824,6 +843,8 @@ jQuery.PrivateBin = (function($, RawDeflate) {
return n % 10 === 1 && n % 100 !== 11 ? 0 : ((n % 10 >= 2 && n % 100 < 10 || n % 100 >= 20) ? 1 : 2); return n % 10 === 1 && n % 100 !== 11 ? 0 : ((n % 10 >= 2 && n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
case 'pl': case 'pl':
return n === 1 ? 0 : (n % 10 >= 2 && n %10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2); return n === 1 ? 0 : (n % 10 >= 2 && n %10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
case 'ro':
return n === 1 ? 0 : ((n === 0 || (n % 100 > 0 && n % 100 < 20)) ? 1 : 2);
case 'ru': case 'ru':
case 'uk': case 'uk':
return n % 10 === 1 && n % 100 !== 11 ? 0 : (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2); return n % 10 === 1 && n % 100 !== 11 ? 0 : (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
@ -847,7 +868,10 @@ jQuery.PrivateBin = (function($, RawDeflate) {
// auto-select language based on browser settings // auto-select language based on browser settings
if (newLanguage.length === 0) { if (newLanguage.length === 0) {
newLanguage = (navigator.language || navigator.userLanguage || 'en').substring(0, 2); newLanguage = (navigator.language || navigator.userLanguage || 'en');
if (newLanguage.indexOf('-') > 0) {
newLanguage = newLanguage.split('-')[0];
}
} }
// if language is already used skip update // if language is already used skip update
@ -1497,10 +1521,11 @@ jQuery.PrivateBin = (function($, RawDeflate) {
me.getPasteKey = function() me.getPasteKey = function()
{ {
if (symmetricKey === null) { if (symmetricKey === null) {
let newKey = window.location.hash.substring(1); let startPos = 1;
if (newKey === '') { if(window.location.hash.startsWith(loadConfirmPrefix)) {
throw 'no encryption key given'; startPos = loadConfirmPrefix.length;
} }
let newKey = window.location.hash.substring(startPos);
// Some web 2.0 services and redirectors add data AFTER the anchor // Some web 2.0 services and redirectors add data AFTER the anchor
// (such as &utm_source=...). We will strip any additional data. // (such as &utm_source=...). We will strip any additional data.
@ -1509,6 +1534,9 @@ jQuery.PrivateBin = (function($, RawDeflate) {
{ {
newKey = newKey.substring(0, ampersandPos); newKey = newKey.substring(0, ampersandPos);
} }
if (newKey === '') {
throw 'no encryption key given';
}
// version 2 uses base58, version 1 uses base64 without decoding // version 2 uses base58, version 1 uses base64 without decoding
try { try {
@ -2020,29 +2048,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
xhrFields: { xhrFields: {
withCredentials: false withCredentials: false
}, },
success: function(response) { success: PasteStatus.extractUrl
let responseString = response;
if (typeof responseString === 'object') {
responseString = JSON.stringify(responseString);
}
if (typeof responseString === 'string' && responseString.length > 0) {
const shortUrlMatcher = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g;
const shortUrl = (responseString.match(shortUrlMatcher) || []).sort(function(a, b) {
return a.length - b.length;
})[0];
if (typeof shortUrl === 'string' && shortUrl.length > 0) {
// we disable the button to avoid calling shortener again
$shortenButton.addClass('buttondisabled');
// update link
$pasteUrl.text(shortUrl);
$pasteUrl.prop('href', shortUrl);
// we pre-select the link so that the user only has to [Ctrl]+[c] the link
Helper.selectText($pasteUrl[0]);
return;
}
}
Alert.showError('Cannot parse response from URL shortener.');
}
}) })
.fail(function(data, textStatus, errorThrown) { .fail(function(data, textStatus, errorThrown) {
console.error(textStatus, errorThrown); console.error(textStatus, errorThrown);
@ -2108,6 +2114,50 @@ jQuery.PrivateBin = (function($, RawDeflate) {
Helper.selectText($pasteUrl[0]); Helper.selectText($pasteUrl[0]);
}; };
/**
* extracts URLs from given string
*
* if at least one is found, it disables the shortener button and
* replaces the paste URL
*
* @name PasteStatus.extractUrl
* @function
* @param {string} response
*/
me.extractUrl = function(response)
{
if (typeof response === 'object') {
response = JSON.stringify(response);
}
if (typeof response === 'string' && response.length > 0) {
const shortUrlMatcher = /https?:\/\/[^\s"<]+/g; // JSON API will have URL in quotes, XML in tags
const shortUrl = (response.match(shortUrlMatcher) || []).filter(function(urlRegExMatch) {
if (typeof URL.canParse === 'function') {
return URL.canParse(urlRegExMatch);
}
// polyfill for older browsers (< 120) & node (< 19.9 & < 18.17)
try {
return !!new URL(urlRegExMatch);
} catch (error) {
return false;
}
}).sort(function(a, b) {
return a.length - b.length; // shortest first
})[0];
if (typeof shortUrl === 'string' && shortUrl.length > 0) {
// we disable the button to avoid calling shortener again
$shortenButton.addClass('buttondisabled');
// update link
$pasteUrl.text(shortUrl);
$pasteUrl.prop('href', shortUrl);
// we pre-select the link so that the user only has to [Ctrl]+[c] the link
Helper.selectText($pasteUrl[0]);
return;
}
}
Alert.showError('Cannot parse response from URL shortener.');
};
/** /**
* shows the remaining time * shows the remaining time
* *
@ -2213,6 +2263,34 @@ jQuery.PrivateBin = (function($, RawDeflate) {
PasteDecrypter.run(); PasteDecrypter.run();
} }
/**
* Request users confirmation to load possibly burn after reading paste
*
* @name Prompt.requestLoadConfirmation
* @function
*/
me.requestLoadConfirmation = function()
{
const $loadconfirmmodal = $('#loadconfirmmodal');
if ($loadconfirmmodal.length > 0) {
const $loadconfirmOpenNow = $loadconfirmmodal.find('#loadconfirm-open-now');
$loadconfirmOpenNow.off('click.loadPaste');
$loadconfirmOpenNow.on('click.loadPaste', PasteDecrypter.run);
const $loadconfirmClose = $loadconfirmmodal.find('.close');
$loadconfirmClose.off('click.close');
$loadconfirmClose.on('click.close', Controller.newPaste);
$loadconfirmmodal.modal('show');
} else {
if (window.confirm(
I18n._('Burn after reading pastes can only be displayed once upon loading it. Do you want to open it now?')
)) {
PasteDecrypter.run();
} else {
Controller.newPaste();
}
}
}
/** /**
* ask the user for the password and set it * ask the user for the password and set it
* *
@ -2227,6 +2305,12 @@ jQuery.PrivateBin = (function($, RawDeflate) {
backdrop: 'static', backdrop: 'static',
keyboard: false keyboard: false
}); });
// focus password input
$passwordDecrypt.focus();
// then re-focus it, when modal causes it to loose focus again
setTimeout(function () {
$passwordDecrypt.focus();
}, 500);
return; return;
} }
@ -2286,13 +2370,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
$passwordForm = $('#passwordform'); $passwordForm = $('#passwordform');
$passwordModal = $('#passwordmodal'); $passwordModal = $('#passwordmodal');
// bind events // bind events - handle Model password submission
// focus password input when it is shown
$passwordModal.on('shown.bs.Model', function () {
$passwordDecrypt.focus();
});
// handle Model password submission
$passwordForm.submit(submitPasswordModal); $passwordForm.submit(submitPasswordModal);
}; };
@ -3526,7 +3604,6 @@ jQuery.PrivateBin = (function($, RawDeflate) {
if (fadeOut === true) { if (fadeOut === true) {
setTimeout(function () { setTimeout(function () {
$comment.removeClass('highlight'); $comment.removeClass('highlight');
}, 300); }, 300);
} }
}; };
@ -3774,6 +3851,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
{ {
document.cookie = 'lang=' + $(event.target).data('lang') + ';secure'; document.cookie = 'lang=' + $(event.target).data('lang') + ';secure';
UiHelper.reloadHome(); UiHelper.reloadHome();
event.preventDefault();
} }
/** /**
@ -3929,10 +4007,6 @@ jQuery.PrivateBin = (function($, RawDeflate) {
const $emailconfirmmodal = $('#emailconfirmmodal'); const $emailconfirmmodal = $('#emailconfirmmodal');
if ($emailconfirmmodal.length > 0) { if ($emailconfirmmodal.length > 0) {
if (expirationDate !== null) { if (expirationDate !== null) {
I18n._(
$emailconfirmmodal.find('#emailconfirm-display'),
'Recipient may become aware of your timezone, convert time to UTC?'
);
const $emailconfirmTimezoneCurrent = $emailconfirmmodal.find('#emailconfirm-timezone-current'); const $emailconfirmTimezoneCurrent = $emailconfirmmodal.find('#emailconfirm-timezone-current');
const $emailconfirmTimezoneUtc = $emailconfirmmodal.find('#emailconfirm-timezone-utc'); const $emailconfirmTimezoneUtc = $emailconfirmmodal.find('#emailconfirm-timezone-utc');
$emailconfirmTimezoneCurrent.off('click.sendEmailCurrentTimezone'); $emailconfirmTimezoneCurrent.off('click.sendEmailCurrentTimezone');
@ -4787,7 +4861,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
// show notification // show notification
const baseUri = Helper.baseUri() + '?', const baseUri = Helper.baseUri() + '?',
url = baseUri + data.id + '#' + CryptTool.base58encode(data.encryptionKey), url = baseUri + data.id + (TopNav.getBurnAfterReading() ? loadConfirmPrefix : '#') + CryptTool.base58encode(data.encryptionKey),
deleteUrl = baseUri + 'pasteid=' + data.id + '&deletetoken=' + data.deletetoken; deleteUrl = baseUri + 'pasteid=' + data.id + '&deletetoken=' + data.deletetoken;
PasteStatus.createPasteNotification(url, deleteUrl); PasteStatus.createPasteNotification(url, deleteUrl);
@ -5206,7 +5280,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
Alert.hideMessages(); Alert.hideMessages();
Alert.showLoading('Decrypting paste…', 'cloud-download'); Alert.showLoading('Decrypting paste…', 'cloud-download');
if (typeof paste === 'undefined') { if (typeof paste === 'undefined' || paste.type === 'click') {
// get cipher data and wait until it is available // get cipher data and wait until it is available
Model.getPasteData(me.run); Model.getPasteData(me.run);
return; return;
@ -5313,7 +5387,10 @@ jQuery.PrivateBin = (function($, RawDeflate) {
AttachmentViewer.removeAttachmentData(); AttachmentViewer.removeAttachmentData();
Alert.hideLoading(); Alert.hideLoading();
history.pushState({type: 'create'}, document.title, Helper.baseUri()); // only push new state if we are coming from a different one
if (Helper.baseUri() != window.location) {
history.pushState({type: 'create'}, document.title, Helper.baseUri());
}
// clear discussion // clear discussion
DiscussionViewer.prepareNewDiscussion(); DiscussionViewer.prepareNewDiscussion();
@ -5339,6 +5416,12 @@ jQuery.PrivateBin = (function($, RawDeflate) {
} }
} }
// check if we should request loading confirmation
if(window.location.hash.startsWith(loadConfirmPrefix)) {
Prompt.requestLoadConfirmation();
return;
}
// show proper elements on screen // show proper elements on screen
PasteDecrypter.run(); PasteDecrypter.run();
}; };

File diff suppressed because one or more lines are too long

2
js/purify-3.0.8.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -96,36 +96,34 @@ describe('Helper', function () {
jsc.property( jsc.property(
'replaces URLs with anchors', 'replaces URLs with anchors',
'string', 'string',
jsc.elements(['http', 'https', 'ftp']), common.jscUrl(),
jsc.nearray(common.jscA2zString()),
jsc.array(common.jscQueryString()),
jsc.array(common.jscHashString()), jsc.array(common.jscHashString()),
'string', 'string',
function (prefix, schema, address, query, fragment, postfix) { function (prefix, url, fragment, postfix) {
query = query.join('');
fragment = fragment.join('');
prefix = prefix.replace(/\r|\f/g, '\n').replace(/\u0000/g, '').replace(/\u000b/g, ''); prefix = prefix.replace(/\r|\f/g, '\n').replace(/\u0000/g, '').replace(/\u000b/g, '');
postfix = ' ' + postfix.replace(/\r/g, '\n').replace(/\u0000/g, ''); postfix = ' ' + postfix.replace(/\r/g, '\n').replace(/\u0000/g, '');
let url = schema + '://' + address.join('') + '/?' + query + '#' + fragment, url.fragment = fragment.join('');
let urlString = common.urlToString(url),
clean = jsdom(); clean = jsdom();
$('body').html('<div id="foo"></div>'); $('body').html('<div id="foo"></div>');
let e = $('#foo'); let e = $('#foo');
// special cases: When the query string and fragment imply the beginning of an HTML entity, eg. &#0 or &#x // special cases: When the query string and fragment imply the beginning of an HTML entity, eg. &#0 or &#x
if ( if (
query.slice(-1) === '&' && url.query[-1] === '&' &&
(parseInt(fragment.substring(0, 1), 10) >= 0 || fragment.charAt(0) === 'x' ) (parseInt(url.fragment.charAt(0), 10) >= 0 || url.fragment.charAt(0) === 'x')
) ) {
{ url.query.pop();
url = schema + '://' + address.join('') + '/?' + query.substring(0, query.length - 1); urlString = common.urlToString(url);
postfix = ''; postfix = '';
} }
e.text(prefix + url + postfix); e.text(prefix + urlString + postfix);
$.PrivateBin.Helper.urls2links(e); $.PrivateBin.Helper.urls2links(e);
let result = e.html(); let result = e.html();
clean(); clean();
url = $('<div />').text(url).html(); urlString = $('<div />').text(urlString).html();
return $('<div />').text(prefix).html() + '<a href="' + url + '" target="_blank" rel="nofollow noopener noreferrer">' + url + '</a>' + $('<div />').text(postfix).html() === result; const expected = $('<div />').text(prefix).html() + '<a href="' + urlString + '" target="_blank" rel="nofollow noopener noreferrer">' + urlString + '</a>' + $('<div />').text(postfix).html();
return $('<div />').text(prefix).html() + '<a href="' + urlString + '" target="_blank" rel="nofollow noopener noreferrer">' + urlString + '</a>' + $('<div />').text(postfix).html() === result;
} }
); );
jsc.property( jsc.property(
@ -261,16 +259,16 @@ describe('Helper', function () {
this.timeout(30000); this.timeout(30000);
jsc.property( jsc.property(
'returns the URL without query & fragment', 'returns the URL without query & fragment',
jsc.elements(['http', 'https']), common.jscSchemas(false),
jsc.nearray(common.jscA2zString()), common.jscUrl(),
jsc.array(common.jscA2zString()), function (schema, url) {
jsc.array(common.jscQueryString()), url.schema = schema;
'string', const fullUrl = common.urlToString(url);
function (schema, address, path, query, fragment) { delete(url.query);
delete(url.fragment);
$.PrivateBin.Helper.reset(); $.PrivateBin.Helper.reset();
var path = path.join('') + (path.length > 0 ? '/' : ''), const expected = common.urlToString(url),
expected = schema + '://' + address.join('') + '/' + path, clean = jsdom('', {url: fullUrl}),
clean = jsdom('', {url: expected + '?' + query.join('') + '#' + fragment}),
result = $.PrivateBin.Helper.baseUri(); result = $.PrivateBin.Helper.baseUri();
clean(); clean();
return expected === result; return expected === result;

View File

@ -193,10 +193,11 @@ describe('I18n', function () {
// mock // mock
clean = jsdom('', {cookie: ['lang=' + language]}); clean = jsdom('', {cookie: ['lang=' + language]});
$.PrivateBin.I18n.reset(language, require('../../i18n/' + language + '.json')); $.PrivateBin.I18n.reset(language, require('../../i18n/' + language + '.json'));
var result = $.PrivateBin.I18n.translate('en'), var loadedLang = $.PrivateBin.I18n.getLanguage(),
alias = $.PrivateBin.I18n._('en'); result = $.PrivateBin.I18n.translate('Never'),
alias = $.PrivateBin.I18n._('Never');
clean(); clean();
return language === result && language === alias; return language === loadedLang && result === alias;
} }
); );
@ -216,13 +217,12 @@ describe('I18n', function () {
$.PrivateBin.I18n.reset('en'); $.PrivateBin.I18n.reset('en');
$.PrivateBin.I18n.loadTranslations(); $.PrivateBin.I18n.loadTranslations();
var result = $.PrivateBin.I18n.translate('en'), var result = $.PrivateBin.I18n.translate('Never'),
alias = $.PrivateBin.I18n._('en'); alias = $.PrivateBin.I18n._('Never');
clean(); clean();
return 'en' === result && 'en' === alias; return 'Never' === result && 'Never' === alias;
} }
); );
}); });
}); });

View File

@ -80,23 +80,22 @@ describe('Model', function () {
jsc.property( jsc.property(
'returns the query string without separator, if any', 'returns the query string without separator, if any',
jsc.nearray(common.jscA2zString()), common.jscUrl(true, false),
jsc.nearray(common.jscA2zString()),
jsc.tuple(new Array(16).fill(common.jscHexString)), jsc.tuple(new Array(16).fill(common.jscHexString)),
jsc.array(common.jscQueryString()), jsc.array(common.jscQueryString()),
jsc.array(common.jscQueryString()), jsc.array(common.jscQueryString()),
'string', function (url, pasteId, queryStart, queryEnd) {
function (schema, address, pasteId, queryStart, queryEnd, fragment) { if (queryStart.length > 0) {
var pasteIdString = pasteId.join(''), queryStart.push('&');
queryStartString = queryStart.join('') + (queryStart.length > 0 ? '&' : ''), }
queryEndString = (queryEnd.length > 0 ? '&' : '') + queryEnd.join(''), if (queryEnd.length > 0) {
queryString = queryStartString + pasteIdString + queryEndString, queryEnd.unshift('&');
clean = jsdom('', { }
url: schema.join('') + '://' + address.join('') + url.query = queryStart.concat(pasteId, queryEnd);
'/?' + queryString + '#' + fragment const pasteIdString = pasteId.join(''),
}); clean = jsdom('', {url: common.urlToString(url)});
global.URL = require('jsdom-url').URL; global.URL = require('jsdom-url').URL;
var result = $.PrivateBin.Model.getPasteId(); const result = $.PrivateBin.Model.getPasteId();
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
clean(); clean();
return pasteIdString === result; return pasteIdString === result;
@ -104,14 +103,9 @@ describe('Model', function () {
); );
jsc.property( jsc.property(
'throws exception on empty query string', 'throws exception on empty query string',
jsc.nearray(common.jscA2zString()), common.jscUrl(true, false),
jsc.nearray(common.jscA2zString()), function (url) {
'string', let clean = jsdom('', {url: common.urlToString(url)}),
function (schema, address, fragment) {
var clean = jsdom('', {
url: schema.join('') + '://' + address.join('') +
'/#' + fragment
}),
result = false; result = false;
global.URL = require('jsdom-url').URL; global.URL = require('jsdom-url').URL;
try { try {
@ -135,35 +129,24 @@ describe('Model', function () {
jsc.property( jsc.property(
'returns the fragment of a v1 URL', 'returns the fragment of a v1 URL',
jsc.nearray(common.jscA2zString()), common.jscUrl(),
jsc.nearray(common.jscA2zString()), function (url) {
jsc.array(common.jscQueryString()), url.fragment = common.btoa(url.fragment.padStart(32, '\u0000'));
'nestring', const clean = jsdom('', {url: common.urlToString(url)}),
function (schema, address, query, fragment) {
const fragmentString = common.btoa(fragment.padStart(32, '\u0000'));
let clean = jsdom('', {
url: schema.join('') + '://' + address.join('') +
'/?' + query.join('') + '#' + fragmentString
}),
result = $.PrivateBin.Model.getPasteKey(); result = $.PrivateBin.Model.getPasteKey();
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
clean(); clean();
return fragmentString === result; return url.fragment === result;
} }
); );
jsc.property( jsc.property(
'returns the v1 fragment stripped of trailing query parts', 'returns the v1 fragment stripped of trailing query parts',
jsc.nearray(common.jscA2zString()), common.jscUrl(),
jsc.nearray(common.jscA2zString()),
jsc.array(common.jscQueryString()),
'nestring',
jsc.array(common.jscHashString()), jsc.array(common.jscHashString()),
function (schema, address, query, fragment, trail) { function (url, trail) {
const fragmentString = common.btoa(fragment.padStart(32, '\u0000')); const fragmentString = common.btoa(url.fragment.padStart(32, '\u0000'));
let clean = jsdom('', { url.fragment = fragmentString + '&' + trail.join('');
url: schema.join('') + '://' + address.join('') + '/?' + const clean = jsdom('', {url: common.urlToString(url)}),
query.join('') + '#' + fragmentString + '&' + trail.join('')
}),
result = $.PrivateBin.Model.getPasteKey(); result = $.PrivateBin.Model.getPasteKey();
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
clean(); clean();
@ -172,18 +155,12 @@ describe('Model', function () {
); );
jsc.property( jsc.property(
'returns the fragment of a v2 URL', 'returns the fragment of a v2 URL',
jsc.nearray(common.jscA2zString()), common.jscUrl(),
jsc.nearray(common.jscA2zString()), function (url) {
jsc.array(common.jscQueryString()),
'nestring',
function (schema, address, query, fragment) {
// base58 strips leading NULL bytes, so the string is padded with these if not found // base58 strips leading NULL bytes, so the string is padded with these if not found
fragment = fragment.padStart(32, '\u0000'); const fragment = url.fragment.padStart(32, '\u0000');
let fragmentString = $.PrivateBin.CryptTool.base58encode(fragment), url.fragment = $.PrivateBin.CryptTool.base58encode(fragment);
clean = jsdom('', { const clean = jsdom('', {url: common.urlToString(url)}),
url: schema.join('') + '://' + address.join('') +
'/?' + query.join('') + '#' + fragmentString
}),
result = $.PrivateBin.Model.getPasteKey(); result = $.PrivateBin.Model.getPasteKey();
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
clean(); clean();
@ -192,19 +169,13 @@ describe('Model', function () {
); );
jsc.property( jsc.property(
'returns the v2 fragment stripped of trailing query parts', 'returns the v2 fragment stripped of trailing query parts',
jsc.nearray(common.jscA2zString()), common.jscUrl(),
jsc.nearray(common.jscA2zString()),
jsc.array(common.jscQueryString()),
'nestring',
jsc.array(common.jscHashString()), jsc.array(common.jscHashString()),
function (schema, address, query, fragment, trail) { function (url, trail) {
// base58 strips leading NULL bytes, so the string is padded with these if not found // base58 strips leading NULL bytes, so the string is padded with these if not found
fragment = fragment.padStart(32, '\u0000'); const fragment = url.fragment.padStart(32, '\u0000');
let fragmentString = $.PrivateBin.CryptTool.base58encode(fragment), url.fragment = $.PrivateBin.CryptTool.base58encode(fragment) + '&' + trail.join('');
clean = jsdom('', { const clean = jsdom('', {url: common.urlToString(url)}),
url: schema.join('') + '://' + address.join('') + '/?' +
query.join('') + '#' + fragmentString + '&' + trail.join('')
}),
result = $.PrivateBin.Model.getPasteKey(); result = $.PrivateBin.Model.getPasteKey();
$.PrivateBin.Model.reset(); $.PrivateBin.Model.reset();
clean(); clean();
@ -213,14 +184,9 @@ describe('Model', function () {
); );
jsc.property( jsc.property(
'throws exception on empty fragment of the URL', 'throws exception on empty fragment of the URL',
jsc.nearray(common.jscA2zString()), common.jscUrl(false),
jsc.nearray(common.jscA2zString()), function (url) {
jsc.array(common.jscQueryString()), let clean = jsdom('', {url: common.urlToString(url)}),
function (schema, address, query) {
var clean = jsdom('', {
url: schema.join('') + '://' + address.join('') +
'/?' + query.join('')
}),
result = false; result = false;
try { try {
$.PrivateBin.Model.getPasteKey(); $.PrivateBin.Model.getPasteKey();

View File

@ -1,32 +1,39 @@
'use strict'; 'use strict';
var common = require('../common'); var common = require('../common');
function urlStrings(schema, longUrl, shortUrl) {
longUrl.schema = schema;
shortUrl.schema = schema;
let longUrlString = common.urlToString(longUrl),
shortUrlString = common.urlToString(shortUrl);
// ensure the two random URLs actually are sorted as expected
if (longUrlString.length <= shortUrlString.length) {
if (longUrlString.length === shortUrlString.length) {
longUrl.address.unshift('a');
longUrlString = common.urlToString(longUrl);
} else {
[longUrlString, shortUrlString] = [shortUrlString, longUrlString];
}
}
return [longUrlString, shortUrlString];
}
describe('PasteStatus', function () { describe('PasteStatus', function () {
describe('createPasteNotification', function () { describe('createPasteNotification', function () {
this.timeout(30000); this.timeout(30000);
jsc.property( jsc.property(
'creates a notification after a successfull paste upload', 'creates a notification after a successfull paste upload',
common.jscSchemas(), common.jscUrl(),
jsc.nearray(common.jscA2zString()), common.jscUrl(false),
jsc.array(common.jscQueryString()), function (url1, url2) {
'string', const expected1 = common.urlToString(url1).replace(/&(gt|lt)$/, '&$1a'),
common.jscSchemas(), expected2 = common.urlToString(url2).replace(/&(gt|lt)$/, '&$1a'),
jsc.nearray(common.jscA2zString()),
jsc.array(common.jscQueryString()),
function (
schema1, address1, query1, fragment1,
schema2, address2, query2
) {
var expected1 = schema1 + '://' + address1.join('') + '/?' +
encodeURI(query1.join('').replace(/^&+|&+$/gm,'') + '#' + fragment1),
expected2 = schema2 + '://' + address2.join('') + '/?' +
encodeURI(query2.join('').replace(/^&+|&+$/gm,'')),
clean = jsdom(); clean = jsdom();
$('body').html('<div><div id="deletelink"></div><div id="pastelink"></div></div>'); $('body').html('<div><div id="deletelink"></div><div id="pastelink"></div></div>');
$.PrivateBin.PasteStatus.init(); $.PrivateBin.PasteStatus.init();
$.PrivateBin.PasteStatus.createPasteNotification(expected1, expected2); $.PrivateBin.PasteStatus.createPasteNotification(expected1, expected2);
var result1 = $('#pasteurl')[0].href, const result1 = $('#pasteurl')[0].href,
result2 = $('#deletelink a')[0].href; result2 = $('#deletelink a')[0].href;
clean(); clean();
return result1 === expected1 && result2 === expected2; return result1 === expected1 && result2 === expected2;
@ -34,6 +41,138 @@ describe('PasteStatus', function () {
); );
}); });
describe('extractUrl', function () {
this.timeout(30000);
jsc.property(
'extracts and updates IDN URLs found in given response',
common.jscSchemas(false),
'nestring',
common.jscUrl(),
function (schema, domain, url) {
domain = domain.replace(/\P{Letter}|[\u00AA-\u00BA]/gu, '').toLowerCase();
if (domain.length === 0) {
domain = 'a';
}
url.schema = schema;
url.address.unshift('.');
url.address = domain.split('').concat(url.address);
const urlString = common.urlToString(url),
expected = urlString.substring((schema + '://' + domain).length),
clean = jsdom();
$('body').html('<div><div id="pastelink"></div></div>');
$.PrivateBin.PasteStatus.init();
$.PrivateBin.PasteStatus.createPasteNotification('', '');
$.PrivateBin.PasteStatus.extractUrl(urlString);
const result = $('#pasteurl')[0].href;
clean();
return result.endsWith(expected) && (
result.startsWith(schema + '://xn--') ||
result.startsWith(schema + '://' + domain)
);
}
);
// YOURLS API samples from: https://yourls.org/readme.html#API;apireturn
jsc.property(
'extracts and updates URLs found in YOURLS API JSON response',
common.jscSchemas(false),
common.jscUrl(),
common.jscUrl(false),
function (schema, longUrl, shortUrl) {
const [longUrlString, shortUrlString] = urlStrings(schema, longUrl, shortUrl),
yourlsResponse = {
url: {
keyword: longUrl.address.join(''),
url: longUrlString,
title: "example title",
date: "2014-10-24 16:01:39",
ip: "127.0.0.1"
},
status: "success",
message: longUrlString + " added to database",
title: "example title",
shorturl: shortUrlString,
statusCode: 200
},
clean = jsdom();
$('body').html('<div><div id="pastelink"></div></div>');
$.PrivateBin.PasteStatus.init();
$.PrivateBin.PasteStatus.createPasteNotification('', '');
$.PrivateBin.PasteStatus.extractUrl(JSON.stringify(yourlsResponse, undefined, 4));
const result = $('#pasteurl')[0].href;
clean();
return result === shortUrlString;
}
);
jsc.property(
'extracts and updates URLs found in YOURLS API XML response',
common.jscSchemas(false),
common.jscUrl(),
common.jscUrl(false),
function (schema, longUrl, shortUrl) {
const [longUrlString, shortUrlString] = urlStrings(schema, longUrl, shortUrl),
yourlsResponse = '<result>\n' +
' <keyword>' + longUrl.address.join('') + '</keyword>\n' +
' <shorturl>' + shortUrlString + '</shorturl>\n' +
' <longurl>' + longUrlString + '</longurl>\n' +
' <message>success</message>\n' +
' <statusCode>200</statusCode>\n' +
'</result>',
clean = jsdom();
$('body').html('<div><div id="pastelink"></div></div>');
$.PrivateBin.PasteStatus.init();
$.PrivateBin.PasteStatus.createPasteNotification('', '');
$.PrivateBin.PasteStatus.extractUrl(yourlsResponse);
const result = $('#pasteurl')[0].href;
clean();
return result === shortUrlString;
}
);
jsc.property(
'extracts and updates URLs found in YOURLS proxy HTML response',
common.jscSchemas(false),
common.jscUrl(),
common.jscUrl(false),
function (schema, longUrl, shortUrl) {
const [longUrlString, shortUrlString] = urlStrings(schema, longUrl, shortUrl),
yourlsResponse = '<!DOCTYPE html>\n' +
'<html lang="en">\n' +
'\t<head>\n' +
'\t\t<meta charset="utf-8" />\n' +
'\t\t<meta http-equiv="Content-Security-Policy" content="default-src \'none\'; base-uri \'self\'; form-action \'none\'; manifest-src \'self\'; connect-src * blob:; script-src \'self\' \'unsafe-eval\'; style-src \'self\'; font-src \'self\'; frame-ancestors \'none\'; img-src \'self\' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-popups allow-modals allow-downloads">\n' +
'\t\t<meta name="robots" content="noindex" />\n' +
'\t\t<meta name="google" content="notranslate">\n' +
'\t\t<title>PrivateBin</title>\n' +
'\t</head>\n' +
'\t<body>\n' +
'\t\t<p>Your paste is <a id="pasteurl" href="' + shortUrlString + '">' + shortUrlString + '</a> <span id="copyhint">(Hit [Ctrl]+[c] to copy)</span></p>\n' +
'\t</body>\n' +
'</html>',
clean = jsdom();
$('body').html('<div><div id="pastelink"></div></div>');
$.PrivateBin.PasteStatus.init();
$.PrivateBin.PasteStatus.createPasteNotification('', '');
$.PrivateBin.PasteStatus.extractUrl(yourlsResponse);
const result = $('#pasteurl')[0].href;
clean();
return result === shortUrlString;
}
);
});
describe('showRemainingTime', function () { describe('showRemainingTime', function () {
this.timeout(30000); this.timeout(30000);
@ -41,18 +180,9 @@ describe('PasteStatus', function () {
'shows burn after reading message or remaining time v1', 'shows burn after reading message or remaining time v1',
'bool', 'bool',
'nat', 'nat',
jsc.nearray(common.jscA2zString()), common.jscUrl(),
jsc.nearray(common.jscA2zString()), function (burnafterreading, remainingTime, url) {
jsc.nearray(common.jscQueryString()), let clean = jsdom('', {url: common.urlToString(url)}),
'string',
function (
burnafterreading, remainingTime,
schema, address, query, fragment
) {
var clean = jsdom('', {
url: schema.join('') + '://' + address.join('') +
'/?' + query.join('') + '#' + fragment
}),
result; result;
$('body').html('<div id="remainingtime" class="hidden"></div>'); $('body').html('<div id="remainingtime" class="hidden"></div>');
$.PrivateBin.PasteStatus.init(); $.PrivateBin.PasteStatus.init();
@ -79,18 +209,9 @@ describe('PasteStatus', function () {
'shows burn after reading message or remaining time v2', 'shows burn after reading message or remaining time v2',
'bool', 'bool',
'nat', 'nat',
jsc.nearray(common.jscA2zString()), common.jscUrl(),
jsc.nearray(common.jscA2zString()), function (burnafterreading, remainingTime, url) {
jsc.nearray(common.jscQueryString()), let clean = jsdom('', {url: common.urlToString(url)}),
'string',
function (
burnafterreading, remainingTime,
schema, address, query, fragment
) {
var clean = jsdom('', {
url: schema.join('') + '://' + address.join('') +
'/?' + query.join('') + '#' + fragment
}),
result; result;
$('body').html('<div id="remainingtime" class="hidden"></div>'); $('body').html('<div id="remainingtime" class="hidden"></div>');
$.PrivateBin.PasteStatus.init(); $.PrivateBin.PasteStatus.init();

View File

@ -13,10 +13,9 @@ describe('UiHelper', function () {
jsc.property( jsc.property(
'redirects to home, when the state is null', 'redirects to home, when the state is null',
common.jscSchemas(), common.jscUrl(false, false),
jsc.nearray(common.jscA2zString()), function (url) {
function (schema, address) { const expected = common.urlToString(url),
var expected = schema + '://' + address.join('') + '/',
clean = jsdom('', {url: expected}); clean = jsdom('', {url: expected});
// make window.location.href writable // make window.location.href writable
@ -34,13 +33,11 @@ describe('UiHelper', function () {
jsc.property( jsc.property(
'does not redirect to home, when a new paste is created', 'does not redirect to home, when a new paste is created',
common.jscSchemas(), common.jscUrl(false),
jsc.nearray(common.jscA2zString()),
jsc.array(common.jscQueryString()),
jsc.nearray(common.jscBase64String()), jsc.nearray(common.jscBase64String()),
function (schema, address, query, fragment) { function (url, fragment) {
var expected = schema + '://' + address.join('') + '/?' + url.fragment = fragment.join('');
query.join('') + '#' + fragment.join(''), const expected = common.urlToString(url),
clean = jsdom('', {url: expected}); clean = jsdom('', {url: expected});
// make window.location.href writable // make window.location.href writable
@ -67,15 +64,12 @@ describe('UiHelper', function () {
jsc.property( jsc.property(
'redirects to home', 'redirects to home',
common.jscSchemas(), common.jscUrl(),
jsc.nearray(common.jscA2zString()), function (url) {
jsc.array(common.jscQueryString()), const clean = jsdom('', {url: common.urlToString(url)});
jsc.nearray(common.jscBase64String()), delete(url.query);
function (schema, address, query, fragment) { delete(url.fragment);
var expected = schema + '://' + address.join('') + '/', const expected = common.urlToString(url);
clean = jsdom('', {
url: expected + '?' + query.join('') + '#' + fragment.join('')
});
// make window.location.href writable // make window.location.href writable
Object.defineProperty(window.location, 'href', { Object.defineProperty(window.location, 'href', {

View File

@ -25,10 +25,10 @@
}; };
let buff; let buff;
if (typeof fetch === 'undefined') { if (typeof fs === 'object') {
buff = fs.readFileSync('zlib-1.2.13.wasm'); buff = fs.readFileSync('zlib-1.3.1.wasm');
} else { } else {
const resp = await fetch('js/zlib-1.2.13.wasm'); const resp = await fetch('js/zlib-1.3.1.wasm');
buff = await resp.arrayBuffer(); buff = await resp.arrayBuffer();
} }
const module = await WebAssembly.compile(buff); const module = await WebAssembly.compile(buff);

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;
@ -28,7 +28,7 @@ class Controller
* *
* @const string * @const string
*/ */
const VERSION = '1.6.0'; const VERSION = '1.7.1';
/** /**
* minimal required PHP version * minimal required PHP version
@ -111,10 +111,12 @@ class Controller
public function __construct() public function __construct()
{ {
if (version_compare(PHP_VERSION, self::MIN_PHP_VERSION) < 0) { if (version_compare(PHP_VERSION, self::MIN_PHP_VERSION) < 0) {
throw new Exception(I18n::_('%s requires php %s or above to work. Sorry.', I18n::_('PrivateBin'), self::MIN_PHP_VERSION), 1); error_log(I18n::_('%s requires php %s or above to work. Sorry.', I18n::_('PrivateBin'), self::MIN_PHP_VERSION));
return;
} }
if (strlen(PATH) < 0 && substr(PATH, -1) !== DIRECTORY_SEPARATOR) { if (strlen(PATH) < 0 && substr(PATH, -1) !== DIRECTORY_SEPARATOR) {
throw new Exception(I18n::_('%s requires the PATH to end in a "%s". Please update the PATH in your index.php.', I18n::_('PrivateBin'), DIRECTORY_SEPARATOR), 5); error_log(I18n::_('%s requires the PATH to end in a "%s". Please update the PATH in your index.php.', I18n::_('PrivateBin'), DIRECTORY_SEPARATOR));
return;
} }
// load config from ini file, initialize required classes // load config from ini file, initialize required classes
@ -250,7 +252,14 @@ class Controller
} }
// The user posts a standard paste. // The user posts a standard paste.
else { else {
$this->_model->purge(); try {
$this->_model->purge();
} catch (Exception $e) {
error_log('Error purging pastes: ' . $e->getMessage() . PHP_EOL .
'Use the administration scripts statistics to find ' .
'damaged paste IDs and either delete them or restore them ' .
'from backup.');
}
$paste = $this->_model->getPaste(); $paste = $this->_model->getPaste();
try { try {
$paste->setData($data); $paste->setData($data);

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin\Data; namespace PrivateBin\Data;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin\Data; namespace PrivateBin\Data;

View File

@ -7,12 +7,13 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin\Data; namespace PrivateBin\Data;
use Exception; use Exception;
use GlobIterator;
use PrivateBin\Json; use PrivateBin\Json;
/** /**
@ -394,7 +395,7 @@ class Filesystem extends AbstractData
public function getAllPastes() public function getAllPastes()
{ {
$pastes = array(); $pastes = array();
foreach (new \GlobIterator($this->_path . self::PASTE_FILE_PATTERN) as $file) { foreach (new GlobIterator($this->_path . self::PASTE_FILE_PATTERN) as $file) {
if ($file->isFile()) { if ($file->isFile()) {
$pastes[] = $file->getBasename('.php'); $pastes[] = $file->getBasename('.php');
} }

View File

@ -4,7 +4,7 @@
* *
* an S3 compatible data backend for PrivateBin with CEPH/RadosGW in mind * an S3 compatible data backend for PrivateBin with CEPH/RadosGW in mind
* see https://docs.ceph.com/en/latest/radosgw/s3/php/ * see https://docs.ceph.com/en/latest/radosgw/s3/php/
* based on lib/Data/GoogleCloudStorage.php from PrivateBin version 1.6.0 * based on lib/Data/GoogleCloudStorage.php from PrivateBin version 1.7.1
* *
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2022 Felix J. Ogris (https://ogris.de/) * @copyright 2022 Felix J. Ogris (https://ogris.de/)

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@ -7,11 +7,14 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;
use AppendIterator;
use GlobIterator;
/** /**
* I18n * I18n
* *
@ -193,10 +196,14 @@ class I18n
public static function getAvailableLanguages() public static function getAvailableLanguages()
{ {
if (count(self::$_availableLanguages) == 0) { if (count(self::$_availableLanguages) == 0) {
$i18n = dir(self::_getPath()); self::$_availableLanguages[] = 'en'; // en.json is not part of the release archive
while (false !== ($file = $i18n->read())) { $languageIterator = new AppendIterator();
if (preg_match('/^([a-z]{2,3}).json$/', $file, $match) === 1) { $languageIterator->append(new GlobIterator(self::_getPath('??.json')));
self::$_availableLanguages[] = $match[1]; $languageIterator->append(new GlobIterator(self::_getPath('???.json'))); // for jbo
foreach ($languageIterator as $file) {
$language = $file->getBasename('.json');
if ($language != 'en') {
self::$_availableLanguages[] = $language;
} }
} }
} }
@ -272,6 +279,18 @@ class I18n
return array_intersect_key(self::$_languageLabels, array_flip($languages)); return array_intersect_key(self::$_languageLabels, array_flip($languages));
} }
/**
* determines if the current language is written right-to-left (RTL)
*
* @access public
* @static
* @return bool
*/
public static function isRtl()
{
return in_array(self::$_language, array('ar', 'he'));
}
/** /**
* set the default language * set the default language
* *
@ -296,10 +315,10 @@ class I18n
*/ */
protected static function _getPath($file = '') protected static function _getPath($file = '')
{ {
if (strlen(self::$_path) == 0) { if (empty(self::$_path)) {
self::$_path = PUBLIC_PATH . DIRECTORY_SEPARATOR . 'i18n'; self::$_path = PUBLIC_PATH . DIRECTORY_SEPARATOR . 'i18n';
} }
return self::$_path . (strlen($file) ? DIRECTORY_SEPARATOR . $file : ''); return self::$_path . (empty($file) ? '' : DIRECTORY_SEPARATOR . $file);
} }
/** /**
@ -337,6 +356,8 @@ class I18n
return $n % 10 === 1 && $n % 100 !== 11 ? 0 : (($n % 10 >= 2 && $n % 100 < 10 || $n % 100 >= 20) ? 1 : 2); return $n % 10 === 1 && $n % 100 !== 11 ? 0 : (($n % 10 >= 2 && $n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
case 'pl': case 'pl':
return $n === 1 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2); return $n === 1 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
case 'ro':
return $n === 1 ? 0 : (($n === 0 || ($n % 100 > 0 && $n % 100 < 20)) ? 1 : 2);
case 'ru': case 'ru':
case 'uk': case 'uk':
return $n % 10 === 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2); return $n % 10 === 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin\Model; namespace PrivateBin\Model;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin\Model; namespace PrivateBin\Model;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin\Model; namespace PrivateBin\Model;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin\Persistence; namespace PrivateBin\Persistence;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin\Persistence; namespace PrivateBin\Persistence;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin\Persistence; namespace PrivateBin\Persistence;

View File

@ -8,7 +8,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin\Persistence; namespace PrivateBin\Persistence;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@ -8,7 +8,7 @@
* @link https://sebsauvage.net/wiki/doku.php?id=php:vizhash_gd * @link https://sebsauvage.net/wiki/doku.php?id=php:vizhash_gd
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 0.0.5 beta PrivateBin 1.6.0 * @version 0.0.5 beta PrivateBin 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;

View File

@ -7,7 +7,7 @@
* @link https://github.com/PrivateBin/PrivateBin * @link https://github.com/PrivateBin/PrivateBin
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
* @version 1.6.0 * @version 1.7.1
*/ */
namespace PrivateBin; namespace PrivateBin;

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