mirror of
https://github.com/PrivateBin/PrivateBin.git
synced 2026-03-27 18:04:14 -04:00
Compare commits
10 Commits
1.2.1
...
php-unit-t
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c8da54b61 | ||
|
|
cd22948c31 | ||
|
|
7277eef7f2 | ||
|
|
b80ce78e01 | ||
|
|
6a9f3303dc | ||
|
|
aad162895c | ||
|
|
40f5988758 | ||
|
|
79dafd5af4 | ||
|
|
e41f0a7561 | ||
|
|
59adfc1962 |
@@ -1,19 +1,5 @@
|
|||||||
---
|
---
|
||||||
version: "2"
|
engines:
|
||||||
checks:
|
|
||||||
file-lines:
|
|
||||||
config:
|
|
||||||
threshold: 2000
|
|
||||||
method-complexity:
|
|
||||||
config:
|
|
||||||
threshold: 550
|
|
||||||
method-count:
|
|
||||||
config:
|
|
||||||
threshold: 50
|
|
||||||
method-lines:
|
|
||||||
config:
|
|
||||||
threshold: 250
|
|
||||||
plugins:
|
|
||||||
csslint:
|
csslint:
|
||||||
enabled: true
|
enabled: true
|
||||||
duplication:
|
duplication:
|
||||||
@@ -26,8 +12,6 @@ plugins:
|
|||||||
enabled: true
|
enabled: true
|
||||||
fixme:
|
fixme:
|
||||||
enabled: true
|
enabled: true
|
||||||
nodesecurity:
|
|
||||||
enabled: true
|
|
||||||
phpmd:
|
phpmd:
|
||||||
enabled: true
|
enabled: true
|
||||||
checks:
|
checks:
|
||||||
@@ -45,20 +29,11 @@ plugins:
|
|||||||
enabled: false
|
enabled: false
|
||||||
CleanCode/StaticAccess:
|
CleanCode/StaticAccess:
|
||||||
enabled: false
|
enabled: false
|
||||||
sonar-php:
|
ratings:
|
||||||
enabled: true
|
paths:
|
||||||
config:
|
- "css/privatebin.css"
|
||||||
tests_patterns:
|
- "css/bootstrap/privatebin.css"
|
||||||
- tst/**
|
- "js/privatebin.js"
|
||||||
exclude_patterns:
|
- "lib/**.php"
|
||||||
- "cfg/"
|
- "index.php"
|
||||||
- "css/"
|
exclude_paths: []
|
||||||
- "!css/privatebin.css"
|
|
||||||
- "!css/noscript.css"
|
|
||||||
- "!css/bootstrap/privatebin.css"
|
|
||||||
- "js/"
|
|
||||||
- "!js/privatebin.js"
|
|
||||||
- "!js/common.js"
|
|
||||||
- "!js/test/"
|
|
||||||
- "vendor/"
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ insert_final_newline = true
|
|||||||
|
|
||||||
[*.css]
|
[*.css]
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
[*.js]
|
[*.js]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
@@ -22,6 +23,7 @@ indent_size = 4
|
|||||||
|
|
||||||
[*.jsonld]
|
[*.jsonld]
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
[*.php]
|
[*.php]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
@@ -29,6 +31,7 @@ indent_size = 4
|
|||||||
|
|
||||||
[*.{htm,html}]
|
[*.{htm,html}]
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
[*.{md,markdown}]
|
[*.{md,markdown}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
|
|||||||
@@ -1,2 +1 @@
|
|||||||
js/*.js
|
**/*{.,-}min.js
|
||||||
!js/privatebin.js
|
|
||||||
|
|||||||
34
.eslintrc
34
.eslintrc
@@ -11,22 +11,11 @@ env:
|
|||||||
|
|
||||||
globals:
|
globals:
|
||||||
sjcl: false
|
sjcl: false
|
||||||
DOMPurify: false
|
|
||||||
after: true
|
|
||||||
before: true
|
|
||||||
cleanup: true
|
|
||||||
describe: false
|
|
||||||
it: false
|
|
||||||
jsc: false
|
|
||||||
jsdom: true
|
|
||||||
kjua: true
|
|
||||||
|
|
||||||
# http://eslint.org/docs/rules/
|
# http://eslint.org/docs/rules/
|
||||||
rules:
|
rules:
|
||||||
# Possible Errors
|
# Possible Errors
|
||||||
comma-dangle:
|
comma-dangle: [2, never]
|
||||||
- error
|
|
||||||
- never
|
|
||||||
no-cond-assign: 2
|
no-cond-assign: 2
|
||||||
no-console: 0
|
no-console: 0
|
||||||
no-constant-condition: 2
|
no-constant-condition: 2
|
||||||
@@ -42,9 +31,7 @@ rules:
|
|||||||
no-extra-parens: 0
|
no-extra-parens: 0
|
||||||
no-extra-semi: 2
|
no-extra-semi: 2
|
||||||
no-func-assign: 2
|
no-func-assign: 2
|
||||||
no-inner-declarations:
|
no-inner-declarations: [2, functions]
|
||||||
- error
|
|
||||||
- functions
|
|
||||||
no-invalid-regexp: 2
|
no-invalid-regexp: 2
|
||||||
no-irregular-whitespace: 2
|
no-irregular-whitespace: 2
|
||||||
no-negated-in-lhs: 2
|
no-negated-in-lhs: 2
|
||||||
@@ -60,9 +47,7 @@ rules:
|
|||||||
# Best Practices
|
# Best Practices
|
||||||
accessor-pairs: 2
|
accessor-pairs: 2
|
||||||
block-scoped-var: 0
|
block-scoped-var: 0
|
||||||
complexity:
|
complexity: [2, 6]
|
||||||
- error
|
|
||||||
- 20
|
|
||||||
consistent-return: 0
|
consistent-return: 0
|
||||||
curly: 0
|
curly: 0
|
||||||
default-case: 0
|
default-case: 0
|
||||||
@@ -75,6 +60,7 @@ rules:
|
|||||||
no-case-declarations: 2
|
no-case-declarations: 2
|
||||||
no-div-regex: 2
|
no-div-regex: 2
|
||||||
no-else-return: 0
|
no-else-return: 0
|
||||||
|
no-empty-label: 2
|
||||||
no-empty-pattern: 2
|
no-empty-pattern: 2
|
||||||
no-eq-null: 2
|
no-eq-null: 2
|
||||||
no-eval: 2
|
no-eval: 2
|
||||||
@@ -99,7 +85,7 @@ rules:
|
|||||||
no-octal-escape: 2
|
no-octal-escape: 2
|
||||||
no-octal: 2
|
no-octal: 2
|
||||||
no-proto: 2
|
no-proto: 2
|
||||||
no-redeclare: 0
|
no-redeclare: 2
|
||||||
no-return-assign: 2
|
no-return-assign: 2
|
||||||
no-script-url: 2
|
no-script-url: 2
|
||||||
no-self-compare: 2
|
no-self-compare: 2
|
||||||
@@ -113,7 +99,7 @@ rules:
|
|||||||
no-with: 2
|
no-with: 2
|
||||||
radix: 2
|
radix: 2
|
||||||
vars-on-top: 0
|
vars-on-top: 0
|
||||||
wrap-iife: 0
|
wrap-iife: 2
|
||||||
yoda: 0
|
yoda: 0
|
||||||
|
|
||||||
# Strict
|
# Strict
|
||||||
@@ -166,9 +152,7 @@ rules:
|
|||||||
max-len: 0
|
max-len: 0
|
||||||
max-nested-callbacks: 0
|
max-nested-callbacks: 0
|
||||||
max-params: 0
|
max-params: 0
|
||||||
max-statements:
|
max-statements: [2, 30]
|
||||||
- error
|
|
||||||
- 60
|
|
||||||
new-cap: 0
|
new-cap: 0
|
||||||
new-parens: 0
|
new-parens: 0
|
||||||
newline-after-var: 0
|
newline-after-var: 0
|
||||||
@@ -195,9 +179,7 @@ rules:
|
|||||||
operator-linebreak: 0
|
operator-linebreak: 0
|
||||||
padded-blocks: 0
|
padded-blocks: 0
|
||||||
quote-props: 0
|
quote-props: 0
|
||||||
quotes:
|
quotes: 0
|
||||||
- error
|
|
||||||
- single
|
|
||||||
require-jsdoc: 0
|
require-jsdoc: 0
|
||||||
semi-spacing: 0
|
semi-spacing: 0
|
||||||
semi: 0
|
semi: 0
|
||||||
|
|||||||
9
.gitattributes
vendored
9
.gitattributes
vendored
@@ -1,7 +1,9 @@
|
|||||||
doc/ export-ignore
|
doc/ export-ignore
|
||||||
tst/ export-ignore
|
tst/ export-ignore
|
||||||
js/.istanbul.yml export-ignore
|
js/.istanbul.yml export-ignore
|
||||||
js/test/ export-ignore
|
js/test.js export-ignore
|
||||||
|
js/mocha-3.2.0.js export-ignore
|
||||||
|
css/mocha-3.2.0.css export-ignore
|
||||||
.codeclimate.yml export-ignore
|
.codeclimate.yml export-ignore
|
||||||
.csslintrc export-ignore
|
.csslintrc export-ignore
|
||||||
.dockerignore export-ignore
|
.dockerignore export-ignore
|
||||||
@@ -11,12 +13,7 @@ js/test/ export-ignore
|
|||||||
.gitattributes export-ignore
|
.gitattributes export-ignore
|
||||||
.github export-ignore
|
.github export-ignore
|
||||||
.gitignore export-ignore
|
.gitignore export-ignore
|
||||||
.jshintrc export-ignore
|
|
||||||
.nsprc export-ignore
|
|
||||||
.php_cs export-ignore
|
.php_cs export-ignore
|
||||||
.styleci.yml export-ignore
|
.styleci.yml export-ignore
|
||||||
.travis.yml export-ignore
|
.travis.yml export-ignore
|
||||||
Dockerfile export-ignore
|
Dockerfile export-ignore
|
||||||
docker-compose.yml export-ignore
|
|
||||||
docker/ export-ignore
|
|
||||||
composer.json export-ignore
|
|
||||||
|
|||||||
3
.github/ISSUE_TEMPLATE.md
vendored
3
.github/ISSUE_TEMPLATE.md
vendored
@@ -35,4 +35,5 @@ If you have access to the server log files, also copy them here.
|
|||||||
<!-- The version of PrivateBin, if you use an unstable version paste the commit hash or the GitHub link to the commit here (you can get it by running `git rev-parse HEAD`) -->
|
<!-- The version of PrivateBin, if you use an unstable version paste the commit hash or the GitHub link to the commit here (you can get it by running `git rev-parse HEAD`) -->
|
||||||
**PrivateBin version:**
|
**PrivateBin version:**
|
||||||
|
|
||||||
I can reproduce this issue on <https://privatebin.net>: Yes / No
|
* I can reproduce this issue on <https://privatebin.net>: Yes / No
|
||||||
|
|
||||||
|
|||||||
8
.gitignore
vendored
8
.gitignore
vendored
@@ -1,9 +1,6 @@
|
|||||||
# Ignore server files for safety
|
# Ignore server files for safety
|
||||||
.htaccess
|
.htaccess
|
||||||
.htpasswd
|
.htpasswd
|
||||||
cfg/*
|
|
||||||
!cfg/conf.sample.php
|
|
||||||
!cfg/.htaccess
|
|
||||||
|
|
||||||
# Ignore data/
|
# Ignore data/
|
||||||
data/
|
data/
|
||||||
@@ -30,13 +27,10 @@ vendor/**/tests
|
|||||||
vendor/**/build_phar.php
|
vendor/**/build_phar.php
|
||||||
!vendor/**/*.php
|
!vendor/**/*.php
|
||||||
|
|
||||||
# Ignore local node modules, unit testing logs, api docs and IDE project files
|
# Ignore local node modules, unit testing logs, api docs and eclipse project files
|
||||||
js/node_modules/
|
js/node_modules/
|
||||||
js/test.log
|
|
||||||
tst/log/
|
tst/log/
|
||||||
tst/ConfigurationCombinationsTest.php
|
|
||||||
.settings
|
.settings
|
||||||
.buildpath
|
.buildpath
|
||||||
.project
|
.project
|
||||||
.externalToolBuilders
|
.externalToolBuilders
|
||||||
.c9
|
|
||||||
|
|||||||
46
.jshintrc
46
.jshintrc
@@ -1,46 +0,0 @@
|
|||||||
{
|
|
||||||
"bitwise": true,
|
|
||||||
"curly": true,
|
|
||||||
"eqeqeq": true,
|
|
||||||
"esversion": 5,
|
|
||||||
"forin": true,
|
|
||||||
"freeze": true,
|
|
||||||
"futurehostile": true,
|
|
||||||
"latedef": "nofunc",
|
|
||||||
"maxcomplexity": 25,
|
|
||||||
"maxdepth": 3,
|
|
||||||
"maxparams": 4,
|
|
||||||
"maxstatements": 100,
|
|
||||||
"noarg": true,
|
|
||||||
"nonbsp": true,
|
|
||||||
"nonew": true,
|
|
||||||
"quotmark": "single",
|
|
||||||
"singleGroups": true,
|
|
||||||
"strict": true,
|
|
||||||
"undef": true,
|
|
||||||
"unused": true,
|
|
||||||
"jquery": true,
|
|
||||||
"browser": true,
|
|
||||||
"predef": {
|
|
||||||
"after": true,
|
|
||||||
"before": true,
|
|
||||||
"cleanup": true,
|
|
||||||
"console": true,
|
|
||||||
"describe": false,
|
|
||||||
"document": true,
|
|
||||||
"fs": false,
|
|
||||||
"global": true,
|
|
||||||
"exports": true,
|
|
||||||
"it": false,
|
|
||||||
"jsc": false,
|
|
||||||
"jsdom": true,
|
|
||||||
"require": false,
|
|
||||||
"setTimeout": false,
|
|
||||||
"window": true
|
|
||||||
},
|
|
||||||
"globals": {
|
|
||||||
"sjcl": true,
|
|
||||||
"DOMPurify": true,
|
|
||||||
"kjua": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
10
.styleci.yml
10
.styleci.yml
@@ -3,17 +3,14 @@ preset: recommended
|
|||||||
risky: false
|
risky: false
|
||||||
|
|
||||||
enabled:
|
enabled:
|
||||||
- align_equals
|
|
||||||
- concat_with_spaces
|
|
||||||
- long_array_syntax
|
|
||||||
- no_empty_comment
|
- no_empty_comment
|
||||||
- pre_increment
|
- align_equals
|
||||||
|
- long_array_syntax
|
||||||
|
- concat_with_spaces
|
||||||
|
|
||||||
disabled:
|
disabled:
|
||||||
- blank_line_after_opening_tag
|
- blank_line_after_opening_tag
|
||||||
- blank_line_before_return
|
- blank_line_before_return
|
||||||
- blank_line_before_throw
|
|
||||||
- blank_line_before_try
|
|
||||||
- concat_without_spaces
|
- concat_without_spaces
|
||||||
- declare_equal_normalize
|
- declare_equal_normalize
|
||||||
- heredoc_to_nowdoc
|
- heredoc_to_nowdoc
|
||||||
@@ -24,7 +21,6 @@ disabled:
|
|||||||
- phpdoc_separation
|
- phpdoc_separation
|
||||||
- phpdoc_single_line_var_spacing
|
- phpdoc_single_line_var_spacing
|
||||||
- phpdoc_summary
|
- phpdoc_summary
|
||||||
- post_increment
|
|
||||||
- short_array_syntax
|
- short_array_syntax
|
||||||
- single_line_after_imports
|
- single_line_after_imports
|
||||||
- unalign_equals
|
- unalign_equals
|
||||||
|
|||||||
32
.travis.yml
32
.travis.yml
@@ -1,35 +1,17 @@
|
|||||||
language: php
|
language: php
|
||||||
sudo: false
|
sudo: false
|
||||||
php:
|
php:
|
||||||
- '5.4'
|
- 5.5
|
||||||
- '5.5'
|
- 5.6
|
||||||
- '5.6'
|
- 7.0
|
||||||
- '7.0'
|
|
||||||
- '7.1'
|
|
||||||
- '7.2'
|
|
||||||
|
|
||||||
# as this is a php project, node.js v4 (for JS unit testing) isn't installed
|
|
||||||
install:
|
|
||||||
- if [ ! -d "$HOME/.nvm" ]; then mkdir -p $HOME/.nvm && curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | NVM_METHOD=script bash; fi
|
|
||||||
- source ~/.nvm/nvm.sh && nvm install 4
|
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- composer install -n
|
- composer install -n
|
||||||
- npm install -g mocha
|
|
||||||
- cd js && npm install jsverify jsdom@9 jsdom-global@2 mime-types
|
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- mocha
|
- cd tst && ../vendor/phpunit/phpunit/phpunit
|
||||||
- cd ../tst && ../vendor/bin/phpunit
|
|
||||||
|
|
||||||
after_script:
|
after_script:
|
||||||
- ../vendor/bin/test-reporter --coverage-report log/coverage-clover.xml
|
- cd ..
|
||||||
- cd .. && vendor/bin/codacycoverage clover tst/log/coverage-clover.xml
|
- vendor/bin/codacycoverage clover tst/log/coverage-clover.xml
|
||||||
|
- vendor/bin/test-reporter --coverage-report tst/log/coverage-clover.xml
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- $HOME/.composer/cache/files
|
|
||||||
- $HOME/.composer/cache/vcs
|
|
||||||
- $HOME/.nvm
|
|
||||||
- $HOME/.npm
|
|
||||||
- js/node_modules
|
|
||||||
|
|||||||
24
CHANGELOG.md
24
CHANGELOG.md
@@ -1,29 +1,9 @@
|
|||||||
# PrivateBin version history
|
# PrivateBin version history
|
||||||
|
|
||||||
* **1.3 (not yet released)**
|
* **next (not yet released)**
|
||||||
* **1.2.1 (2018-08-11)**
|
* ADDED: Translations for Spanish, Occitan and Norwegian
|
||||||
* ADDED: Add support for mega.nz links in pastes and comments (#331)
|
|
||||||
* CHANGED: Added some missing Russian translations (#348)
|
|
||||||
* CHANGED: Minor PHP refactoring: Rename PrivateBin class to Controller, improved logic of some persistence classes (#342)
|
|
||||||
* CHANGED: Upgrading DOMpurify library to 1.0.7
|
|
||||||
* FIXED: Ensure legacy browsers without webcrypto support can't create paste keys with insufficient entropy (#346)
|
|
||||||
* FIXED: Re-add support for old browsers (Firefox<21, Chrome<31, Safari<7, IE<11), broken in 1.2, will be removed again in 1.3
|
|
||||||
* **1.2 (2018-07-22)**
|
|
||||||
* ADDED: Translations for Spanish, Occitan, Norwegian, Portuguese, Dutch and Hungarian
|
|
||||||
* ADDED: Option in configuration to change the default "PrivateBin" title of the site
|
* ADDED: Option in configuration to change the default "PrivateBin" title of the site
|
||||||
* ADDED: Added display of video, audio & PDF, drag & drop, preview of attachments (#182)
|
|
||||||
* ADDED: QR code generation (#169)
|
|
||||||
* ADDED: Introduced DOMpurify library to sanitize generated HTML before display (#183)
|
|
||||||
* CHANGED: Force JSON request for getting paste data & password retry (#216)
|
|
||||||
* CHANGED: Minimum required PHP version is 5.4 (#186)
|
|
||||||
* CHANGED: Shipped .htaccess files were updated for Apache 2.4 (#192)
|
|
||||||
* CHANGED: Cleanup of bootstrap template variants and moved icons to `img` directory
|
* CHANGED: Cleanup of bootstrap template variants and moved icons to `img` directory
|
||||||
* 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
|
|
||||||
* 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
|
|
||||||
* CHANGED: Refactored JavaScript code, making it modular with private and public functions, making it much easier to maintain (#178)
|
|
||||||
* 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)
|
|
||||||
* **1.1.1 (2017-10-06)**
|
|
||||||
* CHANGED: Switched to `.php` file extension for configuration file, to avoid leaking configuration data in unprotected installation.
|
|
||||||
* **1.1 (2016-12-26)**
|
* **1.1 (2016-12-26)**
|
||||||
* ADDED: Translations for Italian and Russian
|
* ADDED: Translations for Italian and Russian
|
||||||
* ADDED: Loading message displayed until decryption succeeded for slower (in terms of CPU or network) systems
|
* ADDED: Loading message displayed until decryption succeeded for slower (in terms of CPU or network) systems
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
## Active contributors
|
## Active contributors
|
||||||
|
|
||||||
Simon Rupf - current developer and maintainer
|
Simon Rupf - current developer and maintainer
|
||||||
rugk - security review, doc improvment, JS refactoring & various other stuff
|
rugk - security review, doc improvment & various other stuff
|
||||||
|
|
||||||
## Past contributions
|
## Past contributions
|
||||||
|
|
||||||
@@ -22,7 +22,6 @@ Sébastien Sauvage - original idea and main developer
|
|||||||
* Nathaniel Olsen - jQuery upgrade
|
* Nathaniel Olsen - jQuery upgrade
|
||||||
* Alexander Demenshin - modal password dialog
|
* Alexander Demenshin - modal password dialog
|
||||||
* PunKeel - Dockerfile
|
* PunKeel - Dockerfile
|
||||||
* thororm - Display of video, audio & PDF, drag & drop, preview of attachments
|
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
* Hexalyse - French
|
* Hexalyse - French
|
||||||
@@ -36,6 +35,3 @@ Sébastien Sauvage - original idea and main developer
|
|||||||
* Alfredo Fabián Altamirano Tena - Spanish
|
* Alfredo Fabián Altamirano Tena - Spanish
|
||||||
* Quent-in - Occitan
|
* Quent-in - Occitan
|
||||||
* idarlund - Norwegian
|
* idarlund - Norwegian
|
||||||
* Tulio Leao - Portuguese
|
|
||||||
* Michael van Schaik - Dutch
|
|
||||||
* Péter Tabajdi - Hungarian
|
|
||||||
|
|||||||
21
Dockerfile
21
Dockerfile
@@ -3,24 +3,15 @@ FROM php:apache
|
|||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
libfreetype6-dev \
|
libfreetype6-dev \
|
||||||
libjpeg62-turbo-dev \
|
libjpeg62-turbo-dev \
|
||||||
libpng-dev \
|
libpng12-dev \
|
||||||
wget \
|
wget \
|
||||||
zip \
|
zip \
|
||||||
unzip && \
|
unzip; \
|
||||||
# We install and enable php-gd
|
# We install and enable php-gd
|
||||||
docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ &&\
|
docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/; \
|
||||||
docker-php-ext-install -j$(nproc) gd && \
|
docker-php-ext-install -j$(nproc) gd; \
|
||||||
|
|
||||||
# We enable Apache's mod_rewrite
|
# We enable Apache's mod_rewrite
|
||||||
a2enmod rewrite
|
a2enmod rewrite
|
||||||
|
|
||||||
|
COPY . .
|
||||||
# Copy app content
|
|
||||||
COPY . /var/www/html
|
|
||||||
|
|
||||||
# Copy start script
|
|
||||||
RUN mv /var/www/html/docker/entrypoint.sh / && \
|
|
||||||
rm -r /var/www/html/docker
|
|
||||||
|
|
||||||
VOLUME /var/www/html/data
|
|
||||||
|
|
||||||
CMD /entrypoint.sh
|
|
||||||
|
|||||||
154
INSTALL.md
154
INSTALL.md
@@ -3,15 +3,14 @@
|
|||||||
**TL;DR:** Download the
|
**TL;DR:** Download the
|
||||||
[latest release archive](https://github.com/PrivateBin/PrivateBin/releases/latest)
|
[latest release archive](https://github.com/PrivateBin/PrivateBin/releases/latest)
|
||||||
and extract it in your web hosts folder where you want to install your PrivateBin
|
and extract it in your web hosts folder where you want to install your PrivateBin
|
||||||
instance. We try to provide a mostly safe default configuration, but we urge you to
|
instance. We try to provide a safe default configuration, but we advise you to
|
||||||
check the [security section](#hardening-and-security) below and the [configuration
|
check the options and adjust them as you see fit.
|
||||||
options](#configuration) to adjust as you see fit.
|
|
||||||
|
|
||||||
**NOTE:** See [our FAQ](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#how-can-i-securely-clonedownload-your-project) for information how to securely download the PrivateBin release files.
|
## Basic installation
|
||||||
|
|
||||||
### Minimal requirements
|
### Requirements
|
||||||
|
|
||||||
- PHP version 5.4 or above
|
- PHP version 5.3 or above
|
||||||
- _one_ of the following sources of cryptographically safe randomness is required:
|
- _one_ of the following sources of cryptographically safe randomness is required:
|
||||||
- PHP 7 or higher
|
- PHP 7 or higher
|
||||||
- [Libsodium](https://download.libsodium.org/libsodium/content/installation/) and it's [PHP extension](https://paragonie.com/book/pecl-libsodium/read/00-intro.md#installing-libsodium)
|
- [Libsodium](https://download.libsodium.org/libsodium/content/installation/) and it's [PHP extension](https://paragonie.com/book/pecl-libsodium/read/00-intro.md#installing-libsodium)
|
||||||
@@ -21,11 +20,37 @@ options](#configuration) to adjust as you see fit.
|
|||||||
|
|
||||||
Mcrypt needs to be able to access `/dev/urandom`. This means if `open_basedir` is set, it must include this file.
|
Mcrypt needs to be able to access `/dev/urandom`. This means if `open_basedir` is set, it must include this file.
|
||||||
- GD extension
|
- GD extension
|
||||||
- some disk space or (optionally) a database supported by [PDO](https://secure.php.net/manual/book.pdo.php)
|
- some disk space or (optional) a database supported by [PDO](https://secure.php.net/manual/book.pdo.php)
|
||||||
- ability to create files and folders in the installation directory and the PATH defined in index.php
|
- ability to create files and folders in the installation directory and the PATH
|
||||||
- A web browser with javascript support
|
- A web browser with javascript support
|
||||||
|
|
||||||
## Hardening and security
|
### Configuration
|
||||||
|
|
||||||
|
In the file `cfg/conf.ini` you can configure PrivateBin. A `cfg/conf.ini.sample`
|
||||||
|
is provided containing all options and default values. You can copy it to
|
||||||
|
`cfg/conf.ini` and adapt it as needed. The config file is divided into multiple
|
||||||
|
sections, which are enclosed in square brackets.
|
||||||
|
|
||||||
|
In the `[main]` section you can enable or disable the discussion feature, set
|
||||||
|
the limit of stored pastes and comments in bytes. The `[traffic]` section lets
|
||||||
|
you set a time limit in seconds. Users may not post more often then this limit
|
||||||
|
to your PrivateBin installation.
|
||||||
|
|
||||||
|
More details can be found in the
|
||||||
|
[configuration documentation](https://github.com/PrivateBin/PrivateBin/wiki/Configuration).
|
||||||
|
|
||||||
|
## Further configuration
|
||||||
|
|
||||||
|
After (or before) setting up PrivateBin, also set up HTTPS, as without HTTPS
|
||||||
|
PrivateBin is not secure. (
|
||||||
|
[More information](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#how-should-i-setup-https))
|
||||||
|
|
||||||
|
If you want to use PrivateBin behind Cloudflare, make sure you disabled Rocket
|
||||||
|
loader and unchecked "Javascript" for Auto Minify, found in your domain settings,
|
||||||
|
under "Speed". (More information
|
||||||
|
[in this FAQ entry](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#user-content-how-to-make-privatebin-work-when-using-cloudflare-for-ddos-protection))
|
||||||
|
|
||||||
|
## Advanced installation
|
||||||
|
|
||||||
### Changing the path
|
### Changing the path
|
||||||
|
|
||||||
@@ -50,35 +75,6 @@ process (see also
|
|||||||
> PrivateBin will look for your includes / data here:
|
> PrivateBin will look for your includes / data here:
|
||||||
> /home/example.com/secret/privatebin
|
> /home/example.com/secret/privatebin
|
||||||
|
|
||||||
### Transport security
|
|
||||||
|
|
||||||
When setting up PrivateBin, also set up HTTPS, if you haven't already. Without HTTPS
|
|
||||||
PrivateBin is not secure, as the javascript files could be manipulated during transmission.
|
|
||||||
For more information on this, see our [FAQ entry on HTTPS setup](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#how-should-i-setup-https).
|
|
||||||
|
|
||||||
### File-level permissions
|
|
||||||
|
|
||||||
After completing the installation, you should make sure, other users on the system cannot read the config file or the `data/` directory, as – depending on your configuration – potential secret information are saved there.
|
|
||||||
|
|
||||||
See [this FAQ item](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#what-are-the-recommended-file-and-folder-permissions-for-privatebin) for a detailed guide on how to "harden" the permissions of files and folders.
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
In the file `cfg/conf.php` you can configure PrivateBin. A `cfg/conf.sample.php`
|
|
||||||
is provided containing all options and default values. You can copy it to
|
|
||||||
`cfg/conf.php` and adapt it as needed. The config file is divided into multiple
|
|
||||||
sections, which are enclosed in square brackets.
|
|
||||||
|
|
||||||
In the `[main]` section you can enable or disable the discussion feature, set
|
|
||||||
the limit of stored pastes and comments in bytes. The `[traffic]` section lets
|
|
||||||
you set a time limit in seconds. Users may not post more often then this limit
|
|
||||||
to your PrivateBin installation.
|
|
||||||
|
|
||||||
More details can be found in the
|
|
||||||
[configuration documentation](https://github.com/PrivateBin/PrivateBin/wiki/Configuration).
|
|
||||||
|
|
||||||
## Advanced installation
|
|
||||||
|
|
||||||
### Web server configuration
|
### Web server configuration
|
||||||
|
|
||||||
A `robots.txt` file is provided in the root dir of PrivateBin. It disallows all
|
A `robots.txt` file is provided in the root dir of PrivateBin. It disallows all
|
||||||
@@ -92,13 +88,6 @@ some known robots and link-scanning bots. If you use Apache, you can rename the
|
|||||||
file to `.htaccess` to enable this feature. If you use another webserver, you
|
file to `.htaccess` to enable this feature. If you use another webserver, you
|
||||||
have to configure it manually to do the same.
|
have to configure it manually to do the same.
|
||||||
|
|
||||||
### When using Cloudflare
|
|
||||||
|
|
||||||
If you want to use PrivateBin behind Cloudflare, make sure you have disabled the Rocket
|
|
||||||
loader and unchecked "Javascript" for Auto Minify, found in your domain settings,
|
|
||||||
under "Speed". (More information
|
|
||||||
[in this FAQ entry](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#user-content-how-to-make-privatebin-work-when-using-cloudflare-for-ddos-protection))
|
|
||||||
|
|
||||||
### Using a database instead of flat files
|
### Using a database instead of flat files
|
||||||
|
|
||||||
In the configuration file the `[model]` and `[model_options]` sections let you
|
In the configuration file the `[model]` and `[model_options]` sections let you
|
||||||
@@ -125,47 +114,36 @@ The table prefix option is called `tbl`.
|
|||||||
> If you gain any experience running PrivateBin on other RDBMS, please let us
|
> If you gain any experience running PrivateBin on other RDBMS, please let us
|
||||||
> know.
|
> know.
|
||||||
|
|
||||||
The following GRANTs (privileges) are required for the PrivateBin user in **MySQL**. In normal operation:
|
For reference or if you want to create the table schema for yourself (replace
|
||||||
- INSERT, SELECT, DELETE on the paste and comment tables
|
`prefix_` with your own table prefix and create the table schema with phpMyAdmin
|
||||||
- SELECT on the config table
|
or the MYSQL console):
|
||||||
|
|
||||||
If you want PrivateBin to handle table creation (when you create the first paste) and updates (after you update PrivateBin to a new release), you need to give the user these additional privileges:
|
CREATE TABLE prefix_paste (
|
||||||
- CREATE, INDEX and ALTER on the database
|
dataid CHAR(16) NOT NULL,
|
||||||
- INSERT and UPDATE on the config table
|
data BLOB,
|
||||||
|
postdate INT,
|
||||||
For reference or if you want to create the table schema for yourself to avoid having to give PrivateBin too many permissions (replace
|
expiredate INT,
|
||||||
`prefix_` with your own table prefix and create the table schema with your favourite MySQL console):
|
opendiscussion INT,
|
||||||
|
burnafterreading INT,
|
||||||
```sql
|
meta TEXT,
|
||||||
CREATE TABLE prefix_paste (
|
attachment MEDIUMBLOB,
|
||||||
dataid CHAR(16) NOT NULL,
|
attachmentname BLOB,
|
||||||
data BLOB,
|
PRIMARY KEY (dataid)
|
||||||
postdate INT,
|
);
|
||||||
expiredate INT,
|
|
||||||
opendiscussion INT,
|
CREATE TABLE prefix_comment (
|
||||||
burnafterreading INT,
|
dataid CHAR(16),
|
||||||
meta TEXT,
|
pasteid CHAR(16),
|
||||||
attachment MEDIUMBLOB,
|
parentid CHAR(16),
|
||||||
attachmentname BLOB,
|
data BLOB,
|
||||||
PRIMARY KEY (dataid)
|
nickname BLOB,
|
||||||
);
|
vizhash BLOB,
|
||||||
|
postdate INT,
|
||||||
CREATE TABLE prefix_comment (
|
PRIMARY KEY (dataid)
|
||||||
dataid CHAR(16),
|
);
|
||||||
pasteid CHAR(16),
|
CREATE INDEX parent ON prefix_comment(pasteid);
|
||||||
parentid CHAR(16),
|
|
||||||
data BLOB,
|
CREATE TABLE prefix_config (
|
||||||
nickname BLOB,
|
id CHAR(16) NOT NULL, value TEXT, PRIMARY KEY (id)
|
||||||
vizhash BLOB,
|
);
|
||||||
postdate INT,
|
INSERT INTO prefix_config VALUES('VERSION', '1.1');
|
||||||
PRIMARY KEY (dataid)
|
|
||||||
);
|
|
||||||
CREATE INDEX parent ON prefix_comment(pasteid);
|
|
||||||
|
|
||||||
CREATE TABLE prefix_config (
|
|
||||||
id CHAR(16) NOT NULL, value TEXT, PRIMARY KEY (id)
|
|
||||||
);
|
|
||||||
INSERT INTO prefix_config VALUES('VERSION', '1.2.1');
|
|
||||||
```
|
|
||||||
|
|
||||||
In **PostgreSQL**, the data, attachment, nickname and vizhash columns needs to be TEXT and not BLOB or MEDIUMBLOB.
|
|
||||||
|
|||||||
10
LICENSE.md
10
LICENSE.md
@@ -30,16 +30,6 @@ the following restrictions:
|
|||||||
|
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
### MIT license for kjua
|
|
||||||
|
|
||||||
Copyright (c) 2016 Lars Jung (https://larsjung.de)
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
## GNU General Public License, version 2.0, for SJCL, rawdeflate and rawinflate
|
## GNU General Public License, version 2.0, for SJCL, rawdeflate and rawinflate
|
||||||
|
|
||||||
_Version 2, June 1991_
|
_Version 2, June 1991_
|
||||||
|
|||||||
58
README.md
58
README.md
@@ -7,19 +7,19 @@
|
|||||||
[](https://www.codacy.com/app/PrivateBin/PrivateBin)
|
[](https://www.codacy.com/app/PrivateBin/PrivateBin)
|
||||||
[](https://codeclimate.com/github/PrivateBin/PrivateBin/coverage) [](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/?branch=master)
|
[](https://codeclimate.com/github/PrivateBin/PrivateBin/coverage) [](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/?branch=master)
|
||||||
|
|
||||||
*Current version: 1.2.1*
|
*Current version: 1.1*
|
||||||
|
|
||||||
**PrivateBin** is a minimalist, open source online [pastebin](https://en.wikipedia.org/wiki/Pastebin)
|
**PrivateBin** is a minimalist, open source online pastebin where the server has
|
||||||
where the server has zero knowledge of pasted data.
|
zero knowledge of pasted data.
|
||||||
|
|
||||||
Data is encrypted and decrypted in the browser using 256bit AES in [Galois Counter mode](https://en.wikipedia.org/wiki/Galois/Counter_Mode).
|
Data is encrypted/decrypted in the browser using 256bit AES in [Galois Counter mode](https://en.wikipedia.org/wiki/Galois/Counter_Mode).
|
||||||
|
|
||||||
This is a fork of ZeroBin, originally developed by
|
This is a fork of ZeroBin, originally developed by
|
||||||
[Sébastien Sauvage](https://github.com/sebsauvage/ZeroBin). ZeroBin was refactored
|
[Sébastien Sauvage](https://github.com/sebsauvage/ZeroBin). It was refactored
|
||||||
to allow easier and cleaner extensions. PrivateBin has many more features than the
|
to allow easier and cleaner extensions and has now much more features than the
|
||||||
original ZeroBin. It is, however, still fully compatible to the original ZeroBin 0.19
|
original. It is however still fully compatible to the original ZeroBin 0.19
|
||||||
data storage scheme. Therefore, such installations can be upgraded to PrivateBin
|
data storage scheme. Therefore such installations can be upgraded to this fork
|
||||||
without losing any data.
|
without loosing any data.
|
||||||
|
|
||||||
## What PrivateBin provides
|
## What PrivateBin provides
|
||||||
|
|
||||||
@@ -38,37 +38,37 @@ without losing any data.
|
|||||||
|
|
||||||
## What it doesn't provide
|
## What it doesn't provide
|
||||||
|
|
||||||
- As a user you have to trust the server administrator not to inject any malicious
|
- As a user you have to trust the server administrator, your internet provider
|
||||||
javascript code.
|
and any country the traffic passes not to inject any malicious javascript code.
|
||||||
For basic security, the PrivateBin installation *has to provide HTTPS*!
|
For a basic security the PrivateBin installation *has to provide HTTPS*!
|
||||||
Otherwise you would also have to trust your internet provider, and any country
|
Additionally it should be secured by
|
||||||
the traffic passes through.
|
|
||||||
Additionally the instance should be secured by
|
|
||||||
[HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) and
|
[HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) and
|
||||||
ideally by [HPKP](https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning) using a
|
ideally by [HPKP](https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning) using a
|
||||||
certificate. It can use traditional certificate authorities and/or use
|
certificate either validated by a trusted third party (check the certificate
|
||||||
|
when first using a new PrivateBin instance) or self-signed by the server
|
||||||
|
operator, validated using a
|
||||||
[DNSSEC](https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions)
|
[DNSSEC](https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions)
|
||||||
protected
|
protected
|
||||||
[DANE](https://en.wikipedia.org/wiki/DNS-based_Authentication_of_Named_Entities)
|
[DANE](https://en.wikipedia.org/wiki/DNS-based_Authentication_of_Named_Entities)
|
||||||
record.
|
record.
|
||||||
|
|
||||||
- The "key" used to encrypt the paste is part of the URL. If you publicly post
|
- The "key" used to encrypt the paste is part of the URL. If you publicly post
|
||||||
the URL of a paste that is not password-protected, anyone can read it.
|
the URL of a paste that is not password-protected, everybody can read it.
|
||||||
Use a password if you want your paste to be private. In this case, make sure to
|
Use a password if you want your paste to be private. In this case make sure to
|
||||||
use a strong password and only share it privately and end-to-end-encrypted.
|
use a strong password and do only share it privately and end-to-end-encrypted.
|
||||||
|
|
||||||
- A server admin might be forced to hand over access logs to the authorities.
|
- A server admin might be forced to hand over access logs to the authorities.
|
||||||
PrivateBin encrypts your text and the discussion contents, but who accessed a
|
PrivateBin encrypts your text and the discussion contents, but who accessed it
|
||||||
paste (first) might still be disclosed via access logs.
|
first might still be disclosed via such 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 misused or the server admin could
|
on the server. However the server could be misused or the server admin could
|
||||||
be legally forced into sending malicious JavaScript to all web users, which
|
be legally forced into sending malicious JavaScript to all web users, which
|
||||||
grabs the decryption key and sends it to the server when a user accesses a
|
grabs the decryption key and send it to the server when a user accesses a
|
||||||
PrivateBin.
|
PrivateBin.
|
||||||
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
|
||||||
compromised. As long as no user accesses this instance with a previously
|
compromised. As long as no user accesses this instance with a previously
|
||||||
generated URL, the content can't be decrypted.
|
generated URL, the content can''t be decrypted.
|
||||||
|
|
||||||
## Options
|
## Options
|
||||||
|
|
||||||
@@ -90,19 +90,17 @@ file](https://github.com/PrivateBin/PrivateBin/wiki/Configuration):
|
|||||||
to adjust size limit)
|
to adjust size limit)
|
||||||
|
|
||||||
* Templates: By default there are bootstrap CSS, darkstrap and "classic ZeroBin"
|
* Templates: By default there are bootstrap CSS, darkstrap and "classic ZeroBin"
|
||||||
to choose from and it is easy to adapt these to your own websites layout or
|
themes and it is easy to adapt these to your own websites layout or create
|
||||||
create your own.
|
your own.
|
||||||
|
|
||||||
* Translation system and automatic browser language detection (if enabled in
|
* Translation system and automatic browser language detection (if enabled in
|
||||||
browser)
|
browser)
|
||||||
|
|
||||||
* Language selection (disabled by default, as it uses a session cookie)
|
* Language selection (disabled by default, as it uses a session cookie)
|
||||||
|
|
||||||
* QR code generation of URL, to easily transfer pastes over to a mobile device
|
|
||||||
|
|
||||||
## Further resources
|
## Further resources
|
||||||
|
|
||||||
* [Installation guide](https://github.com/PrivateBin/PrivateBin/blob/master/INSTALL.md#installation)
|
* [Installation guide](https://github.com/PrivateBin/PrivateBin/wiki/Installation)
|
||||||
|
|
||||||
* [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)
|
||||||
|
|
||||||
|
|||||||
1
cfg/.gitignore
vendored
Normal file
1
cfg/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/conf.ini
|
||||||
@@ -1 +1,2 @@
|
|||||||
Require all denied
|
Allow from none
|
||||||
|
Deny from all
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
;<?php http_response_code(403); /*
|
|
||||||
; config file for PrivateBin
|
; config file for PrivateBin
|
||||||
;
|
;
|
||||||
; An explanation of each setting can be find online at https://github.com/PrivateBin/PrivateBin/wiki/Configuration.
|
; An explanation of each setting can be find online at https://github.com/PrivateBin/PrivateBin/wiki/Configuration.
|
||||||
@@ -52,10 +51,6 @@ languageselection = false
|
|||||||
; the pastes encryption key
|
; the pastes encryption key
|
||||||
; urlshortener = "https://shortener.example.com/api?link="
|
; urlshortener = "https://shortener.example.com/api?link="
|
||||||
|
|
||||||
; (optional) Let users create a QR code for sharing the paste URL with one click.
|
|
||||||
; It works both when a new paste is created and when you view a paste.
|
|
||||||
; qrcode = true
|
|
||||||
|
|
||||||
; (optional) IP based icons are a weak mechanism to detect if a comment was from
|
; (optional) IP based icons are a weak mechanism to detect if a comment was from
|
||||||
; a different user when the same username was used in a comment. It might be
|
; a different user when the same username was used in a comment. It might be
|
||||||
; used to get the IP of a non anonymous comment poster if the server salt is
|
; used to get the IP of a non anonymous comment poster if the server salt is
|
||||||
@@ -69,8 +64,7 @@ languageselection = false
|
|||||||
; scripts or run your site behind certain DDoS-protection services.
|
; scripts or run your site behind certain DDoS-protection services.
|
||||||
; Check the documentation at https://content-security-policy.com/
|
; Check the documentation at https://content-security-policy.com/
|
||||||
; Note: If you use a bootstrap theme, you can remove the allow-popups from the sandbox restrictions.
|
; Note: If you use a bootstrap theme, you can remove the allow-popups from the sandbox restrictions.
|
||||||
; By default this disallows to load images from third-party servers, e.g. when they are embedded in pastes. If you wish to allow that, you can adjust the policy here. See https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-it-load-embedded-images for details.
|
; cspheader = "default-src 'none'; manifest-src 'self'; connect-src *; script-src 'self'; style-src 'self'; font-src 'self'; img-src 'self' data:; referrer no-referrer; sandbox allow-same-origin allow-scripts allow-forms allow-popups"
|
||||||
; cspheader = "default-src 'none'; manifest-src 'self'; connect-src *; script-src 'self'; style-src 'self'; font-src 'self'; img-src 'self' data:; media-src data:; object-src data:; Referrer-Policy: 'no-referrer'; sandbox allow-same-origin allow-scripts allow-forms allow-popups allow-modals"
|
|
||||||
|
|
||||||
; stay compatible with PrivateBin Alpha 0.19, less secure
|
; stay compatible with PrivateBin Alpha 0.19, less secure
|
||||||
; if enabled will use base64.js version 1.7 instead of 2.1.9 and sha1 instead of
|
; if enabled will use base64.js version 1.7 instead of 2.1.9 and sha1 instead of
|
||||||
@@ -82,6 +76,10 @@ zerobincompatibility = false
|
|||||||
; make sure the value exists in [expire_options]
|
; make sure the value exists in [expire_options]
|
||||||
default = "1week"
|
default = "1week"
|
||||||
|
|
||||||
|
; optionally the "clone" button can be disabled on expiring pastes
|
||||||
|
; note that this only hides the button, copy & paste is still possible
|
||||||
|
; clone = false
|
||||||
|
|
||||||
[expire_options]
|
[expire_options]
|
||||||
; Set each one of these to the number of seconds in the expiration period,
|
; Set each one of these to the number of seconds in the expiration period,
|
||||||
; or 0 if it should never expire
|
; or 0 if it should never expire
|
||||||
@@ -11,15 +11,21 @@
|
|||||||
"source": "https://github.com/PrivateBin/PrivateBin",
|
"source": "https://github.com/PrivateBin/PrivateBin",
|
||||||
"docs": "https://zerobin.dssr.ch/documentation/"
|
"docs": "https://zerobin.dssr.ch/documentation/"
|
||||||
},
|
},
|
||||||
|
"repositories": [
|
||||||
|
{
|
||||||
|
"type": "vcs",
|
||||||
|
"url": "https://github.com/PrivateBin/PrivateBin"
|
||||||
|
}
|
||||||
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^5.4.0 || ^7.0",
|
"php": "^5.3.0 || ^7.0",
|
||||||
"paragonie/random_compat": "2.0.15",
|
"paragonie/random_compat": "2.0.4",
|
||||||
"yzalis/identicon": "1.1.0"
|
"yzalis/identicon": "1.1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"codacy/coverage": "dev-master",
|
"codacy/coverage": "dev-master",
|
||||||
"codeclimate/php-test-reporter": "dev-master",
|
"codeclimate/php-test-reporter": "dev-master",
|
||||||
"phpunit/phpunit": "^4.6 || ^5.0"
|
"giorgiosironi/eris": "dev-master"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
body {
|
body {
|
||||||
@@ -17,10 +17,6 @@ body.navbar-spacing {
|
|||||||
padding-top: 70px;
|
padding-top: 70px;
|
||||||
}
|
}
|
||||||
|
|
||||||
body.loading {
|
|
||||||
cursor: wait;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttondisabled {
|
.buttondisabled {
|
||||||
opacity: 0.3;
|
opacity: 0.3;
|
||||||
}
|
}
|
||||||
@@ -68,37 +64,14 @@ body.loading {
|
|||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#attachmentPreview img {
|
#image img {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
height: auto;
|
height: auto;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#attachmentPreview .pdfPreview {
|
|
||||||
width: 100%;
|
|
||||||
height: 100vh;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dragAndDropFile{
|
|
||||||
color:#777;
|
|
||||||
font-size:1em;
|
|
||||||
display:inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#deletelink {
|
#deletelink {
|
||||||
float: right;
|
float: right;
|
||||||
margin-left: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qrcodemodalClose {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
#qrcode-display {
|
|
||||||
width: 200px;
|
|
||||||
height: 200px;
|
|
||||||
margin: auto;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pastelink {
|
#pastelink {
|
||||||
@@ -129,12 +102,6 @@ body.loading {
|
|||||||
border-left: 1px solid #ccc;
|
border-left: 1px solid #ccc;
|
||||||
padding: 5px 0 5px 10px;
|
padding: 5px 0 5px 10px;
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
transition: background-color 0.75s ease-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comment.highlight {
|
|
||||||
background-color: #ffdd86;
|
|
||||||
transition: background-color 0.2s ease-in;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
footer h4 {
|
footer h4 {
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* When there is no script at all other */
|
/* When there is no script at all other */
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
pre .atn,pre .kwd,pre .tag{font-weight:700}pre.prettyprint{display:block;background-color:#333}pre .nocode{background-color:none;color:#000}pre .str{color:#ffa0a0}pre .kwd{color:khaki}pre .com{color:#87ceeb}pre .typ{color:#98fb98}pre .lit{color:#cd5c5c}pre .pln,pre .pun{color:#fff}pre .tag{color:khaki}pre .atn{color:#bdb76b}pre .atv{color:#ffa0a0}pre .dec{color:#98fb98}ol.linenums{margin-top:0;margin-bottom:0;color:#AEAEAE}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{pre.prettyprint{background-color:none}code .str,pre .str{color:#060}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#600;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#006;font-weight:700}code .atn,pre .atn{color:#404}code .atv,pre .atv{color:#060}}
|
pre.prettyprint{display:block;background-color:#333}pre .nocode{background-color:none;color:#000}pre .str{color:#ffa0a0}pre .kwd{color:#f0e68c;font-weight:bold}pre .com{color:#87ceeb}pre .typ{color:#98fb98}pre .lit{color:#cd5c5c}pre .pun{color:#fff}pre .pln{color:#fff}pre .tag{color:#f0e68c;font-weight:bold}pre .atn{color:#bdb76b;font-weight:bold}pre .atv{color:#ffa0a0}pre .dec{color:#98fb98}ol.linenums{margin-top:0;margin-bottom:0;color:#aeaeae}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{pre.prettyprint{background-color:none}pre .str,code .str{color:#060}pre .kwd,code .kwd{color:#006;font-weight:bold}pre .com,code .com{color:#600;font-style:italic}pre .typ,code .typ{color:#404;font-weight:bold}pre .lit,code .lit{color:#044}pre .pun,code .pun{color:#440}pre .pln,code .pln{color:#000}pre .tag,code .tag{color:#006;font-weight:bold}pre .atn,code .atn{color:#404}pre .atv,code .atv{color:#060}}
|
||||||
@@ -1 +1 @@
|
|||||||
a,code.prettyprint a,pre.prettyprint a{text-decoration:none}code .str,pre .str{color:#fec243}code .kwd,pre .kwd{color:#8470FF}code .com,pre .com{color:#32cd32;font-style:italic}code .typ,pre .typ{color:#6ecbcc}code .lit,pre .lit{color:#d06}code .pun,pre .pun{color:#8B8970}code .pln,pre .pln{color:#f0f0f0}code .tag,pre .tag{color:#9c9cff}code .htm,pre .htm{color:plum}code .xsl,pre .xsl{color:#d0a0d0}code .atn,pre .atn{color:#46eeee;font-weight:400}code .atv,pre .atv{color:#EEB4B4}code .dec,pre .dec{color:#3387CC}code.prettyprint,pre.prettyprint{font-family:'Droid Sans Mono','CPMono_v07 Bold','Droid Sans';font-weight:700;font-size:9pt;background-color:#0f0f0f;-moz-border-radius:8px;-webkit-border-radius:8px;-o-border-radius:8px;-ms-border-radius:8px;-khtml-border-radius:8px;border-radius:8px}pre.prettyprint{width:95%;margin:1em auto;padding:1em;white-space:pre-wrap}ol.linenums{margin-top:0;margin-bottom:0;color:#8B8970}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{code.prettyprint,pre.prettyprint{background-color:#fff}code .str,pre .str{color:#088}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#oc3;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#b66ff7;font-weight:700}code .htm,code .xsl,pre .htm,pre .xsl{color:#606;font-weight:700}code .atn,pre .atn{color:#c71585;font-weight:400}code .atv,pre .atv{color:#088;font-weight:400}}
|
pre .str,code .str{color:#fec243}pre .kwd,code .kwd{color:#8470ff}pre .com,code .com{color:#32cd32;font-style:italic}pre .typ,code .typ{color:#6ecbcc}pre .lit,code .lit{color:#d06}pre .pun,code .pun{color:#8b8970}pre .pln,code .pln{color:#f0f0f0}pre .tag,code .tag{color:#9c9cff}pre .htm,code .htm{color:#dda0dd}pre .xsl,code .xsl{color:#d0a0d0}pre .atn,code .atn{color:#46eeee;font-weight:normal}pre .atv,code .atv{color:#eeb4b4}pre .dec,code .dec{color:#3387cc}a{text-decoration:none}pre.prettyprint,code.prettyprint{font-family:'Droid Sans Mono','CPMono_v07 Bold','Droid Sans';font-weight:bold;font-size:9pt;background-color:#0f0f0f;-moz-border-radius:8px;-webkit-border-radius:8px;-o-border-radius:8px;-ms-border-radius:8px;-khtml-border-radius:8px;border-radius:8px}pre.prettyprint{width:95%;margin:1em auto;padding:1em;white-space:pre-wrap}pre.prettyprint a,code.prettyprint a{text-decoration:none}ol.linenums{margin-top:0;margin-bottom:0;color:#8b8970}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{pre.prettyprint,code.prettyprint{background-color:#fff}pre .str,code .str{color:#088}pre .kwd,code .kwd{color:#006;font-weight:bold}pre .com,code .com{color:#0c3;font-style:italic}pre .typ,code .typ{color:#404;font-weight:bold}pre .lit,code .lit{color:#044}pre .pun,code .pun{color:#440}pre .pln,code .pln{color:#000}pre .tag,code .tag{color:#b66ff7;font-weight:bold}pre .htm,code .htm{color:#606;font-weight:bold}pre .xsl,code .xsl{color:#606;font-weight:bold}pre .atn,code .atn{color:#c71585;font-weight:normal}pre .atv,code .atv{color:#088;font-weight:normal}}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.clo,.opn,.pun{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.clo,.opn,.pun{color:#440}.tag{color:#006}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
|
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
|
||||||
@@ -1 +1 @@
|
|||||||
.str{color:#EC7600}.kwd{color:#93C763}.com{color:#66747B}.typ{color:#678CB1}.lit{color:#FACD22}.pln,.pun{color:#F1F2F3}.tag{color:#8AC763}.atn{color:#E0E2E4}.atv{color:#EC7600}.dec{color:purple}pre.prettyprint{border:0 solid #888}ol.linenums{margin-top:0;margin-bottom:0}.prettyprint{background:#000}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{color:#555;list-style-type:decimal}li.L1,li.L3,li.L5,li.L7,li.L9{background:#111}@media print{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.pun{color:#440}.pln{color:#000}.tag{color:#006}.atn{color:#404}.atv{color:#060}}
|
.str{color:#ec7600}.kwd{color:#93c763}.com{color:#66747b}.typ{color:#678cb1}.lit{color:#facd22}.pun{color:#f1f2f3}.pln{color:#f1f2f3}.tag{color:#8ac763}.atn{color:#e0e2e4}.atv{color:#ec7600}.dec{color:purple}pre.prettyprint{border:0 solid #888}ol.linenums{margin-top:0;margin-bottom:0}.prettyprint{background:#000}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{color:#555;list-style-type:decimal}li.L1,li.L3,li.L5,li.L7,li.L9{background:#111}@media print{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun{color:#440}.pln{color:#000}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}
|
||||||
@@ -1 +1 @@
|
|||||||
code .str,pre .str{color:#65B042}code .kwd,pre .kwd{color:#E28964}code .com,pre .com{color:#AEAEAE;font-style:italic}code .typ,pre .typ{color:#89bdff}code .lit,pre .lit{color:#3387CC}code .pln,code .pun,pre .pln,pre .pun{color:#fff}code .tag,pre .tag{color:#89bdff}code .atn,pre .atn{color:#bdb76b}code .atv,pre .atv{color:#65B042}code .dec,pre .dec{color:#3387CC}code.prettyprint,pre.prettyprint{background-color:#000;border-radius:8px}pre.prettyprint{width:95%;margin:1em auto;padding:1em;white-space:pre-wrap}ol.linenums{margin-top:0;margin-bottom:0;color:#AEAEAE}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{code .str,pre .str{color:#060}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#600;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#006;font-weight:700}code .atn,pre .atn{color:#404}code .atv,pre .atv{color:#060}}
|
pre .str,code .str{color:#65b042}pre .kwd,code .kwd{color:#e28964}pre .com,code .com{color:#aeaeae;font-style:italic}pre .typ,code .typ{color:#89bdff}pre .lit,code .lit{color:#3387cc}pre .pun,code .pun{color:#fff}pre .pln,code .pln{color:#fff}pre .tag,code .tag{color:#89bdff}pre .atn,code .atn{color:#bdb76b}pre .atv,code .atv{color:#65b042}pre .dec,code .dec{color:#3387cc}pre.prettyprint,code.prettyprint{background-color:#000;-moz-border-radius:8px;-webkit-border-radius:8px;-o-border-radius:8px;-ms-border-radius:8px;-khtml-border-radius:8px;border-radius:8px}pre.prettyprint{width:95%;margin:1em auto;padding:1em;white-space:pre-wrap}ol.linenums{margin-top:0;margin-bottom:0;color:#aeaeae}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{pre .str,code .str{color:#060}pre .kwd,code .kwd{color:#006;font-weight:bold}pre .com,code .com{color:#600;font-style:italic}pre .typ,code .typ{color:#404;font-weight:bold}pre .lit,code .lit{color:#044}pre .pun,code .pun{color:#440}pre .pln,code .pln{color:#000}pre .tag,code .tag{color:#006;font-weight:bold}pre .atn,code .atn{color:#404}pre .atv,code .atv{color:#060}}
|
||||||
@@ -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.2.1
|
* @version 1.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.
|
||||||
@@ -72,13 +72,13 @@ h3.title {
|
|||||||
bottom: 8px;
|
bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#aboutbox {
|
#aboutbox {
|
||||||
color: #94a3b4;
|
color: #94a3b4;
|
||||||
padding: 4px 8px 4px 16px;
|
padding: 4px 8px 4px 16px;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 10px;
|
top: 10px;
|
||||||
border-left: 2px solid #94a3b4;
|
border-left: 2px solid #94a3b4;
|
||||||
float: right;
|
float: right;
|
||||||
width: 60%;
|
width: 60%;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,29 +104,17 @@ h3.title {
|
|||||||
font-family: Consolas, "Lucida Console", "DejaVu Sans Mono", Monaco, monospace;
|
font-family: Consolas, "Lucida Console", "DejaVu Sans Mono", Monaco, monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
#attachmentPreview img {
|
#image img {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
#attachmentPreview .pdfPreview {
|
#status {
|
||||||
width: 100%;
|
|
||||||
height: 100vh;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dragAndDropFile{
|
|
||||||
color:#777;
|
|
||||||
font-size:1em;
|
|
||||||
display:inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
#status {
|
|
||||||
clear: both;
|
clear: both;
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pasteresult {
|
#pasteresult {
|
||||||
background-color: #1F2833;
|
background-color: #1F2833;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
padding: 4px 12px;
|
padding: 4px 12px;
|
||||||
@@ -144,7 +132,7 @@ h3.title {
|
|||||||
|
|
||||||
#toolbar, #status { margin-bottom: 5px; }
|
#toolbar, #status { margin-bottom: 5px; }
|
||||||
|
|
||||||
#copyhint { color: #666; font-size: 0.85em }
|
#copyhint { color: #666; font-size: 0.85em; }
|
||||||
|
|
||||||
button, .button {
|
button, .button {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
@@ -261,7 +249,7 @@ input {
|
|||||||
font-weight: bold !important;
|
font-weight: bold !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#attachmentPreview, .nonworking {
|
#image, .nonworking {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
color: #000;
|
color: #000;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
version: '3'
|
|
||||||
|
|
||||||
services:
|
|
||||||
privatebin:
|
|
||||||
build: .
|
|
||||||
ports:
|
|
||||||
- "3000:80"
|
|
||||||
volumes:
|
|
||||||
- data:/var/www/html/data
|
|
||||||
# Optionally mount a custom config file
|
|
||||||
#- /srv/docker/privatebin/conf.php:/var/www/html/cfg/conf.php
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
data:
|
|
||||||
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
|
|
||||||
chown -R www-data /var/www/html/data
|
|
||||||
apache2-foreground
|
|
||||||
48
i18n/de.json
48
i18n/de.json
@@ -7,8 +7,8 @@
|
|||||||
"en": "de",
|
"en": "de",
|
||||||
"Paste does not exist, has expired or has been deleted.":
|
"Paste does not exist, has expired or has been deleted.":
|
||||||
"Diesen Text gibt es nicht, er ist abgelaufen oder wurde gelöscht.",
|
"Diesen Text gibt es nicht, er ist abgelaufen oder wurde gelöscht.",
|
||||||
"%s requires php %s or above to work. Sorry.":
|
"%s requires php 5.3.0 or above to work. Sorry.":
|
||||||
"%s benötigt PHP %s oder höher, um zu funktionieren. Sorry.",
|
"%s benötigt PHP 5.3.0 oder höher, um zu funktionieren. Sorry.",
|
||||||
"%s requires configuration section [%s] to be present in configuration file.":
|
"%s requires configuration section [%s] to be present in configuration file.":
|
||||||
"%s benötigt den Konfigurationsabschnitt [%s] in der Konfigurationsdatei um zu funktionieren.",
|
"%s benötigt den Konfigurationsabschnitt [%s] in der Konfigurationsdatei um zu funktionieren.",
|
||||||
"Please wait %d seconds between each post.":
|
"Please wait %d seconds between each post.":
|
||||||
@@ -83,25 +83,25 @@
|
|||||||
"Could not decrypt data (Wrong key?)":
|
"Could not decrypt data (Wrong key?)":
|
||||||
"Konnte Daten nicht entschlüsseln (Falscher Schlüssel?)",
|
"Konnte Daten nicht entschlüsseln (Falscher Schlüssel?)",
|
||||||
"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.":
|
||||||
"Konnte das Paste nicht löschen, es wurde nicht im Einmal-Modus gespeichert.",
|
"Konnte den Text nicht löschen, er wurde nicht im Einmal-Modus gespeichert.",
|
||||||
"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.":
|
||||||
"DIESER TEXT IST NUR FÜR DICH GEDACHT. Schließe das Fenster nicht, diese Nachricht kann nur einmal geöffnet werden.",
|
"DIESER TEXT IST NUR FÜR DICH GEDACHT. Schliesse das Fenster nicht, diese Nachricht kann nur einmal geöffnet werden.",
|
||||||
"Could not decrypt comment; Wrong key?":
|
"Could not decrypt comment; Wrong key?":
|
||||||
"Konnte Kommentar nicht entschlüsseln; Falscher Schlüssel?",
|
"Konnte Kommentar nicht entschlüsseln; Falscher Schlüssel?",
|
||||||
"Reply":
|
"Reply":
|
||||||
"Antworten",
|
"Antworten",
|
||||||
"Anonymous":
|
"Anonymous":
|
||||||
"Anonym",
|
"Anonym",
|
||||||
"Avatar generated from IP address":
|
"Anonymous avatar (Vizhash of the IP address)":
|
||||||
"Avatar (generiert aus der IP-Adresse)",
|
"Anonymer Avatar (Vizhash der IP-Addresse)",
|
||||||
"Add comment":
|
"Add comment":
|
||||||
"Kommentar hinzufügen",
|
"Kommentar hinzufügen",
|
||||||
"Optional nickname…":
|
"Optional nickname...":
|
||||||
"Optionales Pseudonym…",
|
"Optionales Pseudonym...",
|
||||||
"Post comment":
|
"Post comment":
|
||||||
"Kommentar absenden",
|
"Kommentar absenden",
|
||||||
"Sending comment…":
|
"Sending comment...":
|
||||||
"Sende Kommentar…",
|
"Sende Kommentar...",
|
||||||
"Comment posted.":
|
"Comment posted.":
|
||||||
"Kommentar gesendet.",
|
"Kommentar gesendet.",
|
||||||
"Could not refresh display: %s":
|
"Could not refresh display: %s":
|
||||||
@@ -112,28 +112,25 @@
|
|||||||
"Fehler auf dem Server oder keine Antwort vom Server",
|
"Fehler auf dem Server oder keine Antwort vom Server",
|
||||||
"Could not post comment: %s":
|
"Could not post comment: %s":
|
||||||
"Konnte Kommentar nicht senden: %s",
|
"Konnte Kommentar nicht senden: %s",
|
||||||
"Please move your mouse for more entropy…":
|
"Sending paste (Please move your mouse for more entropy)...":
|
||||||
"Bitte bewege Deine Maus um die Entropie zu erhöhen…",
|
"Sende Text (Bitte bewege Deine Maus um die Entropie zu erhöhen)...",
|
||||||
"Sending paste…":
|
"Sending paste...":
|
||||||
"Sende Paste…",
|
"Sende Text...",
|
||||||
"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>":
|
||||||
"Dein Paste ist unter <a id=\"pasteurl\" href=\"%s\">%s</a> zu finden <span id=\"copyhint\">(Drücke [Strg]+[c] um den Link zu kopieren)</span>",
|
"Dein Text ist unter <a id=\"pasteurl\" href=\"%s\">%s</a> zu finden <span id=\"copyhint\">(Drücke [Strg]+[c] um den Link zu kopieren)</span>",
|
||||||
"Delete data":
|
"Delete data":
|
||||||
"Lösche Daten",
|
"Lösche Daten",
|
||||||
"Could not create paste: %s":
|
"Could not create paste: %s":
|
||||||
"Konnte Paste nicht erstellen: %s",
|
"Konnte Text nicht erstellen: %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?)":
|
||||||
"Konnte Paste nicht entschlüsseln: Der Schlüssel fehlt in der Adresse (Hast du eine Umleitung oder einen URL-Verkürzer benutzt, der Teile der Adresse entfernt?)",
|
"Konnte Text nicht entschlüsseln: Der Schlüssel fehlt in der Adresse (Hast du eine Umleitung oder einen URL-Verkürzer benutzt, der Teile der Adresse entfernt?)",
|
||||||
"Format": "Format",
|
"Format": "Format",
|
||||||
"Plain Text": "Nur Text",
|
"Plain Text": "Nur Text",
|
||||||
"Source Code": "Quellcode",
|
"Source Code": "Quellcode",
|
||||||
"Markdown": "Markdown",
|
"Markdown": "Markdown",
|
||||||
"Download attachment": "Anhang herunterladen",
|
"Download attachment": "Anhang herunterladen",
|
||||||
"Cloned: '%s'": "Geklont: '%s'",
|
"Cloned file attached.": "Kopierte Datei angehängt.",
|
||||||
"The cloned file '%s' was attached to this paste.": "Die geklonte Datei '%s' wurde angehängt.",
|
|
||||||
"Attach a file": "Datei anhängen",
|
"Attach a file": "Datei anhängen",
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "Alternativ Drag & Drop einer Datei oder einfügen eines Bildes aus der Zwischenablage",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "Datei zu groß, um als Vorschau angezeigt zu werden. Bitte Anhang herunterladen.",
|
|
||||||
"Remove attachment": "Anhang entfernen",
|
"Remove attachment": "Anhang entfernen",
|
||||||
"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.":
|
||||||
"Dein Browser unterstützt das hochladen von verschlüsselten Dateien nicht. Bitte verwende einen neueren Browser.",
|
"Dein Browser unterstützt das hochladen von verschlüsselten Dateien nicht. Bitte verwende einen neueren Browser.",
|
||||||
@@ -149,11 +146,6 @@
|
|||||||
"Enter password":
|
"Enter password":
|
||||||
"Passwort eingeben",
|
"Passwort eingeben",
|
||||||
"Loading…": "Lädt…",
|
"Loading…": "Lädt…",
|
||||||
"Decrypting paste…": "Entschlüssle Paste…",
|
|
||||||
"Preparing new paste…": "Bereite neues Paste vor…",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
||||||
"Wenn diese Nachricht nicht mehr verschwindet, schau bitte in <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">die FAQ</a> (englisch), um zu sehen, wie der Fehler behoben werden kann.",
|
"Wenn diese Nachricht nicht mehr verschwindet, schau bitte in <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">die FAQ</a> (englisch), um zu sehen, wie der Fehler behoben werden kann."
|
||||||
"+++ no paste text +++": "+++ kein Paste-Text +++",
|
}
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Konnte Paste nicht laden: %s"
|
|
||||||
}
|
|
||||||
|
|||||||
40
i18n/es.json
40
i18n/es.json
@@ -7,10 +7,10 @@
|
|||||||
"en": "es",
|
"en": "es",
|
||||||
"Paste does not exist, has expired or has been deleted.":
|
"Paste does not exist, has expired or has been deleted.":
|
||||||
"El texto no existe, ha caducado o ha sido eliminado.",
|
"El texto no existe, ha caducado o ha sido eliminado.",
|
||||||
"%s requires php %s or above to work. Sorry.":
|
"%s requires php 5.3.0 or above to work. Sorry.":
|
||||||
"%s requiere php %s o superior para funcionar. Lo siento.",
|
"%s requiere php 5.3.0 o superior para funcionar. Lo siento.",
|
||||||
"%s requires configuration section [%s] to be present in configuration file.":
|
"%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 requiere que la sección de configuración [% s] esté presente en el archivo de configuración.",
|
||||||
"Please wait %d seconds between each post.":
|
"Please wait %d seconds between each post.":
|
||||||
"Por favor espere %d segundos entre cada publicación.",
|
"Por favor espere %d segundos entre cada publicación.",
|
||||||
"Paste is limited to %s of encrypted data.":
|
"Paste is limited to %s of encrypted data.":
|
||||||
@@ -92,16 +92,16 @@
|
|||||||
"Responder",
|
"Responder",
|
||||||
"Anonymous":
|
"Anonymous":
|
||||||
"Anónimo",
|
"Anónimo",
|
||||||
"Avatar generated from IP address":
|
"Anonymous avatar (Vizhash of the IP address)":
|
||||||
"Avatar generado a partir de la dirección IP",
|
"Avatar anónimo (Vizhash de la dirección IP)",
|
||||||
"Add comment":
|
"Add comment":
|
||||||
"Añadir comentario",
|
"Añadir comentario",
|
||||||
"Optional nickname…":
|
"Optional nickname...":
|
||||||
"Seudónimo opcional…",
|
"Seudónimo opcional...",
|
||||||
"Post comment":
|
"Post comment":
|
||||||
"Publicar comentario",
|
"Publicar comentario",
|
||||||
"Sending comment…":
|
"Sending comment...":
|
||||||
"Enviando comentario…",
|
"Enviando comentario...",
|
||||||
"Comment posted.":
|
"Comment posted.":
|
||||||
"Comentario publicado.",
|
"Comentario publicado.",
|
||||||
"Could not refresh display: %s":
|
"Could not refresh display: %s":
|
||||||
@@ -112,10 +112,10 @@
|
|||||||
"Error del servidor o el servidor no responde",
|
"Error del servidor o el servidor no responde",
|
||||||
"Could not post comment: %s":
|
"Could not post comment: %s":
|
||||||
"No fue posible publicar comentario: %s",
|
"No fue posible publicar comentario: %s",
|
||||||
"Please move your mouse for more entropy…":
|
"Sending paste (Please move your mouse for more entropy)...":
|
||||||
"Por favor, mueva el ratón para mayor entropía…",
|
"Enviando texto (Por favor, mueva el ratón para mayor entropía)...",
|
||||||
"Sending paste…":
|
"Sending paste...":
|
||||||
"Enviando texto…",
|
"Enviando texto...",
|
||||||
"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>":
|
||||||
"Su texto está en <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Presione [Ctrl]+[c] para copiar)</span>",
|
"Su texto está en <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Presione [Ctrl]+[c] para copiar)</span>",
|
||||||
"Delete data":
|
"Delete data":
|
||||||
@@ -129,11 +129,8 @@
|
|||||||
"Source Code": "Código fuente",
|
"Source Code": "Código fuente",
|
||||||
"Markdown": "Markdown",
|
"Markdown": "Markdown",
|
||||||
"Download attachment": "Descargar adjunto",
|
"Download attachment": "Descargar adjunto",
|
||||||
"Cloned: '%s'": "Clonado: '%s'.",
|
"Cloned file attached.": "Archivo clonado adjunto.",
|
||||||
"The cloned file '%s' was attached to this paste.": "El archivo clonado '%s' ha sido adjuntado a este texto.",
|
|
||||||
"Attach a file": "Adjuntar archivo",
|
"Attach a file": "Adjuntar archivo",
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
|
|
||||||
"Remove attachment": "Remover adjunto",
|
"Remove attachment": "Remover adjunto",
|
||||||
"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.":
|
||||||
"Tu navegador no admite la carga de archivos cifrados. Utilice un navegador más reciente.",
|
"Tu navegador no admite la carga de archivos cifrados. Utilice un navegador más reciente.",
|
||||||
@@ -149,11 +146,6 @@
|
|||||||
"Enter password":
|
"Enter password":
|
||||||
"Ingrese contraseña",
|
"Ingrese contraseña",
|
||||||
"Loading…": "Cargando…",
|
"Loading…": "Cargando…",
|
||||||
"Decrypting paste…": "Descifrando texto…",
|
|
||||||
"Preparing new paste…": "Preparando texto nuevo…",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
||||||
"En caso de que este mensaje nunca desaparezca por favor revise <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">este FAQ para obtener información para solucionar problemas</a>.",
|
"En caso de que este mensaje nunca desaparezca por favor revise <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">este FAQ para obtener información para solucionar problemas</a>."
|
||||||
"+++ no paste text +++": "+++ sin texto +++",
|
}
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Could not get paste data: %s"
|
|
||||||
}
|
|
||||||
|
|||||||
50
i18n/fr.json
50
i18n/fr.json
@@ -1,14 +1,14 @@
|
|||||||
{
|
{
|
||||||
"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 <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
|
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
|
||||||
"%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 <i>dans le navigateur</i> par un chiffrement AES 256 bits. Plus d'informations sur <a href=\"https://privatebin.info/\">la page du projet</a>.",
|
"%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 <i>dans le navigateur</i> par un chiffrage AES 256 bits. Plus d'informations sur <a href=\"https://privatebin.info/\">la page du projet</a>.",
|
||||||
"Because ignorance is bliss":
|
"Because ignorance is bliss":
|
||||||
"Parce que l'ignorance c'est le bonheur",
|
"Parce que l'ignorance c'est le bonheur",
|
||||||
"en": "fr",
|
"en": "fr",
|
||||||
"Paste does not exist, has expired or has been deleted.":
|
"Paste does not exist, has expired or has been deleted.":
|
||||||
"Le paste n'existe pas, a expiré, ou a été supprimé.",
|
"Le paste n'existe pas, a expiré, ou a été supprimé.",
|
||||||
"%s requires php %s or above to work. Sorry.":
|
"%s requires php 5.3.0 or above to work. Sorry.":
|
||||||
"Désolé, %s nécessite php %s ou supérieur pour fonctionner.",
|
"Désolé, %s nécessite php 5.3.0 ou supérieur pour fonctionner.",
|
||||||
"%s requires configuration section [%s] to be present in configuration file.":
|
"%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 a besoin de la section de configuration [%s] dans le fichier de configuration pour fonctionner.",
|
||||||
"Please wait %d seconds between each post.":
|
"Please wait %d seconds between each post.":
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
"Could not decrypt data (Wrong key?)":
|
"Could not decrypt data (Wrong key?)":
|
||||||
"Impossible de déchiffrer les données (mauvaise clé ?)",
|
"Impossible de déchiffrer les données (mauvaise clé ?)",
|
||||||
"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.":
|
||||||
"Impossible de supprimer le paste, car il n'a pas été stocké en mode \"Effacer après lecture\".",
|
"Impossible de supprimer le paste, car il n'a pas été stoclé en mode \"Effacer après lecture\".",
|
||||||
"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.":
|
||||||
"POUR VOS YEUX UNIQUEMENT. Ne fermez pas cette fenêtre, ce paste ne pourra plus être affiché.",
|
"POUR VOS YEUX UNIQUEMENT. Ne fermez pas cette fenêtre, ce paste ne pourra plus être affiché.",
|
||||||
"Could not decrypt comment; Wrong key?":
|
"Could not decrypt comment; Wrong key?":
|
||||||
@@ -92,16 +92,16 @@
|
|||||||
"Répondre",
|
"Répondre",
|
||||||
"Anonymous":
|
"Anonymous":
|
||||||
"Anonyme",
|
"Anonyme",
|
||||||
"Avatar generated from IP address":
|
"Anonymous avatar (Vizhash of the IP address)":
|
||||||
"Avatar généré à partir de l'adresse IP",
|
"Avatar anonyme (Vizhash de l'adresse IP)",
|
||||||
"Add comment":
|
"Add comment":
|
||||||
"Ajouter un commentaire",
|
"Ajouter un commentaire",
|
||||||
"Optional nickname…":
|
"Optional nickname...":
|
||||||
"Pseudonyme optionnel…",
|
"Pseudonyme optionnel...",
|
||||||
"Post comment":
|
"Post comment":
|
||||||
"Poster le commentaire",
|
"Poster le commentaire",
|
||||||
"Sending comment…":
|
"Sending comment...":
|
||||||
"Envoi du commentaire…",
|
"Envoi du commentaire...",
|
||||||
"Comment posted.":
|
"Comment posted.":
|
||||||
"Commentaire posté.",
|
"Commentaire posté.",
|
||||||
"Could not refresh display: %s":
|
"Could not refresh display: %s":
|
||||||
@@ -112,10 +112,10 @@
|
|||||||
"Le serveur ne répond pas ou a rencontré une erreur",
|
"Le serveur ne répond pas ou a rencontré une erreur",
|
||||||
"Could not post comment: %s":
|
"Could not post comment: %s":
|
||||||
"Impossible de poster le commentaire : %s",
|
"Impossible de poster le commentaire : %s",
|
||||||
"Please move your mouse for more entropy…":
|
"Sending paste (Please move your mouse for more entropy)...":
|
||||||
"Merci de bouger votre souris pour plus d'entropie…",
|
"Envoi du paste (Merci de bouger votre souris pour plus d'entropie)...",
|
||||||
"Sending paste…":
|
"Sending paste...":
|
||||||
"Envoi du paste…",
|
"Envoi du 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>":
|
||||||
"Votre paste est disponible à l'adresse <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Appuyez sur [Ctrl]+[c] pour copier)</span>",
|
"Votre paste est disponible à l'adresse <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Appuyez sur [Ctrl]+[c] pour copier)</span>",
|
||||||
"Delete data":
|
"Delete data":
|
||||||
@@ -123,7 +123,7 @@
|
|||||||
"Could not create paste: %s":
|
"Could not create paste: %s":
|
||||||
"Impossible de créer le paste : %s",
|
"Impossible de créer le paste : %s",
|
||||||
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
|
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
|
||||||
"Impossible de déchiffrer le paste : Clé de déchiffrement manquante dans l'URL (Avez-vous utilisé un redirecteur ou un site de réduction d'URL qui supprime une partie de l'URL ?)",
|
"Impossible de déchiffrer le paste : Clé de déchiffrage manquante dans l'URL (Avez-vous utilisé un redirecteur ou un site de réduction d'URL qui supprime une partie de l'URL ?)",
|
||||||
"B": "o",
|
"B": "o",
|
||||||
"KiB": "Kio",
|
"KiB": "Kio",
|
||||||
"MiB": "Mio",
|
"MiB": "Mio",
|
||||||
@@ -138,11 +138,8 @@
|
|||||||
"Source Code": "Code source",
|
"Source Code": "Code source",
|
||||||
"Markdown": "Markdown",
|
"Markdown": "Markdown",
|
||||||
"Download attachment": "Télécharger la pièce jointe",
|
"Download attachment": "Télécharger la pièce jointe",
|
||||||
"Cloned: '%s'": "Cloner '%s'",
|
"Cloned file attached.": "Cloner le fichier attaché.",
|
||||||
"The cloned file '%s' was attached to this paste.": "Le fichier cloné '%s' a été attaché à ce paste.",
|
|
||||||
"Attach a file": "Attacher un fichier ",
|
"Attach a file": "Attacher un fichier ",
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
|
|
||||||
"Remove attachment": "Enlever l'attachement",
|
"Remove attachment": "Enlever l'attachement",
|
||||||
"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.":
|
||||||
"Votre navigateur ne supporte pas l'envoi de fichiers chiffrés. Merci d'utiliser un navigateur plus récent.",
|
"Votre navigateur ne supporte pas l'envoi de fichiers chiffrés. Merci d'utiliser un navigateur plus récent.",
|
||||||
@@ -152,17 +149,12 @@
|
|||||||
"Editor": "Éditer",
|
"Editor": "Éditer",
|
||||||
"Preview": "Prévisualiser",
|
"Preview": "Prévisualiser",
|
||||||
"%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 requiert que le PATH se termine dans un \"%s\". Veuillez mettre à jour le PATH dans votre index.php.",
|
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.",
|
||||||
"Decrypt":
|
"Decrypt":
|
||||||
"Déchiffrer",
|
"Decrypt",
|
||||||
"Enter password":
|
"Enter password":
|
||||||
"Entrez le mot de passe",
|
"Entrez le mot de passe",
|
||||||
"Loading…": "Chargement…",
|
"Loading…": "Loading…",
|
||||||
"Decrypting paste…": "Déchiffrement du paste…",
|
|
||||||
"Preparing new paste…": "Préparation du paste…",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
||||||
"Si ce message ne disparaîssait pas, jetez un oeil à <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">cette FAQ pour des idées de résolution</a> (en Anglais).",
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a> (in English)."
|
||||||
"+++ no paste text +++": "+++ pas de paste-text +++",
|
}
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Could not get paste data: %s"
|
|
||||||
}
|
|
||||||
|
|||||||
159
i18n/hu.json
159
i18n/hu.json
@@ -1,159 +0,0 @@
|
|||||||
{
|
|
||||||
"PrivateBin": "PrivateBin",
|
|
||||||
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
|
|
||||||
"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 <i>böngésződ</i> segítségével titkosítja és oldja fel 256 bit hosszú titkosítási kulcsú AES-t használva. 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.",
|
|
||||||
"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.",
|
|
||||||
"%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.",
|
|
||||||
"Please wait %d seconds between each post.":
|
|
||||||
"Kérlek várj %d másodpercet két beküldés között.",
|
|
||||||
"Paste is limited to %s of encrypted data.":
|
|
||||||
"A bejegyzés maximális hossza: %s",
|
|
||||||
"Invalid data.":
|
|
||||||
"Érvénytelen adat.",
|
|
||||||
"You are unlucky. Try again.":
|
|
||||||
"Peched volt, próbáld újra.",
|
|
||||||
"Error saving comment. Sorry.":
|
|
||||||
"Nem sikerült menteni a hozzászólást. Bocs.",
|
|
||||||
"Error saving paste. Sorry.":
|
|
||||||
"Nem sikerült menteni a bejegyzést. Bocs.",
|
|
||||||
"Invalid paste ID.":
|
|
||||||
"Érvénytelen bejegyzés azonosító.",
|
|
||||||
"Paste is not of burn-after-reading type.":
|
|
||||||
"A bejegyzés nem semmisül meg azonnal olvasás után.",
|
|
||||||
"Wrong deletion token. Paste was not deleted.":
|
|
||||||
"Hibás törlési azonosító. A bejegyzés nem lett törölve.",
|
|
||||||
"Paste was properly deleted.":
|
|
||||||
"A bejegyzés sikeresen törölve.",
|
|
||||||
"JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
|
|
||||||
"JavaScript szükséges a %s működéséhez. Elnézést a fennakadásért.",
|
|
||||||
"%s requires a modern browser to work.":
|
|
||||||
"A %s működéséhez a jelenleginél újabb böngészőre van szükség.",
|
|
||||||
"Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
|
|
||||||
"Még mindig Internet Explorert használsz? Ideje váltani:",
|
|
||||||
"New":
|
|
||||||
"Új",
|
|
||||||
"Send":
|
|
||||||
"Beküldöm!",
|
|
||||||
"Clone":
|
|
||||||
"Másol",
|
|
||||||
"Raw text":
|
|
||||||
"A nyers szöveg",
|
|
||||||
"Expires":
|
|
||||||
"Lejárati idő",
|
|
||||||
"Burn after reading":
|
|
||||||
"Törlés az első olvasás után",
|
|
||||||
"Open discussion":
|
|
||||||
"Hozzászólások engedélyezése",
|
|
||||||
"Password (recommended)":
|
|
||||||
"Jelszó (ajánlott)",
|
|
||||||
"Discussion":
|
|
||||||
"Hozzászólások",
|
|
||||||
"Toggle navigation":
|
|
||||||
"Navigáció",
|
|
||||||
"%d seconds": ["%d másodperc", "%d másodperc"],
|
|
||||||
"%d minutes": ["%d perc", "%d perc"],
|
|
||||||
"%d hours": ["%d óra", "%d óra"],
|
|
||||||
"%d days": ["%d nap", "%d nap"],
|
|
||||||
"%d weeks": ["%d hét", "%d hét"],
|
|
||||||
"%d months": ["%d hónap", "%d hónap"],
|
|
||||||
"%d years": ["%d év", "%d év"],
|
|
||||||
"Never":
|
|
||||||
"Soha",
|
|
||||||
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
|
|
||||||
"Megjegyzés: ez egy teszt szolgáltatás, az adatok bármikor törlődhetnek. Ha visszaélsz vele, kiscicák bánhatják! :)",
|
|
||||||
"This document will expire in %d seconds.":
|
|
||||||
["Ez a bejegyzés %d másodperc után megsemmisül.", "Ez a bejegyzés %d másodperc múlva megsemmisül."],
|
|
||||||
"This document will expire in %d minutes.":
|
|
||||||
["Ez a bejegyzés %d perc után megsemmisül.", "Ez a bejegyzés %d perc múlva megsemmisül."],
|
|
||||||
"This document will expire in %d hours.":
|
|
||||||
["Ez a bejegyzés %d óra után megsemmisül.", "Ez a bejegyzés %d óra múlva megsemmisül."],
|
|
||||||
"This document will expire in %d days.":
|
|
||||||
["Ez a bejegyzés %d nap után megsemmisül.", "Ez a bejegyzés %d nap múlva megsemmisül."],
|
|
||||||
"This document will expire in %d months.":
|
|
||||||
["Ez a bejegyzés %d hónap múlva megsemmisül.", "Ez a bejegyzés %d hónap múlva megsemmisül."],
|
|
||||||
"Please enter the password for this paste:":
|
|
||||||
"Add meg a szükséges jelszót a bejegyzés megtekintéséhez:",
|
|
||||||
"Could not decrypt data (Wrong key?)":
|
|
||||||
"Nem tudtuk dekódolni az adatot. Talán rossz kulcsot adtál meg?",
|
|
||||||
"Could not delete the paste, it was not stored in burn after reading mode.":
|
|
||||||
"Nem tudtuk törölni a bejegyzést, mivel az olvasás után egyből megsemmisült. Így nem is volt tárolva.",
|
|
||||||
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
|
|
||||||
"EZT A BEJEGYZÉST CSAK TE LÁTHATOD!!! Ne csukd be ezt az ablakot, mivel nem tudod újra megnézni. Az ugyanis az első olvasás után rögtön megsemmisül.",
|
|
||||||
"Could not decrypt comment; Wrong key?":
|
|
||||||
"Nem tudtuk dekódolni a hozzászólást. Talán rossz kulcsot adtál meg?",
|
|
||||||
"Reply":
|
|
||||||
"Válasz",
|
|
||||||
"Anonymous":
|
|
||||||
"Anonymous",
|
|
||||||
"Avatar generated from IP address":
|
|
||||||
"Avatar (az IP cím alapján generáljuk)",
|
|
||||||
"Add comment":
|
|
||||||
"Hozzászólok",
|
|
||||||
"Optional nickname…":
|
|
||||||
"Becenév (már ha meg akarod adni)",
|
|
||||||
"Post comment":
|
|
||||||
"Beküld",
|
|
||||||
"Sending comment…":
|
|
||||||
"Beküldés alatt...",
|
|
||||||
"Comment posted.":
|
|
||||||
"A hozzászólás beküldve.",
|
|
||||||
"Could not refresh display: %s":
|
|
||||||
"Nem tudtuk frissíteni: %s",
|
|
||||||
"unknown status":
|
|
||||||
"Ismeretlen státusz.",
|
|
||||||
"server error or not responding":
|
|
||||||
"A szerveren hiba lépett fel vagy nem válaszol.",
|
|
||||||
"Could not post comment: %s":
|
|
||||||
"Nem tudtuk beküldeni a hozzászólást: %s",
|
|
||||||
"Please move your mouse for more entropy…":
|
|
||||||
"Nincs elég véletlenszerűség a rendszerben. Mozgasd az egered, hogy növeld az entrópiát.",
|
|
||||||
"Sending paste…":
|
|
||||||
"Bejegyzés elküldése...",
|
|
||||||
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
|
|
||||||
"A bejegyzésed a <a id=\"pasteurl\" href=\"%s\">%s</a> címen elérhető. <span id=\"copyhint\"> [Ctrl]+[c]-vel tudod vágólapra másolni.</span>",
|
|
||||||
"Delete data":
|
|
||||||
"Adat törlése",
|
|
||||||
"Could not create paste: %s":
|
|
||||||
"Nem tudtuk létrehozni a bejegyzést: %s",
|
|
||||||
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
|
|
||||||
"Nem tudjuk dekódolni a bejegyzést: a dekódoláshoz szükséges kulcs hiányzik a címből. Talán URL rövidítőt használtál ami kivágta azt belőle?",
|
|
||||||
"Format": "Formátum",
|
|
||||||
"Plain Text": "Egyszerű szöveg",
|
|
||||||
"Source Code": "Forráskód",
|
|
||||||
"Markdown": "Markdown",
|
|
||||||
"Download attachment": "Csatolmány letöltése",
|
|
||||||
"Cloned: '%s'": "'%s' másolva",
|
|
||||||
"The cloned file '%s' was attached to this paste.": "A másolt '%s' csatolmányt hozzáadtuk ehhez a bejegyzéshez.",
|
|
||||||
"Attach a file": "Fájl csatolása",
|
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "vagy húzz ide egy fájlt, netán illessz be egy képet a vágólapról.",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "A fájl túl nagy ahhoz, hogy előnézete legyen. Töltsd le, hogy megtekinthesd.",
|
|
||||||
"Remove attachment": "Csatolmány eltávolítása",
|
|
||||||
"Your browser does not support uploading encrypted files. Please use a newer browser.":
|
|
||||||
"A böngésződ nem támogatja titkosított fájlok feltöltését. Használj újabbat.",
|
|
||||||
"Invalid attachment.": "Érvénytelen csatolmány.",
|
|
||||||
"Options": "Opciók",
|
|
||||||
"Shorten URL": "URL rövidítés",
|
|
||||||
"Editor": "Szerkesztő felület",
|
|
||||||
"Preview": "Előnézet",
|
|
||||||
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
|
|
||||||
"%s számára szükséges, hogy a PATH itt végződjön: \"%s\". Kérlek frissítsd a PATH értékét az index.php fájlban.",
|
|
||||||
"Decrypt":
|
|
||||||
"Dekódolás",
|
|
||||||
"Enter password":
|
|
||||||
"Jelszó",
|
|
||||||
"Loading…": "Folyamatban...",
|
|
||||||
"Decrypting paste…": "Bejegyzés dekódolása...",
|
|
||||||
"Preparing new paste…": "Új bejegyzés előkészítése...",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
|
||||||
"Abban az esetben, ha ez az üzenet mindig látható lenne, látogass el a <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">Gyakran Ismételt Kérdések szekcióba a megoldásához</a>.",
|
|
||||||
"+++ no paste text +++": "+++ nincs beillesztett szöveg +++",
|
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Could not get paste data: %s"
|
|
||||||
}
|
|
||||||
54
i18n/it.json
54
i18n/it.json
@@ -7,8 +7,8 @@
|
|||||||
"en": "it",
|
"en": "it",
|
||||||
"Paste does not exist, has expired or has been deleted.":
|
"Paste does not exist, has expired or has been deleted.":
|
||||||
"Questo messaggio non esiste, è scaduto o è stato cancellato.",
|
"Questo messaggio non esiste, è scaduto o è stato cancellato.",
|
||||||
"%s requires php %s or above to work. Sorry.":
|
"%s requires php 5.3.0 or above to work. Sorry.":
|
||||||
"%s richiede php %s o superiore per funzionare. Ci spiace.",
|
"%s richiede PHP 5.3.0 o superiore.",
|
||||||
"%s requires configuration section [%s] to be present in configuration file.":
|
"%s requires configuration section [%s] to be present in configuration file.":
|
||||||
"%s richiede la presenza della sezione [%s] nei file di configurazione.",
|
"%s richiede la presenza della sezione [%s] nei file di configurazione.",
|
||||||
"Please wait %d seconds between each post.":
|
"Please wait %d seconds between each post.":
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
"Invalid data.":
|
"Invalid data.":
|
||||||
"Dati non validi.",
|
"Dati non validi.",
|
||||||
"You are unlucky. Try again.":
|
"You are unlucky. Try again.":
|
||||||
"Ritenta, sarai più fortunato.",
|
"Riprova, sarai più fortunato.",
|
||||||
"Error saving comment. Sorry.":
|
"Error saving comment. Sorry.":
|
||||||
"Errore durante il salvataggio del commento.",
|
"Errore durante il salvataggio del commento.",
|
||||||
"Error saving paste. Sorry.":
|
"Error saving paste. Sorry.":
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
"Never":
|
"Never":
|
||||||
"Mai",
|
"Mai",
|
||||||
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
|
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
|
||||||
"Nota: questo è un servizio di prova, i messaggi salvati possono essere cancellati in qualsiasi momento. Moriranno dei gattini se abuserai di questo servizio.",
|
"Nota: questo è un servizio di prova, i dati possono essere cancellati in qualsiasi momento. Ti preghiamo di non abusare di questo servizio, grazie.",
|
||||||
"This document will expire in %d seconds.":
|
"This document will expire in %d seconds.":
|
||||||
["Questo documento scadrà tra un secondo.", "Questo documento scadrà in %d secondi."],
|
["Questo documento scadrà tra un secondo.", "Questo documento scadrà in %d secondi."],
|
||||||
"This document will expire in %d minutes.":
|
"This document will expire in %d minutes.":
|
||||||
@@ -87,41 +87,41 @@
|
|||||||
"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. Non chiudere questa finestra, il messaggio non può essere visualizzato una seconda volta.",
|
"FOR YOUR EYES ONLY. Non chiudere questa finestra, il messaggio non può essere visualizzato una seconda volta.",
|
||||||
"Could not decrypt comment; Wrong key?":
|
"Could not decrypt comment; Wrong key?":
|
||||||
"Non riesco a decifrare il commento (Chiave errata?)",
|
"Non riesco a decifrari il commento (Chiave errata?)",
|
||||||
"Reply":
|
"Reply":
|
||||||
"Rispondi",
|
"Rispondi",
|
||||||
"Anonymous":
|
"Anonymous":
|
||||||
"Anonimo",
|
"Anonimo",
|
||||||
"Avatar generated from IP address":
|
"Anonymous avatar (Vizhash of the IP address)":
|
||||||
"Avatar generato dall'indirizzo IP)",
|
"Avatar Anonino (Vizhash dell'indirizzo IP)",
|
||||||
"Add comment":
|
"Add comment":
|
||||||
"Aggiungi un commento",
|
"Aggiungi un commento",
|
||||||
"Optional nickname…":
|
"Optional nickname...":
|
||||||
"Nickname opzionale…",
|
"Nickname opzionale...",
|
||||||
"Post comment":
|
"Post comment":
|
||||||
"Invia commento",
|
"Invia commento",
|
||||||
"Sending comment…":
|
"Sending comment...":
|
||||||
"Commento in fase di invio…",
|
"Commento in fase di invio...",
|
||||||
"Comment posted.":
|
"Comment posted.":
|
||||||
"Commento inviato.",
|
"Commento inviato.",
|
||||||
"Could not refresh display: %s":
|
"Could not refresh display: %s":
|
||||||
"Non riesco ad aggiornare il display: %s",
|
"Non riesco ad aggiornare il display: %s",
|
||||||
"unknown status":
|
"unknown status":
|
||||||
"stato sconosciuto",
|
"errore sconosciuto",
|
||||||
"server error or not responding":
|
"server error or not responding":
|
||||||
"errore o mancata risposta dal server",
|
"errore o mancata risposta dal server",
|
||||||
"Could not post comment: %s":
|
"Could not post comment: %s":
|
||||||
"Impossibile inviare il commento: %s",
|
"Impossibile inviare il commento: %s",
|
||||||
"Please move your mouse for more entropy…":
|
"Sending paste (Please move your mouse for more entropy)...":
|
||||||
"Muovi il mouse in modo casuale, per generare maggior entropia…",
|
"Invio messaggio (Muovi il mouse in modo casuale, per generare maggior entropia)...",
|
||||||
"Sending paste…":
|
"Sending paste...":
|
||||||
"Messaggio in fase di invio…",
|
"Messaggio in fase di invio...",
|
||||||
"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>":
|
||||||
"Il tuo messaggio è qui: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Premi [Ctrl]+[c] (Windows) o [Cmd]+[c] (Mac) per copiare il link)</span>",
|
"Il tuo messaggio è qui: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">([CTRL | CMD]+[C] per copiare il link)</span>",
|
||||||
"Delete data":
|
"Delete data":
|
||||||
"Cancella i dati",
|
"Cancella i dati",
|
||||||
"Could not create paste: %s":
|
"Could not create paste: %s":
|
||||||
"Non riesco a creare il messaggio: %s",
|
"Non rieco a creare il messaggio: %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?)":
|
||||||
"Non riesco a decifrare il messaggio: manca la chiave di decifrazione nell'URL (La chiave è parte integrante dell'URL. Per caso hai usato un Redirector o un altro servizio che ha rimosso una parte dell'URL?)",
|
"Non riesco a decifrare il messaggio: manca la chiave di decifrazione nell'URL (La chiave è parte integrante dell'URL. Per caso hai usato un Redirector o un altro servizio che ha rimosso una parte dell'URL?)",
|
||||||
"Format": "Formato",
|
"Format": "Formato",
|
||||||
@@ -129,11 +129,8 @@
|
|||||||
"Source Code": "Codice Sorgente",
|
"Source Code": "Codice Sorgente",
|
||||||
"Markdown": "Markdown",
|
"Markdown": "Markdown",
|
||||||
"Download attachment": "Scarica Allegato",
|
"Download attachment": "Scarica Allegato",
|
||||||
"Cloned: '%s'": "Clonato: '%s'",
|
"Cloned file attached.": "Copia del file allegata.",
|
||||||
"The cloned file '%s' was attached to this paste.": "Il file clonato '%s' era allegato a questo messaggio.",
|
|
||||||
"Attach a file": "Allega un file",
|
"Attach a file": "Allega un file",
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
|
|
||||||
"Remove attachment": "Rimuovi allegato",
|
"Remove attachment": "Rimuovi allegato",
|
||||||
"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.":
|
||||||
"Il tuo browser non supporta l'invio di file cifrati. Utilizza un browser più recente.",
|
"Il tuo browser non supporta l'invio di file cifrati. Utilizza un browser più recente.",
|
||||||
@@ -145,15 +142,10 @@
|
|||||||
"%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 necessita che PATH termini con \"%s\". Aggiorna la variabile PATH nel tuo index.php.",
|
"%s necessita che PATH termini con \"%s\". Aggiorna la variabile PATH nel tuo index.php.",
|
||||||
"Decrypt":
|
"Decrypt":
|
||||||
"Decifra",
|
"Decrypt",
|
||||||
"Enter password":
|
"Enter password":
|
||||||
"Inserisci la password",
|
"Inserisci la password",
|
||||||
"Loading…": "Carico…",
|
"Loading…": "Loading…",
|
||||||
"Decrypting paste…": "Decifro il messaggio…",
|
|
||||||
"Preparing new paste…": "Preparo il nuovo messaggio…",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
||||||
"Nel caso questo messaggio non scompaia, controlla questa <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">FAQ</a> per trovare informazioni su come risolvere il problema (in Inglese).",
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a> (in English)."
|
||||||
"+++ no paste text +++": "+++ nessun testo nel messaggio +++",
|
}
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Could not get paste data: %s"
|
|
||||||
}
|
|
||||||
|
|||||||
159
i18n/nl.json
159
i18n/nl.json
@@ -1,159 +0,0 @@
|
|||||||
{
|
|
||||||
"PrivateBin": "PrivateBin",
|
|
||||||
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
|
|
||||||
"%s is een minimalistische, open source online pastebin waarbij de server geen kennis heeft van de geplakte gegevens. Gegevens worden gecodeerd/gedecodeerd <i> in de browser </i> met behulp van 256 bits AES. Meer informatie is te vinden op de <a href=\"https://privatebin.info/\">projectpagina</a>.",
|
|
||||||
"Because ignorance is bliss":
|
|
||||||
"Onwetendheid is een zegen",
|
|
||||||
"en": "nl",
|
|
||||||
"Paste does not exist, has expired or has been deleted.":
|
|
||||||
"Geplakte tekst 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 configuration section [%s] to be present in configuration file.":
|
|
||||||
"%s vereist dat de configuratiesectie [%s] aanwezig is in het configuratiebestand",
|
|
||||||
"Please wait %d seconds between each post.":
|
|
||||||
"Alstublieft %d seconden wachten tussen elk bericht",
|
|
||||||
"Paste is limited to %s of encrypted data.":
|
|
||||||
"Geplakte tekst is beperkt tot %s aan versleutelde gegevens",
|
|
||||||
"Invalid data.":
|
|
||||||
"Ongeldige gegevens",
|
|
||||||
"You are unlucky. Try again.":
|
|
||||||
"Helaas. Probeer het nog eens",
|
|
||||||
"Error saving comment. Sorry.":
|
|
||||||
"Fout bij het opslaan van het commentaar. Sorry",
|
|
||||||
"Error saving paste. Sorry.":
|
|
||||||
"Fout bij het opslaan van de geplakte tekst. Sorry.",
|
|
||||||
"Invalid paste ID.":
|
|
||||||
"Ongeldige ID.",
|
|
||||||
"Paste is not of burn-after-reading type.":
|
|
||||||
"Geplakte tekst is geen 'vernietig na lezen' type",
|
|
||||||
"Wrong deletion token. Paste was not deleted.":
|
|
||||||
"Foutieve verwijdercode. Geplakte tekst is niet verwijderd.",
|
|
||||||
"Paste was properly deleted.":
|
|
||||||
"Geplakte tekst is correct verwijderd.",
|
|
||||||
"JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
|
|
||||||
"JavaScript vereist om %s te laten werken.<br />Sorry voor het ongemak.",
|
|
||||||
"%s requires a modern browser to work.":
|
|
||||||
"%s vereist een moderne browser om te kunnen werken ",
|
|
||||||
"Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
|
|
||||||
"Gebruik je nog steeds Internet explorer? Doe jezelf een plezier en maak gebruik van een moderne browser:",
|
|
||||||
"New":
|
|
||||||
"Nieuw",
|
|
||||||
"Send":
|
|
||||||
"Verzenden",
|
|
||||||
"Clone":
|
|
||||||
"Clonen",
|
|
||||||
"Raw text":
|
|
||||||
"Onbewerkte tekst",
|
|
||||||
"Expires":
|
|
||||||
"Verloopt",
|
|
||||||
"Burn after reading":
|
|
||||||
"Vernietig na lezen",
|
|
||||||
"Open discussion":
|
|
||||||
"Open discussie",
|
|
||||||
"Password (recommended)":
|
|
||||||
"Wachtwoord (aanbevolen)",
|
|
||||||
"Discussion":
|
|
||||||
"Discussie",
|
|
||||||
"Toggle navigation":
|
|
||||||
"Navigatie openen/sluiten",
|
|
||||||
"%d seconds": ["%d second", "%d seconden"],
|
|
||||||
"%d minutes": ["%d minuut", "%d minuten"],
|
|
||||||
"%d hours": ["%d uur"],
|
|
||||||
"%d days": ["%d dag", "%d dagen"],
|
|
||||||
"%d weeks": ["%d week", "%d weken"],
|
|
||||||
"%d months": ["%d maand", "%d maanden"],
|
|
||||||
"%d years": ["%d jaar"],
|
|
||||||
"Never":
|
|
||||||
"Nooit",
|
|
||||||
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
|
|
||||||
"Opmerking: Dit is een testservice: Gegevens kunnen op elk gegeven moment verwijderd worden.",
|
|
||||||
"This document will expire in %d seconds.":
|
|
||||||
["Dit document verloopt over %d second.", "Dit document verloopt over %d seconden."],
|
|
||||||
"This document will expire in %d minutes.":
|
|
||||||
["Dit document verloopt over %d minuut.", "Dit document verloopt over %d minuten"],
|
|
||||||
"This document will expire in %d hours.":
|
|
||||||
["Dit document verloopt over %d uur."],
|
|
||||||
"This document will expire in %d days.":
|
|
||||||
["Dit document verloopt over %d dag.", "Dit document verloopt over %d dagen."],
|
|
||||||
"This document will expire in %d months.":
|
|
||||||
["Dit document verloopt over %d maand.", "Dit document verloopt over %d maanden."],
|
|
||||||
"Please enter the password for this paste:":
|
|
||||||
"Voer het wachtwoord in voor deze geplakte tekst:",
|
|
||||||
"Could not decrypt data (Wrong key?)":
|
|
||||||
"Kon de gegevens niet decoderen (verkeerde sleutel?)",
|
|
||||||
"Could not delete the paste, it was not stored in burn after reading mode.":
|
|
||||||
"Verwijderen van de geplakte tekst niet mogelijk, deze werd niet opgeslagen in 'vernietig na lezen' modus.",
|
|
||||||
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
|
|
||||||
"FOR YOUR EYES ONLY. Sluit dit venster niet, dit bericht kan niet opnieuw worden weergegeven.",
|
|
||||||
"Could not decrypt comment; Wrong key?":
|
|
||||||
"Kon het commentaar niet decoderen; Verkeerde sleutel?",
|
|
||||||
"Reply":
|
|
||||||
"Beantwoorden",
|
|
||||||
"Anonymous":
|
|
||||||
"Anoniem",
|
|
||||||
"Avatar generated from IP address":
|
|
||||||
"Anonieme avatar (van het IP adres)",
|
|
||||||
"Add comment":
|
|
||||||
"Commentaar toevoegen",
|
|
||||||
"Optional nickname…":
|
|
||||||
"Optionele bijnaam…",
|
|
||||||
"Post comment":
|
|
||||||
"Plaats een commentaar",
|
|
||||||
"Sending comment…":
|
|
||||||
"Commentaar verzenden…",
|
|
||||||
"Comment posted.":
|
|
||||||
"Commentaar geplaatst.",
|
|
||||||
"Could not refresh display: %s":
|
|
||||||
"Kon de weergave niet vernieuwen: %s",
|
|
||||||
"unknown status":
|
|
||||||
"Onbekende status",
|
|
||||||
"server error or not responding":
|
|
||||||
"Serverfout of server reageert niet",
|
|
||||||
"Could not post comment: %s":
|
|
||||||
"Kon het commentaar niet plaatsen: %s",
|
|
||||||
"Please move your mouse for more entropy…":
|
|
||||||
"Aub uw muis bewegen voor meer entropie…",
|
|
||||||
"Sending paste…":
|
|
||||||
"Geplakte tekst verzenden…",
|
|
||||||
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
|
|
||||||
"Uw geplakte tekst is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Druk [Ctrl]+[c] om te kopiëren)</span>",
|
|
||||||
"Delete data":
|
|
||||||
"Gegevens wissen",
|
|
||||||
"Could not create paste: %s":
|
|
||||||
"Kon de geplakte tekst niet aanmaken: %s",
|
|
||||||
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
|
|
||||||
"Kon de geplakte tekst niet decoderen: Decoderingssleutel ontbreekt in URL (Hebt u een redirector of een URL-verkorter gebruikt die een deel van de URL verwijdert?)",
|
|
||||||
"Format": "Formaat",
|
|
||||||
"Plain Text": "Platte tekst",
|
|
||||||
"Source Code": "Broncode",
|
|
||||||
"Markdown": "Markdown",
|
|
||||||
"Download attachment": "Bijlage downloaden",
|
|
||||||
"Cloned: '%s'": "Gekloond: '%s'",
|
|
||||||
"The cloned file '%s' was attached to this paste.": "Het gekloonde bestand '%s' is bijgevoegd aan de geplakte tekst.",
|
|
||||||
"Attach a file": "Een bestand toevoegen",
|
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "U kunt ook een bestand slepen en neerzetten of een afbeelding plakken van het klembord",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "Het bestand is te groot om voorbeeld weer te geven. Aub de bijlage downloaden",
|
|
||||||
"Remove attachment": "Bijlage verwijderen",
|
|
||||||
"Your browser does not support uploading encrypted files. Please use a newer browser.":
|
|
||||||
"Uw browser biedt geen ondersteuning voor het uploaden van gecodeerde bestanden. Gebruik alstublieft een nieuwere browser",
|
|
||||||
"Invalid attachment.": "Ongeldige bijlage",
|
|
||||||
"Options": "Opties",
|
|
||||||
"Shorten URL": "URL verkorten",
|
|
||||||
"Editor": "Editor",
|
|
||||||
"Preview": "Preview",
|
|
||||||
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
|
|
||||||
"%s vereist dat het PATH eindigt in een '%s'. Aub het PATH updaten in uw index.php.",
|
|
||||||
"Decrypt":
|
|
||||||
"Decoderen",
|
|
||||||
"Enter password":
|
|
||||||
"Voer het wachtwoord in",
|
|
||||||
"Loading…": "Laden…",
|
|
||||||
"Decrypting paste…": "Geplakte tekst decoderen…",
|
|
||||||
"Preparing new paste…": "Nieuwe geplakte tekst voorbereiden…",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
|
||||||
"In het geval dat dit bericht nooit verdwijnt, kijkt u dan eens naar <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\"> veelgestelde vragen voor informatie over het oplossen van problemen </a>.",
|
|
||||||
"+++ no paste text +++": "+++ geen geplakte tekst +++",
|
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Could not get paste data: %s"
|
|
||||||
}
|
|
||||||
50
i18n/no.json
50
i18n/no.json
@@ -7,8 +7,8 @@
|
|||||||
"en": "no",
|
"en": "no",
|
||||||
"Paste does not exist, has expired or has been deleted.":
|
"Paste does not exist, has expired or has been deleted.":
|
||||||
"Innlegget eksisterer ikke, er utløpt eller har blitt slettet.",
|
"Innlegget eksisterer ikke, er utløpt eller har blitt slettet.",
|
||||||
"%s requires php %s or above to work. Sorry.":
|
"%s requires php 5.3.0 or above to work. Sorry.":
|
||||||
"Beklager, %s krever php %s eller nyere for å kjøre.",
|
"Beklager, %s krever php 5.3.0 eller nyere for å kjøre.",
|
||||||
"%s requires configuration section [%s] to be present in configuration file.":
|
"%s requires configuration section [%s] to be present in configuration file.":
|
||||||
"%s krever konfigurasjonsdel [%s] å være til stede i konfigurasjonsfilen .",
|
"%s krever konfigurasjonsdel [%s] å være til stede i konfigurasjonsfilen .",
|
||||||
"Please wait %d seconds between each post.":
|
"Please wait %d seconds between each post.":
|
||||||
@@ -26,13 +26,13 @@
|
|||||||
"Invalid paste ID.":
|
"Invalid paste ID.":
|
||||||
"Feil innlegg ID.",
|
"Feil innlegg ID.",
|
||||||
"Paste is not of burn-after-reading type.":
|
"Paste is not of burn-after-reading type.":
|
||||||
"Innlegg er ikke av typen slett etter lesing.",
|
"Innlegg er ikke av type slett-etter-lesing.",
|
||||||
"Wrong deletion token. Paste was not deleted.":
|
"Wrong deletion token. Paste was not deleted.":
|
||||||
"Feil slettingsnøkkel. Innlegg ble ikke fjernet.",
|
"Feil slettingsnøkkel. Innlegg ble ikke fjernet.",
|
||||||
"Paste was properly deleted.":
|
"Paste was properly deleted.":
|
||||||
"Innlegget er slettet.",
|
"Innlegget er slettet.",
|
||||||
"JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
|
"JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
|
||||||
"Javascript kreves for at %s skal fungere<br />Beklager.",
|
"Javascript kreves for at %s skal fungere<br />Beklager ulempene.",
|
||||||
"%s requires a modern browser to work.":
|
"%s requires a modern browser to work.":
|
||||||
"%s krever en moderne nettleser for å fungere.",
|
"%s krever en moderne nettleser for å fungere.",
|
||||||
"Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
|
"Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
"Could not decrypt data (Wrong key?)":
|
"Could not decrypt data (Wrong key?)":
|
||||||
"Kunne ikke dekryptere data (Feil nøkkel?)",
|
"Kunne ikke dekryptere data (Feil nøkkel?)",
|
||||||
"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.":
|
||||||
"Kan ikke slette innlegget, det ble ikke lagret som 'slett etter les' type.",
|
"Kan ikke slette innlegget, det ble ikke lagret i slett-etter-les modus.",
|
||||||
"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.":
|
||||||
"KUN FOR DINE ØYNE. Ikke lukk dette vinduet, denne meldingen kan ikke bli vist igjen.",
|
"KUN FOR DINE ØYNE. Ikke lukk dette vinduet, denne meldingen kan ikke bli vist igjen.",
|
||||||
"Could not decrypt comment; Wrong key?":
|
"Could not decrypt comment; Wrong key?":
|
||||||
@@ -92,30 +92,30 @@
|
|||||||
"Svar",
|
"Svar",
|
||||||
"Anonymous":
|
"Anonymous":
|
||||||
"Anonym",
|
"Anonym",
|
||||||
"Avatar generated from IP address":
|
"Anonymous avatar (Vizhash of the IP address)":
|
||||||
"Anonym avatar generert med data fra IP adressen)",
|
"Anonym avatar (Vizhash av IP adressen)",
|
||||||
"Add comment":
|
"Add comment":
|
||||||
"Legg til kommentar",
|
"Legg til kommentar",
|
||||||
"Optional nickname…":
|
"Optional nickname...":
|
||||||
"Valgfritt kallenavn…",
|
"Valgfritt kallenavn...",
|
||||||
"Post comment":
|
"Post comment":
|
||||||
"Send kommentar",
|
"Send kommentar",
|
||||||
"Sending comment…":
|
"Sending comment...":
|
||||||
"Sender Kommentar…",
|
"Sender Kommentar...",
|
||||||
"Comment posted.":
|
"Comment posted.":
|
||||||
"Kommentar sendt.",
|
"Kommentar sendt.",
|
||||||
"Could not refresh display: %s":
|
"Could not refresh display: %s":
|
||||||
"Kunne ikke oppdatere bildet: %s",
|
"Kunne ikke oppdatere skjermen: %s",
|
||||||
"unknown status":
|
"unknown status":
|
||||||
"ukjent status",
|
"ukjent status",
|
||||||
"server error or not responding":
|
"server error or not responding":
|
||||||
"tjener feilet eller svarer ikke",
|
"server feilet eller svarer ikke",
|
||||||
"Could not post comment: %s":
|
"Could not post comment: %s":
|
||||||
"Kunne ikke sende kommentar: %s",
|
"Kunne ikke sende kommentar: %s",
|
||||||
"Please move your mouse for more entropy…":
|
"Sending paste (Please move your mouse for more entropy)...":
|
||||||
"Flytt musen for mer entropi…",
|
"Sender innlegg (Flytt musen for mere entropi)...",
|
||||||
"Sending paste…":
|
"Sending paste...":
|
||||||
"Sender innlegg…",
|
"Sender innlegg...",
|
||||||
"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>":
|
||||||
"Ditt innlegg er <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Trykk [Ctrl]+[c] for å kopiere)</span>",
|
"Ditt innlegg er <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Trykk [Ctrl]+[c] for å kopiere)</span>",
|
||||||
"Delete data":
|
"Delete data":
|
||||||
@@ -129,17 +129,14 @@
|
|||||||
"Source Code": "Kildekode",
|
"Source Code": "Kildekode",
|
||||||
"Markdown": "Oppmerket",
|
"Markdown": "Oppmerket",
|
||||||
"Download attachment": "Last ned vedlegg",
|
"Download attachment": "Last ned vedlegg",
|
||||||
"Cloned: '%s'": "Kopiert: '%s'",
|
"Cloned file attached.": "Kopier vedlegg.",
|
||||||
"The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.",
|
|
||||||
"Attach a file": "Legg til fil",
|
"Attach a file": "Legg til fil",
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
|
|
||||||
"Remove attachment": "Slett vedlegg",
|
"Remove attachment": "Slett vedlegg",
|
||||||
"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.":
|
||||||
"Nettleseren din støtter ikke å laste opp krypterte filer. Vennligst bruk en nyere nettleser.",
|
"Nettleseren din støtter ikke å laste opp krypterte filer. Vennligst bruk en nyere nettleser.",
|
||||||
"Invalid attachment.": "Ugyldig vedlegg.",
|
"Invalid attachment.": "Ugyldig vedlegg.",
|
||||||
"Options": "Alternativer",
|
"Options": "Alternativer",
|
||||||
"Shorten URL": "Adresse forkorter",
|
"Shorten URL": "Adresse-forkorter",
|
||||||
"Editor": "Rediger",
|
"Editor": "Rediger",
|
||||||
"Preview": "Forhåndsvis",
|
"Preview": "Forhåndsvis",
|
||||||
"%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.":
|
||||||
@@ -149,11 +146,6 @@
|
|||||||
"Enter password":
|
"Enter password":
|
||||||
"Skriv inn passord",
|
"Skriv inn passord",
|
||||||
"Loading…": "Laster…",
|
"Loading…": "Laster…",
|
||||||
"Decrypting paste…": "Dekrypterer innlegg…",
|
|
||||||
"Preparing new paste…": "Klargjør nytt innlegg…",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
||||||
"Hvis denne meldingen ikke forsvinner kan du ta en titt på siden med <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">ofte stilte spørsmål</a> for informasjon om feilsøking.",
|
"Hvis denne meldingen ikke forsvinner kan du ta en titt på siden med <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">ofte stilte spørsmål</a> for informasjon om feilsøking."
|
||||||
"+++ no paste text +++": "+++ ingen innleggstekst +++",
|
}
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Could not get paste data: %s"
|
|
||||||
}
|
|
||||||
|
|||||||
72
i18n/oc.json
72
i18n/oc.json
@@ -1,14 +1,14 @@
|
|||||||
{
|
{
|
||||||
"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 <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
|
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
|
||||||
"%s es un 'pastebin' (o gestionari d’extrachs 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 <i>dins lo navigator</i> per un chiframent AES 256 bits. Mai informacions sus <a href=\"https://privatebin.info/\">la pagina del projècte</a>.",
|
"%s es un 'pastebin' (o gestionari d'extrachs 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 <i>dins lo navigator</i> per un chiframent AES 256 bits. Mai informacions sus <a href=\"https://privatebin.info/\">la pagina del projècte</a>.",
|
||||||
"Because ignorance is bliss":
|
"Because ignorance is bliss":
|
||||||
"Perque lo bonaür es l’ignorància",
|
"Perque l'ignorància es bonaür",
|
||||||
"en": "oc",
|
"en": "oc",
|
||||||
"Paste does not exist, has expired or has been deleted.":
|
"Paste does not exist, has expired or has been deleted.":
|
||||||
"Lo tèxte existís pas, a expirat, o es estat suprimit.",
|
"Lo tèxte existís pas, a expirat, o es estat suprimit.",
|
||||||
"%s requires php %s or above to work. Sorry.":
|
"%s requires php 5.3.0 or above to work. Sorry.":
|
||||||
"O planhèm, %s necessita php %s o superior per foncionar.",
|
"O planhèm, %s necessita php 5.3.0 o superior per foncionar.",
|
||||||
"%s requires configuration section [%s] to be present in configuration file.":
|
"%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 fa besonh de la seccion de configuracion [%s] dins lo fichièr de configuracion per foncionar.",
|
||||||
"Please wait %d seconds between each post.":
|
"Please wait %d seconds between each post.":
|
||||||
@@ -32,11 +32,11 @@
|
|||||||
"Paste was properly deleted.":
|
"Paste was properly deleted.":
|
||||||
"Lo tèxte es estat correctament suprimit.",
|
"Lo tèxte es estat correctament suprimit.",
|
||||||
"JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
|
"JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
|
||||||
"JavaScript es requesit per far foncionar %s. <br />O planhèm per l’inconvenient.",
|
"JavaScript es requesit per far foncionar %s. <br />O planhèm per l'inconvenient.",
|
||||||
"%s requires a modern browser to work.":
|
"%s requires a modern browser to work.":
|
||||||
"%s necessita un navigator modèrn per foncionar.",
|
"%s necessita un navigator modèrn per foncionar.",
|
||||||
"Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
|
"Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
|
||||||
"Encora sus Internet Explorer ? Fasètz-vos una favor, passatz a un navigator modèrn :",
|
"Encora sus Internet Explorer ? Fasètz-vos una favor, passatz a un navigator modèrn :",
|
||||||
"New":
|
"New":
|
||||||
"Nòu",
|
"Nòu",
|
||||||
"Send":
|
"Send":
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
"Never":
|
"Never":
|
||||||
"Jamai",
|
"Jamai",
|
||||||
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
|
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
|
||||||
"Nota : Aquò es un servici d’espròva : las donadas pòdon èsser suprimidas a cada moment. De catons moriràn s’abusatz d’aqueste servici.",
|
"Nota : Aquò es un servici d'espròva : las donadas pòdon èsser suprimidas a cada moment. De catons moriràn s'abusatz d'aqueste servici.",
|
||||||
"This document will expire in %d seconds.":
|
"This document will expire in %d seconds.":
|
||||||
["Ce document expirera dans %d seconde.", "Aqueste document expirarà dins %d segondas."],
|
["Ce document expirera dans %d seconde.", "Aqueste document expirarà dins %d segondas."],
|
||||||
"This document will expire in %d minutes.":
|
"This document will expire in %d minutes.":
|
||||||
@@ -79,51 +79,51 @@
|
|||||||
"This document will expire in %d months.":
|
"This document will expire in %d months.":
|
||||||
["Ce document expirera dans %d mois.", "Aqueste document expirarà dins %d meses."],
|
["Ce document expirera dans %d mois.", "Aqueste document expirarà dins %d meses."],
|
||||||
"Please enter the password for this paste:":
|
"Please enter the password for this paste:":
|
||||||
"Picatz lo senhal per aqueste tèxte :",
|
"Picatz lo senhal per aqueste tèxte :",
|
||||||
"Could not decrypt data (Wrong key?)":
|
"Could not decrypt data (Wrong key?)":
|
||||||
"Impossible de deschifrar las donadas (marrida clau ?)",
|
"Impossible de deschifrar las donadas (marrida clau ?)",
|
||||||
"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.":
|
||||||
"Impossible de suprimir lo tèxte, perque es pas estat gardat en mòde \"Escafar aprèp lectura\".",
|
"Impossible de suprimir lo tèxte, perque es pas estat gardat en mòde \"Escafar aprèp lectura\".",
|
||||||
"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.":
|
||||||
"PER VÒSTRES UÈLHS SOLAMENT. Tampetz pas aquesta fenèstra, aqueste tèxte poirà pas mai èsser afichat.",
|
"PER VÒSTRES UÈLHS SOLAMENT. Tampetz pas aquesta fenèstra, aqueste tèxte poirà pas mai èsser afichat.",
|
||||||
"Could not decrypt comment; Wrong key?":
|
"Could not decrypt comment; Wrong key?":
|
||||||
"Impossible de deschifrar lo comentari ; marrida clau ?",
|
"Impossible de deschifrar lo comentari ; marrida clau ?",
|
||||||
"Reply":
|
"Reply":
|
||||||
"Respondre",
|
"Respondre",
|
||||||
"Anonymous":
|
"Anonymous":
|
||||||
"Anonime",
|
"Anonime",
|
||||||
"Avatar generated from IP address":
|
"Anonymous avatar (Vizhash of the IP address)":
|
||||||
"Avatar anonime (Vizhash de l’adreça IP)",
|
"Avatar anonime (Vizhash de l'adreça IP)",
|
||||||
"Add comment":
|
"Add comment":
|
||||||
"Apondre un comentari",
|
"Apondre un comentari",
|
||||||
"Optional nickname…":
|
"Optional nickname...":
|
||||||
"Escais opcional…",
|
"Escais opcional...",
|
||||||
"Post comment":
|
"Post comment":
|
||||||
"Mandar lo comentari",
|
"Mandar lo comentari",
|
||||||
"Sending comment…":
|
"Sending comment...":
|
||||||
"Mandadís del comentari…",
|
"Mandadís del comentari...",
|
||||||
"Comment posted.":
|
"Comment posted.":
|
||||||
"Comentari mandat.",
|
"Comentari mandat.",
|
||||||
"Could not refresh display: %s":
|
"Could not refresh display: %s":
|
||||||
"Impossible d’actualizar l’afichatge : %s",
|
"Impossible d'actualizar l'afichatge : %s",
|
||||||
"unknown status":
|
"unknown status":
|
||||||
"Estatut desconegut",
|
"Estatut desconegut",
|
||||||
"server error or not responding":
|
"server error or not responding":
|
||||||
"Lo servidor respond pas o a rencontrat una error",
|
"Lo servidor respond pas o a rencontrat una error",
|
||||||
"Could not post comment: %s":
|
"Could not post comment: %s":
|
||||||
"Impossible de mandar lo comentari : %s",
|
"Impossible de mandar lo comentari : %s",
|
||||||
"Please move your mouse for more entropy…":
|
"Sending paste (Please move your mouse for more entropy)...":
|
||||||
"Mercés de bolegar vòstra mirga per mai entropia…",
|
"Mandadís del tèxte (Mercés de bolegar vòstra mirga per mai entropia)...",
|
||||||
"Sending paste…":
|
"Sending paste...":
|
||||||
"Mandadís del tèxte…",
|
"Mandadís del tèxte...",
|
||||||
"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>":
|
||||||
"Vòstre tèxte es disponible a l’adreça <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Picatz sus [Ctrl]+[c] per copiar)</span>",
|
"Vòstre tèxte es disponible a l'adreça <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Picatz sus [Ctrl]+[c] per copiar)</span>",
|
||||||
"Delete data":
|
"Delete data":
|
||||||
"Supprimir las donadas del tèxte",
|
"Supprimir las donadas del tèxte",
|
||||||
"Could not create paste: %s":
|
"Could not create paste: %s":
|
||||||
"Impossible de crear lo tèxte : %s",
|
"Impossible de crear lo tèxte : %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?)":
|
||||||
"Impossible de deschifrar lo tèxte : clau de deschiframent absenta de l’URL (Avètz utilizat un redirector o un site de reduccion d’URL que suprimís una partida de l’URL ?)",
|
"Impossible de deschifrar lo tèxte : Clau de deschiframent absenta de l'URL (Avètz utilizat un redirector o un site de reduccion d'URL que suprimís una partida de l'URL ?)",
|
||||||
"B": "o",
|
"B": "o",
|
||||||
"KiB": "Kio",
|
"KiB": "Kio",
|
||||||
"MiB": "Mio",
|
"MiB": "Mio",
|
||||||
@@ -138,17 +138,14 @@
|
|||||||
"Source Code": "Còdi font",
|
"Source Code": "Còdi font",
|
||||||
"Markdown": "Markdown",
|
"Markdown": "Markdown",
|
||||||
"Download attachment": "Telecargar la pèça junta",
|
"Download attachment": "Telecargar la pèça junta",
|
||||||
"Cloned: '%s'": "Clonar : '%s'",
|
"Cloned file attached.": "Clonar lo fichièr junt.",
|
||||||
"The cloned file '%s' was attached to this paste.": "Aqueste fichièr clonat '%s' es estat ajustat a aqueste tèxte.",
|
"Attach a file": "Juntar un fichièr ",
|
||||||
"Attach a file": "Juntar un fichièr",
|
"Remove attachment": "Levar la pèca junta",
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "autrament lisatz lo fichièr o pegatz l’imatge del quichapapièrs",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "Fichièr tròp pesuc per mostrar un apercebut. Telecargatz la pèca junta.",
|
|
||||||
"Remove attachment": "Levar la pèça junta",
|
|
||||||
"Your browser does not support uploading encrypted files. Please use a newer browser.":
|
"Your browser does not support uploading encrypted files. Please use a newer browser.":
|
||||||
"Vòstre navigator es pas compatible amb lo mandadís de fichièrs chifrats. Mercés d’emplegar un navigator mai recent.",
|
"Vòstre navigator es pas compatible amb lo mandadís de fichièrs chifrats. Mercés d'emplegar un navigator mai recent.",
|
||||||
"Invalid attachment.": "Pèça junta invalida.",
|
"Invalid attachment.": "Pèça junta invalida.",
|
||||||
"Options": "Opcions",
|
"Options": "Opcions",
|
||||||
"Shorten URL": "Acorchir l’URL",
|
"Shorten URL": "Acorchir l'URL",
|
||||||
"Editor": "Editar",
|
"Editor": "Editar",
|
||||||
"Preview": "Previsualizar",
|
"Preview": "Previsualizar",
|
||||||
"%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.":
|
||||||
@@ -158,11 +155,6 @@
|
|||||||
"Enter password":
|
"Enter password":
|
||||||
"Picatz lo senhal",
|
"Picatz lo senhal",
|
||||||
"Loading…": "Cargament…",
|
"Loading…": "Cargament…",
|
||||||
"Decrypting paste…": "Deschirament del tèxte…",
|
|
||||||
"Preparing new paste…": "Preparacion…",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
||||||
"Se per cas aqueste messatge quita pas de s’afichar mercés de gaitar <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">aquesta FAQ per las solucions</a> (en anglés).",
|
"Se per cas aqueste messatge quita pas de s'afichar mercés de gaitar <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">aquesta FAQ per las solucions</a> (en Anglés)."
|
||||||
"+++ no paste text +++": "+++ cap de tèxte pegat +++",
|
}
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Could not get paste data: %s"
|
|
||||||
}
|
|
||||||
|
|||||||
36
i18n/pl.json
36
i18n/pl.json
@@ -7,8 +7,8 @@
|
|||||||
"en": "pl",
|
"en": "pl",
|
||||||
"Paste does not exist, has expired or has been deleted.":
|
"Paste does not exist, has expired or has been deleted.":
|
||||||
"Wklejka nie istnieje, wygasła albo została usunięta.",
|
"Wklejka nie istnieje, wygasła albo została usunięta.",
|
||||||
"%s requires php %s or above to work. Sorry.":
|
"%s requires php 5.3.0 or above to work. Sorry.":
|
||||||
"%s wymaga PHP w wersji %s lub nowszej, sorry.",
|
"%s wymaga PHP w wersji 5.3.0 lub nowszej, sorry.",
|
||||||
"%s requires configuration section [%s] to be present in configuration file.":
|
"%s requires configuration section [%s] to be present in configuration file.":
|
||||||
"%s wymaga obecności sekcji [%s] w pliku konfiguracyjnym.",
|
"%s wymaga obecności sekcji [%s] w pliku konfiguracyjnym.",
|
||||||
"Please wait %d seconds between each post.":
|
"Please wait %d seconds between each post.":
|
||||||
@@ -92,16 +92,16 @@
|
|||||||
"Odpowiedz",
|
"Odpowiedz",
|
||||||
"Anonymous":
|
"Anonymous":
|
||||||
"Anonim",
|
"Anonim",
|
||||||
"Avatar generated from IP address":
|
"Anonymous avatar (Vizhash of the IP address)":
|
||||||
"Anonimowy avatar (Vizhash z adresu IP)",
|
"Anonimowy avatar (Vizhash z adresu IP)",
|
||||||
"Add comment":
|
"Add comment":
|
||||||
"Dodaj komentarz",
|
"Dodaj komentarz",
|
||||||
"Optional nickname…":
|
"Optional nickname...":
|
||||||
"Opcjonalny nick…",
|
"Opcjonalny nick...",
|
||||||
"Post comment":
|
"Post comment":
|
||||||
"Wyślij komentarz",
|
"Wyślij komentarz",
|
||||||
"Sending comment…":
|
"Sending comment...":
|
||||||
"Wysyłanie komentarza…",
|
"Wysyłanie komentarza...",
|
||||||
"Comment posted.":
|
"Comment posted.":
|
||||||
"Wysłano komentarz.",
|
"Wysłano komentarz.",
|
||||||
"Could not refresh display: %s":
|
"Could not refresh display: %s":
|
||||||
@@ -112,10 +112,10 @@
|
|||||||
"bląd serwera lub brak odpowiedzi",
|
"bląd serwera lub brak odpowiedzi",
|
||||||
"Could not post comment: %s":
|
"Could not post comment: %s":
|
||||||
"Nie udało się wysłać komentarza: %s",
|
"Nie udało się wysłać komentarza: %s",
|
||||||
"Please move your mouse for more entropy…":
|
"Sending paste (Please move your mouse for more entropy)...":
|
||||||
"Proszę poruszać myszą aby uzyskać większą entropię…",
|
"Wysyłanie wklejki (proszę poruszać myszą aby uzyskać większą entropię)...",
|
||||||
"Sending paste…":
|
"Sending paste...":
|
||||||
"Wysyłanie wklejki…",
|
"Wysyłanie wklejki...",
|
||||||
"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>":
|
||||||
"Twoja wklejka to <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(wciśnij [Ctrl]+[c] aby skopiować)</span>",
|
"Twoja wklejka to <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(wciśnij [Ctrl]+[c] aby skopiować)</span>",
|
||||||
"Delete data":
|
"Delete data":
|
||||||
@@ -129,11 +129,8 @@
|
|||||||
"Source Code": "Kod źródłowy",
|
"Source Code": "Kod źródłowy",
|
||||||
"Markdown": "Markdown",
|
"Markdown": "Markdown",
|
||||||
"Download attachment": "Pobierz załącznik",
|
"Download attachment": "Pobierz załącznik",
|
||||||
"Cloned: '%s'": "Sklonowano: '%s'",
|
"Cloned file attached.": "Sklonowano załączony plik.",
|
||||||
"The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.",
|
|
||||||
"Attach a file": "Załącz plik",
|
"Attach a file": "Załącz plik",
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
|
|
||||||
"Remove attachment": "Usuń załącznik",
|
"Remove attachment": "Usuń załącznik",
|
||||||
"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.":
|
||||||
"Twoja przeglądarka nie wspiera wysyłania zaszyfrowanych plików. Użyj nowszej przeglądarki.",
|
"Twoja przeglądarka nie wspiera wysyłania zaszyfrowanych plików. Użyj nowszej przeglądarki.",
|
||||||
@@ -149,11 +146,6 @@
|
|||||||
"Enter password":
|
"Enter password":
|
||||||
"Wpisz hasło",
|
"Wpisz hasło",
|
||||||
"Loading…": "Loading…",
|
"Loading…": "Loading…",
|
||||||
"Decrypting paste…": "Decrypting paste…",
|
|
||||||
"Preparing new paste…": "Preparing new paste…",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a> (in English).",
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a> (in English)."
|
||||||
"+++ no paste text +++": "+++ no paste text +++",
|
}
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Could not get paste data: %s"
|
|
||||||
}
|
|
||||||
|
|||||||
159
i18n/pt.json
159
i18n/pt.json
@@ -1,159 +0,0 @@
|
|||||||
{
|
|
||||||
"PrivateBin": "PrivateBin",
|
|
||||||
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href=\"https://privatebin.info/\">project page</a>.":
|
|
||||||
"%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 <i>no navegador</i> usando 256 bits AES. 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",
|
|
||||||
"en": "pt",
|
|
||||||
"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 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.",
|
|
||||||
"Please wait %d seconds between each post.":
|
|
||||||
"Por favor espere %d segundos entre cada publicação.",
|
|
||||||
"Paste is limited to %s of encrypted data.":
|
|
||||||
"A cópia está limitada a %s de dados cifrados.",
|
|
||||||
"Invalid data.":
|
|
||||||
"Dados inválidos.",
|
|
||||||
"You are unlucky. Try again.":
|
|
||||||
"Você é azarado. Tente novamente",
|
|
||||||
"Error saving comment. Sorry.":
|
|
||||||
"Erro ao salvar comentário. Desculpa.",
|
|
||||||
"Error saving paste. Sorry.":
|
|
||||||
"Erro ao salvar cópia. Desculpa.",
|
|
||||||
"Invalid paste ID.":
|
|
||||||
"ID de cópia inválido.",
|
|
||||||
"Paste is not of burn-after-reading type.":
|
|
||||||
"Cópia não é do tipo \"queime após ler\".",
|
|
||||||
"Wrong deletion token. Paste was not deleted.":
|
|
||||||
"Token de remoção inválido. A cópia não foi excluída.",
|
|
||||||
"Paste was properly deleted.":
|
|
||||||
"A cópia foi devidamente excluída.",
|
|
||||||
"JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
|
|
||||||
"JavaScript é necessário para que %s funcione.<br />Pedimos desculpas pela inconveniência.",
|
|
||||||
"%s requires a modern browser to work.":
|
|
||||||
"%s requer um navegador moderno para funcionar.",
|
|
||||||
"Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
|
|
||||||
"Ainda usando Internet Explorer? Faça-se um favor, mude para um navegador moderno:",
|
|
||||||
"New":
|
|
||||||
"Novo",
|
|
||||||
"Send":
|
|
||||||
"Enviar",
|
|
||||||
"Clone":
|
|
||||||
"Clonar",
|
|
||||||
"Raw text":
|
|
||||||
"Texto sem formato",
|
|
||||||
"Expires":
|
|
||||||
"Expirar em",
|
|
||||||
"Burn after reading":
|
|
||||||
"Queime após ler",
|
|
||||||
"Open discussion":
|
|
||||||
"Discussão aberta",
|
|
||||||
"Password (recommended)":
|
|
||||||
"Senha (recomendada)",
|
|
||||||
"Discussion":
|
|
||||||
"Discussão",
|
|
||||||
"Toggle navigation":
|
|
||||||
"Mudar navegação",
|
|
||||||
"%d seconds": ["%d segundo", "%d segundos"],
|
|
||||||
"%d minutes": ["%d minuto", "%d minutos"],
|
|
||||||
"%d hours": ["%d hora", "%d horas"],
|
|
||||||
"%d days": ["%d dia", "%d dias"],
|
|
||||||
"%d weeks": ["%d semana", "%d semanas"],
|
|
||||||
"%d months": ["%d mês", "%d meses"],
|
|
||||||
"%d years": ["%d ano", "%d anos"],
|
|
||||||
"Never":
|
|
||||||
"Nunca",
|
|
||||||
"Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.":
|
|
||||||
"Nota: Este é um serviço de teste. Dados podem ser perdidos a qualquer momento. Gatinhos morrerão se você abusar desse serviço.",
|
|
||||||
"This document will expire in %d seconds.":
|
|
||||||
["Este documento irá expirar em um segundo.", "Este documento irá expirar em %d segundos."],
|
|
||||||
"This document will expire in %d minutes.":
|
|
||||||
["Este documento irá expirar em um minuto.", "Este documento irá expirar em %d minutos."],
|
|
||||||
"This document will expire in %d hours.":
|
|
||||||
["Este documento irá expirar em uma hora.", "Este documento irá expirar em %d horas."],
|
|
||||||
"This document will expire in %d days.":
|
|
||||||
["Este documento irá expirar em um dia.", "Este documento irá expirar em %d dias."],
|
|
||||||
"This document will expire in %d months.":
|
|
||||||
["Este documento irá expirar em um mês.", "Este documento irá expirar em %d meses."],
|
|
||||||
"Please enter the password for this paste:":
|
|
||||||
"Por favor, digite a senha para essa cópia:",
|
|
||||||
"Could not decrypt data (Wrong key?)":
|
|
||||||
"Não foi possível decifrar os dados (Chave errada?)",
|
|
||||||
"Could not delete the paste, it was not stored in burn after reading mode.":
|
|
||||||
"Não foi possível excluir a cópia, ela não foi salva no modo de \"queime após ler\".",
|
|
||||||
"FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.":
|
|
||||||
"APENAS PARA SEUS OLHOS. Não feche essa janela, essa mensagem não pode ser exibida novamente.",
|
|
||||||
"Could not decrypt comment; Wrong key?":
|
|
||||||
"Não foi possível decifrar o comentário; Chave errada?",
|
|
||||||
"Reply":
|
|
||||||
"Responder",
|
|
||||||
"Anonymous":
|
|
||||||
"Anônimo",
|
|
||||||
"Avatar generated from IP address":
|
|
||||||
"Avatar gerado à partir do endereço IP",
|
|
||||||
"Add comment":
|
|
||||||
"Adicionar comentário",
|
|
||||||
"Optional nickname…":
|
|
||||||
"Apelido opcional…",
|
|
||||||
"Post comment":
|
|
||||||
"Publicar comentário",
|
|
||||||
"Sending comment…":
|
|
||||||
"Enviando comentário…",
|
|
||||||
"Comment posted.":
|
|
||||||
"Comentário publicado.",
|
|
||||||
"Could not refresh display: %s":
|
|
||||||
"Não foi possível atualizar a tela: %s",
|
|
||||||
"unknown status":
|
|
||||||
"Estado desconhecido",
|
|
||||||
"server error or not responding":
|
|
||||||
"Servidor em erro ou não responsivo",
|
|
||||||
"Could not post comment: %s":
|
|
||||||
"Não foi possível publicar o comentário: %s",
|
|
||||||
"Please move your mouse for more entropy…":
|
|
||||||
"Por favor, mova o mouse para maior entropia…",
|
|
||||||
"Sending paste…":
|
|
||||||
"Enviando cópia…",
|
|
||||||
"Your paste is <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Hit [Ctrl]+[c] to copy)</span>":
|
|
||||||
"Sua cópia é <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Pressione [Ctrl]+[c] para copiar)</span>",
|
|
||||||
"Delete data":
|
|
||||||
"Excluir dados",
|
|
||||||
"Could not create paste: %s":
|
|
||||||
"Não foi possível criar cópia: %s",
|
|
||||||
"Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)":
|
|
||||||
"Não foi possível decifrar a cópia: chave de decriptografia ausente na URL (Você utilizou um redirecionador ou encurtador de URL que removeu parte dela?)",
|
|
||||||
"Format": "Formato",
|
|
||||||
"Plain Text": "Texto sem formato",
|
|
||||||
"Source Code": "Código fonte",
|
|
||||||
"Markdown": "Markdown",
|
|
||||||
"Download attachment": "Baixar anexo",
|
|
||||||
"Cloned: '%s'": "Clonado: '%s'",
|
|
||||||
"The cloned file '%s' was attached to this paste.": "O arquivo clonado '%s' foi anexado a essa cópia.",
|
|
||||||
"Attach a file": "Anexar um arquivo",
|
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
|
|
||||||
"Remove attachment": "Remover anexo",
|
|
||||||
"Your browser does not support uploading encrypted files. Please use a newer browser.":
|
|
||||||
"Seu navegador não permite subir arquivos cifrados. Por favor, utilize um navegador mais recente.",
|
|
||||||
"Invalid attachment.": "Anexo inválido.",
|
|
||||||
"Options": "Opções",
|
|
||||||
"Shorten URL": "Encurtar URL",
|
|
||||||
"Editor": "Editor",
|
|
||||||
"Preview": "Visualizar",
|
|
||||||
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
|
|
||||||
"%s requer que o PATH termine em \"%s\". Por favor, atualize o PATH em seu index.php.",
|
|
||||||
"Decrypt":
|
|
||||||
"Decifrar",
|
|
||||||
"Enter password":
|
|
||||||
"Digite a senha",
|
|
||||||
"Loading…": "Carregando…",
|
|
||||||
"Decrypting paste…": "Decifrando cópia…",
|
|
||||||
"Preparing new paste…": "Preparando nova cópia…",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
|
||||||
"Caso essa mensagem nunca desapareça, por favor veja <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">este FAQ para saber como resolver os problemas</a>.",
|
|
||||||
"+++ no paste text +++": "+++ sem texto de cópia +++",
|
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Could not get paste data: %s"
|
|
||||||
}
|
|
||||||
44
i18n/ru.json
44
i18n/ru.json
@@ -7,8 +7,8 @@
|
|||||||
"en": "ru",
|
"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 requires php 5.3.0 or above to work. Sorry.":
|
||||||
"Для работы %s требуется php %s или выше. Извините.",
|
"Для работы %s требуется PHP 5.3.0 или выше. Извините.",
|
||||||
"%s requires configuration section [%s] to be present in configuration file.":
|
"%s requires configuration section [%s] to be present in configuration file.":
|
||||||
"%s необходимо наличие секции [%s] в конфигурационном файле.",
|
"%s необходимо наличие секции [%s] в конфигурационном файле.",
|
||||||
"Please wait %d seconds between each post.":
|
"Please wait %d seconds between each post.":
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
"Paste was properly deleted.":
|
"Paste was properly deleted.":
|
||||||
"Запись была успешно удалена.",
|
"Запись была успешно удалена.",
|
||||||
"JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
|
"JavaScript is required for %s to work.<br />Sorry for the inconvenience.":
|
||||||
"Для работы %s требуется включенный JavaScript.<br />Приносим извинения за неудобства.",
|
"Для работы %s требуется включенный JavaScript.<br />Приносим извинения за неудобства..",
|
||||||
"%s requires a modern browser to work.":
|
"%s requires a modern browser to work.":
|
||||||
"Для работы %s требуется более современный браузер.",
|
"Для работы %s требуется более современный браузер.",
|
||||||
"Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
|
"Still using Internet Explorer? Do yourself a favor, switch to a modern browser:":
|
||||||
@@ -92,30 +92,30 @@
|
|||||||
"Ответить",
|
"Ответить",
|
||||||
"Anonymous":
|
"Anonymous":
|
||||||
"Аноним",
|
"Аноним",
|
||||||
"Avatar generated from IP address":
|
"Anonymous avatar (Vizhash of the IP address)":
|
||||||
"Аватар, сгенерированный из IP-адреса",
|
"Анонимный аватар (Vizhash IP адреса)",
|
||||||
"Add comment":
|
"Add comment":
|
||||||
"Добавить комментарий",
|
"Добавить комментарий",
|
||||||
"Optional nickname…":
|
"Optional nickname...":
|
||||||
"Опциональный никнейм…",
|
"Опциональный никнейм...",
|
||||||
"Post comment":
|
"Post comment":
|
||||||
"Отправить комментарий",
|
"Отправить комментарий",
|
||||||
"Sending comment…":
|
"Sending comment...":
|
||||||
"Отправка комментария…",
|
"Отправка комментария...",
|
||||||
"Comment posted.":
|
"Comment posted.":
|
||||||
"Комментарий опубликован.",
|
"Комментарий опубликован.",
|
||||||
"Could not refresh display: %s":
|
"Could not refresh display: %s":
|
||||||
"Не удалось обновить отображение: %s",
|
"Невозможно обновить данные: %s",
|
||||||
"unknown status":
|
"unknown status":
|
||||||
"неизвестная причина",
|
"неизвестная причина",
|
||||||
"server error or not responding":
|
"server error or not responding":
|
||||||
"ошибка сервера или нет ответа",
|
"ошибка сервера или нет ответа",
|
||||||
"Could not post comment: %s":
|
"Could not post comment: %s":
|
||||||
"Не удалось опубликовать комментарий: %s",
|
"Не удалось опубликовать комментарий: %s",
|
||||||
"Please move your mouse for more entropy…":
|
"Sending paste (Please move your mouse for more entropy)...":
|
||||||
"Пожалуйста двигайте мышкой для большей энтропии…",
|
"Отправка записи (Пожалуйста двигайте мышкой для большей энтропии)...",
|
||||||
"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>":
|
||||||
"Ссылка на запись <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Нажмите [Ctrl]+[c] чтобы скопировать ссылку)</span>",
|
"Ссылка на запись <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Нажмите [Ctrl]+[c] чтобы скопировать ссылку)</span>",
|
||||||
"Delete data":
|
"Delete data":
|
||||||
@@ -138,12 +138,8 @@
|
|||||||
"Source Code": "Исходный код",
|
"Source Code": "Исходный код",
|
||||||
"Markdown": "Язык разметки",
|
"Markdown": "Язык разметки",
|
||||||
"Download attachment": "Скачать прикрепленный файл",
|
"Download attachment": "Скачать прикрепленный файл",
|
||||||
"Cloned: '%s'": "Дублировано: '%s'",
|
"Cloned file attached.": "Дубль файла прикреплен.",
|
||||||
"The cloned file '%s' was attached to this paste.":
|
|
||||||
"Дубликат файла '%s' был прикреплен к этой записи.",
|
|
||||||
"Attach a file": "Прикрепить файл",
|
"Attach a file": "Прикрепить файл",
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "так же можно перенести файл в окно браузера или вставить изображение из буфера",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "Файл слишком большой для отображения предпросмотра. Пожалуйста скачайте прикрепленный файл.",
|
|
||||||
"Remove attachment": "Удалить вложение",
|
"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.":
|
||||||
"Ваш браузер не поддерживает отправку зашифрованных файлов. Используйте более новый браузер.",
|
"Ваш браузер не поддерживает отправку зашифрованных файлов. Используйте более новый браузер.",
|
||||||
@@ -158,12 +154,6 @@
|
|||||||
"Расшифровать",
|
"Расшифровать",
|
||||||
"Enter password":
|
"Enter password":
|
||||||
"Введите пароль",
|
"Введите пароль",
|
||||||
"Loading…": "Загрузка…",
|
"Uploading paste… Please wait.":
|
||||||
"Decrypting paste…": "Расшифровка записи…",
|
"Отправка записи... Пожалуйста подождите."
|
||||||
"Preparing new paste…": "Подготовка новой записи…",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
|
||||||
"Если данное сообщение не исчезает длительное время, посмотрите <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">этот FAQ с информацией о возможном решении проблемы (на английском)</a>.",
|
|
||||||
"+++ no paste text +++": "+++ в записи нет текста +++",
|
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Не удалось получить данные записи: %s"
|
|
||||||
}
|
}
|
||||||
|
|||||||
32
i18n/sl.json
32
i18n/sl.json
@@ -7,8 +7,8 @@
|
|||||||
"en": "sl",
|
"en": "sl",
|
||||||
"Paste does not exist, has expired or has been deleted.":
|
"Paste does not exist, has expired or has been deleted.":
|
||||||
"Prilepek ne obstaja, mu je potekla življenjska doba, ali pa je izbrisan.",
|
"Prilepek ne obstaja, mu je potekla življenjska doba, ali pa je izbrisan.",
|
||||||
"%s requires php %s or above to work. Sorry.":
|
"%s requires php 5.3.0 or above to work. Sorry.":
|
||||||
"Oprosti, %s za delovanje potrebuje vsaj php %s.",
|
"Oprosti, %s za delovanje potrebuje vsaj php 5.3.0.",
|
||||||
"%s requires configuration section [%s] to be present in configuration file.":
|
"%s requires configuration section [%s] to be present in configuration file.":
|
||||||
"%s potrebuje sekcijo konfiguracij [%s] v konfiguracijski datoteki.",
|
"%s potrebuje sekcijo konfiguracij [%s] v konfiguracijski datoteki.",
|
||||||
"Please wait %d seconds between each post.":
|
"Please wait %d seconds between each post.":
|
||||||
@@ -92,16 +92,16 @@
|
|||||||
"Odgovori",
|
"Odgovori",
|
||||||
"Anonymous":
|
"Anonymous":
|
||||||
"Aninomno",
|
"Aninomno",
|
||||||
"Avatar generated from IP address":
|
"Anonymous avatar (Vizhash of the IP address)":
|
||||||
"Anonimen avatar (Vizhash IP naslova)",
|
"Anonimen avatar (Vizhash IP naslova)",
|
||||||
"Add comment":
|
"Add comment":
|
||||||
"Dodaj komentar",
|
"Dodaj komentar",
|
||||||
"Optional nickname…":
|
"Optional nickname...":
|
||||||
"Uporabniško ime (lahko izpustiš)",
|
"Uporabniško ime (lahko izpustiš)",
|
||||||
"Post comment":
|
"Post comment":
|
||||||
"Objavi komentar",
|
"Objavi komentar",
|
||||||
"Sending comment…":
|
"Sending comment...":
|
||||||
"Pošiljam komentar …",
|
"Pošiljam komentar ...",
|
||||||
"Comment posted.":
|
"Comment posted.":
|
||||||
"Komentar poslan.",
|
"Komentar poslan.",
|
||||||
"Could not refresh display: %s":
|
"Could not refresh display: %s":
|
||||||
@@ -112,10 +112,10 @@
|
|||||||
"napaka na strežniku, ali pa se strežnik ne odziva",
|
"napaka na strežniku, ali pa se strežnik ne odziva",
|
||||||
"Could not post comment: %s":
|
"Could not post comment: %s":
|
||||||
"Komentarja ni bilo mogoče objaviti : %s",
|
"Komentarja ni bilo mogoče objaviti : %s",
|
||||||
"Please move your mouse for more entropy…":
|
"Sending paste (Please move your mouse for more entropy)...":
|
||||||
"Prosim premakni svojo miško za več entropije…",
|
"Pošiljam prilepek (prosim premakni svojo miško za več entropije) ...",
|
||||||
"Sending paste…":
|
"Sending paste...":
|
||||||
"Pošiljam prilepek…",
|
"Pošiljam prilepek...",
|
||||||
"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>":
|
||||||
"Tvoj prilepek je dostopen na naslovu: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Pritisni [Ctrl]+[c] ali [Cmd] + [c] in skopiraj)</span>",
|
"Tvoj prilepek je dostopen na naslovu: <a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(Pritisni [Ctrl]+[c] ali [Cmd] + [c] in skopiraj)</span>",
|
||||||
"Delete data":
|
"Delete data":
|
||||||
@@ -138,11 +138,8 @@
|
|||||||
"Source Code": "Odprta koda",
|
"Source Code": "Odprta koda",
|
||||||
"Markdown": "Markdown",
|
"Markdown": "Markdown",
|
||||||
"Download attachment": "Pretoči priponko",
|
"Download attachment": "Pretoči priponko",
|
||||||
"Cloned: '%s'": "'%s' klonirana",
|
"Cloned file attached.": "Pripeta datoteka klonirana",
|
||||||
"The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.",
|
|
||||||
"Attach a file": "Pripni datoteko",
|
"Attach a file": "Pripni datoteko",
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
|
|
||||||
"Remove attachment": "Odstrani priponko",
|
"Remove attachment": "Odstrani priponko",
|
||||||
"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.":
|
||||||
"Tvoj brskalnik ne omogoča nalaganje zakodiranih datotek. Prosim uporabi novejši brskalnik.",
|
"Tvoj brskalnik ne omogoča nalaganje zakodiranih datotek. Prosim uporabi novejši brskalnik.",
|
||||||
@@ -158,11 +155,6 @@
|
|||||||
"Enter password":
|
"Enter password":
|
||||||
"Prosim vnesi geslo",
|
"Prosim vnesi geslo",
|
||||||
"Loading…": "Loading…",
|
"Loading…": "Loading…",
|
||||||
"Decrypting paste…": "Decrypting paste…",
|
|
||||||
"Preparing new paste…": "Preparing new paste…",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a> (in English).",
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a> (in English)."
|
||||||
"+++ no paste text +++": "+++ no paste text +++",
|
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Could not get paste data: %s"
|
|
||||||
}
|
}
|
||||||
|
|||||||
48
i18n/zh.json
48
i18n/zh.json
@@ -7,8 +7,8 @@
|
|||||||
"en": "zh",
|
"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 requires php 5.3.0 or above to work. Sorry.":
|
||||||
"%s需要工作于PHP %s及以上版本,抱歉。",
|
"%s需要工作于PHP 5.3.0及以上版本,抱歉。",
|
||||||
"%s requires configuration section [%s] to be present in configuration file.":
|
"%s requires configuration section [%s] to be present in configuration file.":
|
||||||
"%s需要设置配置文件中 [%s] 的部分。",
|
"%s需要设置配置文件中 [%s] 的部分。",
|
||||||
"Please wait %d seconds between each post.":
|
"Please wait %d seconds between each post.":
|
||||||
@@ -92,16 +92,16 @@
|
|||||||
"回复",
|
"回复",
|
||||||
"Anonymous":
|
"Anonymous":
|
||||||
"匿名",
|
"匿名",
|
||||||
"Avatar generated from IP address":
|
"Anonymous avatar (Vizhash of the IP address)":
|
||||||
"由IP生成的头像",
|
"匿名头像 (由IP地址生成Vizhash)",
|
||||||
"Add comment":
|
"Add comment":
|
||||||
"添加评论",
|
"添加评论",
|
||||||
"Optional nickname…":
|
"Optional nickname...":
|
||||||
"可选昵称…",
|
"可选昵称...",
|
||||||
"Post comment":
|
"Post comment":
|
||||||
"评论",
|
"评论",
|
||||||
"Sending comment…":
|
"Sending comment...":
|
||||||
"评论发送中…",
|
"评论发送中...",
|
||||||
"Comment posted.":
|
"Comment posted.":
|
||||||
"评论已发送。",
|
"评论已发送。",
|
||||||
"Could not refresh display: %s":
|
"Could not refresh display: %s":
|
||||||
@@ -112,10 +112,10 @@
|
|||||||
"服务器错误或无回应",
|
"服务器错误或无回应",
|
||||||
"Could not post comment: %s":
|
"Could not post comment: %s":
|
||||||
"无法发送评论: %s",
|
"无法发送评论: %s",
|
||||||
"Please move your mouse for more entropy…":
|
"Sending paste (Please move your mouse for more entropy)...":
|
||||||
"请移动鼠标增加随机性…",
|
"粘贴提交中 (请移动鼠标以产生更多熵)...",
|
||||||
"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>":
|
||||||
"您的粘贴的链接是<a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(按下 [Ctrl]+[c] 以复制)</span>",
|
"您的粘贴的链接是<a id=\"pasteurl\" href=\"%s\">%s</a> <span id=\"copyhint\">(按下 [Ctrl]+[c] 以复制)</span>",
|
||||||
"Delete data":
|
"Delete data":
|
||||||
@@ -129,31 +129,23 @@
|
|||||||
"Source Code": "源代码",
|
"Source Code": "源代码",
|
||||||
"Markdown": "Markdown",
|
"Markdown": "Markdown",
|
||||||
"Download attachment": "下载附件",
|
"Download attachment": "下载附件",
|
||||||
"Cloned: '%s'": "克隆: '%s'",
|
"Cloned file attached.": "已附加克隆的文件",
|
||||||
"The cloned file '%s' was attached to this paste.": "克隆文件 '%s' 已附加到此粘贴。",
|
|
||||||
"Attach a file": "添加一个附件",
|
"Attach a file": "添加一个附件",
|
||||||
"alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard",
|
|
||||||
"File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.",
|
|
||||||
"Remove attachment": "移除附件",
|
"Remove attachment": "移除附件",
|
||||||
"Your browser does not support uploading encrypted files. Please use a newer browser.":
|
"Your browser does not support uploading encrypted files. Please use a newer browser.":
|
||||||
"您的浏览器不支持上传加密的文件,请使用更新的浏览器。",
|
"您的浏览器不支持上传加密的文件,请使用更新的浏览器。",
|
||||||
"Invalid attachment.": "无效的附件",
|
"Invalid attachment.": "无效的附件",
|
||||||
"Options": "选项",
|
"Options": "选项",
|
||||||
"Shorten URL": "缩短链接",
|
"Shorten URL": "缩短链接",
|
||||||
"Editor": "编辑",
|
"Editor": "編輯",
|
||||||
"Preview": "预览",
|
"Preview": "預習",
|
||||||
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
|
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.":
|
||||||
"%s 的 PATH 变量必须结束于 \"%s\"。 请修改你的 index.php 中的 PATH 变量。",
|
"%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.",
|
||||||
"Decrypt":
|
"Decrypt":
|
||||||
"解密",
|
"Decrypt",
|
||||||
"Enter password":
|
"Enter password":
|
||||||
"输入密码",
|
"Enter password",
|
||||||
"Loading…": "载入中…",
|
"Loading…": "Loading…",
|
||||||
"Decrypting paste…": "正在解密",
|
|
||||||
"Preparing new paste…": "正在准备新的粘贴",
|
|
||||||
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a>.":
|
||||||
"如果这个消息一直不消失,请参考 <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">这里的 FAQ 进行故障排除</a> (英文版)。",
|
"In case this message never disappears please have a look at <a href=\"https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away\">this FAQ for information to troubleshoot</a> (in English)."
|
||||||
"+++ no paste text +++": "+++ 没有粘贴内容 +++",
|
|
||||||
"Could not get paste data: %s":
|
|
||||||
"Could not get paste data: %s"
|
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
img/icon_qr.png
BIN
img/icon_qr.png
Binary file not shown.
|
Before Width: | Height: | Size: 299 B |
@@ -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.2.1
|
* @version 1.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
|
||||||
@@ -15,4 +15,4 @@ define('PATH', '');
|
|||||||
|
|
||||||
define('PUBLIC_PATH', __DIR__);
|
define('PUBLIC_PATH', __DIR__);
|
||||||
require PATH . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
|
require PATH . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
|
||||||
new PrivateBin\Controller;
|
new PrivateBin\PrivateBin;
|
||||||
|
|||||||
1
js/base64-2.1.9.js
Normal file
1
js/base64-2.1.9.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
(function(global){"use strict";var _Base64=global.Base64;var version="2.1.9";var buffer;if(typeof module!=="undefined"&&module.exports){try{buffer=require("buffer").Buffer}catch(err){}}var b64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64tab=function(bin){var t={};for(var i=0,l=bin.length;i<l;i++)t[bin.charAt(i)]=i;return t}(b64chars);var fromCharCode=String.fromCharCode;var cb_utob=function(c){if(c.length<2){var cc=c.charCodeAt(0);return cc<128?c:cc<2048?fromCharCode(192|cc>>>6)+fromCharCode(128|cc&63):fromCharCode(224|cc>>>12&15)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}else{var cc=65536+(c.charCodeAt(0)-55296)*1024+(c.charCodeAt(1)-56320);return fromCharCode(240|cc>>>18&7)+fromCharCode(128|cc>>>12&63)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}};var re_utob=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;var utob=function(u){return u.replace(re_utob,cb_utob)};var cb_encode=function(ccc){var padlen=[0,2,1][ccc.length%3],ord=ccc.charCodeAt(0)<<16|(ccc.length>1?ccc.charCodeAt(1):0)<<8|(ccc.length>2?ccc.charCodeAt(2):0),chars=[b64chars.charAt(ord>>>18),b64chars.charAt(ord>>>12&63),padlen>=2?"=":b64chars.charAt(ord>>>6&63),padlen>=1?"=":b64chars.charAt(ord&63)];return chars.join("")};var btoa=global.btoa?function(b){return global.btoa(b)}:function(b){return b.replace(/[\s\S]{1,3}/g,cb_encode)};var _encode=buffer?function(u){return(u.constructor===buffer.constructor?u:new buffer(u)).toString("base64")}:function(u){return btoa(utob(u))};var encode=function(u,urisafe){return!urisafe?_encode(String(u)):_encode(String(u)).replace(/[+\/]/g,function(m0){return m0=="+"?"-":"_"}).replace(/=/g,"")};var encodeURI=function(u){return encode(u,true)};var re_btou=new RegExp(["[À-ß][-¿]","[à-ï][-¿]{2}","[ð-÷][-¿]{3}"].join("|"),"g");var cb_btou=function(cccc){switch(cccc.length){case 4:var cp=(7&cccc.charCodeAt(0))<<18|(63&cccc.charCodeAt(1))<<12|(63&cccc.charCodeAt(2))<<6|63&cccc.charCodeAt(3),offset=cp-65536;return fromCharCode((offset>>>10)+55296)+fromCharCode((offset&1023)+56320);case 3:return fromCharCode((15&cccc.charCodeAt(0))<<12|(63&cccc.charCodeAt(1))<<6|63&cccc.charCodeAt(2));default:return fromCharCode((31&cccc.charCodeAt(0))<<6|63&cccc.charCodeAt(1))}};var btou=function(b){return b.replace(re_btou,cb_btou)};var cb_decode=function(cccc){var len=cccc.length,padlen=len%4,n=(len>0?b64tab[cccc.charAt(0)]<<18:0)|(len>1?b64tab[cccc.charAt(1)]<<12:0)|(len>2?b64tab[cccc.charAt(2)]<<6:0)|(len>3?b64tab[cccc.charAt(3)]:0),chars=[fromCharCode(n>>>16),fromCharCode(n>>>8&255),fromCharCode(n&255)];chars.length-=[0,0,2,1][padlen];return chars.join("")};var atob=global.atob?function(a){return global.atob(a)}:function(a){return a.replace(/[\s\S]{1,4}/g,cb_decode)};var _decode=buffer?function(a){return(a.constructor===buffer.constructor?a:new buffer(a,"base64")).toString()}:function(a){return btou(atob(a))};var decode=function(a){return _decode(String(a).replace(/[-_]/g,function(m0){return m0=="-"?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))};var noConflict=function(){var Base64=global.Base64;global.Base64=_Base64;return Base64};global.Base64={VERSION:version,atob:atob,btoa:btoa,fromBase64:decode,toBase64:encode,utob:utob,encode:encode,encodeURI:encodeURI,btou:btou,decode:decode,noConflict:noConflict};if(typeof Object.defineProperty==="function"){var noEnum=function(v){return{value:v,enumerable:false,writable:true,configurable:true}};global.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",noEnum(function(){return decode(this)}));Object.defineProperty(String.prototype,"toBase64",noEnum(function(urisafe){return encode(this,urisafe)}));Object.defineProperty(String.prototype,"toBase64URI",noEnum(function(){return encode(this,true)}))}}if(global["Meteor"]){Base64=global.Base64}})(this);
|
||||||
@@ -1 +0,0 @@
|
|||||||
(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?module.exports=factory(global):typeof define==="function"&&define.amd?define(factory):factory(global)})(typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:this,function(global){"use strict";var _Base64=global.Base64;var version="2.4.5";var buffer;if(typeof module!=="undefined"&&module.exports){try{buffer=require("buffer").Buffer}catch(err){}}var b64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64tab=function(bin){var t={};for(var i=0,l=bin.length;i<l;i++)t[bin.charAt(i)]=i;return t}(b64chars);var fromCharCode=String.fromCharCode;var cb_utob=function(c){if(c.length<2){var cc=c.charCodeAt(0);return cc<128?c:cc<2048?fromCharCode(192|cc>>>6)+fromCharCode(128|cc&63):fromCharCode(224|cc>>>12&15)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}else{var cc=65536+(c.charCodeAt(0)-55296)*1024+(c.charCodeAt(1)-56320);return fromCharCode(240|cc>>>18&7)+fromCharCode(128|cc>>>12&63)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}};var re_utob=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;var utob=function(u){return u.replace(re_utob,cb_utob)};var cb_encode=function(ccc){var padlen=[0,2,1][ccc.length%3],ord=ccc.charCodeAt(0)<<16|(ccc.length>1?ccc.charCodeAt(1):0)<<8|(ccc.length>2?ccc.charCodeAt(2):0),chars=[b64chars.charAt(ord>>>18),b64chars.charAt(ord>>>12&63),padlen>=2?"=":b64chars.charAt(ord>>>6&63),padlen>=1?"=":b64chars.charAt(ord&63)];return chars.join("")};var btoa=global.btoa?function(b){return global.btoa(b)}:function(b){return b.replace(/[\s\S]{1,3}/g,cb_encode)};var _encode=buffer?buffer.from&&Uint8Array&&buffer.from!==Uint8Array.from?function(u){return(u.constructor===buffer.constructor?u:buffer.from(u)).toString("base64")}:function(u){return(u.constructor===buffer.constructor?u:new buffer(u)).toString("base64")}:function(u){return btoa(utob(u))};var encode=function(u,urisafe){return!urisafe?_encode(String(u)):_encode(String(u)).replace(/[+\/]/g,function(m0){return m0=="+"?"-":"_"}).replace(/=/g,"")};var encodeURI=function(u){return encode(u,true)};var re_btou=new RegExp(["[À-ß][-¿]","[à-ï][-¿]{2}","[ð-÷][-¿]{3}"].join("|"),"g");var cb_btou=function(cccc){switch(cccc.length){case 4:var cp=(7&cccc.charCodeAt(0))<<18|(63&cccc.charCodeAt(1))<<12|(63&cccc.charCodeAt(2))<<6|63&cccc.charCodeAt(3),offset=cp-65536;return fromCharCode((offset>>>10)+55296)+fromCharCode((offset&1023)+56320);case 3:return fromCharCode((15&cccc.charCodeAt(0))<<12|(63&cccc.charCodeAt(1))<<6|63&cccc.charCodeAt(2));default:return fromCharCode((31&cccc.charCodeAt(0))<<6|63&cccc.charCodeAt(1))}};var btou=function(b){return b.replace(re_btou,cb_btou)};var cb_decode=function(cccc){var len=cccc.length,padlen=len%4,n=(len>0?b64tab[cccc.charAt(0)]<<18:0)|(len>1?b64tab[cccc.charAt(1)]<<12:0)|(len>2?b64tab[cccc.charAt(2)]<<6:0)|(len>3?b64tab[cccc.charAt(3)]:0),chars=[fromCharCode(n>>>16),fromCharCode(n>>>8&255),fromCharCode(n&255)];chars.length-=[0,0,2,1][padlen];return chars.join("")};var atob=global.atob?function(a){return global.atob(a)}:function(a){return a.replace(/[\s\S]{1,4}/g,cb_decode)};var _decode=buffer?buffer.from&&Uint8Array&&buffer.from!==Uint8Array.from?function(a){return(a.constructor===buffer.constructor?a:buffer.from(a,"base64")).toString()}:function(a){return(a.constructor===buffer.constructor?a:new buffer(a,"base64")).toString()}:function(a){return btou(atob(a))};var decode=function(a){return _decode(String(a).replace(/[-_]/g,function(m0){return m0=="-"?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))};var noConflict=function(){var Base64=global.Base64;global.Base64=_Base64;return Base64};global.Base64={VERSION:version,atob:atob,btoa:btoa,fromBase64:decode,toBase64:encode,utob:utob,encode:encode,encodeURI:encodeURI,btou:btou,decode:decode,noConflict:noConflict};if(typeof Object.defineProperty==="function"){var noEnum=function(v){return{value:v,enumerable:false,writable:true,configurable:true}};global.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",noEnum(function(){return decode(this)}));Object.defineProperty(String.prototype,"toBase64",noEnum(function(urisafe){return encode(this,urisafe)}));Object.defineProperty(String.prototype,"toBase64URI",noEnum(function(){return encode(this,true)}))}}if(global["Meteor"]){Base64=global.Base64}if(typeof module!=="undefined"&&module.exports){module.exports.Base64=global.Base64}else if(typeof define==="function"&&define.amd){define([],function(){return global.Base64})}return{Base64:global.Base64}});
|
|
||||||
160
js/common.js
160
js/common.js
@@ -1,160 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
// testing prerequisites
|
|
||||||
global.assert = require('assert');
|
|
||||||
global.jsc = require('jsverify');
|
|
||||||
global.jsdom = require('jsdom-global');
|
|
||||||
global.cleanup = global.jsdom();
|
|
||||||
global.fs = require('fs');
|
|
||||||
|
|
||||||
// application libraries to test
|
|
||||||
global.$ = global.jQuery = require('./jquery-3.3.1');
|
|
||||||
global.sjcl = require('./sjcl-1.0.7');
|
|
||||||
global.Base64 = require('./base64-2.4.5').Base64;
|
|
||||||
global.RawDeflate = require('./rawdeflate-0.5').RawDeflate;
|
|
||||||
global.RawDeflate.inflate = require('./rawinflate-0.3').RawDeflate.inflate;
|
|
||||||
require('./prettify');
|
|
||||||
global.prettyPrint = window.PR.prettyPrint;
|
|
||||||
global.prettyPrintOne = window.PR.prettyPrintOne;
|
|
||||||
global.showdown = require('./showdown-1.8.6');
|
|
||||||
global.DOMPurify = require('./purify-1.0.7');
|
|
||||||
require('./bootstrap-3.3.7');
|
|
||||||
require('./privatebin');
|
|
||||||
|
|
||||||
// internal variables
|
|
||||||
var a2zString = ['a','b','c','d','e','f','g','h','i','j','k','l','m',
|
|
||||||
'n','o','p','q','r','s','t','u','v','w','x','y','z'],
|
|
||||||
alnumString = a2zString.concat(['0','1','2','3','4','5','6','7','8','9']),
|
|
||||||
queryString = alnumString.concat(['+','%','&','.','*','-','_']),
|
|
||||||
hashString = queryString.concat(['!']),
|
|
||||||
base64String = alnumString.concat(['+','/','=']).concat(
|
|
||||||
a2zString.map(function(c) {
|
|
||||||
return c.toUpperCase();
|
|
||||||
})
|
|
||||||
),
|
|
||||||
schemas = ['ftp','gopher','http','https','ws','wss'],
|
|
||||||
supportedLanguages = ['de', 'es', 'fr', 'it', 'no', 'pl', 'pt', 'oc', 'ru', 'sl', 'zh'],
|
|
||||||
mimeTypes = ['image/png', 'application/octet-stream'],
|
|
||||||
formats = ['plaintext', 'markdown', 'syntaxhighlighting'],
|
|
||||||
/**
|
|
||||||
* character to HTML entity lookup table
|
|
||||||
*
|
|
||||||
* @see {@link https://github.com/janl/mustache.js/blob/master/mustache.js#L60}
|
|
||||||
*/
|
|
||||||
entityMap = {
|
|
||||||
'&': '&',
|
|
||||||
'<': '<',
|
|
||||||
'>': '>',
|
|
||||||
'"': '"',
|
|
||||||
"'": ''',
|
|
||||||
'/': '/',
|
|
||||||
'`': '`',
|
|
||||||
'=': '='
|
|
||||||
},
|
|
||||||
logFile = fs.createWriteStream('test.log'),
|
|
||||||
mimeFile = fs.createReadStream('/etc/mime.types'),
|
|
||||||
mimeLine = '';
|
|
||||||
|
|
||||||
// redirect console messages to log file
|
|
||||||
console.info = console.warn = console.error = function () {
|
|
||||||
logFile.write(Array.prototype.slice.call(arguments).join('') + '\n');
|
|
||||||
};
|
|
||||||
|
|
||||||
// populate mime types from environment
|
|
||||||
mimeFile.on('data', function(data) {
|
|
||||||
mimeLine += data;
|
|
||||||
var index = mimeLine.indexOf('\n');
|
|
||||||
while (index > -1) {
|
|
||||||
var line = mimeLine.substring(0, index);
|
|
||||||
mimeLine = mimeLine.substring(index + 1);
|
|
||||||
parseMime(line);
|
|
||||||
index = mimeLine.indexOf('\n');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
mimeFile.on('end', function() {
|
|
||||||
if (mimeLine.length > 0) {
|
|
||||||
parseMime(mimeLine);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function parseMime(line) {
|
|
||||||
// ignore comments
|
|
||||||
var index = line.indexOf('#');
|
|
||||||
if (index > -1) {
|
|
||||||
line = line.substring(0, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ignore bits after tabs
|
|
||||||
index = line.indexOf('\t');
|
|
||||||
if (index > -1) {
|
|
||||||
line = line.substring(0, index);
|
|
||||||
}
|
|
||||||
if (line.length > 0) {
|
|
||||||
mimeTypes.push(line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// common testing helper functions
|
|
||||||
|
|
||||||
/**
|
|
||||||
* convert all applicable characters to HTML entities
|
|
||||||
*
|
|
||||||
* @see {@link https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content}
|
|
||||||
* @name htmlEntities
|
|
||||||
* @function
|
|
||||||
* @param {string} str
|
|
||||||
* @return {string} escaped HTML
|
|
||||||
*/
|
|
||||||
exports.htmlEntities = function(str) {
|
|
||||||
return String(str).replace(
|
|
||||||
/[&<>"'`=\/]/g, function(s) {
|
|
||||||
return entityMap[s];
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// provides random lowercase characters from a to z
|
|
||||||
exports.jscA2zString = function() {
|
|
||||||
return jsc.elements(a2zString);
|
|
||||||
};
|
|
||||||
|
|
||||||
// provides random lowercase alpha numeric characters (a to z and 0 to 9)
|
|
||||||
exports.jscAlnumString = function() {
|
|
||||||
return jsc.elements(alnumString);
|
|
||||||
};
|
|
||||||
|
|
||||||
// provides random characters allowed in GET queries
|
|
||||||
exports.jscQueryString = function() {
|
|
||||||
return jsc.elements(queryString);
|
|
||||||
};
|
|
||||||
|
|
||||||
// provides random characters allowed in hash queries
|
|
||||||
exports.jscHashString = function() {
|
|
||||||
return jsc.elements(hashString);
|
|
||||||
};
|
|
||||||
|
|
||||||
// provides random characters allowed in base64 encoded strings
|
|
||||||
exports.jscBase64String = function() {
|
|
||||||
return jsc.elements(base64String);
|
|
||||||
};
|
|
||||||
|
|
||||||
// provides a random URL schema supported by the whatwg-url library
|
|
||||||
exports.jscSchemas = function() {
|
|
||||||
return jsc.elements(schemas);
|
|
||||||
};
|
|
||||||
|
|
||||||
// provides a random supported language string
|
|
||||||
exports.jscSupportedLanguages = function() {
|
|
||||||
return jsc.elements(supportedLanguages);
|
|
||||||
};
|
|
||||||
|
|
||||||
// provides a random mime type
|
|
||||||
exports.jscMimeTypes = function() {
|
|
||||||
return jsc.elements(mimeTypes);
|
|
||||||
};
|
|
||||||
|
|
||||||
// provides a random PrivateBin paste formatter
|
|
||||||
exports.jscFormats = function() {
|
|
||||||
return jsc.elements(formats);
|
|
||||||
};
|
|
||||||
|
|
||||||
4
js/jquery-3.1.1.js
vendored
Normal file
4
js/jquery-3.1.1.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
js/jquery-3.3.1.js
vendored
2
js/jquery-3.3.1.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,30 +1,30 @@
|
|||||||
!function(){"undefined"!==typeof window&&(window.PR_SHOULD_USE_CONTINUATION=!0);
|
!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
|
||||||
(function(){function T(a){function d(e){var a=e.charCodeAt(0);if(92!==a)return a;var c=e.charAt(1);return(a=w[c])?a:"0"<=c&&"7">=c?parseInt(e.substring(1),8):"u"===c||"x"===c?parseInt(e.substring(2),16):e.charCodeAt(1)}function f(e){if(32>e)return(16>e?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return"\\"===e||"-"===e||"]"===e||"^"===e?"\\"+e:e}function c(e){var c=e.substring(1,e.length-1).match(RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));
|
(function(){function R(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a=
|
||||||
e=[];var a="^"===c[0],b=["["];a&&b.push("^");for(var a=a?1:0,g=c.length;a<g;++a){var h=c[a];if(/\\[bdsw]/i.test(h))b.push(h);else{var h=d(h),k;a+2<g&&"-"===c[a+1]?(k=d(c[a+2]),a+=2):k=h;e.push([h,k]);65>k||122<h||(65>k||90<h||e.push([Math.max(65,h)|32,Math.min(k,90)|32]),97>k||122<h||e.push([Math.max(97,h)&-33,Math.min(k,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});c=[];g=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=g[1]+1?g[1]=Math.max(g[1],h[1]):c.push(g=h);for(a=0;a<c.length;++a)h=
|
b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b[a],c.push(g(h[0])),
|
||||||
c[a],b.push(f(h[0])),h[1]>h[0]&&(h[1]+1>h[0]&&b.push("-"),b.push(f(h[1])));b.push("]");return b.join("")}function m(e){for(var a=e.source.match(RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g")),b=a.length,d=[],g=0,h=0;g<b;++g){var k=a[g];"("===k?++h:"\\"===k.charAt(0)&&(k=+k.substring(1))&&(k<=h?d[k]=-1:a[g]=f(k))}for(g=1;g<d.length;++g)-1===d[g]&&(d[g]=++E);for(h=g=0;g<b;++g)k=a[g],
|
h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1))&&l<=h&&
|
||||||
"("===k?(++h,d[h]||(a[g]="(?:")):"\\"===k.charAt(0)&&(k=+k.substring(1))&&k<=h&&(a[g]="\\"+d[k]);for(g=0;g<b;++g)"^"===a[g]&&"^"!==a[g+1]&&(a[g]="");if(e.ignoreCase&&q)for(g=0;g<b;++g)k=a[g],e=k.charAt(0),2<=k.length&&"["===e?a[g]=c(k):"\\"!==e&&(a[g]=k.replace(/[a-zA-Z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var E=0,q=!1,l=!1,n=0,b=a.length;n<b;++n){var p=a[n];if(p.ignoreCase)l=!0;else if(/[a-z]/i.test(p.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,
|
(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9,n:10,v:11,
|
||||||
""))){q=!0;l=!1;break}}for(var w={b:8,t:9,n:10,v:11,f:12,r:13},r=[],n=0,b=a.length;n<b;++n){p=a[n];if(p.global||p.multiline)throw Error(""+p);r.push("(?:"+m(p)+")")}return new RegExp(r.join("|"),l?"gi":"g")}function U(a,d){function f(a){var b=a.nodeType;if(1==b){if(!c.test(a.className)){for(b=a.firstChild;b;b=b.nextSibling)f(b);b=a.nodeName.toLowerCase();if("br"===b||"li"===b)m[l]="\n",q[l<<1]=E++,q[l++<<1|1]=a}}else if(3==b||4==b)b=a.nodeValue,b.length&&(b=d?b.replace(/\r\n?/g,"\n"):b.replace(/[ \t\r\n]+/g,
|
f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function S(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m[j++<<1|1]=
|
||||||
" "),m[l]=b,q[l<<1]=E,E+=b.length,q[l++<<1|1]=a)}var c=/(?:^|\s)nocode(?:\s|$)/,m=[],E=0,q=[],l=0;f(a);return{a:m.join("").replace(/\n$/,""),c:q}}function J(a,d,f,c,m){f&&(a={h:a,l:1,j:null,m:null,a:f,c:null,i:d,g:null},c(a),m.push.apply(m,a.g))}function V(a){for(var d=void 0,f=a.firstChild;f;f=f.nextSibling)var c=f.nodeType,d=1===c?d?a:f:3===c?W.test(f.nodeValue)?a:d:d;return d===a?void 0:d}function G(a,d){function f(a){for(var l=a.i,n=a.h,b=[l,"pln"],p=0,q=a.a.match(m)||[],r={},e=0,t=q.length;e<
|
a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function T(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?U.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function D(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.charAt(0)];
|
||||||
t;++e){var z=q[e],v=r[z],g=void 0,h;if("string"===typeof v)h=!1;else{var k=c[z.charAt(0)];if(k)g=z.match(k[1]),v=k[0];else{for(h=0;h<E;++h)if(k=d[h],g=z.match(k[1])){v=k[0];break}g||(v="pln")}!(h=5<=v.length&&"lang-"===v.substring(0,5))||g&&"string"===typeof g[1]||(h=!1,v="src");h||(r[z]=v)}k=p;p+=z.length;if(h){h=g[1];var A=z.indexOf(h),C=A+h.length;g[2]&&(C=z.length-g[2].length,A=C-h.length);v=v.substring(5);J(n,l+k,z.substring(0,A),f,b);J(n,l+k+A,h,K(v,h),b);J(n,l+k+C,z.substring(C),f,b)}else b.push(l+
|
if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c<i;++c){var r=
|
||||||
k,v)}a.g=b}var c={},m;(function(){for(var f=a.concat(d),l=[],n={},b=0,p=f.length;b<p;++b){var w=f[b],r=w[3];if(r)for(var e=r.length;0<=--e;)c[r.charAt(e)]=w;w=w[1];r=""+w;n.hasOwnProperty(r)||(l.push(w),n[r]=null)}l.push(/[\0-\uffff]/);m=T(l)})();var E=d.length;return f}function x(a){var d=[],f=[];a.tripleQuotedStrings?d.push(["str",/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
|
g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=R(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
|
||||||
null,"'\""]):a.multiLineStrings?d.push(["str",/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"]):d.push(["str",/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"]);a.verbatimStrings&&f.push(["str",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null]);var c=a.hashComments;c&&(a.cStyleComments?(1<c?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,
|
q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com",
|
||||||
null,"#"]),f.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])):d.push(["com",/^#[^\r\n]*/,null,"#"]));a.cStyleComments&&(f.push(["com",/^\/\/[^\r\n]*/,null]),f.push(["com",/^\/\*[\s\S]*?(?:\*\/|$)/,null]));if(c=a.regexLiterals){var m=(c=1<c?"":"\n\r")?".":"[\\S\\s]";f.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+
|
/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+
|
||||||
("/(?=[^/*"+c+"])(?:[^/\\x5B\\x5C"+c+"]|\\x5C"+m+"|\\x5B(?:[^\\x5C\\x5D"+c+"]|\\x5C"+m+")*(?:\\x5D|$))+/")+")")])}(c=a.types)&&f.push(["typ",c]);c=(""+a.keywords).replace(/^ | $/g,"");c.length&&f.push(["kwd",new RegExp("^(?:"+c.replace(/[\s,]+/g,"|")+")\\b"),null]);d.push(["pln",/^\s+/,null," \r\n\t\u00a0"]);c="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(c+="(?!s*/)");f.push(["lit",/^@[a-z_$][a-z_$@0-9]*/i,null],["typ",/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],["pln",/^[a-z_$][a-z_$@0-9]*/i,
|
s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,
|
||||||
null],["lit",/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],["pln",/^\\[\s\S]?/,null],["pun",new RegExp(c),null]);return G(d,f)}function L(a,d,f){function c(a){var b=a.nodeType;if(1==b&&!t.test(a.className))if("br"===a.nodeName.toLowerCase())m(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)c(a);else if((3==b||4==b)&&f){var e=a.nodeValue,d=e.match(q);d&&(b=e.substring(0,d.index),a.nodeValue=b,(e=e.substring(d.index+
|
q],["pun",RegExp(b),q]);return D(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d=
|
||||||
d[0].length))&&a.parentNode.insertBefore(l.createTextNode(e),a.nextSibling),m(a),b||a.parentNode.removeChild(a))}}function m(a){function c(a,b){var e=b?a.cloneNode(!1):a,k=a.parentNode;if(k){var k=c(k,1),d=a.nextSibling;k.appendChild(e);for(var f=d;f;f=d)d=f.nextSibling,k.appendChild(f)}return e}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;a=c(a.nextSibling,0);for(var e;(e=a.parentNode)&&1===e.nodeType;)a=e;b.push(a)}for(var t=/(?:^|\s)nocode(?:\s|$)/,q=/\r\n?|\n/,l=a.ownerDocument,n=l.createElement("li");a.firstChild;)n.appendChild(a.firstChild);
|
c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var r=j.createElement("ol");
|
||||||
for(var b=[n],p=0;p<b.length;++p)c(b[p]);d===(d|0)&&b[0].setAttribute("value",d);var w=l.createElement("ol");w.className="linenums";d=Math.max(0,d-1|0)||0;for(var p=0,r=b.length;p<r;++p)n=b[p],n.className="L"+(p+d)%10,n.firstChild||n.appendChild(l.createTextNode("\u00a0")),w.appendChild(n);a.appendChild(w)}function t(a,d){for(var f=d.length;0<=--f;){var c=d[f];I.hasOwnProperty(c)?D.console&&console.warn("cannot override language handler %s",c):I[c]=a}}function K(a,d){a&&I.hasOwnProperty(a)||(a=/^\s*</.test(d)?
|
r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?E.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=S(a.c,a.i),b=g.a;
|
||||||
"default-markup":"default-code");return I[a]}function M(a){var d=a.j;try{var f=U(a.h,a.l),c=f.a;a.a=c;a.c=f.c;a.i=0;K(d,c)(a);var m=/\bMSIE\s(\d+)/.exec(navigator.userAgent),m=m&&8>=+m[1],d=/\n/g,t=a.a,q=t.length,f=0,l=a.c,n=l.length,c=0,b=a.g,p=b.length,w=0;b[p]=q;var r,e;for(e=r=0;e<p;)b[e]!==b[e+2]?(b[r++]=b[e++],b[r++]=b[e++]):e+=2;p=r;for(e=r=0;e<p;){for(var x=b[e],z=b[e+1],v=e+2;v+2<=p&&b[v+1]===z;)v+=2;b[r++]=x;b[r++]=z;e=v}b.length=r;var g=a.h;a="";g&&(a=g.style.display,g.style.display="none");
|
a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType!==1&&(G=x.substring(g,
|
||||||
try{for(;c<n;){var h=l[c+2]||q,k=b[w+2]||q,v=Math.min(h,k),A=l[c+1],C;if(1!==A.nodeType&&(C=t.substring(f,v))){m&&(C=C.replace(d,"\r"));A.nodeValue=C;var N=A.ownerDocument,u=N.createElement("span");u.className=b[w+1];var B=A.parentNode;B.replaceChild(u,A);u.appendChild(A);f<h&&(l[c+1]=A=N.createTextNode(t.substring(v,h)),B.insertBefore(A,u.nextSibling))}f=v;f>=h&&(c+=2);f>=k&&(w+=2)}}finally{g&&(g.style.display=a)}}catch(y){D.console&&console.log(y&&y.stack||y)}}var D="undefined"!==typeof window?
|
t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){E.console&&console.log(u&&u.stack||u)}}var E=window,y=["break,continue,do,else,for,if,return,while"],C=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
|
||||||
window:{},B=["break,continue,do,else,for,if,return,while"],F=[[B,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],H=[F,"alignas,alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],
|
"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[C,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],V=[C,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],
|
||||||
O=[F,"abstract,assert,boolean,byte,extends,finally,final,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],P=[F,"abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending,dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface,internal,into,is,join,let,lock,null,object,out,override,orderby,params,partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,value,var,virtual,where,yield"],
|
N=[C,"abstract,as,base,bool,by,byte,checked,decimal,delegate,descending,dynamic,event,finally,fixed,foreach,from,group,implicit,in,interface,internal,into,is,let,lock,null,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],C=[C,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],O=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
|
||||||
F=[F,"abstract,async,await,constructor,debugger,enum,eval,export,from,function,get,import,implements,instanceof,interface,let,null,of,set,undefined,var,with,yield,Infinity,NaN"],Q=[B,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],R=[B,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],
|
P=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],Q=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,
|
||||||
B=[B,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],S=/^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,W=/\S/,X=x({keywords:[H,P,O,F,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",Q,R,B],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),
|
U=/\S/,X=v({keywords:[M,N,C,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",O,P,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(D([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",
|
||||||
I={};t(X,["default-code"]);t(G([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),"default-markup htm html mxml xhtml xml xsl".split(" "));t(G([["pln",/^[\s]+/,
|
/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(D([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],
|
||||||
null," \t\r\n"],["atv",/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],["pun",/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);
|
["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(D([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:Q}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:N,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:Q}),
|
||||||
t(G([],[["atv",/^[\s\S]+/]]),["uq.val"]);t(x({keywords:H,hashComments:!0,cStyleComments:!0,types:S}),"c cc cpp cxx cyc m".split(" "));t(x({keywords:"null,true,false"}),["json"]);t(x({keywords:P,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:S}),["cs"]);t(x({keywords:O,cStyleComments:!0}),["java"]);t(x({keywords:B,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);t(x({keywords:Q,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);t(x({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",
|
["cs"]);p(v({keywords:V,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:O,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);p(v({keywords:P,
|
||||||
hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);t(x({keywords:R,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);t(x({keywords:F,cStyleComments:!0,regexLiterals:!0}),["javascript","js","ts","typescript"]);t(x({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,
|
hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:C,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);
|
||||||
regexLiterals:!0}),["coffee"]);t(G([],[["str",/^[\s\S]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:G,registerLangHandler:t,sourceDecorator:x,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,f){f=f||!1;d=d||null;var c=document.createElement("div");c.innerHTML="<pre>"+a+"</pre>";
|
p(D([],[["str",/^[\S\s]+/]]),["regex"]);var Y=E.PR={createSimpleLexer:D,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:E.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1});
|
||||||
c=c.firstChild;f&&L(c,f,!0);M({j:d,m:f,h:c,l:1,a:null,i:null,c:null,g:null});return c.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function f(){for(var c=D.PR_SHOULD_USE_CONTINUATION?b.now()+250:Infinity;p<x.length&&b.now()<c;p++){for(var d=x[p],l=g,n=d;n=n.previousSibling;){var m=n.nodeType,u=(7===m||8===m)&&n.nodeValue;if(u?!/^\??prettify\b/.test(u):3!==m||/\S/.test(n.nodeValue))break;if(u){l={};u.replace(/\b(\w+)=([\w:.%+-]+)/g,function(a,b,c){l[b]=c});break}}n=d.className;if((l!==g||r.test(n))&&
|
return b.innerHTML},prettyPrint:E.prettyPrint=function(a,d){function g(){for(var b=E.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f.test(o.tagName)&&
|
||||||
!e.test(n)){m=!1;for(u=d.parentNode;u;u=u.parentNode)if(v.test(u.tagName)&&u.className&&r.test(u.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=l.lang;if(!m){var m=n.match(w),q;!m&&(q=V(d))&&z.test(q.tagName)&&(m=q.className.match(w));m&&(m=m[1])}if(B.test(d.tagName))u=1;else var u=d.currentStyle,y=t.defaultView,u=(u=u?u.whiteSpace:y&&y.getComputedStyle?y.getComputedStyle(d,null).getPropertyValue("white-space"):0)&&"pre"===u.substring(0,3);y=l.linenums;(y="true"===y||+y)||(y=(y=n.match(/\blinenums\b(?::(\d+))?/))?
|
o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=T(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J(d,u,o);r=
|
||||||
y[1]&&y[1].length?+y[1]:!0:!1);y&&L(d,y,u);M({j:m,h:d,m:y,l:u,a:null,i:null,c:null,g:null})}}}p<x.length?D.setTimeout(f,250):"function"===typeof a&&a()}for(var c=d||document.body,t=c.ownerDocument||document,c=[c.getElementsByTagName("pre"),c.getElementsByTagName("code"),c.getElementsByTagName("xmp")],x=[],q=0;q<c.length;++q)for(var l=0,n=c[q].length;l<n;++l)x.push(c[q][l]);var c=null,b=Date;b.now||(b={now:function(){return+new Date}});var p=0,w=/\blang(?:uage)?-([\w.]+)(?!\S)/,r=/\bprettyprint\b/,
|
{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code|xmp)$/i,
|
||||||
e=/\bprettyprinted\b/,B=/pre|xmp/i,z=/^code$/i,v=/^(?:pre|code|xmp)$/i,g={};f()}},H=D.define;"function"===typeof H&&H.amd&&H("google-code-prettify",[],function(){return Y})})();}()
|
h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()
|
||||||
|
|||||||
5509
js/privatebin.js
5509
js/privatebin.js
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
1
js/showdown-1.6.1.js
Normal file
1
js/showdown-1.6.1.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -8,7 +8,7 @@ function t(a,b,c){if(4!==b.length)throw new sjcl.exception.invalid("invalid aes
|
|||||||
sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.$(a.slice(b/32),32-(b&31)).slice(1);return void 0===c?a:sjcl.bitArray.clamp(a,c-b)},extract:function(a,b,c){var d=Math.floor(-b-c&31);return((b+c-1^b)&-32?a[b/32|0]<<32-d^a[b/32+1|0]>>>d:a[b/32|0]>>>d)&(1<<c)-1},concat:function(a,b){if(0===a.length||0===b.length)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return 32===d?a.concat(b):sjcl.bitArray.$(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;return 0===
|
sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.$(a.slice(b/32),32-(b&31)).slice(1);return void 0===c?a:sjcl.bitArray.clamp(a,c-b)},extract:function(a,b,c){var d=Math.floor(-b-c&31);return((b+c-1^b)&-32?a[b/32|0]<<32-d^a[b/32+1|0]>>>d:a[b/32|0]>>>d)&(1<<c)-1},concat:function(a,b){if(0===a.length||0===b.length)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return 32===d?a.concat(b):sjcl.bitArray.$(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;return 0===
|
||||||
b?0:32*(b-1)+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(32*a.length<b)return a;a=a.slice(0,Math.ceil(b/32));var c=a.length;b=b&31;0<c&&b&&(a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1));return a},partial:function(a,b,c){return 32===a?b:(c?b|0:b<<32-a)+0x10000000000*a},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return!1;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return 0===
|
b?0:32*(b-1)+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(32*a.length<b)return a;a=a.slice(0,Math.ceil(b/32));var c=a.length;b=b&31;0<c&&b&&(a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1));return a},partial:function(a,b,c){return 32===a?b:(c?b|0:b<<32-a)+0x10000000000*a},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return!1;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return 0===
|
||||||
c},$:function(a,b,c,d){var e;e=0;for(void 0===d&&(d=[]);32<=b;b-=32)d.push(c),c=0;if(0===b)return d.concat(a);for(e=0;e<a.length;e++)d.push(c|a[e]>>>b),c=a[e]<<32-b;e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,32<b+a?c:d.pop(),1));return d},i:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]},byteswapM:function(a){var b,c;for(b=0;b<a.length;++b)c=a[b],a[b]=c>>>24|c>>>8&0xff00|(c&0xff00)<<8|c<<24;return a}};
|
c},$:function(a,b,c,d){var e;e=0;for(void 0===d&&(d=[]);32<=b;b-=32)d.push(c),c=0;if(0===b)return d.concat(a);for(e=0;e<a.length;e++)d.push(c|a[e]>>>b),c=a[e]<<32-b;e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,32<b+a?c:d.pop(),1));return d},i:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]},byteswapM:function(a){var b,c;for(b=0;b<a.length;++b)c=a[b],a[b]=c>>>24|c>>>8&0xff00|(c&0xff00)<<8|c<<24;return a}};
|
||||||
sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++)0===(d&3)&&(e=a[d/4]),b+=String.fromCharCode(e>>>8>>>8>>>8),e<<=8;return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++)d=d<<8|a.charCodeAt(c),3===(c&3)&&(b.push(d),d=0);c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}};
|
sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++)0===(d&3)&&(e=a[d/4]),b+=String.fromCharCode(e>>>24),e<<=8;return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++)d=d<<8|a.charCodeAt(c),3===(c&3)&&(b.push(d),d=0);c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}};
|
||||||
sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a=a+"00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,4*d)}};
|
sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a=a+"00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,4*d)}};
|
||||||
sjcl.codec.base32={B:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",X:"0123456789ABCDEFGHIJKLMNOPQRSTUV",BITS:32,BASE:5,REMAINING:27,fromBits:function(a,b,c){var d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f="",g=0,h=sjcl.codec.base32.B,k=0,l=sjcl.bitArray.bitLength(a);c&&(h=sjcl.codec.base32.X);for(c=0;f.length*d<l;)f+=h.charAt((k^a[c]>>>g)>>>e),g<d?(k=a[c]<<d-g,g+=e,c++):(k<<=d,g-=d);for(;f.length&7&&!b;)f+="=";return f},toBits:function(a,b){a=a.replace(/\s|=/g,"").toUpperCase();var c=sjcl.codec.base32.BITS,
|
sjcl.codec.base32={B:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",X:"0123456789ABCDEFGHIJKLMNOPQRSTUV",BITS:32,BASE:5,REMAINING:27,fromBits:function(a,b,c){var d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f="",g=0,h=sjcl.codec.base32.B,k=0,l=sjcl.bitArray.bitLength(a);c&&(h=sjcl.codec.base32.X);for(c=0;f.length*d<l;)f+=h.charAt((k^a[c]>>>g)>>>e),g<d?(k=a[c]<<d-g,g+=e,c++):(k<<=d,g-=d);for(;f.length&7&&!b;)f+="=";return f},toBits:function(a,b){a=a.replace(/\s|=/g,"").toUpperCase();var c=sjcl.codec.base32.BITS,
|
||||||
d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f=[],g,h=0,k=sjcl.codec.base32.B,l=0,n,m="base32";b&&(k=sjcl.codec.base32.X,m="base32hex");for(g=0;g<a.length;g++){n=k.indexOf(a.charAt(g));if(0>n){if(!b)try{return sjcl.codec.base32hex.toBits(a)}catch(p){}throw new sjcl.exception.invalid("this isn't "+m+"!");}h>e?(h-=e,f.push(l^n>>>h),l=n<<c-h):(h+=d,l^=n<<c-h)}h&56&&f.push(sjcl.bitArray.partial(h&56,l,1));return f}};
|
d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f=[],g,h=0,k=sjcl.codec.base32.B,l=0,n,m="base32";b&&(k=sjcl.codec.base32.X,m="base32hex");for(g=0;g<a.length;g++){n=k.indexOf(a.charAt(g));if(0>n){if(!b)try{return sjcl.codec.base32hex.toBits(a)}catch(p){}throw new sjcl.exception.invalid("this isn't "+m+"!");}h>e?(h-=e,f.push(l^n>>>h),l=n<<c-h):(h+=d,l^=n<<c-h)}h&56&&f.push(sjcl.bitArray.partial(h&56,l,1));return f}};
|
||||||
158
js/test.js
Normal file
158
js/test.js
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
'use strict';
|
||||||
|
var jsc = require('jsverify'),
|
||||||
|
jsdom = require('jsdom-global'),
|
||||||
|
cleanup = jsdom(),
|
||||||
|
|
||||||
|
a2zString = ['a','b','c','d','e','f','g','h','i','j','k','l','m',
|
||||||
|
'n','o','p','q','r','s','t','u','v','w','x','y','z'],
|
||||||
|
alnumString = a2zString.concat(['0','1','2','3','4','5','6','7','8','9']),
|
||||||
|
queryString = alnumString.concat(['+','%','&','.','*','-','_']),
|
||||||
|
base64String = alnumString.concat(['+','/','=']).concat(
|
||||||
|
a2zString.map(function(c) {
|
||||||
|
return c.toUpperCase();
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
global.$ = global.jQuery = require('./jquery-3.1.1');
|
||||||
|
global.sjcl = require('./sjcl-1.0.6');
|
||||||
|
global.Base64 = require('./base64-2.1.9');
|
||||||
|
global.RawDeflate = require('./rawdeflate-0.5');
|
||||||
|
require('./rawinflate-0.3');
|
||||||
|
require('./privatebin');
|
||||||
|
|
||||||
|
describe('helper', function () {
|
||||||
|
describe('secondsToHuman', function () {
|
||||||
|
after(function () {
|
||||||
|
cleanup();
|
||||||
|
});
|
||||||
|
|
||||||
|
jsc.property('returns an array with a number and a word', 'integer', function (number) {
|
||||||
|
var result = $.PrivateBin.helper.secondsToHuman(number);
|
||||||
|
return Array.isArray(result) &&
|
||||||
|
result.length === 2 &&
|
||||||
|
result[0] === parseInt(result[0], 10) &&
|
||||||
|
typeof result[1] === 'string';
|
||||||
|
});
|
||||||
|
jsc.property('returns seconds on the first array position', 'integer 59', function (number) {
|
||||||
|
return $.PrivateBin.helper.secondsToHuman(number)[0] === number;
|
||||||
|
});
|
||||||
|
jsc.property('returns seconds on the second array position', 'integer 59', function (number) {
|
||||||
|
return $.PrivateBin.helper.secondsToHuman(number)[1] === 'second';
|
||||||
|
});
|
||||||
|
jsc.property('returns minutes on the first array position', 'integer 60 3599', function (number) {
|
||||||
|
return $.PrivateBin.helper.secondsToHuman(number)[0] === Math.floor(number / 60);
|
||||||
|
});
|
||||||
|
jsc.property('returns minutes on the second array position', 'integer 60 3599', function (number) {
|
||||||
|
return $.PrivateBin.helper.secondsToHuman(number)[1] === 'minute';
|
||||||
|
});
|
||||||
|
jsc.property('returns hours on the first array position', 'integer 3600 86399', function (number) {
|
||||||
|
return $.PrivateBin.helper.secondsToHuman(number)[0] === Math.floor(number / (60 * 60));
|
||||||
|
});
|
||||||
|
jsc.property('returns hours on the second array position', 'integer 3600 86399', function (number) {
|
||||||
|
return $.PrivateBin.helper.secondsToHuman(number)[1] === 'hour';
|
||||||
|
});
|
||||||
|
jsc.property('returns days on the first array position', 'integer 86400 5184000', function (number) {
|
||||||
|
return $.PrivateBin.helper.secondsToHuman(number)[0] === Math.floor(number / (60 * 60 * 24));
|
||||||
|
});
|
||||||
|
jsc.property('returns days on the second array position', 'integer 86400 5184000', function (number) {
|
||||||
|
return $.PrivateBin.helper.secondsToHuman(number)[1] === 'day';
|
||||||
|
});
|
||||||
|
// max safe integer as per http://ecma262-5.com/ELS5_HTML.htm#Section_8.5
|
||||||
|
jsc.property('returns months on the first array position', 'integer 5184000 9007199254740991', function (number) {
|
||||||
|
return $.PrivateBin.helper.secondsToHuman(number)[0] === Math.floor(number / (60 * 60 * 24 * 30));
|
||||||
|
});
|
||||||
|
jsc.property('returns months on the second array position', 'integer 5184000 9007199254740991', function (number) {
|
||||||
|
return $.PrivateBin.helper.secondsToHuman(number)[1] === 'month';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('scriptLocation', function () {
|
||||||
|
jsc.property(
|
||||||
|
'returns the URL without query & fragment',
|
||||||
|
jsc.nearray(jsc.elements(a2zString)),
|
||||||
|
jsc.nearray(jsc.elements(a2zString)),
|
||||||
|
jsc.array(jsc.elements(queryString)),
|
||||||
|
'string',
|
||||||
|
function (schema, address, query, fragment) {
|
||||||
|
var expected = schema.join('') + '://' + address.join('') + '/',
|
||||||
|
clean = jsdom('', {url: expected + '?' + query.join('') + '#' + fragment}),
|
||||||
|
result = $.PrivateBin.helper.scriptLocation();
|
||||||
|
clean();
|
||||||
|
return expected === result;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('pasteId', function () {
|
||||||
|
jsc.property(
|
||||||
|
'returns the query string without separator, if any',
|
||||||
|
jsc.nearray(jsc.elements(a2zString)),
|
||||||
|
jsc.nearray(jsc.elements(a2zString)),
|
||||||
|
jsc.array(jsc.elements(queryString)),
|
||||||
|
'string',
|
||||||
|
function (schema, address, query, fragment) {
|
||||||
|
var queryString = query.join(''),
|
||||||
|
clean = jsdom('', {
|
||||||
|
url: schema.join('') + '://' + address.join('') +
|
||||||
|
'/?' + queryString + '#' + fragment
|
||||||
|
}),
|
||||||
|
result = $.PrivateBin.helper.pasteId();
|
||||||
|
clean();
|
||||||
|
return queryString === result;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('pageKey', function () {
|
||||||
|
jsc.property(
|
||||||
|
'returns the fragment of the URL',
|
||||||
|
jsc.nearray(jsc.elements(a2zString)),
|
||||||
|
jsc.nearray(jsc.elements(a2zString)),
|
||||||
|
jsc.array(jsc.elements(queryString)),
|
||||||
|
jsc.array(jsc.elements(base64String)),
|
||||||
|
function (schema, address, query, fragment) {
|
||||||
|
var fragmentString = fragment.join(''),
|
||||||
|
clean = jsdom('', {
|
||||||
|
url: schema.join('') + '://' + address.join('') +
|
||||||
|
'/?' + query.join('') + '#' + fragmentString
|
||||||
|
}),
|
||||||
|
result = $.PrivateBin.helper.pageKey();
|
||||||
|
clean();
|
||||||
|
return fragmentString === result;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
jsc.property(
|
||||||
|
'returns the fragment stripped of trailing query parts',
|
||||||
|
jsc.nearray(jsc.elements(a2zString)),
|
||||||
|
jsc.nearray(jsc.elements(a2zString)),
|
||||||
|
jsc.array(jsc.elements(queryString)),
|
||||||
|
jsc.array(jsc.elements(base64String)),
|
||||||
|
jsc.array(jsc.elements(queryString)),
|
||||||
|
function (schema, address, query, fragment, trail) {
|
||||||
|
var fragmentString = fragment.join(''),
|
||||||
|
clean = jsdom('', {
|
||||||
|
url: schema.join('') + '://' + address.join('') + '/?' +
|
||||||
|
query.join('') + '#' + fragmentString + '&' + trail.join('')
|
||||||
|
}),
|
||||||
|
result = $.PrivateBin.helper.pageKey();
|
||||||
|
clean();
|
||||||
|
return fragmentString === result;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('htmlEntities', function () {
|
||||||
|
after(function () {
|
||||||
|
cleanup();
|
||||||
|
});
|
||||||
|
|
||||||
|
jsc.property(
|
||||||
|
'removes all HTML entities from any given string',
|
||||||
|
'string',
|
||||||
|
function (string) {
|
||||||
|
var result = $.PrivateBin.helper.htmlEntities(string);
|
||||||
|
return !(/[<>"'`=\/]/.test(result)) && !(string.indexOf('&') > -1 && !(/&/.test(result)));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
226
js/test/Alert.js
226
js/test/Alert.js
@@ -1,226 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
var common = require('../common');
|
|
||||||
|
|
||||||
describe('Alert', function () {
|
|
||||||
describe('showStatus', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'shows a status message',
|
|
||||||
jsc.array(common.jscAlnumString()),
|
|
||||||
jsc.array(common.jscAlnumString()),
|
|
||||||
function (icon, message) {
|
|
||||||
icon = icon.join('');
|
|
||||||
message = message.join('');
|
|
||||||
var expected = '<div id="status" role="alert" ' +
|
|
||||||
'class="statusmessage alert alert-info"><span ' +
|
|
||||||
'class="glyphicon glyphicon-' + icon +
|
|
||||||
'" aria-hidden="true"></span> ' + message + '</div>';
|
|
||||||
$('body').html(
|
|
||||||
'<div id="status" role="alert" class="statusmessage ' +
|
|
||||||
'alert alert-info hidden"><span class="glyphicon ' +
|
|
||||||
'glyphicon-info-sign" aria-hidden="true"></span> </div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.Alert.init();
|
|
||||||
$.PrivateBin.Alert.showStatus(message, icon);
|
|
||||||
var result = $('body').html();
|
|
||||||
return expected === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('showError', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'shows an error message',
|
|
||||||
jsc.array(common.jscAlnumString()),
|
|
||||||
jsc.array(common.jscAlnumString()),
|
|
||||||
function (icon, message) {
|
|
||||||
icon = icon.join('');
|
|
||||||
message = message.join('');
|
|
||||||
var expected = '<div id="errormessage" role="alert" ' +
|
|
||||||
'class="statusmessage alert alert-danger"><span ' +
|
|
||||||
'class="glyphicon glyphicon-' + icon +
|
|
||||||
'" aria-hidden="true"></span> ' + message + '</div>';
|
|
||||||
$('body').html(
|
|
||||||
'<div id="errormessage" role="alert" class="statusmessage ' +
|
|
||||||
'alert alert-danger hidden"><span class="glyphicon ' +
|
|
||||||
'glyphicon-alert" aria-hidden="true"></span> </div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.Alert.init();
|
|
||||||
$.PrivateBin.Alert.showError(message, icon);
|
|
||||||
var result = $('body').html();
|
|
||||||
return expected === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('showRemaining', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'shows remaining time',
|
|
||||||
jsc.array(common.jscAlnumString()),
|
|
||||||
jsc.array(common.jscAlnumString()),
|
|
||||||
'integer',
|
|
||||||
function (message, string, number) {
|
|
||||||
message = message.join('');
|
|
||||||
string = string.join('');
|
|
||||||
var expected = '<div id="remainingtime" role="alert" ' +
|
|
||||||
'class="alert alert-info"><span ' +
|
|
||||||
'class="glyphicon glyphicon-fire" aria-hidden="true">' +
|
|
||||||
'</span> ' + string + message + number + '</div>';
|
|
||||||
$('body').html(
|
|
||||||
'<div id="remainingtime" role="alert" class="hidden ' +
|
|
||||||
'alert alert-info"><span class="glyphicon ' +
|
|
||||||
'glyphicon-fire" aria-hidden="true"></span> </div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.Alert.init();
|
|
||||||
$.PrivateBin.Alert.showRemaining(['%s' + message + '%d', string, number]);
|
|
||||||
var result = $('body').html();
|
|
||||||
return expected === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('showLoading', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'shows a loading message',
|
|
||||||
jsc.array(common.jscAlnumString()),
|
|
||||||
jsc.array(common.jscAlnumString()),
|
|
||||||
function (message, icon) {
|
|
||||||
message = message.join('');
|
|
||||||
icon = icon.join('');
|
|
||||||
var defaultMessage = 'Loading…';
|
|
||||||
if (message.length === 0) {
|
|
||||||
message = defaultMessage;
|
|
||||||
}
|
|
||||||
var expected = '<ul class="nav navbar-nav"><li ' +
|
|
||||||
'id="loadingindicator" class="navbar-text"><span ' +
|
|
||||||
'class="glyphicon glyphicon-' + icon +
|
|
||||||
'" aria-hidden="true"></span> ' + message + '</li></ul>';
|
|
||||||
$('body').html(
|
|
||||||
'<ul class="nav navbar-nav"><li id="loadingindicator" ' +
|
|
||||||
'class="navbar-text hidden"><span class="glyphicon ' +
|
|
||||||
'glyphicon-time" aria-hidden="true"></span> ' +
|
|
||||||
defaultMessage + '</li></ul>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.Alert.init();
|
|
||||||
$.PrivateBin.Alert.showLoading(message, icon);
|
|
||||||
var result = $('body').html();
|
|
||||||
return expected === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('hideLoading', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'hides the loading message',
|
|
||||||
function() {
|
|
||||||
$('body').html(
|
|
||||||
'<ul class="nav navbar-nav"><li id="loadingindicator" ' +
|
|
||||||
'class="navbar-text"><span class="glyphicon ' +
|
|
||||||
'glyphicon-time" aria-hidden="true"></span> ' +
|
|
||||||
'Loading…</li></ul>'
|
|
||||||
);
|
|
||||||
$('body').addClass('loading');
|
|
||||||
$.PrivateBin.Alert.init();
|
|
||||||
$.PrivateBin.Alert.hideLoading();
|
|
||||||
assert.ok(
|
|
||||||
!$('body').hasClass('loading') &&
|
|
||||||
$('#loadingindicator').hasClass('hidden')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('hideMessages', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'hides all messages',
|
|
||||||
function() {
|
|
||||||
$('body').html(
|
|
||||||
'<div id="status" role="alert" class="statusmessage ' +
|
|
||||||
'alert alert-info"><span class="glyphicon ' +
|
|
||||||
'glyphicon-info-sign" aria-hidden="true"></span> </div>' +
|
|
||||||
'<div id="errormessage" role="alert" class="statusmessage ' +
|
|
||||||
'alert alert-danger"><span class="glyphicon ' +
|
|
||||||
'glyphicon-alert" aria-hidden="true"></span> </div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.Alert.init();
|
|
||||||
$.PrivateBin.Alert.hideMessages();
|
|
||||||
assert.ok(
|
|
||||||
$('#status').hasClass('hidden') &&
|
|
||||||
$('#errormessage').hasClass('hidden')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('setCustomHandler', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'calls a given handler function',
|
|
||||||
'nat 3',
|
|
||||||
jsc.array(common.jscAlnumString()),
|
|
||||||
function (trigger, message) {
|
|
||||||
message = message.join('');
|
|
||||||
var handlerCalled = false,
|
|
||||||
defaultMessage = 'Loading…',
|
|
||||||
functions = [
|
|
||||||
$.PrivateBin.Alert.showStatus,
|
|
||||||
$.PrivateBin.Alert.showError,
|
|
||||||
$.PrivateBin.Alert.showRemaining,
|
|
||||||
$.PrivateBin.Alert.showLoading
|
|
||||||
];
|
|
||||||
if (message.length === 0) {
|
|
||||||
message = defaultMessage;
|
|
||||||
}
|
|
||||||
$('body').html(
|
|
||||||
'<ul class="nav navbar-nav"><li id="loadingindicator" ' +
|
|
||||||
'class="navbar-text hidden"><span class="glyphicon ' +
|
|
||||||
'glyphicon-time" aria-hidden="true"></span> ' +
|
|
||||||
defaultMessage + '</li></ul>' +
|
|
||||||
'<div id="remainingtime" role="alert" class="hidden ' +
|
|
||||||
'alert alert-info"><span class="glyphicon ' +
|
|
||||||
'glyphicon-fire" aria-hidden="true"></span> </div>' +
|
|
||||||
'<div id="status" role="alert" class="statusmessage ' +
|
|
||||||
'alert alert-info"><span class="glyphicon ' +
|
|
||||||
'glyphicon-info-sign" aria-hidden="true"></span> </div>' +
|
|
||||||
'<div id="errormessage" role="alert" class="statusmessage ' +
|
|
||||||
'alert alert-danger"><span class="glyphicon ' +
|
|
||||||
'glyphicon-alert" aria-hidden="true"></span> </div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.Alert.init();
|
|
||||||
$.PrivateBin.Alert.setCustomHandler(function(id, $element) {
|
|
||||||
handlerCalled = true;
|
|
||||||
return jsc.random(0, 1) ? true : $element;
|
|
||||||
});
|
|
||||||
functions[trigger](message);
|
|
||||||
return handlerCalled;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
var common = require('../common');
|
|
||||||
|
|
||||||
describe('AttachmentViewer', function () {
|
|
||||||
describe('setAttachment, showAttachment, removeAttachment, hideAttachment, hideAttachmentPreview, hasAttachment, getAttachment & moveAttachmentTo', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'displays & hides data as requested',
|
|
||||||
common.jscMimeTypes(),
|
|
||||||
jsc.nearray(common.jscBase64String()),
|
|
||||||
'string',
|
|
||||||
'string',
|
|
||||||
'string',
|
|
||||||
function (mimeType, base64, filename, prefix, postfix) {
|
|
||||||
var clean = jsdom(),
|
|
||||||
data = 'data:' + mimeType + ';base64,' + base64.join(''),
|
|
||||||
previewSupported = (
|
|
||||||
mimeType.substring(0, 6) === 'image/' ||
|
|
||||||
mimeType.substring(0, 6) === 'audio/' ||
|
|
||||||
mimeType.substring(0, 6) === 'video/' ||
|
|
||||||
mimeType.match(/\/pdf/i)
|
|
||||||
),
|
|
||||||
results = [];
|
|
||||||
prefix = prefix.replace(/%(s|d)/g, '%%');
|
|
||||||
postfix = postfix.replace(/%(s|d)/g, '%%');
|
|
||||||
$('body').html(
|
|
||||||
'<div id="attachment" role="alert" class="hidden alert ' +
|
|
||||||
'alert-info"><span class="glyphicon glyphicon-download-' +
|
|
||||||
'alt" aria-hidden="true"></span> <a class="alert-link">' +
|
|
||||||
'Download attachment</a></div><div id="attachmentPrevie' +
|
|
||||||
'w" class="hidden"></div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.AttachmentViewer.init();
|
|
||||||
results.push(
|
|
||||||
!$.PrivateBin.AttachmentViewer.hasAttachment() &&
|
|
||||||
$('#attachment').hasClass('hidden') &&
|
|
||||||
$('#attachmentPreview').hasClass('hidden')
|
|
||||||
);
|
|
||||||
if (filename.length) {
|
|
||||||
$.PrivateBin.AttachmentViewer.setAttachment(data, filename);
|
|
||||||
} else {
|
|
||||||
$.PrivateBin.AttachmentViewer.setAttachment(data);
|
|
||||||
}
|
|
||||||
var attachment = $.PrivateBin.AttachmentViewer.getAttachment();
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.AttachmentViewer.hasAttachment() &&
|
|
||||||
$('#attachment').hasClass('hidden') &&
|
|
||||||
$('#attachmentPreview').hasClass('hidden') &&
|
|
||||||
attachment[0] === data &&
|
|
||||||
attachment[1] === filename
|
|
||||||
);
|
|
||||||
$.PrivateBin.AttachmentViewer.showAttachment();
|
|
||||||
results.push(
|
|
||||||
!$('#attachment').hasClass('hidden') &&
|
|
||||||
(previewSupported ? !$('#attachmentPreview').hasClass('hidden') : $('#attachmentPreview').hasClass('hidden'))
|
|
||||||
);
|
|
||||||
$.PrivateBin.AttachmentViewer.hideAttachment();
|
|
||||||
results.push(
|
|
||||||
$('#attachment').hasClass('hidden') &&
|
|
||||||
(previewSupported ? !$('#attachmentPreview').hasClass('hidden') : $('#attachmentPreview').hasClass('hidden'))
|
|
||||||
);
|
|
||||||
if (previewSupported) {
|
|
||||||
$.PrivateBin.AttachmentViewer.hideAttachmentPreview();
|
|
||||||
results.push($('#attachmentPreview').hasClass('hidden'));
|
|
||||||
}
|
|
||||||
$.PrivateBin.AttachmentViewer.showAttachment();
|
|
||||||
results.push(
|
|
||||||
!$('#attachment').hasClass('hidden') &&
|
|
||||||
(previewSupported ? !$('#attachmentPreview').hasClass('hidden') : $('#attachmentPreview').hasClass('hidden'))
|
|
||||||
);
|
|
||||||
var element = $('<div></div>');
|
|
||||||
$.PrivateBin.AttachmentViewer.moveAttachmentTo(element, prefix + '%s' + postfix);
|
|
||||||
if (filename.length) {
|
|
||||||
results.push(
|
|
||||||
element.children()[0].href === data &&
|
|
||||||
element.children()[0].getAttribute('download') === filename &&
|
|
||||||
element.children()[0].text === prefix + filename + postfix
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
results.push(element.children()[0].href === data);
|
|
||||||
}
|
|
||||||
$.PrivateBin.AttachmentViewer.removeAttachment();
|
|
||||||
results.push(
|
|
||||||
$('#attachment').hasClass('hidden') &&
|
|
||||||
$('#attachmentPreview').hasClass('hidden')
|
|
||||||
);
|
|
||||||
clean();
|
|
||||||
return results.every(element => element);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1,207 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
require('../common');
|
|
||||||
|
|
||||||
describe('CryptTool', function () {
|
|
||||||
describe('cipher & decipher', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
it('can en- and decrypt any message', function () {
|
|
||||||
jsc.check(jsc.forall(
|
|
||||||
'string',
|
|
||||||
'string',
|
|
||||||
'string',
|
|
||||||
function (key, password, message) {
|
|
||||||
return message === $.PrivateBin.CryptTool.decipher(
|
|
||||||
key,
|
|
||||||
password,
|
|
||||||
$.PrivateBin.CryptTool.cipher(key, password, message)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
),
|
|
||||||
// reducing amount of checks as running 100 takes about 5 minutes
|
|
||||||
{tests: 5, quiet: true});
|
|
||||||
});
|
|
||||||
|
|
||||||
// The below static unit tests are included to ensure deciphering of "classic"
|
|
||||||
// SJCL based pastes still works
|
|
||||||
it(
|
|
||||||
'supports PrivateBin v1 ciphertext (SJCL & Base64)',
|
|
||||||
function () {
|
|
||||||
// Of course you can easily decipher the following texts, if you like.
|
|
||||||
// Bonus points for finding their sources and hidden meanings.
|
|
||||||
var paste1 = $.PrivateBin.CryptTool.decipher(
|
|
||||||
'6t2qsmLyfXIokNCL+3/yl15rfTUBQvm5SOnFPvNE7Q8=',
|
|
||||||
// -- "That's amazing. I've got the same combination on my luggage."
|
|
||||||
Array.apply(0, Array(6)).map(function(_,b) { return b + 1; }).join(''),
|
|
||||||
'{"iv":"4HNFIl7eYbCh6HuShctTIA==","v":1,"iter":10000,"ks"' +
|
|
||||||
':256,"ts":128,"mode":"gcm","adata":"","cipher":"aes","sa' +
|
|
||||||
'lt":"u0lQvePq6L0=","ct":"fGPUVrDyaVr1ZDGb+kqQ3CPEW8x4YKG' +
|
|
||||||
'fzHDmA0Vjkh250aWNe7Cnigkps9aaFVMX9AaerrTp3yZbojJtNqVGMfL' +
|
|
||||||
'dUTu+53xmZHqRKxCCqSfDNSNoW4Oxk5OVgAtRyuG4bXHDsWTXDNz2xce' +
|
|
||||||
'qzVFqhkwTwlUchrV7uuFK/XUKTNjPFM744moivIcBbfM2FOeKlIFs8RY' +
|
|
||||||
'PYuvqQhp2rMLlNGwwKh//4kykQsHMQDeSDuJl8stMQzgWR/btUBZuwNZ' +
|
|
||||||
'EydkMH6IPpTdf5WTSrZ+wC2OK0GutCm4UaEe6txzaTMfu+WRVu4PN6q+' +
|
|
||||||
'N+2zljWJ1XdpVcN/i0Sv4QVMym0Xa6y0eccEhj/69o47PmExmMMeEwEx' +
|
|
||||||
'ImPalMNT9JUSiZdOZJ/GdzwrwoIuq1mdQR6vSH+XJ/8jXJQ7bjjJVJYX' +
|
|
||||||
'TcT0Di5jixArI2Kpp1GGlGVFbLgPugwU1wczg+byqeDOAECXRRnQcoge' +
|
|
||||||
'aJtVcRwXwfy4j3ORFcblYMilxyHqKBewcYPRVBGtBs50cVjSIkAfR84r' +
|
|
||||||
'nc1nfvnxK/Gmm+4VBNHI6ODWNpRolVMCzXjbKYnV3Are5AgSpsTqaGl4' +
|
|
||||||
'1VJGpcco6cAwi4K0Bys1seKR+bLSdUgqRrkEqSRSdu3/VTu9HhEk8an0' +
|
|
||||||
'rjTE4CBB5/LMn16p0TGLoOb32odKFIEtpanVvLjeyiVMvSxcgYLNnTi/' +
|
|
||||||
'5FiaAC4pJxRD+AZHedU1FICUeEXxIcac/4E5qjkHjX9SpQtLl80QLIVn' +
|
|
||||||
'jNliZm7QLB/nKu7W8Jb0+/CiTdV3Q9LhxlH4ciprnX+W0B00BKYFHnL9' +
|
|
||||||
'jRVzKdXhf1EHydbXMAfpCjHAXIVCkFakJinQBDIIw/SC6Yig0u0ddEID' +
|
|
||||||
'2B7LYAP1iE4RZwzTrxCB+ke2jQr8c20Jj6u6ShFOPC9DCw9XupZ4HAal' +
|
|
||||||
'VG00kSgjus+b8zrVji3/LKEhb4EBzp1ctBJCFTeXwej8ZETLoXTylev5' +
|
|
||||||
'dlwZSYAbuBPPcbFR/xAIPx3uDabd1E1gTqUc68ICIGhd197Mb2eRWiSv' +
|
|
||||||
'Hr5SPsASerMxId6XA6+iQlRiI+NDR+TGVNmCnfxSlyPFMOHGTmslXOGI' +
|
|
||||||
'qGfBR8l4ft8YVZ70lCwmwTuViGc75ULSf9mM57/LmRzQFMYQtvI8IFK9' +
|
|
||||||
'JaQEMY5xz0HLtR4iyQUUdwR9e0ytBNdWF2a2WPDEnJuY/QJo4GzTlgv4' +
|
|
||||||
'QUxMXI5htsn2rf0HxCFu7Po8DNYLxTS+67hYjDIYWYaEIc8LXWMLyDm9' +
|
|
||||||
'C5fARPJ4F2BIWgzgzkNj+dVjusft2XnziamWdbS5u3kuRlVuz5LQj+R5' +
|
|
||||||
'imnqQAincdZTkTT1nYx+DatlOLllCYIHffpI="}'
|
|
||||||
),
|
|
||||||
paste2 = $.PrivateBin.CryptTool.decipher(
|
|
||||||
's9pmKZKOBN7EVvHpTA8jjLFH3Xlz/0l8lB4+ONPACrM=',
|
|
||||||
'', // no password
|
|
||||||
'{"iv":"WA42mdxIVXUwBqZu7JYNiw==","v":1,"iter":10000,"ks"' +
|
|
||||||
':256,"ts":128,"mode":"gcm","adata":"","cipher":"aes","sa' +
|
|
||||||
'lt":"jN6CjbQMJCM=","ct":"kYYMo5DFG1+w0UHiYXT5pdV0IUuXxzO' +
|
|
||||||
'lslkW/c3DRCbGFROCVkAskHce7HoRczee1N9c5MhHjVMJUIZE02qIS8U' +
|
|
||||||
'yHdJ/GqcPVidTUcj9rnDNWsTXkjVv8jCwHS/cwmAjDTWpwp5ThECN+ov' +
|
|
||||||
'/wNp/NdtTj8Qj7f/T3rfZIOCWfwLH9s4Des35UNcUidfPTNQ1l0Gm0X+' +
|
|
||||||
'r98CCUSYZjQxkZc6hRZBLPQ8EaNVooUwd5eP4GiYlmSDNA0wOSA+5isP' +
|
|
||||||
'YxomVCt+kFf58VBlNhpfNi7BLYAUTPpXT4SfH5drR9+C7NTeZ+tTCYjb' +
|
|
||||||
'U94PzYItOpu8vgnB1/a6BAM5h3m9w+giUb0df4hgTWeZnZxLjo5BN8WV' +
|
|
||||||
'+kdTXMj3/Vv0gw0DQrDcCuX/cBAjpy3lQGwlAN1vXoOIyZJUjMpQRrOL' +
|
|
||||||
'dKvLB+zcmVNtGDbgnfP2IYBzk9NtodpUa27ne0T0ZpwOPlVwevsIVZO2' +
|
|
||||||
'24WLa+iQmmHOWDFFpVDlS0t0fLfOk7Hcb2xFsTxiCIiyKMho/IME1Du3' +
|
|
||||||
'X4e6BVa3hobSSZv0rRtNgY1KcyYPrUPW2fxZ+oik3y9SgGvb7XpjVIta' +
|
|
||||||
'8DWlDWRfZ9kzoweWEYqz9IA8Xd373RefpyuWI25zlHoX3nwljzsZU6dC' +
|
|
||||||
'//h/Dt2DNr+IAvKO3+u23cWoB9kgcZJ2FJuqjLvVfCF+OWcig7zs2pTY' +
|
|
||||||
'JW6Rg6lqbBCxiUUlae6xJrjfv0pzD2VYCLY7v1bVTagppwKzNI3WaluC' +
|
|
||||||
'OrdDYUCxUSe56yd1oAoLPRVbYvomRboUO6cjQhEknERyvt45og2kORJO' +
|
|
||||||
'EJayHW+jZgR0Y0jM3Nk17ubpij2gHxNx9kiLDOiCGSV5mn9mV7qd3HHc' +
|
|
||||||
'OMSykiBgbyzjobi96LT2dIGLeDXTIdPOog8wyobO4jWq0GGs0vBB8oSY' +
|
|
||||||
'XhHvixZLcSjX2KQuHmEoWzmJcr3DavdoXZmAurGWLKjzEdJc5dSD/eNr' +
|
|
||||||
'99gjHX7wphJ6umKMM+fn6PcbYJkhDh2GlJL5COXjXfm/5aj/vuyaRRWZ' +
|
|
||||||
'MZtmnYpGAtAPg7AUG"}'
|
|
||||||
);
|
|
||||||
|
|
||||||
assert.ok(
|
|
||||||
paste1.includes('securely packed in iron') &&
|
|
||||||
paste2.includes('Sol is right')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
it(
|
|
||||||
'supports ZeroBin ciphertext (SJCL & Base64 1.7)',
|
|
||||||
function () {
|
|
||||||
var newBase64 = global.Base64;
|
|
||||||
global.Base64 = require('../base64-1.7').Base64;
|
|
||||||
jsdom();
|
|
||||||
delete require.cache[require.resolve('../privatebin')];
|
|
||||||
require('../privatebin');
|
|
||||||
|
|
||||||
// Of course you can easily decipher the following texts, if you like.
|
|
||||||
// Bonus points for finding their sources and hidden meanings.
|
|
||||||
var paste1 = $.PrivateBin.CryptTool.decipher(
|
|
||||||
'6t2qsmLyfXIokNCL+3/yl15rfTUBQvm5SOnFPvNE7Q8=',
|
|
||||||
// -- "That's amazing. I've got the same combination on my luggage."
|
|
||||||
Array.apply(0, Array(6)).map(function(_,b) { return b + 1; }).join(''),
|
|
||||||
'{"iv":"aTnR2qBL1CAmLX8FdWe3VA==","v":1,"iter":10000,"ks"' +
|
|
||||||
':256,"ts":128,"mode":"gcm","adata":"","cipher":"aes","sa' +
|
|
||||||
'lt":"u0lQvePq6L0=","ct":"A3nBTvICZtYy6xqbIJE0c8Veored5lM' +
|
|
||||||
'JUGgGUm4581wjrPFlU0Q0tUZSf+RUUoZj2jqDa4kiyyZ5YNMe30hNMV0' +
|
|
||||||
'oVSalNhRgD9svVMnPuF162IbyhVCwr7ULjT981CHxVlGNqGqmIU6L/Xi' +
|
|
||||||
'xgdArxAA8x1GCrfAkBWWGeq8Qw5vJPG/RCHpwR4Wy3azrluqeyERBzma' +
|
|
||||||
'OQjO/kM35TiI6IrLYFyYyL7upYlxAaxS0XBMZvN8QU8Lnerwvh5JVC6O' +
|
|
||||||
'kkKrhogajTJIKozCF79yI78c50LUh7tTuI3Yoh7+fXxhoODvQdYFmoiU' +
|
|
||||||
'lrutN7Y5ZMRdITvVu8fTYtX9c7Fiufmcq5icEimiHp2g1bvfpOaGOsFT' +
|
|
||||||
'+XNFgC9215jcp5mpBdN852xs7bUtw+nDrf+LsDEX6iRpRZ+PYgLDN5xQ' +
|
|
||||||
'T1ByEtYbeP+tO38pnx72oZdIB3cj8UkOxnxdNiZM5YB5egn4jUj1fHot' +
|
|
||||||
'1I69WoTiUJipZ5PIATv7ScymRB+AYzjxjurQ9lVfX9QtAbEH2dhdmoUo' +
|
|
||||||
'3IDRSXpWNCe9RC1aUIyWfZO7oI7FEohNscHNTLEcT+wFnFUPByLlXmjN' +
|
|
||||||
'Z7FKeNpvUm3jTY4t4sbZH8o2dUl624PAw1INcJ6FKqWGWwoFT2j1MYC+' +
|
|
||||||
'YV/LkLTdjuWfayvwLMh27G/FfKCRbW36vqinegqpPDylsx9+3oFkEw3y' +
|
|
||||||
'5Z8+44oN91rE/4Md7JhPJeRVlFC9TNCj4dA+EVhbbQqscvSnIH2uHkMw' +
|
|
||||||
'7mNNo7xba/YT9KoPDaniqnYqb+q2pX1WNWE7dLS2wfroMAS3kh8P22DA' +
|
|
||||||
'V37AeiNoD2PcI6ZcHbRdPa+XRrRcJhSPPW7UQ0z4OvBfjdu/w390QxAx' +
|
|
||||||
'SxvZewoh49fKKB6hTsRnZb4tpHkjlww=="}'
|
|
||||||
),
|
|
||||||
paste2 = $.PrivateBin.CryptTool.decipher(
|
|
||||||
's9pmKZKOBN7EVvHpTA8jjLFH3Xlz/0l8lB4+ONPACrM=',
|
|
||||||
'', // no password
|
|
||||||
'{"iv":"Z7lAZQbkrqGMvruxoSm6Pw==","v":1,"iter":10000,"ks"' +
|
|
||||||
':256,"ts":128,"mode":"gcm","adata":"","cipher":"aes","sa' +
|
|
||||||
'lt":"jN6CjbQMJCM=","ct":"PuOPWB3i2FPcreSrLYeQf84LdE8RHjs' +
|
|
||||||
'c+MGtiOr4b7doNyWKYtkNorbRadxaPnEee2/Utrp1MIIfY5juJSy8RGw' +
|
|
||||||
'EPX5ciWcYe6EzsXWznsnvhmpKNj9B7eIIrfSbxfy8E2e/g7xav1nive+' +
|
|
||||||
'ljToka3WT1DZ8ILQd/NbnJeHWaoSEOfvz8+d8QJPb1tNZvs7zEY95Dum' +
|
|
||||||
'QwbyOsIMKAvcZHJ9OJNpujXzdMyt6DpcFcqlldWBZ/8q5rAUTw0HNx/r' +
|
|
||||||
'CgbhAxRYfNoTLIcMM4L0cXbPSgCjwf5FuO3EdE13mgEDhcClW79m0Qvc' +
|
|
||||||
'nIh8xgzYoxLbp0+AwvC/MbZM8savN/0ieWr2EKkZ04ggiOIEyvfCUuNp' +
|
|
||||||
'rQBYO+y8kKduNEN6by0Yf4LRCPfmwN+GezDLuzTnZIMhPbGqUAdgV6Ex' +
|
|
||||||
'qK2ULEEIrQEMoOuQIxfoMhqLlzG79vXGt2O+BY+4IiYfvmuRLks4UXfy' +
|
|
||||||
'HqxPXTJg48IYbGs0j4TtJPUgp3523EyYLwEGyVTAuWhYAmVIwd/hoV7d' +
|
|
||||||
'7tmfcF73w9dufDFI3LNca2KxzBnWNPYvIZKBwWbq8ncxkb191dP6mjEi' +
|
|
||||||
'7NnhqVk5A6vIBbu4AC5PZf76l6yep4xsoy/QtdDxCMocCXeAML9MQ9uP' +
|
|
||||||
'QbuspOKrBvMfN5igA1kBqasnxI472KBNXsdZnaDddSVUuvhTcETM="}'
|
|
||||||
);
|
|
||||||
|
|
||||||
global.Base64 = newBase64;
|
|
||||||
jsdom();
|
|
||||||
delete require.cache[require.resolve('../privatebin')];
|
|
||||||
require('../privatebin');
|
|
||||||
assert.ok(
|
|
||||||
paste1.includes('securely packed in iron') &&
|
|
||||||
paste2.includes('Sol is right')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('isEntropyReady & addEntropySeedListener', function () {
|
|
||||||
it(
|
|
||||||
'lets us know that enough entropy is collected or make us wait for it',
|
|
||||||
function(done) {
|
|
||||||
if ($.PrivateBin.CryptTool.isEntropyReady()) {
|
|
||||||
done();
|
|
||||||
} else {
|
|
||||||
$.PrivateBin.CryptTool.addEntropySeedListener(function() {
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getSymmetricKey', function () {
|
|
||||||
var keys = [];
|
|
||||||
|
|
||||||
// the parameter is used to ensure the test is run more then one time
|
|
||||||
jsc.property(
|
|
||||||
'returns random, non-empty keys',
|
|
||||||
function() {
|
|
||||||
var key = $.PrivateBin.CryptTool.getSymmetricKey(),
|
|
||||||
result = (key !== '' && keys.indexOf(key) === -1);
|
|
||||||
keys.push(key);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Base64.js vs SJCL.js vs abab.js', function () {
|
|
||||||
jsc.property(
|
|
||||||
'these all return the same base64 string',
|
|
||||||
'string',
|
|
||||||
function(string) {
|
|
||||||
var base64 = Base64.toBase64(string),
|
|
||||||
sjcl = global.sjcl.codec.base64.fromBits(global.sjcl.codec.utf8String.toBits(string)),
|
|
||||||
abab = window.btoa(Base64.utob(string));
|
|
||||||
return base64 === sjcl && sjcl === abab;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
var common = require('../common');
|
|
||||||
|
|
||||||
describe('DiscussionViewer', function () {
|
|
||||||
describe('handleNotification, prepareNewDiscussion, addComment, finishDiscussion, getReplyMessage, getReplyNickname, getReplyCommentId & highlightComment', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'displays & hides comments as requested',
|
|
||||||
jsc.array(
|
|
||||||
jsc.record({
|
|
||||||
idArray: jsc.nearray(common.jscAlnumString()),
|
|
||||||
parentidArray: jsc.nearray(common.jscAlnumString()),
|
|
||||||
data: jsc.string,
|
|
||||||
meta: jsc.record({
|
|
||||||
nickname: jsc.string,
|
|
||||||
postdate: jsc.nat,
|
|
||||||
vizhash: jsc.string
|
|
||||||
})
|
|
||||||
})
|
|
||||||
),
|
|
||||||
'nat',
|
|
||||||
'bool',
|
|
||||||
'string',
|
|
||||||
'string',
|
|
||||||
jsc.elements(['loading', 'danger', 'other']),
|
|
||||||
'nestring',
|
|
||||||
function (comments, commentKey, fadeOut, nickname, message, alertType, alert) {
|
|
||||||
var clean = jsdom(),
|
|
||||||
results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<div id="discussion"><h4>Discussion</h4>' +
|
|
||||||
'<div id="commentcontainer"></div></div><div id="templates">' +
|
|
||||||
'<article id="commenttemplate" class="comment">' +
|
|
||||||
'<div class="commentmeta"><span class="nickname">name</span>' +
|
|
||||||
'<span class="commentdate">0000-00-00</span></div>' +
|
|
||||||
'<div class="commentdata">c</div>' +
|
|
||||||
'<button class="btn btn-default btn-sm">Reply</button>' +
|
|
||||||
'</article><p id="commenttailtemplate" class="comment">' +
|
|
||||||
'<button class="btn btn-default btn-sm">Add comment</button>' +
|
|
||||||
'</p><div id="replytemplate" class="reply hidden">' +
|
|
||||||
'<input type="text" id="nickname" class="form-control" ' +
|
|
||||||
'title="Optional nickname…" placeholder="Optional ' +
|
|
||||||
'nickname…" /><textarea id="replymessage" ' +
|
|
||||||
'class="replymessage form-control" cols="80" rows="7">' +
|
|
||||||
'</textarea><br /><div id="replystatus" role="alert" ' +
|
|
||||||
'class="statusmessage hidden alert"><span class="glyphicon" ' +
|
|
||||||
'aria-hidden="true"></span> </div><button id="replybutton" ' +
|
|
||||||
'class="btn btn-default btn-sm">Post comment</button></div></div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.Model.init();
|
|
||||||
$.PrivateBin.DiscussionViewer.init();
|
|
||||||
results.push(
|
|
||||||
!$('#discussion').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.DiscussionViewer.prepareNewDiscussion();
|
|
||||||
results.push(
|
|
||||||
$('#discussion').hasClass('hidden')
|
|
||||||
);
|
|
||||||
comments.forEach(function (comment) {
|
|
||||||
comment.id = comment.idArray.join('');
|
|
||||||
comment.parentid = comment.parentidArray.join('');
|
|
||||||
$.PrivateBin.DiscussionViewer.addComment(comment, comment.data, comment.meta.nickname);
|
|
||||||
});
|
|
||||||
results.push(
|
|
||||||
$('#discussion').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.DiscussionViewer.finishDiscussion();
|
|
||||||
results.push(
|
|
||||||
!$('#discussion').hasClass('hidden') &&
|
|
||||||
comments.length + 1 >= $('#commentcontainer').children().length
|
|
||||||
);
|
|
||||||
if (comments.length > 0) {
|
|
||||||
if (commentKey >= comments.length) {
|
|
||||||
commentKey = commentKey % comments.length;
|
|
||||||
}
|
|
||||||
$.PrivateBin.DiscussionViewer.highlightComment(comments[commentKey].id, fadeOut);
|
|
||||||
results.push(
|
|
||||||
$('#comment_' + comments[commentKey].id).hasClass('highlight')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
$('#commentcontainer').find('button')[0].click();
|
|
||||||
results.push(
|
|
||||||
!$('#reply').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$('#reply #nickname').val(nickname);
|
|
||||||
$('#reply #replymessage').val(message);
|
|
||||||
$.PrivateBin.DiscussionViewer.getReplyCommentId();
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.DiscussionViewer.getReplyNickname() === $('#reply #nickname').val() &&
|
|
||||||
$.PrivateBin.DiscussionViewer.getReplyMessage() === $('#reply #replymessage').val()
|
|
||||||
);
|
|
||||||
var notificationResult = $.PrivateBin.DiscussionViewer.handleNotification(alertType === 'other' ? alert : alertType);
|
|
||||||
if (alertType === 'loading') {
|
|
||||||
results.push(notificationResult === false);
|
|
||||||
} else {
|
|
||||||
results.push(
|
|
||||||
alertType === 'danger' ? (
|
|
||||||
notificationResult.hasClass('alert-danger') &&
|
|
||||||
!notificationResult.hasClass('alert-info')
|
|
||||||
) : (
|
|
||||||
!notificationResult.hasClass('alert-danger') &&
|
|
||||||
notificationResult.hasClass('alert-info')
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
clean();
|
|
||||||
return results.every(element => element);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
require('../common');
|
|
||||||
|
|
||||||
describe('Editor', function () {
|
|
||||||
describe('show, hide, getText, setText & isPreview', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'returns text fed into the textarea, handles editor tabs',
|
|
||||||
'string',
|
|
||||||
function (text) {
|
|
||||||
var clean = jsdom(),
|
|
||||||
results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<ul id="editorTabs" class="nav nav-tabs hidden"><li ' +
|
|
||||||
'role="presentation" class="active"><a id="messageedit" ' +
|
|
||||||
'href="#">Editor</a></li><li role="presentation"><a ' +
|
|
||||||
'id="messagepreview" href="#">Preview</a></li></ul><div ' +
|
|
||||||
'id="placeholder" class="hidden">+++ no paste text +++</div>' +
|
|
||||||
'<div id="prettymessage" class="hidden"><pre id="prettyprint" ' +
|
|
||||||
'class="prettyprint linenums:1"></pre></div><div ' +
|
|
||||||
'id="plaintext" class="hidden"></div><p><textarea ' +
|
|
||||||
'id="message" name="message" cols="80" rows="25" ' +
|
|
||||||
'class="form-control hidden"></textarea></p>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.Editor.init();
|
|
||||||
results.push(
|
|
||||||
$('#editorTabs').hasClass('hidden') &&
|
|
||||||
$('#message').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.Editor.show();
|
|
||||||
results.push(
|
|
||||||
!$('#editorTabs').hasClass('hidden') &&
|
|
||||||
!$('#message').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.Editor.hide();
|
|
||||||
results.push(
|
|
||||||
$('#editorTabs').hasClass('hidden') &&
|
|
||||||
$('#message').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.Editor.show();
|
|
||||||
$.PrivateBin.Editor.focusInput();
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.Editor.getText().length === 0
|
|
||||||
);
|
|
||||||
$.PrivateBin.Editor.setText(text);
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.Editor.getText() === $('#message').val()
|
|
||||||
);
|
|
||||||
$.PrivateBin.Editor.setText();
|
|
||||||
results.push(
|
|
||||||
!$.PrivateBin.Editor.isPreview() &&
|
|
||||||
!$('#message').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$('#messagepreview').click();
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.Editor.isPreview() &&
|
|
||||||
$('#message').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$('#messageedit').click();
|
|
||||||
results.push(
|
|
||||||
!$.PrivateBin.Editor.isPreview() &&
|
|
||||||
!$('#message').hasClass('hidden')
|
|
||||||
);
|
|
||||||
clean();
|
|
||||||
return results.every(element => element);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1,278 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
var common = require('../common');
|
|
||||||
|
|
||||||
describe('Helper', function () {
|
|
||||||
describe('secondsToHuman', function () {
|
|
||||||
after(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property('returns an array with a number and a word', 'integer', function (number) {
|
|
||||||
var result = $.PrivateBin.Helper.secondsToHuman(number);
|
|
||||||
return Array.isArray(result) &&
|
|
||||||
result.length === 2 &&
|
|
||||||
result[0] === parseInt(result[0], 10) &&
|
|
||||||
typeof result[1] === 'string';
|
|
||||||
});
|
|
||||||
jsc.property('returns seconds on the first array position', 'integer 59', function (number) {
|
|
||||||
return $.PrivateBin.Helper.secondsToHuman(number)[0] === number;
|
|
||||||
});
|
|
||||||
jsc.property('returns seconds on the second array position', 'integer 59', function (number) {
|
|
||||||
return $.PrivateBin.Helper.secondsToHuman(number)[1] === 'second';
|
|
||||||
});
|
|
||||||
jsc.property('returns minutes on the first array position', 'integer 60 3599', function (number) {
|
|
||||||
return $.PrivateBin.Helper.secondsToHuman(number)[0] === Math.floor(number / 60);
|
|
||||||
});
|
|
||||||
jsc.property('returns minutes on the second array position', 'integer 60 3599', function (number) {
|
|
||||||
return $.PrivateBin.Helper.secondsToHuman(number)[1] === 'minute';
|
|
||||||
});
|
|
||||||
jsc.property('returns hours on the first array position', 'integer 3600 86399', function (number) {
|
|
||||||
return $.PrivateBin.Helper.secondsToHuman(number)[0] === Math.floor(number / (60 * 60));
|
|
||||||
});
|
|
||||||
jsc.property('returns hours on the second array position', 'integer 3600 86399', function (number) {
|
|
||||||
return $.PrivateBin.Helper.secondsToHuman(number)[1] === 'hour';
|
|
||||||
});
|
|
||||||
jsc.property('returns days on the first array position', 'integer 86400 5184000', function (number) {
|
|
||||||
return $.PrivateBin.Helper.secondsToHuman(number)[0] === Math.floor(number / (60 * 60 * 24));
|
|
||||||
});
|
|
||||||
jsc.property('returns days on the second array position', 'integer 86400 5184000', function (number) {
|
|
||||||
return $.PrivateBin.Helper.secondsToHuman(number)[1] === 'day';
|
|
||||||
});
|
|
||||||
// max safe integer as per http://ecma262-5.com/ELS5_HTML.htm#Section_8.5
|
|
||||||
jsc.property('returns months on the first array position', 'integer 5184000 9007199254740991', function (number) {
|
|
||||||
return $.PrivateBin.Helper.secondsToHuman(number)[0] === Math.floor(number / (60 * 60 * 24 * 30));
|
|
||||||
});
|
|
||||||
jsc.property('returns months on the second array position', 'integer 5184000 9007199254740991', function (number) {
|
|
||||||
return $.PrivateBin.Helper.secondsToHuman(number)[1] === 'month';
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// this test is not yet meaningful using jsdom, as it does not contain getSelection support.
|
|
||||||
// TODO: This needs to be tested using a browser.
|
|
||||||
describe('selectText', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
jsc.property(
|
|
||||||
'selection contains content of given ID',
|
|
||||||
jsc.nearray(jsc.nearray(common.jscAlnumString())),
|
|
||||||
'nearray string',
|
|
||||||
function (ids, contents) {
|
|
||||||
var html = '',
|
|
||||||
result = true;
|
|
||||||
ids.forEach(function(item, i) {
|
|
||||||
html += '<div id="' + item.join('') + '">' + common.htmlEntities(contents[i] || contents[0]) + '</div>';
|
|
||||||
});
|
|
||||||
var clean = jsdom(html);
|
|
||||||
// TODO: As per https://github.com/tmpvar/jsdom/issues/321 there is no getSelection in jsdom, yet.
|
|
||||||
// Once there is one, uncomment the block below to actually check the result.
|
|
||||||
/*
|
|
||||||
ids.forEach(function(item, i) {
|
|
||||||
$.PrivateBin.Helper.selectText(item.join(''));
|
|
||||||
result *= (contents[i] || contents[0]) === window.getSelection().toString();
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
clean();
|
|
||||||
return Boolean(result);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('urls2links', function () {
|
|
||||||
after(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'ignores non-URL content',
|
|
||||||
'string',
|
|
||||||
function (content) {
|
|
||||||
return content === $.PrivateBin.Helper.urls2links(content);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
jsc.property(
|
|
||||||
'replaces URLs with anchors',
|
|
||||||
'string',
|
|
||||||
jsc.elements(['http', 'https', 'ftp']),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.array(common.jscQueryString()),
|
|
||||||
jsc.array(common.jscHashString()),
|
|
||||||
'string',
|
|
||||||
function (prefix, schema, address, query, fragment, postfix) {
|
|
||||||
var query = query.join(''),
|
|
||||||
fragment = fragment.join(''),
|
|
||||||
url = schema + '://' + address.join('') + '/?' + query + '#' + fragment,
|
|
||||||
prefix = common.htmlEntities(prefix),
|
|
||||||
postfix = ' ' + common.htmlEntities(postfix);
|
|
||||||
|
|
||||||
// special cases: When the query string and fragment imply the beginning of an HTML entity, eg. � or &#x
|
|
||||||
if (
|
|
||||||
query.slice(-1) === '&' &&
|
|
||||||
(parseInt(fragment.substring(0, 1), 10) >= 0 || fragment.charAt(0) === 'x' )
|
|
||||||
)
|
|
||||||
{
|
|
||||||
url = schema + '://' + address.join('') + '/?' + query.substring(0, query.length - 1);
|
|
||||||
postfix = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return prefix + '<a href="' + url + '" rel="nofollow">' + url + '</a>' + postfix === $.PrivateBin.Helper.urls2links(prefix + url + postfix);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
jsc.property(
|
|
||||||
'replaces magnet links with anchors',
|
|
||||||
'string',
|
|
||||||
jsc.array(common.jscQueryString()),
|
|
||||||
'string',
|
|
||||||
function (prefix, query, postfix) {
|
|
||||||
var url = 'magnet:?' + query.join('').replace(/^&+|&+$/gm,''),
|
|
||||||
prefix = common.htmlEntities(prefix),
|
|
||||||
postfix = common.htmlEntities(postfix);
|
|
||||||
return prefix + '<a href="' + url + '" rel="nofollow">' + url + '</a> ' + postfix === $.PrivateBin.Helper.urls2links(prefix + url + ' ' + postfix);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('sprintf', function () {
|
|
||||||
after(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'replaces %s in strings with first given parameter',
|
|
||||||
'string',
|
|
||||||
'(small nearray) string',
|
|
||||||
'string',
|
|
||||||
function (prefix, params, postfix) {
|
|
||||||
prefix = prefix.replace(/%(s|d)/g, '%%');
|
|
||||||
params[0] = params[0].replace(/%(s|d)/g, '%%');
|
|
||||||
postfix = postfix.replace(/%(s|d)/g, '%%');
|
|
||||||
var result = prefix + params[0] + postfix;
|
|
||||||
params.unshift(prefix + '%s' + postfix);
|
|
||||||
return result === $.PrivateBin.Helper.sprintf.apply(this, params);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
jsc.property(
|
|
||||||
'replaces %d in strings with first given parameter',
|
|
||||||
'string',
|
|
||||||
'(small nearray) nat',
|
|
||||||
'string',
|
|
||||||
function (prefix, params, postfix) {
|
|
||||||
prefix = prefix.replace(/%(s|d)/g, '%%');
|
|
||||||
postfix = postfix.replace(/%(s|d)/g, '%%');
|
|
||||||
var result = prefix + params[0] + postfix;
|
|
||||||
params.unshift(prefix + '%d' + postfix);
|
|
||||||
return result === $.PrivateBin.Helper.sprintf.apply(this, params);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
jsc.property(
|
|
||||||
'replaces %d in strings with 0 if first parameter is not a number',
|
|
||||||
'string',
|
|
||||||
'(small nearray) falsy',
|
|
||||||
'string',
|
|
||||||
function (prefix, params, postfix) {
|
|
||||||
prefix = prefix.replace(/%(s|d)/g, '%%');
|
|
||||||
postfix = postfix.replace(/%(s|d)/g, '%%');
|
|
||||||
var result = prefix + '0' + postfix;
|
|
||||||
params.unshift(prefix + '%d' + postfix);
|
|
||||||
return result === $.PrivateBin.Helper.sprintf.apply(this, params);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
jsc.property(
|
|
||||||
'replaces %d and %s in strings in order',
|
|
||||||
'string',
|
|
||||||
'nat',
|
|
||||||
'string',
|
|
||||||
'string',
|
|
||||||
'string',
|
|
||||||
function (prefix, uint, middle, string, postfix) {
|
|
||||||
prefix = prefix.replace(/%(s|d)/g, '%%');
|
|
||||||
middle = middle.replace(/%(s|d)/g, '%%');
|
|
||||||
postfix = postfix.replace(/%(s|d)/g, '%%');
|
|
||||||
var params = [prefix + '%d' + middle + '%s' + postfix, uint, string],
|
|
||||||
result = prefix + uint + middle + string + postfix;
|
|
||||||
return result === $.PrivateBin.Helper.sprintf.apply(this, params);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
jsc.property(
|
|
||||||
'replaces %d and %s in strings in reverse order',
|
|
||||||
'string',
|
|
||||||
'nat',
|
|
||||||
'string',
|
|
||||||
'string',
|
|
||||||
'string',
|
|
||||||
function (prefix, uint, middle, string, postfix) {
|
|
||||||
prefix = prefix.replace(/%(s|d)/g, '%%');
|
|
||||||
middle = middle.replace(/%(s|d)/g, '%%');
|
|
||||||
postfix = postfix.replace(/%(s|d)/g, '%%');
|
|
||||||
var params = [prefix + '%s' + middle + '%d' + postfix, string, uint],
|
|
||||||
result = prefix + string + middle + uint + postfix;
|
|
||||||
return result === $.PrivateBin.Helper.sprintf.apply(this, params);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getCookie', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
jsc.property(
|
|
||||||
'returns the requested cookie',
|
|
||||||
'nearray asciinestring',
|
|
||||||
'nearray asciistring',
|
|
||||||
function (labels, values) {
|
|
||||||
var selectedKey = '', selectedValue = '',
|
|
||||||
cookieArray = [];
|
|
||||||
labels.forEach(function(item, i) {
|
|
||||||
// deliberatly using a non-ascii key for replacing invalid characters
|
|
||||||
var key = item.replace(/[\s;,=]/g, Array(i+2).join('£')),
|
|
||||||
value = (values[i] || values[0]).replace(/[\s;,=]/g, '');
|
|
||||||
cookieArray.push(key + '=' + value);
|
|
||||||
if (Math.random() < 1 / i || selectedKey === key)
|
|
||||||
{
|
|
||||||
selectedKey = key;
|
|
||||||
selectedValue = value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
var clean = jsdom('', {cookie: cookieArray}),
|
|
||||||
result = $.PrivateBin.Helper.getCookie(selectedKey);
|
|
||||||
clean();
|
|
||||||
return result === selectedValue;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('baseUri', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.Helper.reset();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'returns the URL without query & fragment',
|
|
||||||
common.jscSchemas(),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.array(common.jscQueryString()),
|
|
||||||
'string',
|
|
||||||
function (schema, address, query, fragment) {
|
|
||||||
var expected = schema + '://' + address.join('') + '/',
|
|
||||||
clean = jsdom('', {url: expected + '?' + query.join('') + '#' + fragment}),
|
|
||||||
result = $.PrivateBin.Helper.baseUri();
|
|
||||||
$.PrivateBin.Helper.reset();
|
|
||||||
clean();
|
|
||||||
return expected === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('htmlEntities', function () {
|
|
||||||
after(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'removes all HTML entities from any given string',
|
|
||||||
'string',
|
|
||||||
function (string) {
|
|
||||||
var result = common.htmlEntities(string);
|
|
||||||
return !(/[<>"'`=\/]/.test(result)) && !(string.indexOf('&') > -1 && !(/&/.test(result)));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
128
js/test/I18n.js
128
js/test/I18n.js
@@ -1,128 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
var common = require('../common');
|
|
||||||
|
|
||||||
describe('I18n', function () {
|
|
||||||
describe('translate', function () {
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.I18n.reset();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'returns message ID unchanged if no translation found',
|
|
||||||
'string',
|
|
||||||
function (messageId) {
|
|
||||||
messageId = messageId.replace(/%(s|d)/g, '%%');
|
|
||||||
var plurals = [messageId, messageId + 's'],
|
|
||||||
fake = [messageId],
|
|
||||||
result = $.PrivateBin.I18n.translate(messageId);
|
|
||||||
$.PrivateBin.I18n.reset();
|
|
||||||
|
|
||||||
var alias = $.PrivateBin.I18n._(messageId);
|
|
||||||
$.PrivateBin.I18n.reset();
|
|
||||||
|
|
||||||
var pluralResult = $.PrivateBin.I18n.translate(plurals);
|
|
||||||
$.PrivateBin.I18n.reset();
|
|
||||||
|
|
||||||
var pluralAlias = $.PrivateBin.I18n._(plurals);
|
|
||||||
$.PrivateBin.I18n.reset();
|
|
||||||
|
|
||||||
var fakeResult = $.PrivateBin.I18n.translate(fake);
|
|
||||||
$.PrivateBin.I18n.reset();
|
|
||||||
|
|
||||||
var fakeAlias = $.PrivateBin.I18n._(fake);
|
|
||||||
$.PrivateBin.I18n.reset();
|
|
||||||
|
|
||||||
return messageId === result && messageId === alias &&
|
|
||||||
messageId === pluralResult && messageId === pluralAlias &&
|
|
||||||
messageId === fakeResult && messageId === fakeAlias;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
jsc.property(
|
|
||||||
'replaces %s in strings with first given parameter',
|
|
||||||
'string',
|
|
||||||
'(small nearray) string',
|
|
||||||
'string',
|
|
||||||
function (prefix, params, postfix) {
|
|
||||||
prefix = prefix.replace(/%(s|d)/g, '%%');
|
|
||||||
params[0] = params[0].replace(/%(s|d)/g, '%%');
|
|
||||||
postfix = postfix.replace(/%(s|d)/g, '%%');
|
|
||||||
var translation = prefix + params[0] + postfix;
|
|
||||||
params.unshift(prefix + '%s' + postfix);
|
|
||||||
var result = $.PrivateBin.I18n.translate.apply(this, params);
|
|
||||||
$.PrivateBin.I18n.reset();
|
|
||||||
var alias = $.PrivateBin.I18n._.apply(this, params);
|
|
||||||
$.PrivateBin.I18n.reset();
|
|
||||||
return translation === result && translation === alias;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getPluralForm', function () {
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.I18n.reset();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'returns valid key for plural form',
|
|
||||||
common.jscSupportedLanguages(),
|
|
||||||
'integer',
|
|
||||||
function(language, n) {
|
|
||||||
$.PrivateBin.I18n.reset(language);
|
|
||||||
var result = $.PrivateBin.I18n.getPluralForm(n);
|
|
||||||
// arabic seems to have the highest plural count with 6 forms
|
|
||||||
return result >= 0 && result <= 5;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
// loading of JSON via AJAX needs to be tested in the browser, this just mocks it
|
|
||||||
// TODO: This needs to be tested using a browser.
|
|
||||||
describe('loadTranslations', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.I18n.reset();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'downloads and handles any supported language',
|
|
||||||
common.jscSupportedLanguages(),
|
|
||||||
function(language) {
|
|
||||||
var clean = jsdom('', {url: 'https://privatebin.net/', cookie: ['lang=' + language]});
|
|
||||||
|
|
||||||
$.PrivateBin.I18n.reset('en');
|
|
||||||
$.PrivateBin.I18n.loadTranslations();
|
|
||||||
$.PrivateBin.I18n.reset(language, require('../../i18n/' + language + '.json'));
|
|
||||||
var result = $.PrivateBin.I18n.translate('en'),
|
|
||||||
alias = $.PrivateBin.I18n._('en');
|
|
||||||
|
|
||||||
clean();
|
|
||||||
return language === result && language === alias;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'should default to en',
|
|
||||||
function() {
|
|
||||||
var clean = jsdom('', {url: 'https://privatebin.net/'});
|
|
||||||
|
|
||||||
// when navigator.userLanguage is undefined and no default language
|
|
||||||
// is specified, it would throw an error
|
|
||||||
[ 'language', 'userLanguage' ].forEach(function (key) {
|
|
||||||
Object.defineProperty(navigator, key, {
|
|
||||||
value: undefined,
|
|
||||||
writeable: false
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
$.PrivateBin.I18n.reset('en');
|
|
||||||
$.PrivateBin.I18n.loadTranslations();
|
|
||||||
var result = $.PrivateBin.I18n.translate('en'),
|
|
||||||
alias = $.PrivateBin.I18n._('en');
|
|
||||||
|
|
||||||
clean();
|
|
||||||
return 'en' === result && 'en' === alias;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
221
js/test/Model.js
221
js/test/Model.js
@@ -1,221 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
var common = require('../common');
|
|
||||||
|
|
||||||
describe('Model', function () {
|
|
||||||
describe('getExpirationDefault', function () {
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'returns the contents of the element with id "pasteExpiration"',
|
|
||||||
'array asciinestring',
|
|
||||||
'string',
|
|
||||||
'small nat',
|
|
||||||
function (keys, value, key) {
|
|
||||||
keys = keys.map(common.htmlEntities);
|
|
||||||
value = common.htmlEntities(value);
|
|
||||||
var content = keys.length > key ? keys[key] : (keys.length > 0 ? keys[0] : 'null'),
|
|
||||||
contents = '<select id="pasteExpiration" name="pasteExpiration">';
|
|
||||||
keys.forEach(function(item) {
|
|
||||||
contents += '<option value="' + item + '"';
|
|
||||||
if (item === content) {
|
|
||||||
contents += ' selected="selected"';
|
|
||||||
}
|
|
||||||
contents += '>' + value + '</option>';
|
|
||||||
});
|
|
||||||
contents += '</select>';
|
|
||||||
$('body').html(contents);
|
|
||||||
var result = common.htmlEntities(
|
|
||||||
$.PrivateBin.Model.getExpirationDefault()
|
|
||||||
);
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
return content === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getFormatDefault', function () {
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'returns the contents of the element with id "pasteFormatter"',
|
|
||||||
'array asciinestring',
|
|
||||||
'string',
|
|
||||||
'small nat',
|
|
||||||
function (keys, value, key) {
|
|
||||||
keys = keys.map(common.htmlEntities);
|
|
||||||
value = common.htmlEntities(value);
|
|
||||||
var content = keys.length > key ? keys[key] : (keys.length > 0 ? keys[0] : 'null'),
|
|
||||||
contents = '<select id="pasteFormatter" name="pasteFormatter">';
|
|
||||||
keys.forEach(function(item) {
|
|
||||||
contents += '<option value="' + item + '"';
|
|
||||||
if (item === content) {
|
|
||||||
contents += ' selected="selected"';
|
|
||||||
}
|
|
||||||
contents += '>' + value + '</option>';
|
|
||||||
});
|
|
||||||
contents += '</select>';
|
|
||||||
$('body').html(contents);
|
|
||||||
var result = common.htmlEntities(
|
|
||||||
$.PrivateBin.Model.getFormatDefault()
|
|
||||||
);
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
return content === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getPasteId', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'returns the query string without separator, if any',
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.nearray(common.jscHashString()),
|
|
||||||
'string',
|
|
||||||
function (schema, address, query, fragment) {
|
|
||||||
var queryString = query.join(''),
|
|
||||||
clean = jsdom('', {
|
|
||||||
url: schema.join('') + '://' + address.join('') +
|
|
||||||
'/?' + queryString + '#' + fragment
|
|
||||||
}),
|
|
||||||
result = $.PrivateBin.Model.getPasteId();
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
clean();
|
|
||||||
return queryString === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
jsc.property(
|
|
||||||
'throws exception on empty query string',
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
'string',
|
|
||||||
function (schema, address, fragment) {
|
|
||||||
var clean = jsdom('', {
|
|
||||||
url: schema.join('') + '://' + address.join('') +
|
|
||||||
'/#' + fragment
|
|
||||||
}),
|
|
||||||
result = false;
|
|
||||||
try {
|
|
||||||
$.PrivateBin.Model.getPasteId();
|
|
||||||
}
|
|
||||||
catch(err) {
|
|
||||||
result = true;
|
|
||||||
}
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
clean();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getPasteKey', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
jsc.property(
|
|
||||||
'returns the fragment of the URL',
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.array(common.jscQueryString()),
|
|
||||||
jsc.nearray(common.jscBase64String()),
|
|
||||||
function (schema, address, query, fragment) {
|
|
||||||
var fragmentString = fragment.join(''),
|
|
||||||
clean = jsdom('', {
|
|
||||||
url: schema.join('') + '://' + address.join('') +
|
|
||||||
'/?' + query.join('') + '#' + fragmentString
|
|
||||||
}),
|
|
||||||
result = $.PrivateBin.Model.getPasteKey();
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
clean();
|
|
||||||
return fragmentString === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
jsc.property(
|
|
||||||
'returns the fragment stripped of trailing query parts',
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.array(common.jscQueryString()),
|
|
||||||
jsc.nearray(common.jscBase64String()),
|
|
||||||
jsc.array(common.jscHashString()),
|
|
||||||
function (schema, address, query, fragment, trail) {
|
|
||||||
var fragmentString = fragment.join(''),
|
|
||||||
clean = jsdom('', {
|
|
||||||
url: schema.join('') + '://' + address.join('') + '/?' +
|
|
||||||
query.join('') + '#' + fragmentString + '&' + trail.join('')
|
|
||||||
}),
|
|
||||||
result = $.PrivateBin.Model.getPasteKey();
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
clean();
|
|
||||||
return fragmentString === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
jsc.property(
|
|
||||||
'throws exception on empty fragment of the URL',
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.array(common.jscQueryString()),
|
|
||||||
function (schema, address, query) {
|
|
||||||
var clean = jsdom('', {
|
|
||||||
url: schema.join('') + '://' + address.join('') +
|
|
||||||
'/?' + query.join('')
|
|
||||||
}),
|
|
||||||
result = false;
|
|
||||||
try {
|
|
||||||
$.PrivateBin.Model.getPasteKey();
|
|
||||||
}
|
|
||||||
catch(err) {
|
|
||||||
result = true;
|
|
||||||
}
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
clean();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getTemplate', function () {
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'returns the contents of the element with id "[name]template"',
|
|
||||||
jsc.nearray(common.jscAlnumString()),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.nearray(common.jscAlnumString()),
|
|
||||||
function (id, element, value) {
|
|
||||||
id = id.join('');
|
|
||||||
element = element.join('');
|
|
||||||
value = value.join('').trim();
|
|
||||||
|
|
||||||
// <br>, <hr>, <img> and <wbr> tags can't contain strings,
|
|
||||||
// table tags can't be alone, so test with a <p> instead
|
|
||||||
if (['br', 'col', 'hr', 'img', 'tr', 'td', 'th', 'wbr'].indexOf(element) >= 0) {
|
|
||||||
element = 'p';
|
|
||||||
}
|
|
||||||
|
|
||||||
$('body').html(
|
|
||||||
'<div id="templates"><' + element + ' id="' + id +
|
|
||||||
'template">' + value + '</' + element + '></div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.Model.init();
|
|
||||||
var template = '<' + element + ' id="' + id + '">' + value +
|
|
||||||
'</' + element + '>',
|
|
||||||
result = $.PrivateBin.Model.getTemplate(id).wrap('<p/>').parent().html();
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
return template === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
var common = require('../common');
|
|
||||||
|
|
||||||
describe('PasteStatus', function () {
|
|
||||||
describe('createPasteNotification', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'creates a notification after a successfull paste upload',
|
|
||||||
common.jscSchemas(),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.array(common.jscQueryString()),
|
|
||||||
'string',
|
|
||||||
common.jscSchemas(),
|
|
||||||
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('')),
|
|
||||||
clean = jsdom();
|
|
||||||
$('body').html('<div><div id="deletelink"></div><div id="pastelink"></div></div>');
|
|
||||||
$.PrivateBin.PasteStatus.init();
|
|
||||||
$.PrivateBin.PasteStatus.createPasteNotification(expected1, expected2);
|
|
||||||
var result1 = $('#pasteurl')[0].href,
|
|
||||||
result2 = $('#deletelink a')[0].href;
|
|
||||||
clean();
|
|
||||||
return result1 === expected1 && result2 === expected2;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('showRemainingTime', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'shows burn after reading message or remaining time',
|
|
||||||
'bool',
|
|
||||||
'nat',
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.nearray(common.jscQueryString()),
|
|
||||||
'string',
|
|
||||||
function (
|
|
||||||
burnafterreading, remainingTime,
|
|
||||||
schema, address, query, fragment
|
|
||||||
) {
|
|
||||||
var clean = jsdom('', {
|
|
||||||
url: schema.join('') + '://' + address.join('') +
|
|
||||||
'/?' + query.join('') + '#' + fragment
|
|
||||||
}),
|
|
||||||
result;
|
|
||||||
$('body').html('<div id="remainingtime" class="hidden"></div>');
|
|
||||||
$.PrivateBin.PasteStatus.init();
|
|
||||||
$.PrivateBin.PasteStatus.showRemainingTime({
|
|
||||||
'burnafterreading': burnafterreading,
|
|
||||||
'remaining_time': remainingTime,
|
|
||||||
'expire_date': remainingTime ? ((new Date()).getTime() / 1000) + remainingTime : 0
|
|
||||||
});
|
|
||||||
if (burnafterreading) {
|
|
||||||
result = $('#remainingtime').hasClass('foryoureyesonly') &&
|
|
||||||
!$('#remainingtime').hasClass('hidden');
|
|
||||||
} else if (remainingTime) {
|
|
||||||
result =!$('#remainingtime').hasClass('foryoureyesonly') &&
|
|
||||||
!$('#remainingtime').hasClass('hidden');
|
|
||||||
} else {
|
|
||||||
result = $('#remainingtime').hasClass('hidden') &&
|
|
||||||
!$('#remainingtime').hasClass('foryoureyesonly');
|
|
||||||
}
|
|
||||||
clean();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('hideMessages', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'hides all messages',
|
|
||||||
function() {
|
|
||||||
$('body').html(
|
|
||||||
'<div id="remainingtime"></div><div id="pastesuccess"></div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.PasteStatus.init();
|
|
||||||
$.PrivateBin.PasteStatus.hideMessages();
|
|
||||||
assert.ok(
|
|
||||||
$('#remainingtime').hasClass('hidden') &&
|
|
||||||
$('#pastesuccess').hasClass('hidden')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
var common = require('../common');
|
|
||||||
|
|
||||||
describe('PasteViewer', function () {
|
|
||||||
describe('run, hide, getText, setText, getFormat, setFormat & isPrettyPrinted', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'displays text according to format',
|
|
||||||
common.jscFormats(),
|
|
||||||
'nestring',
|
|
||||||
function (format, text) {
|
|
||||||
var clean = jsdom(),
|
|
||||||
results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<div id="placeholder" class="hidden">+++ no paste text ' +
|
|
||||||
'+++</div><div id="prettymessage" class="hidden"><pre ' +
|
|
||||||
'id="prettyprint" class="prettyprint linenums:1"></pre>' +
|
|
||||||
'</div><div id="plaintext" class="hidden"></div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.PasteViewer.init();
|
|
||||||
$.PrivateBin.PasteViewer.setFormat(format);
|
|
||||||
$.PrivateBin.PasteViewer.setText('');
|
|
||||||
results.push(
|
|
||||||
$('#placeholder').hasClass('hidden') &&
|
|
||||||
$('#prettymessage').hasClass('hidden') &&
|
|
||||||
$('#plaintext').hasClass('hidden') &&
|
|
||||||
$.PrivateBin.PasteViewer.getFormat() === format &&
|
|
||||||
$.PrivateBin.PasteViewer.getText() === ''
|
|
||||||
);
|
|
||||||
$.PrivateBin.PasteViewer.run();
|
|
||||||
results.push(
|
|
||||||
!$('#placeholder').hasClass('hidden') &&
|
|
||||||
$('#prettymessage').hasClass('hidden') &&
|
|
||||||
$('#plaintext').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.PasteViewer.hide();
|
|
||||||
results.push(
|
|
||||||
$('#placeholder').hasClass('hidden') &&
|
|
||||||
$('#prettymessage').hasClass('hidden') &&
|
|
||||||
$('#plaintext').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.PasteViewer.setText(text);
|
|
||||||
$.PrivateBin.PasteViewer.run();
|
|
||||||
results.push(
|
|
||||||
$('#placeholder').hasClass('hidden') &&
|
|
||||||
!$.PrivateBin.PasteViewer.isPrettyPrinted() &&
|
|
||||||
$.PrivateBin.PasteViewer.getText() === text
|
|
||||||
);
|
|
||||||
if (format === 'markdown') {
|
|
||||||
results.push(
|
|
||||||
$('#prettymessage').hasClass('hidden') &&
|
|
||||||
!$('#plaintext').hasClass('hidden')
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
results.push(
|
|
||||||
!$('#prettymessage').hasClass('hidden') &&
|
|
||||||
$('#plaintext').hasClass('hidden')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
clean();
|
|
||||||
return results.every(element => element);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'sanitizes XSS',
|
|
||||||
common.jscFormats(),
|
|
||||||
'string',
|
|
||||||
// @see {@link https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet}
|
|
||||||
jsc.elements([
|
|
||||||
'<PLAINTEXT>',
|
|
||||||
'></SCRIPT>">\'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>',
|
|
||||||
'\'\';!--"<XSS>=&{()}',
|
|
||||||
'<SCRIPT SRC=http://example.com/xss.js></SCRIPT>',
|
|
||||||
'\'">><marquee><img src=x onerror=confirm(1)></marquee>">' +
|
|
||||||
'</plaintext\\></|\\><plaintext/onmouseover=prompt(1)>' +
|
|
||||||
'<script>prompt(1)</script>@gmail.com<isindex formaction=' +
|
|
||||||
'javascript:alert(/XSS/) type=submit>\'-->"></script>' +
|
|
||||||
'<script>alert(document.cookie)</script>"><img/id="confirm' +
|
|
||||||
'(1)"/alt="/"src="/"onerror=eval(id)>\'">',
|
|
||||||
'<IMG SRC="javascript:alert(\'XSS\');">',
|
|
||||||
'<IMG SRC=javascript:alert(\'XSS\')>',
|
|
||||||
'<IMG SRC=JaVaScRiPt:alert(\'XSS\')>',
|
|
||||||
'<IMG SRC=javascript:alert("XSS")>',
|
|
||||||
'<IMG SRC=`javascript:alert("RSnake says, \'XSS\'")`>',
|
|
||||||
'<a onmouseover="alert(document.cookie)">xxs link</a>',
|
|
||||||
'<a onmouseover=alert(document.cookie)>xxs link</a>',
|
|
||||||
'<IMG """><SCRIPT>alert("XSS")</SCRIPT>">',
|
|
||||||
'<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>',
|
|
||||||
'<IMG STYLE="xss:expr/*XSS*/ession(alert(\'XSS\'))">',
|
|
||||||
'<FRAMESET><FRAME SRC="javascript:alert(\'XSS\');"></FRAMESET>',
|
|
||||||
'<TABLE BACKGROUND="javascript:alert(\'XSS\')">',
|
|
||||||
'<TABLE><TD BACKGROUND="javascript:alert(\'XSS\')">',
|
|
||||||
'<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="httx://xss.rocks/xss.js"></SCRIPT>'
|
|
||||||
]),
|
|
||||||
'string',
|
|
||||||
function (format, prefix, xss, suffix) {
|
|
||||||
var clean = jsdom(),
|
|
||||||
text = prefix + xss + suffix;
|
|
||||||
$('body').html(
|
|
||||||
'<div id="placeholder" class="hidden">+++ no paste text ' +
|
|
||||||
'+++</div><div id="prettymessage" class="hidden"><pre ' +
|
|
||||||
'id="prettyprint" class="prettyprint linenums:1"></pre>' +
|
|
||||||
'</div><div id="plaintext" class="hidden"></div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.PasteViewer.init();
|
|
||||||
$.PrivateBin.PasteViewer.setFormat(format);
|
|
||||||
$.PrivateBin.PasteViewer.setText(text);
|
|
||||||
$.PrivateBin.PasteViewer.run();
|
|
||||||
var result = $('body').html().indexOf(xss) === -1;
|
|
||||||
clean();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
require('../common');
|
|
||||||
|
|
||||||
describe('Prompt', function () {
|
|
||||||
// TODO: this does not test the prompt() fallback, since that isn't available
|
|
||||||
// in nodejs -> replace the prompt in the "page" template with a modal
|
|
||||||
describe('requestPassword & getPassword', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'returns the password fed into the dialog',
|
|
||||||
'string',
|
|
||||||
function (password) {
|
|
||||||
password = password.replace(/\r+/g, '');
|
|
||||||
var clean = jsdom('', {url: 'ftp://example.com/?0'});
|
|
||||||
$('body').html(
|
|
||||||
'<div id="passwordmodal" class="modal fade" role="dialog">' +
|
|
||||||
'<div class="modal-dialog"><div class="modal-content">' +
|
|
||||||
'<div class="modal-body"><form id="passwordform" role="form">' +
|
|
||||||
'<div class="form-group"><input id="passworddecrypt" ' +
|
|
||||||
'type="password" class="form-control" placeholder="Enter ' +
|
|
||||||
'password"></div><button type="submit">Decrypt</button>' +
|
|
||||||
'</form></div></div></div></div>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.Model.init();
|
|
||||||
$.PrivateBin.Prompt.init();
|
|
||||||
$.PrivateBin.Prompt.requestPassword();
|
|
||||||
$('#passworddecrypt').val(password);
|
|
||||||
$('#passwordform').submit();
|
|
||||||
var result = $.PrivateBin.Prompt.getPassword();
|
|
||||||
$.PrivateBin.Model.reset();
|
|
||||||
clean();
|
|
||||||
return result === password;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1,548 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
var common = require('../common');
|
|
||||||
|
|
||||||
describe('TopNav', function () {
|
|
||||||
describe('showViewButtons & hideViewButtons', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'displays & hides navigation elements for viewing an existing paste',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav class="navbar navbar-inverse navbar-static-top">' +
|
|
||||||
'<div id="navbar" class="navbar-collapse collapse"><ul ' +
|
|
||||||
'class="nav navbar-nav"><li><button id="newbutton" ' +
|
|
||||||
'type="button" class="hidden btn btn-warning navbar-btn">' +
|
|
||||||
'<span class="glyphicon glyphicon-file" aria-hidden="true">' +
|
|
||||||
'</span> New</button><button id="clonebutton" type="button"' +
|
|
||||||
' class="hidden btn btn-warning navbar-btn">' +
|
|
||||||
'<span class="glyphicon glyphicon-duplicate" ' +
|
|
||||||
'aria-hidden="true"></span> Clone</button><button ' +
|
|
||||||
'id="rawtextbutton" type="button" class="hidden btn ' +
|
|
||||||
'btn-warning navbar-btn"><span class="glyphicon ' +
|
|
||||||
'glyphicon-text-background" aria-hidden="true"></span> ' +
|
|
||||||
'Raw text</button><button id="qrcodelink" type="button" ' +
|
|
||||||
'data-toggle="modal" data-target="#qrcodemodal" ' +
|
|
||||||
'class="hidden btn btn-warning navbar-btn"><span ' +
|
|
||||||
'class="glyphicon glyphicon-qrcode" aria-hidden="true">' +
|
|
||||||
'</span> QR code</button></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
$('#newbutton').hasClass('hidden') &&
|
|
||||||
$('#clonebutton').hasClass('hidden') &&
|
|
||||||
$('#rawtextbutton').hasClass('hidden') &&
|
|
||||||
$('#qrcodelink').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.showViewButtons();
|
|
||||||
results.push(
|
|
||||||
!$('#newbutton').hasClass('hidden') &&
|
|
||||||
!$('#clonebutton').hasClass('hidden') &&
|
|
||||||
!$('#rawtextbutton').hasClass('hidden') &&
|
|
||||||
!$('#qrcodelink').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.hideViewButtons();
|
|
||||||
results.push(
|
|
||||||
$('#newbutton').hasClass('hidden') &&
|
|
||||||
$('#clonebutton').hasClass('hidden') &&
|
|
||||||
$('#rawtextbutton').hasClass('hidden') &&
|
|
||||||
$('#qrcodelink').hasClass('hidden')
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('showCreateButtons & hideCreateButtons', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'displays & hides navigation elements for creating a paste',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div id="navbar"><ul><li><button id="newbutton" ' +
|
|
||||||
'type="button" class="hidden">New</button></li><li><a ' +
|
|
||||||
'id="expiration" href="#" class="hidden">Expiration</a>' +
|
|
||||||
'</li><li><div id="burnafterreadingoption" class="hidden">' +
|
|
||||||
'Burn after reading</div></li><li><div id="opendiscussion' +
|
|
||||||
'option" class="hidden">Open discussion</div></li><li>' +
|
|
||||||
'<div id="password" class="hidden">Password</div></li>' +
|
|
||||||
'<li id="attach" class="hidden">Attach a file</li><li>' +
|
|
||||||
'<a id="formatter" href="#" class="hidden">Format</a>' +
|
|
||||||
'</li><li><button id="sendbutton" type="button" ' +
|
|
||||||
'class="hidden">Send</button></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
$('#sendbutton').hasClass('hidden') &&
|
|
||||||
$('#expiration').hasClass('hidden') &&
|
|
||||||
$('#formatter').hasClass('hidden') &&
|
|
||||||
$('#burnafterreadingoption').hasClass('hidden') &&
|
|
||||||
$('#opendiscussionoption').hasClass('hidden') &&
|
|
||||||
$('#newbutton').hasClass('hidden') &&
|
|
||||||
$('#password').hasClass('hidden') &&
|
|
||||||
$('#attach').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.showCreateButtons();
|
|
||||||
results.push(
|
|
||||||
!$('#sendbutton').hasClass('hidden') &&
|
|
||||||
!$('#expiration').hasClass('hidden') &&
|
|
||||||
!$('#formatter').hasClass('hidden') &&
|
|
||||||
!$('#burnafterreadingoption').hasClass('hidden') &&
|
|
||||||
!$('#opendiscussionoption').hasClass('hidden') &&
|
|
||||||
!$('#newbutton').hasClass('hidden') &&
|
|
||||||
!$('#password').hasClass('hidden') &&
|
|
||||||
!$('#attach').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.hideCreateButtons();
|
|
||||||
results.push(
|
|
||||||
$('#sendbutton').hasClass('hidden') &&
|
|
||||||
$('#expiration').hasClass('hidden') &&
|
|
||||||
$('#formatter').hasClass('hidden') &&
|
|
||||||
$('#burnafterreadingoption').hasClass('hidden') &&
|
|
||||||
$('#opendiscussionoption').hasClass('hidden') &&
|
|
||||||
$('#newbutton').hasClass('hidden') &&
|
|
||||||
$('#password').hasClass('hidden') &&
|
|
||||||
$('#attach').hasClass('hidden')
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('showNewPasteButton', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'displays the button for creating a paste',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div id="navbar"><ul><li><button id="newbutton" type=' +
|
|
||||||
'"button" class="hidden">New</button></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
$('#newbutton').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.showNewPasteButton();
|
|
||||||
results.push(
|
|
||||||
!$('#newbutton').hasClass('hidden')
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('hideCloneButton', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'hides the button for cloning a paste',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div id="navbar"><ul><li><button id="clonebutton" ' +
|
|
||||||
'type="button" class="btn btn-warning navbar-btn">' +
|
|
||||||
'<span class="glyphicon glyphicon-duplicate" aria-hidden=' +
|
|
||||||
'"true"></span> Clone</button></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
!$('#clonebutton').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.hideCloneButton();
|
|
||||||
results.push(
|
|
||||||
$('#clonebutton').hasClass('hidden')
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('hideRawButton', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'hides the raw text button',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div id="navbar"><ul><li><button ' +
|
|
||||||
'id="rawtextbutton" type="button" class="btn ' +
|
|
||||||
'btn-warning navbar-btn"><span class="glyphicon ' +
|
|
||||||
'glyphicon-text-background" aria-hidden="true"></span> ' +
|
|
||||||
'Raw text</button></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
!$('#rawtextbutton').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.hideRawButton();
|
|
||||||
results.push(
|
|
||||||
$('#rawtextbutton').hasClass('hidden')
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('hideFileSelector', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'hides the file attachment selection button',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div id="navbar"><ul><li id="attach" class="hidden ' +
|
|
||||||
'dropdown"><a href="#" class="dropdown-toggle" data-' +
|
|
||||||
'toggle="dropdown" role="button" aria-haspopup="true" ' +
|
|
||||||
'aria-expanded="false">Attach a file <span class="caret">' +
|
|
||||||
'</span></a><ul class="dropdown-menu"><li id="filewrap">' +
|
|
||||||
'<div><input type="file" id="file" name="file" /></div>' +
|
|
||||||
'</li><li id="customattachment" class="hidden"></li><li>' +
|
|
||||||
'<a id="fileremovebutton" href="#">Remove attachment</a>' +
|
|
||||||
'</li></ul></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
!$('#filewrap').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.hideFileSelector();
|
|
||||||
results.push(
|
|
||||||
$('#filewrap').hasClass('hidden')
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('showCustomAttachment', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'display the custom file attachment',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div id="navbar"><ul><li id="attach" class="hidden ' +
|
|
||||||
'dropdown"><a href="#" class="dropdown-toggle" data-' +
|
|
||||||
'toggle="dropdown" role="button" aria-haspopup="true" ' +
|
|
||||||
'aria-expanded="false">Attach a file <span class="caret">' +
|
|
||||||
'</span></a><ul class="dropdown-menu"><li id="filewrap">' +
|
|
||||||
'<div><input type="file" id="file" name="file" /></div>' +
|
|
||||||
'</li><li id="customattachment" class="hidden"></li><li>' +
|
|
||||||
'<a id="fileremovebutton" href="#">Remove attachment</a>' +
|
|
||||||
'</li></ul></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
$('#customattachment').hasClass('hidden')
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.showCustomAttachment();
|
|
||||||
results.push(
|
|
||||||
!$('#customattachment').hasClass('hidden')
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('collapseBar', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'collapses the navigation when displayed on a small screen',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div class="navbar-header"><button type="button" ' +
|
|
||||||
'class="navbar-toggle collapsed" data-toggle="collapse" ' +
|
|
||||||
'data-target="#navbar" aria-expanded="false" aria-controls' +
|
|
||||||
'="navbar">Toggle navigation</button><a class="reloadlink ' +
|
|
||||||
'navbar-brand" href=""><img alt="PrivateBin" ' +
|
|
||||||
'src="img/icon.svg" width="38" /></a></div><div ' +
|
|
||||||
'id="navbar"><ul><li><button id="newbutton" type=' +
|
|
||||||
'"button" class="hidden">New</button></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
$('.navbar-toggle').hasClass('collapsed') &&
|
|
||||||
$('#navbar').attr('aria-expanded') != 'true'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.collapseBar();
|
|
||||||
results.push(
|
|
||||||
$('.navbar-toggle').hasClass('collapsed') &&
|
|
||||||
$('#navbar').attr('aria-expanded') != 'true'
|
|
||||||
);
|
|
||||||
$('.navbar-toggle').click();
|
|
||||||
results.push(
|
|
||||||
!$('.navbar-toggle').hasClass('collapsed') &&
|
|
||||||
$('#navbar').attr('aria-expanded') == 'true'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.collapseBar();
|
|
||||||
results.push(
|
|
||||||
$('.navbar-toggle').hasClass('collapsed') &&
|
|
||||||
$('#navbar').attr('aria-expanded') == 'false'
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getExpiration', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'returns the currently selected expiration date',
|
|
||||||
function () {
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
assert.ok($.PrivateBin.TopNav.getExpiration() === '1week');
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getFileList', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
var File = window.File,
|
|
||||||
FileList = window.FileList,
|
|
||||||
path = require('path'),
|
|
||||||
mime = require('mime-types');
|
|
||||||
|
|
||||||
// mocking file input as per https://github.com/jsdom/jsdom/issues/1272
|
|
||||||
function createFile(file_path) {
|
|
||||||
var file = fs.statSync(file_path),
|
|
||||||
lastModified = file.mtimeMs,
|
|
||||||
size = file.size;
|
|
||||||
|
|
||||||
return new File(
|
|
||||||
[new fs.readFileSync(file_path)],
|
|
||||||
path.basename(file_path),
|
|
||||||
{
|
|
||||||
lastModified,
|
|
||||||
type: mime.lookup(file_path) || '',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
function addFileList(input, file_paths) {
|
|
||||||
if (typeof file_paths === 'string')
|
|
||||||
file_paths = [file_paths]
|
|
||||||
else if (!Array.isArray(file_paths)) {
|
|
||||||
throw new Error('file_paths needs to be a file path string or an Array of file path strings')
|
|
||||||
}
|
|
||||||
|
|
||||||
const file_list = file_paths.map(fp => createFile(fp))
|
|
||||||
file_list.__proto__ = Object.create(FileList.prototype)
|
|
||||||
|
|
||||||
Object.defineProperty(input, 'files', {
|
|
||||||
value: file_list,
|
|
||||||
writeable: false,
|
|
||||||
})
|
|
||||||
|
|
||||||
return input
|
|
||||||
}
|
|
||||||
|
|
||||||
it(
|
|
||||||
'returns the selected files',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div id="navbar"><ul><li id="attach" class="hidden ' +
|
|
||||||
'dropdown"><a href="#" class="dropdown-toggle" data-' +
|
|
||||||
'toggle="dropdown" role="button" aria-haspopup="true" ' +
|
|
||||||
'aria-expanded="false">Attach a file <span class="caret">' +
|
|
||||||
'</span></a><ul class="dropdown-menu"><li id="filewrap">' +
|
|
||||||
'<div><input type="file" id="file" name="file" /></div>' +
|
|
||||||
'</li><li id="customattachment" class="hidden"></li><li>' +
|
|
||||||
'<a id="fileremovebutton" href="#">Remove attachment</a>' +
|
|
||||||
'</li></ul></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.TopNav.getFileList() === null
|
|
||||||
);
|
|
||||||
addFileList($('#file')[0], [
|
|
||||||
'../img/logo.svg',
|
|
||||||
'../img/busy.gif'
|
|
||||||
]);
|
|
||||||
var files = $.PrivateBin.TopNav.getFileList();
|
|
||||||
results.push(
|
|
||||||
files[0].name === 'logo.svg' &&
|
|
||||||
files[1].name === 'busy.gif'
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getBurnAfterReading', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'returns if the burn-after-reading checkbox was ticked',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div id="navbar"><ul><li id="burnafterreadingoption" ' +
|
|
||||||
'class="hidden"><label><input type="checkbox" ' +
|
|
||||||
'id="burnafterreading" name="burnafterreading" /> ' +
|
|
||||||
'Burn after reading</label></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
!$.PrivateBin.TopNav.getBurnAfterReading()
|
|
||||||
);
|
|
||||||
$('#burnafterreading').attr('checked', 'checked');
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.TopNav.getBurnAfterReading()
|
|
||||||
);
|
|
||||||
$('#burnafterreading').removeAttr('checked');
|
|
||||||
results.push(
|
|
||||||
!$.PrivateBin.TopNav.getBurnAfterReading()
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getOpenDiscussion', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'returns if the open-discussion checkbox was ticked',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div id="navbar"><ul><li id="opendiscussionoption" ' +
|
|
||||||
'class="hidden"><label><input type="checkbox" ' +
|
|
||||||
'id="opendiscussion" name="opendiscussion" /> ' +
|
|
||||||
'Open discussion</label></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
!$.PrivateBin.TopNav.getOpenDiscussion()
|
|
||||||
);
|
|
||||||
$('#opendiscussion').attr('checked', 'checked');
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.TopNav.getOpenDiscussion()
|
|
||||||
);
|
|
||||||
$('#opendiscussion').removeAttr('checked');
|
|
||||||
results.push(
|
|
||||||
!$.PrivateBin.TopNav.getOpenDiscussion()
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
describe('getPassword', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'returns the contents of the password input',
|
|
||||||
'string',
|
|
||||||
function (password) {
|
|
||||||
password = password.replace(/\r+/g, '');
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div id="navbar"><ul><li><div id="password" ' +
|
|
||||||
'class="navbar-form hidden"><input type="password" ' +
|
|
||||||
'id="passwordinput" placeholder="Password (recommended)" ' +
|
|
||||||
'class="form-control" size="23" /></div></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.TopNav.getPassword() === ''
|
|
||||||
);
|
|
||||||
$('#passwordinput').val(password);
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.TopNav.getPassword() === password
|
|
||||||
);
|
|
||||||
$('#passwordinput').val('');
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.TopNav.getPassword() === ''
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
return results.every(element => element);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getCustomAttachment', function () {
|
|
||||||
before(function () {
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(
|
|
||||||
'returns the custom attachment element',
|
|
||||||
function () {
|
|
||||||
var results = [];
|
|
||||||
$('body').html(
|
|
||||||
'<nav><div id="navbar"><ul><li id="attach" class="hidden ' +
|
|
||||||
'dropdown"><a href="#" class="dropdown-toggle" data-' +
|
|
||||||
'toggle="dropdown" role="button" aria-haspopup="true" ' +
|
|
||||||
'aria-expanded="false">Attach a file <span class="caret">' +
|
|
||||||
'</span></a><ul class="dropdown-menu"><li id="filewrap">' +
|
|
||||||
'<div><input type="file" id="file" name="file" /></div>' +
|
|
||||||
'</li><li id="customattachment" class="hidden"></li><li>' +
|
|
||||||
'<a id="fileremovebutton" href="#">Remove attachment</a>' +
|
|
||||||
'</li></ul></li></ul></div></nav>'
|
|
||||||
);
|
|
||||||
$.PrivateBin.TopNav.init();
|
|
||||||
results.push(
|
|
||||||
!$.PrivateBin.TopNav.getCustomAttachment().hasClass('test')
|
|
||||||
);
|
|
||||||
$('#customattachment').addClass('test');
|
|
||||||
results.push(
|
|
||||||
$.PrivateBin.TopNav.getCustomAttachment().hasClass('test')
|
|
||||||
);
|
|
||||||
cleanup();
|
|
||||||
assert.ok(results.every(element => element));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
var common = require('../common');
|
|
||||||
|
|
||||||
describe('UiHelper', function () {
|
|
||||||
// TODO: As per https://github.com/tmpvar/jsdom/issues/1565 there is no navigation support in jsdom, yet.
|
|
||||||
// for now we use a mock function to trigger the event
|
|
||||||
describe('historyChange', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.Helper.reset();
|
|
||||||
cleanup();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'redirects to home, when the state is null',
|
|
||||||
common.jscSchemas(),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
function (schema, address) {
|
|
||||||
var expected = schema + '://' + address.join('') + '/',
|
|
||||||
clean = jsdom('', {url: expected});
|
|
||||||
|
|
||||||
// make window.location.href writable
|
|
||||||
Object.defineProperty(window.location, 'href', {
|
|
||||||
writable: true,
|
|
||||||
value: window.location.href
|
|
||||||
});
|
|
||||||
$.PrivateBin.UiHelper.mockHistoryChange();
|
|
||||||
$.PrivateBin.Helper.reset();
|
|
||||||
var result = window.location.href;
|
|
||||||
clean();
|
|
||||||
return expected === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'does not redirect to home, when a new paste is created',
|
|
||||||
common.jscSchemas(),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.array(common.jscQueryString()),
|
|
||||||
jsc.nearray(common.jscBase64String()),
|
|
||||||
function (schema, address, query, fragment) {
|
|
||||||
var expected = schema + '://' + address.join('') + '/?' +
|
|
||||||
query.join('') + '#' + fragment.join(''),
|
|
||||||
clean = jsdom('', {url: expected});
|
|
||||||
|
|
||||||
// make window.location.href writable
|
|
||||||
Object.defineProperty(window.location, 'href', {
|
|
||||||
writable: true,
|
|
||||||
value: window.location.href
|
|
||||||
});
|
|
||||||
$.PrivateBin.UiHelper.mockHistoryChange([
|
|
||||||
{type: 'newpaste'}, '', expected
|
|
||||||
]);
|
|
||||||
$.PrivateBin.Helper.reset();
|
|
||||||
var result = window.location.href;
|
|
||||||
clean();
|
|
||||||
return expected === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('reloadHome', function () {
|
|
||||||
this.timeout(30000);
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.Helper.reset();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'redirects to home',
|
|
||||||
common.jscSchemas(),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
jsc.array(common.jscQueryString()),
|
|
||||||
jsc.nearray(common.jscBase64String()),
|
|
||||||
function (schema, address, query, fragment) {
|
|
||||||
var expected = schema + '://' + address.join('') + '/',
|
|
||||||
clean = jsdom('', {
|
|
||||||
url: expected + '?' + query.join('') + '#' + fragment.join('')
|
|
||||||
});
|
|
||||||
|
|
||||||
// make window.location.href writable
|
|
||||||
Object.defineProperty(window.location, 'href', {
|
|
||||||
writable: true,
|
|
||||||
value: window.location.href
|
|
||||||
});
|
|
||||||
$.PrivateBin.UiHelper.reloadHome();
|
|
||||||
$.PrivateBin.Helper.reset();
|
|
||||||
var result = window.location.href;
|
|
||||||
clean();
|
|
||||||
return expected === result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('isVisible', function () {
|
|
||||||
// TODO As per https://github.com/tmpvar/jsdom/issues/1048 there is no layout support in jsdom, yet.
|
|
||||||
// once it is supported or a workaround is found, uncomment the section below
|
|
||||||
/*
|
|
||||||
before(function () {
|
|
||||||
$.PrivateBin.Helper.reset();
|
|
||||||
});
|
|
||||||
|
|
||||||
jsc.property(
|
|
||||||
'detect visible elements',
|
|
||||||
jsc.nearray(common.jscAlnumString()),
|
|
||||||
jsc.nearray(common.jscA2zString()),
|
|
||||||
function (id, element) {
|
|
||||||
id = id.join('');
|
|
||||||
element = element.join('');
|
|
||||||
var clean = jsdom(
|
|
||||||
'<' + element + ' id="' + id + '"></' + element + '>'
|
|
||||||
);
|
|
||||||
var result = $.PrivateBin.UiHelper.isVisible($('#' + id));
|
|
||||||
clean();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
*/
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('scrollTo', function () {
|
|
||||||
// TODO Did not find a way to test that, see isVisible test above
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -1 +1,2 @@
|
|||||||
Require all denied
|
Allow from none
|
||||||
|
Deny from all
|
||||||
|
|||||||
@@ -7,14 +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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin;
|
namespace PrivateBin;
|
||||||
|
|
||||||
use Exception;
|
use Exception;
|
||||||
use PDO;
|
use PDO;
|
||||||
use PrivateBin\Persistence\DataStore;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration
|
* Configuration
|
||||||
@@ -51,13 +50,13 @@ class Configuration
|
|||||||
'languageselection' => false,
|
'languageselection' => false,
|
||||||
'languagedefault' => '',
|
'languagedefault' => '',
|
||||||
'urlshortener' => '',
|
'urlshortener' => '',
|
||||||
'qrcode' => true,
|
|
||||||
'icon' => 'identicon',
|
'icon' => 'identicon',
|
||||||
'cspheader' => 'default-src \'none\'; manifest-src \'self\'; connect-src *; script-src \'self\'; style-src \'self\'; font-src \'self\'; img-src \'self\' data:; media-src data:; object-src data:; Referrer-Policy: \'no-referrer\'; sandbox allow-same-origin allow-scripts allow-forms allow-popups allow-modals',
|
'cspheader' => 'default-src \'none\'; manifest-src \'self\'; connect-src *; script-src \'self\'; style-src \'self\'; font-src \'self\'; img-src \'self\' data:; referrer no-referrer; sandbox allow-same-origin allow-scripts allow-forms allow-popups',
|
||||||
'zerobincompatibility' => false,
|
'zerobincompatibility' => false,
|
||||||
),
|
),
|
||||||
'expire' => array(
|
'expire' => array(
|
||||||
'default' => '1week',
|
'default' => '1week',
|
||||||
|
'clone' => true,
|
||||||
),
|
),
|
||||||
'expire_options' => array(
|
'expire_options' => array(
|
||||||
'5min' => 300,
|
'5min' => 300,
|
||||||
@@ -100,20 +99,7 @@ class Configuration
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$config = array();
|
$config = array();
|
||||||
$configFile = PATH . 'cfg' . DIRECTORY_SEPARATOR . 'conf.php';
|
$configFile = PATH . 'cfg' . DIRECTORY_SEPARATOR . 'conf.ini';
|
||||||
$configIni = PATH . 'cfg' . DIRECTORY_SEPARATOR . 'conf.ini';
|
|
||||||
|
|
||||||
// rename INI files to avoid configuration leakage
|
|
||||||
if (is_readable($configIni)) {
|
|
||||||
DataStore::prependRename($configIni, $configFile, ';');
|
|
||||||
|
|
||||||
// cleanup sample, too
|
|
||||||
$configIniSample = $configIni . '.sample';
|
|
||||||
if (is_readable($configIniSample)) {
|
|
||||||
DataStore::prependRename($configIniSample, PATH . 'cfg' . DIRECTORY_SEPARATOR . 'conf.sample.php', ';');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_readable($configFile)) {
|
if (is_readable($configFile)) {
|
||||||
$config = parse_ini_file($configFile, true);
|
$config = parse_ini_file($configFile, true);
|
||||||
foreach (array('main', 'model', 'model_options') as $section) {
|
foreach (array('main', 'model', 'model_options') as $section) {
|
||||||
@@ -122,7 +108,6 @@ class Configuration
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$opts = '_options';
|
$opts = '_options';
|
||||||
foreach (self::getDefaults() as $section => $values) {
|
foreach (self::getDefaults() as $section => $values) {
|
||||||
// fill missing sections with default values
|
// fill missing sections with default values
|
||||||
@@ -211,7 +196,7 @@ class Configuration
|
|||||||
/**
|
/**
|
||||||
* get configuration as array
|
* get configuration as array
|
||||||
*
|
*
|
||||||
* @return array
|
* return array
|
||||||
*/
|
*/
|
||||||
public function get()
|
public function get()
|
||||||
{
|
{
|
||||||
@@ -221,7 +206,7 @@ class Configuration
|
|||||||
/**
|
/**
|
||||||
* get default configuration as array
|
* get default configuration as array
|
||||||
*
|
*
|
||||||
* @return array
|
* return array
|
||||||
*/
|
*/
|
||||||
public static function getDefaults()
|
public static function getDefaults()
|
||||||
{
|
{
|
||||||
@@ -234,7 +219,7 @@ class Configuration
|
|||||||
* @param string $key
|
* @param string $key
|
||||||
* @param string $section defaults to main
|
* @param string $section defaults to main
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
* @return mixed
|
* return mixed
|
||||||
*/
|
*/
|
||||||
public function getKey($key, $section = 'main')
|
public function getKey($key, $section = 'main')
|
||||||
{
|
{
|
||||||
@@ -250,7 +235,7 @@ class Configuration
|
|||||||
*
|
*
|
||||||
* @param string $section
|
* @param string $section
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
* @return mixed
|
* return mixed
|
||||||
*/
|
*/
|
||||||
public function getSection($section)
|
public function getSection($section)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin\Data;
|
namespace PrivateBin\Data;
|
||||||
@@ -58,7 +58,7 @@ abstract class AbstractData
|
|||||||
* @access public
|
* @access public
|
||||||
* @static
|
* @static
|
||||||
* @param array $options
|
* @param array $options
|
||||||
* @return AbstractData
|
* @return privatebin_abstract
|
||||||
*/
|
*/
|
||||||
public static function getInstance($options)
|
public static function getInstance($options)
|
||||||
{
|
{
|
||||||
@@ -88,6 +88,7 @@ abstract class AbstractData
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @param string $pasteid
|
* @param string $pasteid
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
abstract public function delete($pasteid);
|
abstract public function delete($pasteid);
|
||||||
|
|
||||||
@@ -146,6 +147,7 @@ abstract class AbstractData
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @param int $batchsize
|
* @param int $batchsize
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function purge($batchsize)
|
public function purge($batchsize)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin\Data;
|
namespace PrivateBin\Data;
|
||||||
@@ -15,7 +15,7 @@ namespace PrivateBin\Data;
|
|||||||
use Exception;
|
use Exception;
|
||||||
use PDO;
|
use PDO;
|
||||||
use PDOException;
|
use PDOException;
|
||||||
use PrivateBin\Controller;
|
use PrivateBin\PrivateBin;
|
||||||
use stdClass;
|
use stdClass;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -122,7 +122,7 @@ class Database extends AbstractData
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create config table if necessary
|
// create config table if necessary
|
||||||
$db_version = Controller::VERSION;
|
$db_version = PrivateBin::VERSION;
|
||||||
if (!in_array(self::_sanitizeIdentifier('config'), $tables)) {
|
if (!in_array(self::_sanitizeIdentifier('config'), $tables)) {
|
||||||
self::_createConfigTable();
|
self::_createConfigTable();
|
||||||
// if we only needed to create the config table, the DB is older then 0.22
|
// if we only needed to create the config table, the DB is older then 0.22
|
||||||
@@ -134,7 +134,7 @@ class Database extends AbstractData
|
|||||||
}
|
}
|
||||||
|
|
||||||
// update database structure if necessary
|
// update database structure if necessary
|
||||||
if (version_compare($db_version, Controller::VERSION, '<')) {
|
if (version_compare($db_version, PrivateBin::VERSION, '<')) {
|
||||||
self::_upgradeDatabase($db_version);
|
self::_upgradeDatabase($db_version);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -282,6 +282,7 @@ class Database extends AbstractData
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @param string $pasteid
|
* @param string $pasteid
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function delete($pasteid)
|
public function delete($pasteid)
|
||||||
{
|
{
|
||||||
@@ -374,10 +375,11 @@ class Database extends AbstractData
|
|||||||
$comments[$i]->data = $row['data'];
|
$comments[$i]->data = $row['data'];
|
||||||
$comments[$i]->meta = new stdClass;
|
$comments[$i]->meta = new stdClass;
|
||||||
$comments[$i]->meta->postdate = (int) $row['postdate'];
|
$comments[$i]->meta->postdate = (int) $row['postdate'];
|
||||||
foreach (array('nickname', 'vizhash') as $key) {
|
if (array_key_exists('nickname', $row) && !empty($row['nickname'])) {
|
||||||
if (array_key_exists($key, $row) && !empty($row[$key])) {
|
$comments[$i]->meta->nickname = $row['nickname'];
|
||||||
$comments[$i]->meta->$key = $row[$key];
|
}
|
||||||
}
|
if (array_key_exists('vizhash', $row) && !empty($row['vizhash'])) {
|
||||||
|
$comments[$i]->meta->vizhash = $row['vizhash'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ksort($comments);
|
ksort($comments);
|
||||||
@@ -562,6 +564,7 @@ class Database extends AbstractData
|
|||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @static
|
* @static
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
private static function _createPasteTable()
|
private static function _createPasteTable()
|
||||||
{
|
{
|
||||||
@@ -586,6 +589,7 @@ class Database extends AbstractData
|
|||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @static
|
* @static
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
private static function _createCommentTable()
|
private static function _createCommentTable()
|
||||||
{
|
{
|
||||||
@@ -612,6 +616,7 @@ class Database extends AbstractData
|
|||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @static
|
* @static
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
private static function _createConfigTable()
|
private static function _createConfigTable()
|
||||||
{
|
{
|
||||||
@@ -623,7 +628,7 @@ class Database extends AbstractData
|
|||||||
self::_exec(
|
self::_exec(
|
||||||
'INSERT INTO ' . self::_sanitizeIdentifier('config') .
|
'INSERT INTO ' . self::_sanitizeIdentifier('config') .
|
||||||
' VALUES(?,?)',
|
' VALUES(?,?)',
|
||||||
array('VERSION', Controller::VERSION)
|
array('VERSION', PrivateBin::VERSION)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -646,6 +651,7 @@ class Database extends AbstractData
|
|||||||
* @access private
|
* @access private
|
||||||
* @static
|
* @static
|
||||||
* @param string $oldversion
|
* @param string $oldversion
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
private static function _upgradeDatabase($oldversion)
|
private static function _upgradeDatabase($oldversion)
|
||||||
{
|
{
|
||||||
@@ -693,12 +699,13 @@ class Database extends AbstractData
|
|||||||
'CREATE INDEX IF NOT EXISTS comment_parent ON ' .
|
'CREATE INDEX IF NOT EXISTS comment_parent ON ' .
|
||||||
self::_sanitizeIdentifier('comment') . '(pasteid);'
|
self::_sanitizeIdentifier('comment') . '(pasteid);'
|
||||||
);
|
);
|
||||||
// no break, continue with updates for 0.22 and later
|
// no break, continue with updates for 0.22
|
||||||
default:
|
case '0.22':
|
||||||
|
case '1.0':
|
||||||
self::_exec(
|
self::_exec(
|
||||||
'UPDATE ' . self::_sanitizeIdentifier('config') .
|
'UPDATE ' . self::_sanitizeIdentifier('config') .
|
||||||
' SET value = ? WHERE id = ?',
|
' SET value = ? WHERE id = ?',
|
||||||
array(Controller::VERSION, 'VERSION')
|
array(PrivateBin::VERSION, 'VERSION')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,13 +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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin\Data;
|
namespace PrivateBin\Data;
|
||||||
|
|
||||||
|
use PrivateBin\Json;
|
||||||
use PrivateBin\Model\Paste;
|
use PrivateBin\Model\Paste;
|
||||||
use PrivateBin\Persistence\DataStore;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filesystem
|
* Filesystem
|
||||||
@@ -22,6 +22,15 @@ use PrivateBin\Persistence\DataStore;
|
|||||||
*/
|
*/
|
||||||
class Filesystem extends AbstractData
|
class Filesystem extends AbstractData
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* directory where data is stored
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @static
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private static $_dir = 'data/';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get instance of singleton
|
* get instance of singleton
|
||||||
*
|
*
|
||||||
@@ -32,16 +41,17 @@ class Filesystem extends AbstractData
|
|||||||
*/
|
*/
|
||||||
public static function getInstance($options = null)
|
public static function getInstance($options = null)
|
||||||
{
|
{
|
||||||
// if needed initialize the singleton
|
|
||||||
if (!(self::$_instance instanceof self)) {
|
|
||||||
self::$_instance = new self;
|
|
||||||
}
|
|
||||||
// if given update the data directory
|
// if given update the data directory
|
||||||
if (
|
if (
|
||||||
is_array($options) &&
|
is_array($options) &&
|
||||||
array_key_exists('dir', $options)
|
array_key_exists('dir', $options)
|
||||||
) {
|
) {
|
||||||
DataStore::setPath($options['dir']);
|
self::$_dir = $options['dir'] . DIRECTORY_SEPARATOR;
|
||||||
|
}
|
||||||
|
// if needed initialize the singleton
|
||||||
|
if (!(self::$_instance instanceof self)) {
|
||||||
|
self::$_instance = new self;
|
||||||
|
self::_init();
|
||||||
}
|
}
|
||||||
return self::$_instance;
|
return self::$_instance;
|
||||||
}
|
}
|
||||||
@@ -52,19 +62,19 @@ class Filesystem extends AbstractData
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $pasteid
|
* @param string $pasteid
|
||||||
* @param array $paste
|
* @param array $paste
|
||||||
|
* @throws Exception
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function create($pasteid, $paste)
|
public function create($pasteid, $paste)
|
||||||
{
|
{
|
||||||
$storagedir = self::_dataid2path($pasteid);
|
$storagedir = self::_dataid2path($pasteid);
|
||||||
$file = $storagedir . $pasteid . '.php';
|
if (is_file($storagedir . $pasteid)) {
|
||||||
if (is_file($file)) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!is_dir($storagedir)) {
|
if (!is_dir($storagedir)) {
|
||||||
mkdir($storagedir, 0700, true);
|
mkdir($storagedir, 0700, true);
|
||||||
}
|
}
|
||||||
return DataStore::store($file, $paste);
|
return (bool) file_put_contents($storagedir . $pasteid, Json::encode($paste));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -79,7 +89,9 @@ class Filesystem extends AbstractData
|
|||||||
if (!$this->exists($pasteid)) {
|
if (!$this->exists($pasteid)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$paste = DataStore::get(self::_dataid2path($pasteid) . $pasteid . '.php');
|
$paste = json_decode(
|
||||||
|
file_get_contents(self::_dataid2path($pasteid) . $pasteid)
|
||||||
|
);
|
||||||
if (property_exists($paste->meta, 'attachment')) {
|
if (property_exists($paste->meta, 'attachment')) {
|
||||||
$paste->attachment = $paste->meta->attachment;
|
$paste->attachment = $paste->meta->attachment;
|
||||||
unset($paste->meta->attachment);
|
unset($paste->meta->attachment);
|
||||||
@@ -96,14 +108,15 @@ class Filesystem extends AbstractData
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @param string $pasteid
|
* @param string $pasteid
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function delete($pasteid)
|
public function delete($pasteid)
|
||||||
{
|
{
|
||||||
$pastedir = self::_dataid2path($pasteid);
|
$pastedir = self::_dataid2path($pasteid);
|
||||||
if (is_dir($pastedir)) {
|
if (is_dir($pastedir)) {
|
||||||
// Delete the paste itself.
|
// Delete the paste itself.
|
||||||
if (is_file($pastedir . $pasteid . '.php')) {
|
if (is_file($pastedir . $pasteid)) {
|
||||||
unlink($pastedir . $pasteid . '.php');
|
unlink($pastedir . $pasteid);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete discussion if it exists.
|
// Delete discussion if it exists.
|
||||||
@@ -131,26 +144,7 @@ class Filesystem extends AbstractData
|
|||||||
*/
|
*/
|
||||||
public function exists($pasteid)
|
public function exists($pasteid)
|
||||||
{
|
{
|
||||||
$basePath = self::_dataid2path($pasteid) . $pasteid;
|
return is_file(self::_dataid2path($pasteid) . $pasteid);
|
||||||
$pastePath = $basePath . '.php';
|
|
||||||
// convert to PHP protected files if needed
|
|
||||||
if (is_readable($basePath)) {
|
|
||||||
DataStore::prependRename($basePath, $pastePath);
|
|
||||||
|
|
||||||
// convert comments, too
|
|
||||||
$discdir = self::_dataid2discussionpath($pasteid);
|
|
||||||
if (is_dir($discdir)) {
|
|
||||||
$dir = dir($discdir);
|
|
||||||
while (false !== ($filename = $dir->read())) {
|
|
||||||
if (substr($filename, -4) !== '.php' && strlen($filename) >= 16) {
|
|
||||||
$commentFilename = $discdir . $filename . '.php';
|
|
||||||
DataStore::prependRename($discdir . $filename, $commentFilename);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$dir->close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return is_readable($pastePath);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -161,19 +155,20 @@ class Filesystem extends AbstractData
|
|||||||
* @param string $parentid
|
* @param string $parentid
|
||||||
* @param string $commentid
|
* @param string $commentid
|
||||||
* @param array $comment
|
* @param array $comment
|
||||||
|
* @throws Exception
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function createComment($pasteid, $parentid, $commentid, $comment)
|
public function createComment($pasteid, $parentid, $commentid, $comment)
|
||||||
{
|
{
|
||||||
$storagedir = self::_dataid2discussionpath($pasteid);
|
$storagedir = self::_dataid2discussionpath($pasteid);
|
||||||
$file = $storagedir . $pasteid . '.' . $commentid . '.' . $parentid . '.php';
|
$filename = $pasteid . '.' . $commentid . '.' . $parentid;
|
||||||
if (is_file($file)) {
|
if (is_file($storagedir . $filename)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!is_dir($storagedir)) {
|
if (!is_dir($storagedir)) {
|
||||||
mkdir($storagedir, 0700, true);
|
mkdir($storagedir, 0700, true);
|
||||||
}
|
}
|
||||||
return DataStore::store($file, $comment);
|
return (bool) file_put_contents($storagedir . $filename, Json::encode($comment));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -188,14 +183,15 @@ class Filesystem extends AbstractData
|
|||||||
$comments = array();
|
$comments = array();
|
||||||
$discdir = self::_dataid2discussionpath($pasteid);
|
$discdir = self::_dataid2discussionpath($pasteid);
|
||||||
if (is_dir($discdir)) {
|
if (is_dir($discdir)) {
|
||||||
|
// Delete all files in discussion directory
|
||||||
$dir = dir($discdir);
|
$dir = dir($discdir);
|
||||||
while (false !== ($filename = $dir->read())) {
|
while (false !== ($filename = $dir->read())) {
|
||||||
// Filename is in the form pasteid.commentid.parentid.php:
|
// Filename is in the form pasteid.commentid.parentid:
|
||||||
// - pasteid is the paste this reply belongs to.
|
// - pasteid is the paste this reply belongs to.
|
||||||
// - commentid is the comment identifier itself.
|
// - commentid is the comment identifier itself.
|
||||||
// - parentid is the comment this comment replies to (It can be pasteid)
|
// - parentid is the comment this comment replies to (It can be pasteid)
|
||||||
if (is_file($discdir . $filename)) {
|
if (is_file($discdir . $filename)) {
|
||||||
$comment = DataStore::get($discdir . $filename);
|
$comment = json_decode(file_get_contents($discdir . $filename));
|
||||||
$items = explode('.', $filename);
|
$items = explode('.', $filename);
|
||||||
// Add some meta information not contained in file.
|
// Add some meta information not contained in file.
|
||||||
$comment->id = $items[1];
|
$comment->id = $items[1];
|
||||||
@@ -227,7 +223,7 @@ class Filesystem extends AbstractData
|
|||||||
{
|
{
|
||||||
return is_file(
|
return is_file(
|
||||||
self::_dataid2discussionpath($pasteid) .
|
self::_dataid2discussionpath($pasteid) .
|
||||||
$pasteid . '.' . $commentid . '.' . $parentid . '.php'
|
$pasteid . '.' . $commentid . '.' . $parentid
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,9 +237,8 @@ class Filesystem extends AbstractData
|
|||||||
protected function _getExpiredPastes($batchsize)
|
protected function _getExpiredPastes($batchsize)
|
||||||
{
|
{
|
||||||
$pastes = array();
|
$pastes = array();
|
||||||
$mainpath = DataStore::getPath();
|
|
||||||
$firstLevel = array_filter(
|
$firstLevel = array_filter(
|
||||||
scandir($mainpath),
|
scandir(self::$_dir),
|
||||||
'self::_isFirstLevelDir'
|
'self::_isFirstLevelDir'
|
||||||
);
|
);
|
||||||
if (count($firstLevel) > 0) {
|
if (count($firstLevel) > 0) {
|
||||||
@@ -251,7 +246,7 @@ class Filesystem extends AbstractData
|
|||||||
for ($i = 0, $max = $batchsize * 10; $i < $max; ++$i) {
|
for ($i = 0, $max = $batchsize * 10; $i < $max; ++$i) {
|
||||||
$firstKey = array_rand($firstLevel);
|
$firstKey = array_rand($firstLevel);
|
||||||
$secondLevel = array_filter(
|
$secondLevel = array_filter(
|
||||||
scandir($mainpath . DIRECTORY_SEPARATOR . $firstLevel[$firstKey]),
|
scandir(self::$_dir . $firstLevel[$firstKey]),
|
||||||
'self::_isSecondLevelDir'
|
'self::_isSecondLevelDir'
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -262,21 +257,13 @@ class Filesystem extends AbstractData
|
|||||||
}
|
}
|
||||||
|
|
||||||
$secondKey = array_rand($secondLevel);
|
$secondKey = array_rand($secondLevel);
|
||||||
$path = $mainpath . DIRECTORY_SEPARATOR .
|
$path = self::$_dir . $firstLevel[$firstKey] .
|
||||||
$firstLevel[$firstKey] . DIRECTORY_SEPARATOR .
|
DIRECTORY_SEPARATOR . $secondLevel[$secondKey];
|
||||||
$secondLevel[$secondKey];
|
|
||||||
if (!is_dir($path)) {
|
if (!is_dir($path)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$thirdLevel = array_filter(
|
$thirdLevel = array_filter(
|
||||||
array_map(
|
scandir($path),
|
||||||
function ($filename) {
|
|
||||||
return strlen($filename) >= 20 ?
|
|
||||||
substr($filename, 0, -4) :
|
|
||||||
$filename;
|
|
||||||
},
|
|
||||||
scandir($path)
|
|
||||||
),
|
|
||||||
'PrivateBin\\Model\\Paste::isValidId'
|
'PrivateBin\\Model\\Paste::isValidId'
|
||||||
);
|
);
|
||||||
if (count($thirdLevel) == 0) {
|
if (count($thirdLevel) == 0) {
|
||||||
@@ -305,6 +292,29 @@ class Filesystem extends AbstractData
|
|||||||
return $pastes;
|
return $pastes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* initialize privatebin
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @static
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private static function _init()
|
||||||
|
{
|
||||||
|
// Create storage directory if it does not exist.
|
||||||
|
if (!is_dir(self::$_dir)) {
|
||||||
|
mkdir(self::$_dir, 0700);
|
||||||
|
}
|
||||||
|
// Create .htaccess file if it does not exist.
|
||||||
|
if (!is_file(self::$_dir . '.htaccess')) {
|
||||||
|
file_put_contents(
|
||||||
|
self::$_dir . '.htaccess',
|
||||||
|
'Allow from none' . PHP_EOL .
|
||||||
|
'Deny from all' . PHP_EOL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert paste id to storage path.
|
* Convert paste id to storage path.
|
||||||
*
|
*
|
||||||
@@ -322,10 +332,8 @@ class Filesystem extends AbstractData
|
|||||||
*/
|
*/
|
||||||
private static function _dataid2path($dataid)
|
private static function _dataid2path($dataid)
|
||||||
{
|
{
|
||||||
return DataStore::getPath(
|
return self::$_dir . substr($dataid, 0, 2) . DIRECTORY_SEPARATOR .
|
||||||
substr($dataid, 0, 2) . DIRECTORY_SEPARATOR .
|
substr($dataid, 2, 2) . DIRECTORY_SEPARATOR;
|
||||||
substr($dataid, 2, 2) . DIRECTORY_SEPARATOR
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -355,7 +363,7 @@ class Filesystem extends AbstractData
|
|||||||
private static function _isFirstLevelDir($element)
|
private static function _isFirstLevelDir($element)
|
||||||
{
|
{
|
||||||
return self::_isSecondLevelDir($element) &&
|
return self::_isSecondLevelDir($element) &&
|
||||||
is_dir(DataStore::getPath($element));
|
is_dir(self::$_dir . DIRECTORY_SEPARATOR . $element);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin;
|
namespace PrivateBin;
|
||||||
@@ -21,10 +21,27 @@ use Exception;
|
|||||||
*/
|
*/
|
||||||
class Filter
|
class Filter
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* strips slashes deeply
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @static
|
||||||
|
* @param mixed $value
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function stripslashesDeep($value)
|
||||||
|
{
|
||||||
|
return is_array($value) ?
|
||||||
|
array_map('self::stripslashesDeep', $value) :
|
||||||
|
stripslashes($value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* format a given time string into a human readable label (localized)
|
* format a given time string into a human readable label (localized)
|
||||||
*
|
*
|
||||||
* accepts times in the format "[integer][time unit]"
|
* accepts times in the format "[integer][time unit]", valid time units are:
|
||||||
|
* sec, second, seconds, min, minute, minutes, hour, hours, day, days, week,
|
||||||
|
* weeks, month, months, year, years
|
||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @static
|
* @static
|
||||||
@@ -64,7 +81,7 @@ class Filter
|
|||||||
$i = 0;
|
$i = 0;
|
||||||
while (($size / 1024) >= 1) {
|
while (($size / 1024) >= 1) {
|
||||||
$size = $size / 1024;
|
$size = $size / 1024;
|
||||||
++$i;
|
$i++;
|
||||||
}
|
}
|
||||||
return number_format($size, ($i ? 2 : 0), '.', ' ') . ' ' . I18n::_($iec[$i]);
|
return number_format($size, ($i ? 2 : 0), '.', ' ') . ' ' . I18n::_($iec[$i]);
|
||||||
}
|
}
|
||||||
@@ -82,7 +99,7 @@ class Filter
|
|||||||
public static function slowEquals($a, $b)
|
public static function slowEquals($a, $b)
|
||||||
{
|
{
|
||||||
$diff = strlen($a) ^ strlen($b);
|
$diff = strlen($a) ^ strlen($b);
|
||||||
for ($i = 0; $i < strlen($a) && $i < strlen($b); ++$i) {
|
for ($i = 0; $i < strlen($a) && $i < strlen($b); $i++) {
|
||||||
$diff |= ord($a[$i]) ^ ord($b[$i]);
|
$diff |= ord($a[$i]) ^ ord($b[$i]);
|
||||||
}
|
}
|
||||||
return $diff === 0;
|
return $diff === 0;
|
||||||
|
|||||||
13
lib/I18n.php
13
lib/I18n.php
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin;
|
namespace PrivateBin;
|
||||||
@@ -135,17 +135,15 @@ class I18n
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @static
|
* @static
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function loadTranslations()
|
public static function loadTranslations()
|
||||||
{
|
{
|
||||||
$availableLanguages = self::getAvailableLanguages();
|
$availableLanguages = self::getAvailableLanguages();
|
||||||
|
|
||||||
// check if the lang cookie was set and that language exists
|
// check if the lang cookie was set and that language exists
|
||||||
if (
|
if (array_key_exists('lang', $_COOKIE) && in_array($_COOKIE['lang'], $availableLanguages)) {
|
||||||
array_key_exists('lang', $_COOKIE) &&
|
$match = $_COOKIE['lang'];
|
||||||
($key = array_search($_COOKIE['lang'], $availableLanguages)) !== false
|
|
||||||
) {
|
|
||||||
$match = $availableLanguages[$key];
|
|
||||||
}
|
}
|
||||||
// find a translation file matching the browsers language preferences
|
// find a translation file matching the browsers language preferences
|
||||||
else {
|
else {
|
||||||
@@ -258,6 +256,7 @@ class I18n
|
|||||||
* @access public
|
* @access public
|
||||||
* @static
|
* @static
|
||||||
* @param string $lang
|
* @param string $lang
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function setLanguageFallback($lang)
|
public static function setLanguageFallback($lang)
|
||||||
{
|
{
|
||||||
@@ -305,7 +304,7 @@ class I18n
|
|||||||
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);
|
||||||
case 'sl':
|
case 'sl':
|
||||||
return $n % 100 == 1 ? 1 : ($n % 100 == 2 ? 2 : ($n % 100 == 3 || $n % 100 == 4 ? 3 : 0));
|
return $n % 100 == 1 ? 1 : ($n % 100 == 2 ? 2 : ($n % 100 == 3 || $n % 100 == 4 ? 3 : 0));
|
||||||
// de, en, es, hu, it, nl, no, pt
|
// de, en, es, it, no
|
||||||
default:
|
default:
|
||||||
return $n != 1 ? 1 : 0;
|
return $n != 1 ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin;
|
namespace PrivateBin;
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin;
|
namespace PrivateBin;
|
||||||
@@ -40,6 +40,7 @@ class Model
|
|||||||
* Factory constructor.
|
* Factory constructor.
|
||||||
*
|
*
|
||||||
* @param configuration $conf
|
* @param configuration $conf
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct(Configuration $conf)
|
public function __construct(Configuration $conf)
|
||||||
{
|
{
|
||||||
@@ -63,6 +64,8 @@ class Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if a purge is necessary and triggers it if yes.
|
* Checks if a purge is necessary and triggers it if yes.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function purge()
|
public function purge()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin\Model;
|
namespace PrivateBin\Model;
|
||||||
@@ -63,6 +63,7 @@ abstract class AbstractModel
|
|||||||
* @access public
|
* @access public
|
||||||
* @param Configuration $configuration
|
* @param Configuration $configuration
|
||||||
* @param AbstractData $storage
|
* @param AbstractData $storage
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct(Configuration $configuration, AbstractData $storage)
|
public function __construct(Configuration $configuration, AbstractData $storage)
|
||||||
{
|
{
|
||||||
@@ -89,6 +90,7 @@ abstract class AbstractModel
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $id
|
* @param string $id
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setId($id)
|
public function setId($id)
|
||||||
{
|
{
|
||||||
@@ -104,6 +106,7 @@ abstract class AbstractModel
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $data
|
* @param string $data
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setData($data)
|
public function setData($data)
|
||||||
{
|
{
|
||||||
@@ -130,6 +133,7 @@ abstract class AbstractModel
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
abstract public function store();
|
abstract public function store();
|
||||||
|
|
||||||
@@ -138,6 +142,7 @@ abstract class AbstractModel
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
abstract public function delete();
|
abstract public function delete();
|
||||||
|
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin\Model;
|
namespace PrivateBin\Model;
|
||||||
@@ -61,6 +61,7 @@ class Comment extends AbstractModel
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function store()
|
public function store()
|
||||||
{
|
{
|
||||||
@@ -100,6 +101,7 @@ class Comment extends AbstractModel
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function delete()
|
public function delete()
|
||||||
{
|
{
|
||||||
@@ -127,6 +129,7 @@ class Comment extends AbstractModel
|
|||||||
* @access public
|
* @access public
|
||||||
* @param Paste $paste
|
* @param Paste $paste
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setPaste(Paste $paste)
|
public function setPaste(Paste $paste)
|
||||||
{
|
{
|
||||||
@@ -151,6 +154,7 @@ class Comment extends AbstractModel
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $id
|
* @param string $id
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setParentId($id)
|
public function setParentId($id)
|
||||||
{
|
{
|
||||||
@@ -180,6 +184,7 @@ class Comment extends AbstractModel
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $nickname
|
* @param string $nickname
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setNickname($nickname)
|
public function setNickname($nickname)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,14 +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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin\Model;
|
namespace PrivateBin\Model;
|
||||||
|
|
||||||
use Exception;
|
use Exception;
|
||||||
use PrivateBin\Controller;
|
|
||||||
use PrivateBin\Persistence\ServerSalt;
|
use PrivateBin\Persistence\ServerSalt;
|
||||||
|
use PrivateBin\PrivateBin;
|
||||||
use PrivateBin\Sjcl;
|
use PrivateBin\Sjcl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -35,24 +35,19 @@ class Paste extends AbstractModel
|
|||||||
{
|
{
|
||||||
$data = $this->_store->read($this->getId());
|
$data = $this->_store->read($this->getId());
|
||||||
if ($data === false) {
|
if ($data === false) {
|
||||||
throw new Exception(Controller::GENERIC_ERROR, 64);
|
throw new Exception(PrivateBin::GENERIC_ERROR, 64);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if paste has expired and delete it if neccessary.
|
// check if paste has expired and delete it if neccessary.
|
||||||
if (property_exists($data->meta, 'expire_date')) {
|
if (property_exists($data->meta, 'expire_date')) {
|
||||||
if ($data->meta->expire_date < time()) {
|
if ($data->meta->expire_date < time()) {
|
||||||
$this->delete();
|
$this->delete();
|
||||||
throw new Exception(Controller::GENERIC_ERROR, 63);
|
throw new Exception(PrivateBin::GENERIC_ERROR, 63);
|
||||||
}
|
}
|
||||||
// We kindly provide the remaining time before expiration (in seconds)
|
// We kindly provide the remaining time before expiration (in seconds)
|
||||||
$data->meta->remaining_time = $data->meta->expire_date - time();
|
$data->meta->remaining_time = $data->meta->expire_date - time();
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if non-expired burn after reading paste needs to be deleted
|
|
||||||
if (property_exists($data->meta, 'burnafterreading') && $data->meta->burnafterreading) {
|
|
||||||
$this->delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
// set formatter for for the view.
|
// set formatter for for the view.
|
||||||
if (!property_exists($data->meta, 'formatter')) {
|
if (!property_exists($data->meta, 'formatter')) {
|
||||||
// support < 0.21 syntax highlighting
|
// support < 0.21 syntax highlighting
|
||||||
@@ -72,12 +67,6 @@ class Paste extends AbstractModel
|
|||||||
$data->comment_offset = 0;
|
$data->comment_offset = 0;
|
||||||
$data->{'@context'} = 'js/paste.jsonld';
|
$data->{'@context'} = 'js/paste.jsonld';
|
||||||
$this->_data = $data;
|
$this->_data = $data;
|
||||||
|
|
||||||
// If the paste was meant to be read only once, delete it.
|
|
||||||
if ($this->isBurnafterreading()) {
|
|
||||||
$this->delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->_data;
|
return $this->_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +75,7 @@ class Paste extends AbstractModel
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function store()
|
public function store()
|
||||||
{
|
{
|
||||||
@@ -113,6 +103,7 @@ class Paste extends AbstractModel
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function delete()
|
public function delete()
|
||||||
{
|
{
|
||||||
@@ -169,7 +160,7 @@ class Paste extends AbstractModel
|
|||||||
*
|
*
|
||||||
* The token is the hmac of the pastes ID signed with the server salt.
|
* The token is the hmac of the pastes ID signed with the server salt.
|
||||||
* The paste can be deleted by calling:
|
* The paste can be deleted by calling:
|
||||||
* https://example.com/privatebin/?pasteid=<pasteid>&deletetoken=<deletetoken>
|
* http://example.com/privatebin/?pasteid=<pasteid>&deletetoken=<deletetoken>
|
||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @return string
|
* @return string
|
||||||
@@ -192,6 +183,7 @@ class Paste extends AbstractModel
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $attachment
|
* @param string $attachment
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setAttachment($attachment)
|
public function setAttachment($attachment)
|
||||||
{
|
{
|
||||||
@@ -207,6 +199,7 @@ class Paste extends AbstractModel
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $attachmentname
|
* @param string $attachmentname
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setAttachmentName($attachmentname)
|
public function setAttachmentName($attachmentname)
|
||||||
{
|
{
|
||||||
@@ -221,6 +214,7 @@ class Paste extends AbstractModel
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @param string $expiration
|
* @param string $expiration
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setExpiration($expiration)
|
public function setExpiration($expiration)
|
||||||
{
|
{
|
||||||
@@ -242,6 +236,7 @@ class Paste extends AbstractModel
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $burnafterreading
|
* @param string $burnafterreading
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setBurnafterreading($burnafterreading = '1')
|
public function setBurnafterreading($burnafterreading = '1')
|
||||||
{
|
{
|
||||||
@@ -262,6 +257,7 @@ class Paste extends AbstractModel
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $opendiscussion
|
* @param string $opendiscussion
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setOpendiscussion($opendiscussion = '1')
|
public function setOpendiscussion($opendiscussion = '1')
|
||||||
{
|
{
|
||||||
@@ -285,6 +281,7 @@ class Paste extends AbstractModel
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $format
|
* @param string $format
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setFormatter($format)
|
public function setFormatter($format)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin\Persistence;
|
namespace PrivateBin\Persistence;
|
||||||
@@ -36,6 +36,7 @@ abstract class AbstractPersistence
|
|||||||
* @access public
|
* @access public
|
||||||
* @static
|
* @static
|
||||||
* @param string $path
|
* @param string $path
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function setPath($path)
|
public static function setPath($path)
|
||||||
{
|
{
|
||||||
@@ -79,23 +80,27 @@ abstract class AbstractPersistence
|
|||||||
* @access protected
|
* @access protected
|
||||||
* @static
|
* @static
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
protected static function _initialize()
|
protected static function _initialize()
|
||||||
{
|
{
|
||||||
// Create storage directory if it does not exist.
|
// Create storage directory if it does not exist.
|
||||||
if (!is_dir(self::$_path)) {
|
if (!is_dir(self::$_path)) {
|
||||||
if (!@mkdir(self::$_path, 0700)) {
|
if (!@mkdir(self::$_path)) {
|
||||||
throw new Exception('unable to create directory ' . self::$_path, 10);
|
throw new Exception('unable to create directory ' . self::$_path, 10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create .htaccess file if it does not exist.
|
||||||
$file = self::$_path . DIRECTORY_SEPARATOR . '.htaccess';
|
$file = self::$_path . DIRECTORY_SEPARATOR . '.htaccess';
|
||||||
if (!is_file($file)) {
|
if (!is_file($file)) {
|
||||||
$writtenBytes = @file_put_contents(
|
$writtenBytes = @file_put_contents(
|
||||||
$file,
|
$file,
|
||||||
'Require all denied' . PHP_EOL,
|
'Allow from none' . PHP_EOL .
|
||||||
|
'Deny from all' . PHP_EOL,
|
||||||
LOCK_EX
|
LOCK_EX
|
||||||
);
|
);
|
||||||
if ($writtenBytes === false || $writtenBytes < 19) {
|
if ($writtenBytes === false || $writtenBytes < 30) {
|
||||||
throw new Exception('unable to write to file ' . $file, 11);
|
throw new Exception('unable to write to file ' . $file, 11);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,89 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* PrivateBin
|
|
||||||
*
|
|
||||||
* a zero-knowledge paste bin
|
|
||||||
*
|
|
||||||
* @link https://github.com/PrivateBin/PrivateBin
|
|
||||||
* @copyright 2012 Sébastien SAUVAGE (sebsauvage.net)
|
|
||||||
* @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
|
|
||||||
* @version 1.1
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace PrivateBin\Persistence;
|
|
||||||
|
|
||||||
use Exception;
|
|
||||||
use PrivateBin\Json;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* DataStore
|
|
||||||
*
|
|
||||||
* Handles data storage for Data\Filesystem.
|
|
||||||
*/
|
|
||||||
class DataStore extends AbstractPersistence
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* first line in file, to protect its contents
|
|
||||||
*
|
|
||||||
* @const string
|
|
||||||
*/
|
|
||||||
const PROTECTION_LINE = '<?php http_response_code(403); /*';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* store the data
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @static
|
|
||||||
* @param string $filename
|
|
||||||
* @param array $data
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public static function store($filename, $data)
|
|
||||||
{
|
|
||||||
$path = self::getPath();
|
|
||||||
if (strpos($filename, $path) === 0) {
|
|
||||||
$filename = substr($filename, strlen($path));
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
self::_store($filename, self::PROTECTION_LINE . PHP_EOL . Json::encode($data));
|
|
||||||
return true;
|
|
||||||
} catch (Exception $e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get the data
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @static
|
|
||||||
* @param string $filename
|
|
||||||
* @return stdClass|false $data
|
|
||||||
*/
|
|
||||||
public static function get($filename)
|
|
||||||
{
|
|
||||||
return json_decode(substr(file_get_contents($filename), strlen(self::PROTECTION_LINE . PHP_EOL)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* rename a file, prepending the protection line at the beginning
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @static
|
|
||||||
* @param string $srcFile
|
|
||||||
* @param string $destFile
|
|
||||||
* @param string $prefix (optional)
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function prependRename($srcFile, $destFile, $prefix = '')
|
|
||||||
{
|
|
||||||
// don't overwrite already converted file
|
|
||||||
if (!is_readable($destFile)) {
|
|
||||||
$handle = fopen($srcFile, 'r', false, stream_context_create());
|
|
||||||
file_put_contents($destFile, $prefix . self::PROTECTION_LINE . PHP_EOL);
|
|
||||||
file_put_contents($destFile, $handle, FILE_APPEND);
|
|
||||||
fclose($handle);
|
|
||||||
}
|
|
||||||
unlink($srcFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin\Persistence;
|
namespace PrivateBin\Persistence;
|
||||||
@@ -36,6 +36,7 @@ class PurgeLimiter extends AbstractPersistence
|
|||||||
* @access public
|
* @access public
|
||||||
* @static
|
* @static
|
||||||
* @param int $limit
|
* @param int $limit
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function setLimit($limit)
|
public static function setLimit($limit)
|
||||||
{
|
{
|
||||||
@@ -48,6 +49,7 @@ class PurgeLimiter extends AbstractPersistence
|
|||||||
* @access public
|
* @access public
|
||||||
* @static
|
* @static
|
||||||
* @param Configuration $conf
|
* @param Configuration $conf
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function setConfiguration(Configuration $conf)
|
public static function setConfiguration(Configuration $conf)
|
||||||
{
|
{
|
||||||
@@ -70,18 +72,23 @@ class PurgeLimiter extends AbstractPersistence
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
$now = time();
|
$file = 'purge_limiter.php';
|
||||||
$file = 'purge_limiter.php';
|
$now = time();
|
||||||
if (self::_exists($file)) {
|
$content = '<?php' . PHP_EOL . '$GLOBALS[\'purge_limiter\'] = ' . $now . ';' . PHP_EOL;
|
||||||
require self::getPath($file);
|
if (!self::_exists($file)) {
|
||||||
$pl = $GLOBALS['purge_limiter'];
|
self::_store($file, $content);
|
||||||
if ($pl + self::$_limit >= $now) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$content = '<?php' . PHP_EOL . '$GLOBALS[\'purge_limiter\'] = ' . $now . ';';
|
$path = self::getPath($file);
|
||||||
self::_store($file, $content);
|
require $path;
|
||||||
return true;
|
$pl = $GLOBALS['purge_limiter'];
|
||||||
|
|
||||||
|
if ($pl + self::$_limit >= $now) {
|
||||||
|
$result = false;
|
||||||
|
} else {
|
||||||
|
$result = true;
|
||||||
|
self::_store($file, $content);
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin\Persistence;
|
namespace PrivateBin\Persistence;
|
||||||
@@ -83,7 +83,7 @@ class ServerSalt extends AbstractPersistence
|
|||||||
self::$_salt = self::generate();
|
self::$_salt = self::generate();
|
||||||
self::_store(
|
self::_store(
|
||||||
self::$_file,
|
self::$_file,
|
||||||
'<?php # |' . self::$_salt . '|'
|
'<?php /* |' . self::$_salt . '| */ ?>'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return self::$_salt;
|
return self::$_salt;
|
||||||
@@ -95,6 +95,7 @@ class ServerSalt extends AbstractPersistence
|
|||||||
* @access public
|
* @access public
|
||||||
* @static
|
* @static
|
||||||
* @param string $path
|
* @param string $path
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function setPath($path)
|
public static function setPath($path)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin\Persistence;
|
namespace PrivateBin\Persistence;
|
||||||
@@ -45,6 +45,7 @@ class TrafficLimiter extends AbstractPersistence
|
|||||||
* @access public
|
* @access public
|
||||||
* @static
|
* @static
|
||||||
* @param int $limit
|
* @param int $limit
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function setLimit($limit)
|
public static function setLimit($limit)
|
||||||
{
|
{
|
||||||
@@ -57,6 +58,7 @@ class TrafficLimiter extends AbstractPersistence
|
|||||||
* @access public
|
* @access public
|
||||||
* @static
|
* @static
|
||||||
* @param Configuration $conf
|
* @param Configuration $conf
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function setConfiguration(Configuration $conf)
|
public static function setConfiguration(Configuration $conf)
|
||||||
{
|
{
|
||||||
@@ -101,22 +103,27 @@ class TrafficLimiter extends AbstractPersistence
|
|||||||
}
|
}
|
||||||
|
|
||||||
$file = 'traffic_limiter.php';
|
$file = 'traffic_limiter.php';
|
||||||
if (self::_exists($file)) {
|
if (!self::_exists($file)) {
|
||||||
require self::getPath($file);
|
self::_store(
|
||||||
$tl = $GLOBALS['traffic_limiter'];
|
$file,
|
||||||
} else {
|
'<?php' . PHP_EOL .
|
||||||
$tl = array();
|
'$GLOBALS[\'traffic_limiter\'] = array();' . PHP_EOL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// purge file of expired hashes to keep it small
|
$path = self::getPath($file);
|
||||||
|
require $path;
|
||||||
$now = time();
|
$now = time();
|
||||||
|
$tl = $GLOBALS['traffic_limiter'];
|
||||||
|
|
||||||
|
// purge file of expired hashes to keep it small
|
||||||
foreach ($tl as $key => $time) {
|
foreach ($tl as $key => $time) {
|
||||||
if ($time + self::$_limit < $now) {
|
if ($time + self::$_limit < $now) {
|
||||||
unset($tl[$key]);
|
unset($tl[$key]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// this hash is used as an array key, hence a shorter algo is used
|
// this hash is used as an array key, hence a shorter hash is used
|
||||||
$hash = self::getHash('sha256');
|
$hash = self::getHash('sha256');
|
||||||
if (array_key_exists($hash, $tl) && ($tl[$hash] + self::$_limit >= $now)) {
|
if (array_key_exists($hash, $tl) && ($tl[$hash] + self::$_limit >= $now)) {
|
||||||
$result = false;
|
$result = false;
|
||||||
@@ -127,7 +134,8 @@ class TrafficLimiter extends AbstractPersistence
|
|||||||
self::_store(
|
self::_store(
|
||||||
$file,
|
$file,
|
||||||
'<?php' . PHP_EOL .
|
'<?php' . PHP_EOL .
|
||||||
'$GLOBALS[\'traffic_limiter\'] = ' . var_export($tl, true) . ';'
|
'$GLOBALS[\'traffic_limiter\'] = ' .
|
||||||
|
var_export($tl, true) . ';' . PHP_EOL
|
||||||
);
|
);
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin;
|
namespace PrivateBin;
|
||||||
@@ -17,25 +17,18 @@ use PrivateBin\Persistence\ServerSalt;
|
|||||||
use PrivateBin\Persistence\TrafficLimiter;
|
use PrivateBin\Persistence\TrafficLimiter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller
|
* PrivateBin
|
||||||
*
|
*
|
||||||
* Puts it all together.
|
* Controller, puts it all together.
|
||||||
*/
|
*/
|
||||||
class Controller
|
class PrivateBin
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* version
|
* version
|
||||||
*
|
*
|
||||||
* @const string
|
* @const string
|
||||||
*/
|
*/
|
||||||
const VERSION = '1.2.1';
|
const VERSION = '1.1';
|
||||||
|
|
||||||
/**
|
|
||||||
* minimal required PHP version
|
|
||||||
*
|
|
||||||
* @const string
|
|
||||||
*/
|
|
||||||
const MIN_PHP_VERSION = '5.4.0';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* show the same error message if the paste expired or does not exist
|
* show the same error message if the paste expired or does not exist
|
||||||
@@ -52,6 +45,22 @@ class Controller
|
|||||||
*/
|
*/
|
||||||
private $_conf;
|
private $_conf;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* data
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $_data = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* does the paste expire
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private $_doesExpire = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* error message
|
* error message
|
||||||
*
|
*
|
||||||
@@ -107,11 +116,12 @@ class Controller
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
if (version_compare(PHP_VERSION, self::MIN_PHP_VERSION) < 0) {
|
if (version_compare(PHP_VERSION, '5.3.0') < 0) {
|
||||||
throw new Exception(I18n::_('%s requires php %s or above to work. Sorry.', I18n::_('PrivateBin'), self::MIN_PHP_VERSION), 1);
|
throw new Exception(I18n::_('%s requires php 5.3.0 or above to work. Sorry.', I18n::_('PrivateBin')), 1);
|
||||||
}
|
}
|
||||||
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);
|
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);
|
||||||
@@ -151,16 +161,29 @@ class Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* initialize PrivateBin
|
* initialize privatebin
|
||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
private function _init()
|
private function _init()
|
||||||
{
|
{
|
||||||
|
foreach (array('cfg', 'lib') as $dir) {
|
||||||
|
if (!is_file(PATH . $dir . DIRECTORY_SEPARATOR . '.htaccess')) {
|
||||||
|
file_put_contents(
|
||||||
|
PATH . $dir . DIRECTORY_SEPARATOR . '.htaccess',
|
||||||
|
'Allow from none' . PHP_EOL .
|
||||||
|
'Deny from all' . PHP_EOL,
|
||||||
|
LOCK_EX
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$this->_conf = new Configuration;
|
$this->_conf = new Configuration;
|
||||||
$this->_model = new Model($this->_conf);
|
$this->_model = new Model($this->_conf);
|
||||||
$this->_request = new Request;
|
$this->_request = new Request;
|
||||||
$this->_urlBase = $this->_request->getRequestUri();
|
$this->_urlBase = array_key_exists('REQUEST_URI', $_SERVER) ?
|
||||||
|
htmlspecialchars($_SERVER['REQUEST_URI']) : '/';
|
||||||
ServerSalt::setPath($this->_conf->getKey('dir', 'traffic'));
|
ServerSalt::setPath($this->_conf->getKey('dir', 'traffic'));
|
||||||
|
|
||||||
// set default language
|
// set default language
|
||||||
@@ -301,6 +324,7 @@ class Controller
|
|||||||
* @access private
|
* @access private
|
||||||
* @param string $dataid
|
* @param string $dataid
|
||||||
* @param string $deletetoken
|
* @param string $deletetoken
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
private function _delete($dataid, $deletetoken)
|
private function _delete($dataid, $deletetoken)
|
||||||
{
|
{
|
||||||
@@ -311,10 +335,10 @@ class Controller
|
|||||||
// deleted if it has already expired
|
// deleted if it has already expired
|
||||||
$burnafterreading = $paste->isBurnafterreading();
|
$burnafterreading = $paste->isBurnafterreading();
|
||||||
if (
|
if (
|
||||||
($burnafterreading && $deletetoken == 'burnafterreading') || // either we burn-after it has been read //@TODO: not needed anymore now?
|
($burnafterreading && $deletetoken == 'burnafterreading') ||
|
||||||
Filter::slowEquals($deletetoken, $paste->getDeleteToken()) // or we manually delete it with this secret token
|
Filter::slowEquals($deletetoken, $paste->getDeleteToken())
|
||||||
) {
|
) {
|
||||||
// Paste exists and deletion token (if required) is valid: Delete the paste.
|
// Paste exists and deletion token is valid: Delete the paste.
|
||||||
$paste->delete();
|
$paste->delete();
|
||||||
$this->_status = 'Paste was properly deleted.';
|
$this->_status = 'Paste was properly deleted.';
|
||||||
} else {
|
} else {
|
||||||
@@ -340,37 +364,44 @@ class Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read an existing paste or comment, only allowed via a JSON API call
|
* Read an existing paste or comment
|
||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @param string $dataid
|
* @param string $dataid
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
private function _read($dataid)
|
private function _read($dataid)
|
||||||
{
|
{
|
||||||
if (!$this->_request->isJsonApiCall()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$paste = $this->_model->getPaste($dataid);
|
$paste = $this->_model->getPaste($dataid);
|
||||||
if ($paste->exists()) {
|
if ($paste->exists()) {
|
||||||
$data = $paste->get();
|
$data = $paste->get();
|
||||||
|
$this->_doesExpire = property_exists($data, 'meta') && property_exists($data->meta, 'expire_date');
|
||||||
if (property_exists($data->meta, 'salt')) {
|
if (property_exists($data->meta, 'salt')) {
|
||||||
unset($data->meta->salt);
|
unset($data->meta->salt);
|
||||||
}
|
}
|
||||||
$this->_return_message(0, $dataid, (array) $data);
|
$this->_data = json_encode($data);
|
||||||
} else {
|
} else {
|
||||||
$this->_return_message(1, self::GENERIC_ERROR);
|
$this->_error = self::GENERIC_ERROR;
|
||||||
}
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$this->_return_message(1, $e->getMessage());
|
$this->_error = $e->getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->_request->isJsonApiCall()) {
|
||||||
|
if (strlen($this->_error)) {
|
||||||
|
$this->_return_message(1, $this->_error);
|
||||||
|
} else {
|
||||||
|
$this->_return_message(0, $dataid, json_decode($this->_data, true));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display frontend.
|
* Display PrivateBin frontend.
|
||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
private function _view()
|
private function _view()
|
||||||
{
|
{
|
||||||
@@ -404,6 +435,7 @@ class Controller
|
|||||||
|
|
||||||
$page = new View;
|
$page = new View;
|
||||||
$page->assign('NAME', $this->_conf->getKey('name'));
|
$page->assign('NAME', $this->_conf->getKey('name'));
|
||||||
|
$page->assign('CIPHERDATA', $this->_data);
|
||||||
$page->assign('ERROR', I18n::_($this->_error));
|
$page->assign('ERROR', I18n::_($this->_error));
|
||||||
$page->assign('STATUS', I18n::_($this->_status));
|
$page->assign('STATUS', I18n::_($this->_status));
|
||||||
$page->assign('VERSION', self::VERSION);
|
$page->assign('VERSION', self::VERSION);
|
||||||
@@ -423,8 +455,8 @@ class Controller
|
|||||||
$page->assign('LANGUAGES', I18n::getLanguageLabels(I18n::getAvailableLanguages()));
|
$page->assign('LANGUAGES', I18n::getLanguageLabels(I18n::getAvailableLanguages()));
|
||||||
$page->assign('EXPIRE', $expire);
|
$page->assign('EXPIRE', $expire);
|
||||||
$page->assign('EXPIREDEFAULT', $this->_conf->getKey('default', 'expire'));
|
$page->assign('EXPIREDEFAULT', $this->_conf->getKey('default', 'expire'));
|
||||||
|
$page->assign('EXPIRECLONE', !$this->_doesExpire || ($this->_doesExpire && $this->_conf->getKey('clone', 'expire')));
|
||||||
$page->assign('URLSHORTENER', $this->_conf->getKey('urlshortener'));
|
$page->assign('URLSHORTENER', $this->_conf->getKey('urlshortener'));
|
||||||
$page->assign('QRCODE', $this->_conf->getKey('qrcode'));
|
|
||||||
$page->draw($this->_conf->getKey('template'));
|
$page->draw($this->_conf->getKey('template'));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -433,6 +465,7 @@ class Controller
|
|||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @param string $type
|
* @param string $type
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
private function _jsonld($type)
|
private function _jsonld($type)
|
||||||
{
|
{
|
||||||
@@ -465,6 +498,7 @@ class Controller
|
|||||||
* @param int $status
|
* @param int $status
|
||||||
* @param string $message
|
* @param string $message
|
||||||
* @param array $other
|
* @param array $other
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
private function _return_message($status, $message, $other = array())
|
private function _return_message($status, $message, $other = array())
|
||||||
{
|
{
|
||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin;
|
namespace PrivateBin;
|
||||||
@@ -41,7 +41,7 @@ class Request
|
|||||||
const MIME_XHTML = 'application/xhtml+xml';
|
const MIME_XHTML = 'application/xhtml+xml';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Input stream to use for PUT parameter parsing
|
* Input stream to use for PUT parameter parsing.
|
||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @var string
|
* @var string
|
||||||
@@ -49,7 +49,7 @@ class Request
|
|||||||
private static $_inputStream = 'php://input';
|
private static $_inputStream = 'php://input';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Operation to perform
|
* Operation to perform.
|
||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @var string
|
* @var string
|
||||||
@@ -57,7 +57,7 @@ class Request
|
|||||||
private $_operation = 'view';
|
private $_operation = 'view';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request parameters
|
* Request parameters.
|
||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @var array
|
* @var array
|
||||||
@@ -65,7 +65,7 @@ class Request
|
|||||||
private $_params = array();
|
private $_params = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If we are in a JSON API context
|
* If we are in a JSON API context.
|
||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @var bool
|
* @var bool
|
||||||
@@ -73,12 +73,20 @@ class Request
|
|||||||
private $_isJsonApi = false;
|
private $_isJsonApi = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor.
|
||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
|
// in case stupid admin has left magic_quotes enabled in php.ini (for PHP < 5.4)
|
||||||
|
if (version_compare(PHP_VERSION, '5.4.0') < 0 && get_magic_quotes_gpc()) {
|
||||||
|
$_POST = array_map('PrivateBin\\Filter::stripslashesDeep', $_POST);
|
||||||
|
$_GET = array_map('PrivateBin\\Filter::stripslashesDeep', $_GET);
|
||||||
|
$_COOKIE = array_map('PrivateBin\\Filter::stripslashesDeep', $_COOKIE);
|
||||||
|
}
|
||||||
|
|
||||||
// decide if we are in JSON API or HTML context
|
// decide if we are in JSON API or HTML context
|
||||||
$this->_isJsonApi = $this->_detectJsonRequest();
|
$this->_isJsonApi = $this->_detectJsonRequest();
|
||||||
|
|
||||||
@@ -121,7 +129,7 @@ class Request
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get current operation
|
* Get current operation.
|
||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @return string
|
* @return string
|
||||||
@@ -132,7 +140,7 @@ class Request
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a request parameter
|
* Get a request parameter.
|
||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @param string $param
|
* @param string $param
|
||||||
@@ -141,24 +149,11 @@ class Request
|
|||||||
*/
|
*/
|
||||||
public function getParam($param, $default = '')
|
public function getParam($param, $default = '')
|
||||||
{
|
{
|
||||||
return array_key_exists($param, $this->_params) ?
|
return array_key_exists($param, $this->_params) ? $this->_params[$param] : $default;
|
||||||
$this->_params[$param] : $default;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get request URI
|
* If we are in a JSON API context.
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getRequestUri()
|
|
||||||
{
|
|
||||||
return array_key_exists('REQUEST_URI', $_SERVER) ?
|
|
||||||
htmlspecialchars($_SERVER['REQUEST_URI']) : '/';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If we are in a JSON API context
|
|
||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @return bool
|
* @return bool
|
||||||
@@ -169,7 +164,7 @@ class Request
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override the default input stream source, used for unit testing
|
* Override the default input stream source, used for unit testing.
|
||||||
*
|
*
|
||||||
* @param string $input
|
* @param string $input
|
||||||
*/
|
*/
|
||||||
@@ -179,7 +174,7 @@ class Request
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detect the clients supported media type and decide if its a JSON API call or not
|
* detect the clients supported media type and decide if its a JSON API call or not
|
||||||
*
|
*
|
||||||
* Adapted from: https://stackoverflow.com/questions/3770513/detect-browser-language-in-php#3771447
|
* Adapted from: https://stackoverflow.com/questions/3770513/detect-browser-language-in-php#3771447
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin;
|
namespace PrivateBin;
|
||||||
|
|||||||
@@ -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 http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
|
* @license http://www.opensource.org/licenses/zlib-license.php The zlib/libpng License
|
||||||
* @version 1.2.1
|
* @version 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin;
|
namespace PrivateBin;
|
||||||
@@ -35,6 +35,7 @@ class View
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $name
|
* @param string $name
|
||||||
* @param mixed $value
|
* @param mixed $value
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function assign($name, $value)
|
public function assign($name, $value)
|
||||||
{
|
{
|
||||||
@@ -47,6 +48,7 @@ class View
|
|||||||
* @access public
|
* @access public
|
||||||
* @param string $template
|
* @param string $template
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function draw($template)
|
public function draw($template)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
* @link http://sebsauvage.net/wiki/doku.php?id=php:vizhash_gd
|
* @link http://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.2.1
|
* @version 0.0.5 beta PrivateBin 1.1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace PrivateBin;
|
namespace PrivateBin;
|
||||||
@@ -61,6 +61,7 @@ class Vizhash16x16
|
|||||||
* constructor
|
* constructor
|
||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@@ -79,7 +80,7 @@ class Vizhash16x16
|
|||||||
*/
|
*/
|
||||||
public function generate($text)
|
public function generate($text)
|
||||||
{
|
{
|
||||||
if (!function_exists('gd_info')) {
|
if (!function_exists('gd_info') || strlen($text) < 1) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,6 +210,7 @@ class Vizhash16x16
|
|||||||
* @param resource $image
|
* @param resource $image
|
||||||
* @param int $action
|
* @param int $action
|
||||||
* @param int $color
|
* @param int $color
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
private function drawshape($image, $action, $color)
|
private function drawshape($image, $action, $color)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,3 +5,5 @@ root = false
|
|||||||
# special format for PHP templates
|
# special format for PHP templates
|
||||||
[*.php]
|
[*.php]
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
Require all denied
|
|
||||||
@@ -4,7 +4,7 @@ $isCpct = substr($template, 9, 8) === '-compact';
|
|||||||
$isDark = substr($template, 9, 5) === '-dark';
|
$isDark = substr($template, 9, 5) === '-dark';
|
||||||
$isPage = substr($template, -5) === '-page';
|
$isPage = substr($template, -5) === '-page';
|
||||||
?><!DOCTYPE html>
|
?><!DOCTYPE html>
|
||||||
<html>
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
@@ -41,41 +41,35 @@ if ($SYNTAXHIGHLIGHTING):
|
|||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
<noscript><link type="text/css" rel="stylesheet" href="css/noscript.css" /></noscript>
|
<noscript><link type="text/css" rel="stylesheet" href="css/noscript.css" /></noscript>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/jquery-3.3.1.js" integrity="sha512-+NqPlbbtM1QqiK8ZAo4Yrj2c4lNQoGv8P79DPtKzj++l5jnN39rHA/xsqn8zE9l0uSoxaCdrOgFs6yjyfbBxSg==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/jquery-3.1.1.js" integrity="sha512-U6K1YLIFUWcvuw5ucmMtT9HH4t0uz3M366qrF5y4vnyH6dgDzndlcGvH/Lz5k8NFh80SN95aJ5rqGZEdaQZ7ZQ==" crossorigin="anonymous"></script>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/sjcl-1.0.7.js" integrity="sha512-J2eNenPwyfXkMVNMFz9Q54kKfYi5AA3mQWpNgtjSJzsKHtpbhUt/7bvcjGwwmzE8ZUVWMI/ndagIX1lG+SfxGA==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/sjcl-1.0.6.js" integrity="sha512-DsyxLV/uBoQlRTJmW5Gb2SxXUXB+aYeZ6zk+NuXy8LuLyi8oGti9AGn6He5fUY2DtgQ2//RjfaZog8exFuunUQ==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
if ($QRCODE):
|
|
||||||
?>
|
|
||||||
<script async type="text/javascript" data-cfasync="false" src="js/kjua-0.1.2.js" integrity="sha512-hmvfOhcr4J8bjQ2GuNVzfSbuulv72wgQCJpgnXc2+cCHKqvYo8pK2nc0Q4Esem2973zo1radyIMTEkt+xJlhBA==" crossorigin="anonymous"></script>
|
|
||||||
<?php
|
|
||||||
endif;
|
|
||||||
if ($ZEROBINCOMPATIBILITY):
|
if ($ZEROBINCOMPATIBILITY):
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/base64-1.7.js" integrity="sha512-JdwsSP3GyHR+jaCkns9CL9NTt4JUJqm/BsODGmYhBcj5EAPKcHYh+OiMfyHbcDLECe17TL0hjXADFkusAqiYgA==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/base64-1.7.js" integrity="sha512-JdwsSP3GyHR+jaCkns9CL9NTt4JUJqm/BsODGmYhBcj5EAPKcHYh+OiMfyHbcDLECe17TL0hjXADFkusAqiYgA==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
else:
|
else:
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/base64-2.4.5.js" integrity="sha512-YINE6agO8ZrYuzlrZZwQJTu0uqURJDxD4gjsfZ6mV4fP2gW5j8giNJ734iyJVTBrnF2XMiUBM/DSi7ON1V5RMQ==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/base64-2.1.9.js" integrity="sha512-rbqAby7hObftbEoGQzkhUbEh5YkUn2MtekTLs4btvo2oly4CZ3DxhJzEh0u/rNzS54tcJdqi5Ug1ruugEd2U1g==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/rawdeflate-0.5.js" integrity="sha512-tTdZ7qMr7tt5VQy4iCHu6/aGB12eRwbUy+AEI5rXntfsjcRfBeeqJloMsBU9FrGk1bIYLiuND/FhU42LO1bi0g==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/rawdeflate-0.5.js" integrity="sha512-tTdZ7qMr7tt5VQy4iCHu6/aGB12eRwbUy+AEI5rXntfsjcRfBeeqJloMsBU9FrGk1bIYLiuND/FhU42LO1bi0g==" crossorigin="anonymous"></script>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/rawinflate-0.3.js" integrity="sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/rawinflate-0.3.js" integrity="sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==" crossorigin="anonymous"></script>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/bootstrap-3.3.7.js" integrity="sha512-iztkobsvnjKfAtTNdHkGVjAYTrrtlC7mGp/54c40wowO7LhURYl3gVzzcEqGl/qKXQltJ2HwMrdLcNUdo+N/RQ==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/bootstrap-3.3.7.js" integrity="sha512-iztkobsvnjKfAtTNdHkGVjAYTrrtlC7mGp/54c40wowO7LhURYl3gVzzcEqGl/qKXQltJ2HwMrdLcNUdo+N/RQ==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
if ($SYNTAXHIGHLIGHTING):
|
if ($SYNTAXHIGHLIGHTING):
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/prettify.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/prettify.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-m8iHxoN+Fe12xxFwWNdY/TS4KoFntHp29qY0xUzBnPd0bkKMOR/dFhEdTWydpt0b/fIXyhB+znGYUvgjfJ2RzQ==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
if ($MARKDOWN):
|
if ($MARKDOWN):
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/showdown-1.8.6.js" integrity="sha512-YFg2sBCGT00I6X5KzgCLP4VqRlmPMRhkVvJS9oJKk5LxiUzzcjzV5m4fNf6mQMctLrhgS5LFKiFF3vzIuXbjAw==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/showdown-1.6.1.js" integrity="sha512-e6kAsBTgFnTBnEQXrq8BV6+XFwxb3kyWHeEPOl+KhxaWt3xImE2zAW2+yP3E2CQ7F9yoJl1poVU9qxkOEtVsTQ==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/purify-1.0.7.js" integrity="sha512-VnKJHLosO8z2ojNvWk9BEKYqnhZyWK9rM90FgZUUEp/PRnUqR5OLLKE0a3BkVmn7YgB7LXRrjHgFHQYKd6DAIA==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-vYYJYraxQNOf41XtehLBU2JbIQ2Uffe+n8TjHyWkpqoZdZX4aL5zyABrUNvRUP02+AxoRsmNJkpvIbmeQqcIXg==" crossorigin="anonymous"></script>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-5xT6WHyurvC0LFESbkycBMAjhsi0KL/Xhx2oU+d0bqiJPkWK6ZAZgZ7I02oQiXaLtFSLf7UqpBo5XEePlfhH7Q==" crossorigin="anonymous"></script>
|
|
||||||
<!--[if lt IE 10]>
|
<!--[if lt IE 10]>
|
||||||
<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
|
<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
@@ -93,14 +87,14 @@ if ($isCpct):
|
|||||||
?> class="navbar-spacing"<?php
|
?> class="navbar-spacing"<?php
|
||||||
endif;
|
endif;
|
||||||
?>>
|
?>>
|
||||||
<div id="passwordmodal" tabindex="-1" class="modal fade" role="dialog" aria-hidden="true">
|
<div id="passwordmodal" class="modal fade" role="dialog">
|
||||||
<div class="modal-dialog" role="document">
|
<div class="modal-dialog">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<form id="passwordform" role="form">
|
<form id="passwordform" role="form">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="passworddecrypt"><span class="glyphicon glyphicon-eye-open"></span> <?php echo I18n::_('Please enter the password for this paste:') ?></label>
|
<label for="passworddecrypt"><span class="glyphicon glyphicon-eye-open"></span> <?php echo I18n::_('Please enter the password for this paste:') ?></label>
|
||||||
<input id="passworddecrypt" type="password" class="form-control" placeholder="<?php echo I18n::_('Enter password') ?>" required="required">
|
<input id="passworddecrypt" type="password" class="form-control" placeholder="<?php echo I18n::_('Enter password') ?>" autofocus>
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="btn btn-success btn-block"><span class="glyphicon glyphicon-off"></span> <?php echo I18n::_('Decrypt') ?></button>
|
<button type="submit" class="btn btn-success btn-block"><span class="glyphicon glyphicon-off"></span> <?php echo I18n::_('Decrypt') ?></button>
|
||||||
</form>
|
</form>
|
||||||
@@ -108,22 +102,6 @@ endif;
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
|
||||||
if ($QRCODE):
|
|
||||||
?>
|
|
||||||
<div id="qrcodemodal" tabindex="-1" class="modal fade" aria-labelledby="qrcodemodalTitle" role="dialog" aria-hidden="true">
|
|
||||||
<div class="modal-dialog" role="document">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-body">
|
|
||||||
<div class="mx-auto" id="qrcode-display"></div>
|
|
||||||
</div>
|
|
||||||
<button type="button" class="btn btn-primary btn-block" data-dismiss="modal"><?php echo I18n::_('Close') ?></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
endif;
|
|
||||||
?>
|
|
||||||
<nav class="navbar navbar-<?php echo $isDark ? 'inverse' : 'default'; ?> navbar-<?php echo $isCpct ? 'fixed' : 'static'; ?>-top"><?php
|
<nav class="navbar navbar-<?php echo $isDark ? 'inverse' : 'default'; ?> navbar-<?php echo $isCpct ? 'fixed' : 'static'; ?>-top"><?php
|
||||||
if ($isCpct):
|
if ($isCpct):
|
||||||
?><div class="container"><?php
|
?><div class="container"><?php
|
||||||
@@ -143,13 +121,8 @@ endif;
|
|||||||
<div id="navbar" class="navbar-collapse collapse">
|
<div id="navbar" class="navbar-collapse collapse">
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li id="loadingindicator" class="navbar-text hidden">
|
<li id="loadingindicator" class="navbar-text hidden">
|
||||||
<span class="glyphicon glyphicon-time" aria-hidden="true"></span>
|
<span class="glyphicon glyphicon-upload" aria-hidden="true"></span>
|
||||||
<?php echo I18n::_('Loading…'), PHP_EOL; ?>
|
<?php echo I18n::_('Uploading paste… Please wait.'), PHP_EOL; ?>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<button id="retrybutton" type="button" class="reloadlink hidden btn btn-<?php echo $isDark ? 'warning' : 'primary'; ?> navbar-btn">
|
|
||||||
<span class="glyphicon glyphicon-repeat" aria-hidden="true"></span> <?php echo I18n::_('Retry'), PHP_EOL; ?>
|
|
||||||
</button>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<?php
|
<?php
|
||||||
@@ -159,26 +132,23 @@ if ($isPage):
|
|||||||
<span class="glyphicon glyphicon-upload" aria-hidden="true"></span> <?php echo I18n::_('Send'), PHP_EOL;
|
<span class="glyphicon glyphicon-upload" aria-hidden="true"></span> <?php echo I18n::_('Send'), PHP_EOL;
|
||||||
else:
|
else:
|
||||||
?>
|
?>
|
||||||
<button id="newbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
|
<button id="newbutton" type="button" class="reloadlink hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
|
||||||
<span class="glyphicon glyphicon-file" aria-hidden="true"></span> <?php echo I18n::_('New'), PHP_EOL;
|
<span class="glyphicon glyphicon-file" aria-hidden="true"></span> <?php echo I18n::_('New'), PHP_EOL;
|
||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
</button>
|
</button>
|
||||||
|
<?php
|
||||||
|
if ($EXPIRECLONE):
|
||||||
|
?>
|
||||||
<button id="clonebutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
|
<button id="clonebutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
|
||||||
<span class="glyphicon glyphicon-duplicate" aria-hidden="true"></span> <?php echo I18n::_('Clone'), PHP_EOL; ?>
|
<span class="glyphicon glyphicon-duplicate" aria-hidden="true"></span> <?php echo I18n::_('Clone'), PHP_EOL; ?>
|
||||||
</button>
|
</button>
|
||||||
<button id="rawtextbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
|
|
||||||
<span class="glyphicon glyphicon-text-background" aria-hidden="true"></span> <?php echo I18n::_('Raw text'), PHP_EOL; ?>
|
|
||||||
</button>
|
|
||||||
<?php
|
|
||||||
if ($QRCODE):
|
|
||||||
?>
|
|
||||||
<button id="qrcodelink" type="button" data-toggle="modal" data-target="#qrcodemodal" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
|
|
||||||
<span class="glyphicon glyphicon-qrcode" aria-hidden="true"></span> <?php echo I18n::_('QR code'), PHP_EOL; ?>
|
|
||||||
</button>
|
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
|
<button id="rawtextbutton" type="button" class="hidden btn btn-<?php echo $isDark ? 'warning' : 'default'; ?> navbar-btn">
|
||||||
|
<span class="glyphicon glyphicon-text-background" aria-hidden="true"></span> <?php echo I18n::_('Raw text'), PHP_EOL; ?>
|
||||||
|
</button>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<select id="pasteExpiration" name="pasteExpiration" class="hidden">
|
<select id="pasteExpiration" name="pasteExpiration" class="hidden">
|
||||||
@@ -228,7 +198,7 @@ if ($isCpct):
|
|||||||
<?php
|
<?php
|
||||||
if ($DISCUSSION):
|
if ($DISCUSSION):
|
||||||
?>
|
?>
|
||||||
<li id="opendiscussionoption" class="checkbox hidden">
|
<li id="opendisc" class="checkbox hidden">
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" id="opendiscussion" name="opendiscussion"<?php
|
<input type="checkbox" id="opendiscussion" name="opendiscussion"<?php
|
||||||
if ($OPENDISCUSSION):
|
if ($OPENDISCUSSION):
|
||||||
@@ -292,7 +262,7 @@ else:
|
|||||||
if ($DISCUSSION):
|
if ($DISCUSSION):
|
||||||
?>
|
?>
|
||||||
<li>
|
<li>
|
||||||
<div id="opendiscussionoption" class="navbar-text checkbox hidden">
|
<div id="opendisc" class="navbar-text checkbox hidden">
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" id="opendiscussion" name="opendiscussion"<?php
|
<input type="checkbox" id="opendiscussion" name="opendiscussion"<?php
|
||||||
if ($OPENDISCUSSION):
|
if ($OPENDISCUSSION):
|
||||||
@@ -300,7 +270,7 @@ else:
|
|||||||
endif;
|
endif;
|
||||||
?> />
|
?> />
|
||||||
<?php echo I18n::_('Open discussion'), PHP_EOL; ?>
|
<?php echo I18n::_('Open discussion'), PHP_EOL; ?>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<?php
|
<?php
|
||||||
@@ -310,7 +280,7 @@ if ($PASSWORD):
|
|||||||
?>
|
?>
|
||||||
<li>
|
<li>
|
||||||
<div id="password" class="navbar-form hidden">
|
<div id="password" class="navbar-form hidden">
|
||||||
<input type="password" id="passwordinput" placeholder="<?php echo I18n::_('Password (recommended)'); ?>" class="form-control" size="23" />
|
<input type="password" id="passwordinput" placeholder="<?php echo I18n::_('Password (recommended)'); ?>" class="form-control" size="19" />
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<?php
|
<?php
|
||||||
@@ -324,9 +294,7 @@ if ($FILEUPLOAD):
|
|||||||
<div>
|
<div>
|
||||||
<input type="file" id="file" name="file" />
|
<input type="file" id="file" name="file" />
|
||||||
</div>
|
</div>
|
||||||
<div id="dragAndDropFileName" class="dragAndDropFile"><?php echo I18n::_('alternatively drag & drop a file or paste an image from the clipboard'); ?></div>
|
|
||||||
</li>
|
</li>
|
||||||
<li id="customattachment" class="hidden"></li>
|
|
||||||
<li>
|
<li>
|
||||||
<a id="fileremovebutton" href="#">
|
<a id="fileremovebutton" href="#">
|
||||||
<?php echo I18n::_('Remove attachment'), PHP_EOL; ?>
|
<?php echo I18n::_('Remove attachment'), PHP_EOL; ?>
|
||||||
@@ -415,60 +383,52 @@ if ($isCpct):
|
|||||||
?></div><?php
|
?></div><?php
|
||||||
endif;
|
endif;
|
||||||
?></nav>
|
?></nav>
|
||||||
<main>
|
<header class="container">
|
||||||
<section class="container">
|
|
||||||
<?php
|
<?php
|
||||||
if (strlen($NOTICE)):
|
if (strlen($NOTICE)):
|
||||||
?>
|
?>
|
||||||
<div role="alert" class="alert alert-info">
|
<div role="alert" class="alert alert-info">
|
||||||
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
|
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> <?php echo htmlspecialchars($NOTICE), PHP_EOL; ?>
|
||||||
<?php echo htmlspecialchars($NOTICE), PHP_EOL; ?>
|
</div>
|
||||||
</div>
|
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
<div id="remainingtime" role="alert" class="hidden alert alert-info">
|
<div id="remainingtime" role="alert" class="hidden alert alert-info">
|
||||||
<span class="glyphicon glyphicon-fire" aria-hidden="true"></span>
|
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
if ($FILEUPLOAD):
|
if ($FILEUPLOAD):
|
||||||
?>
|
?>
|
||||||
<div id="attachment" role="alert" class="hidden alert alert-info">
|
<div id="attachment" role="alert" class="hidden alert alert-info">
|
||||||
<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span>
|
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> <a><?php echo I18n::_('Download attachment'); ?></a> <span id="clonedfile" class="hidden"><?php echo I18n::_('Cloned file attached.'); ?></span>
|
||||||
<a class="alert-link"><?php echo I18n::_('Download attachment'), PHP_EOL; ?></a>
|
</div>
|
||||||
</div>
|
<?php
|
||||||
|
endif;
|
||||||
|
if (strlen($STATUS)):
|
||||||
|
?>
|
||||||
|
<div id="status" role="alert" class="alert alert-success">
|
||||||
|
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span> <?php echo htmlspecialchars($STATUS), PHP_EOL; ?>
|
||||||
|
</div>
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
<div id="status" role="alert" class="statusmessage alert alert-info<?php echo empty($STATUS) ? ' hidden' : '' ?>">
|
<div id="errormessage" role="alert" class="<?php
|
||||||
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
|
if (!strlen($ERROR)):
|
||||||
<?php echo htmlspecialchars($STATUS), PHP_EOL; ?>
|
?>hidden <?php
|
||||||
</div>
|
endif;
|
||||||
<div id="errormessage" role="alert" class="statusmessage<?php echo empty($ERROR) ? ' hidden' : '' ?> alert alert-danger">
|
?>alert alert-danger"><span class="glyphicon glyphicon-alert" aria-hidden="true"></span> <?php echo htmlspecialchars($ERROR); ?></div>
|
||||||
<span class="glyphicon glyphicon-alert" aria-hidden="true"></span>
|
<noscript><div id="noscript" role="alert" class="nonworking alert alert-<?php echo $isDark ? 'error' : 'warning'; ?>"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> <?php echo I18n::_('JavaScript is required for %s to work.<br />Sorry for the inconvenience.', I18n::_($NAME)); ?></div></noscript>
|
||||||
<?php echo htmlspecialchars($ERROR), PHP_EOL; ?>
|
<div id="oldienotice" role="alert" class="hidden nonworking alert alert-danger"><span class="glyphicon glyphicon-alert" aria-hidden="true"></span> <?php echo I18n::_('%s requires a modern browser to work.', I18n::_($NAME)); ?></div>
|
||||||
</div>
|
<div id="ienotice" role="alert" class="hidden alert alert-<?php echo $isDark ? 'error' : 'warning'; ?>"><span class="glyphicon glyphicon-question-sign" aria-hidden="true"></span> <?php echo I18n::_('Still using Internet Explorer? Do yourself a favor, switch to a modern browser:'), PHP_EOL; ?>
|
||||||
<noscript>
|
<a href="https://www.mozilla.org/firefox/">Firefox</a>,
|
||||||
<div id="noscript" role="alert" class="nonworking alert alert-<?php echo $isDark ? 'error' : 'warning'; ?>">
|
<a href="https://www.opera.com/">Opera</a>,
|
||||||
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
|
<a href="https://www.google.com/chrome">Chrome</a>,
|
||||||
<?php echo I18n::_('JavaScript is required for %s to work.<br />Sorry for the inconvenience.', I18n::_($NAME)), PHP_EOL; ?>
|
<a href="https://www.apple.com/safari">Safari</a>...
|
||||||
</div>
|
</div>
|
||||||
</noscript>
|
<div id="pasteresult" role="alert" class="hidden alert alert-success">
|
||||||
<div id="oldienotice" role="alert" class="hidden nonworking alert alert-danger">
|
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
|
||||||
<span class="glyphicon glyphicon-alert" aria-hidden="true"></span>
|
<div id="deletelink"></div>
|
||||||
<?php echo I18n::_('%s requires a modern browser to work.', I18n::_($NAME)), PHP_EOL; ?>
|
<div id="pastelink">
|
||||||
</div>
|
|
||||||
<div id="ienotice" role="alert" class="hidden alert alert-<?php echo $isDark ? 'error' : 'warning'; ?>">
|
|
||||||
<span class="glyphicon glyphicon-question-sign" aria-hidden="true"></span>
|
|
||||||
<?php echo I18n::_('Still using Internet Explorer? Do yourself a favor, switch to a modern browser:'), PHP_EOL; ?>
|
|
||||||
<a href="https://www.mozilla.org/firefox/">Firefox</a>,
|
|
||||||
<a href="https://www.opera.com/">Opera</a>,
|
|
||||||
<a href="https://www.google.com/chrome">Chrome</a>…
|
|
||||||
</div>
|
|
||||||
<div id="pastesuccess" role="alert" class="hidden alert alert-success">
|
|
||||||
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
|
|
||||||
<div id="deletelink"></div>
|
|
||||||
<div id="pastelink"></div>
|
|
||||||
<?php
|
<?php
|
||||||
if (strlen($URLSHORTENER)):
|
if (strlen($URLSHORTENER)):
|
||||||
?>
|
?>
|
||||||
@@ -479,57 +439,43 @@ if (strlen($URLSHORTENER)):
|
|||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
<ul id="editorTabs" class="nav nav-tabs hidden">
|
|
||||||
<li role="presentation" class="active"><a id="messageedit" href="#"><?php echo I18n::_('Editor'); ?></a></li>
|
|
||||||
<li role="presentation"><a id="messagepreview" href="#"><?php echo I18n::_('Preview'); ?></a></li>
|
|
||||||
</ul>
|
|
||||||
</section>
|
|
||||||
<section class="container">
|
|
||||||
<article class="row">
|
|
||||||
<div id="placeholder" class="col-md-12 hidden"><?php echo I18n::_('+++ no paste text +++'); ?></div>
|
|
||||||
<div id="attachmentPreview" class="col-md-12 text-center hidden"></div>
|
|
||||||
<div id="prettymessage" class="col-md-12 hidden">
|
|
||||||
<pre id="prettyprint" class="col-md-12 prettyprint linenums:1"></pre>
|
|
||||||
</div>
|
|
||||||
<div id="plaintext" class="col-md-12 hidden"></div>
|
|
||||||
<p class="col-md-12"><textarea id="message" name="message" cols="80" rows="25" class="form-control hidden"></textarea></p>
|
|
||||||
</article>
|
|
||||||
</section>
|
|
||||||
<section class="container">
|
|
||||||
<div id="discussion" class="hidden">
|
|
||||||
<h4><?php echo I18n::_('Discussion'); ?></h4>
|
|
||||||
<div id="commentcontainer"></div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<section class="container">
|
|
||||||
<div id="noscript" role="alert" class="nonworking alert alert-info noscript-hide">
|
|
||||||
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
|
|
||||||
<?php echo I18n::_('Loading…'); ?><br />
|
|
||||||
<span class="small"><?php echo I18n::_('In case this message never disappears please have a look at <a href="https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away">this FAQ for information to troubleshoot</a>.'); ?></span>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<footer class="container">
|
|
||||||
<div class="row">
|
|
||||||
<h4 class="col-md-5 col-xs-8"><?php echo I18n::_($NAME); ?> <small>- <?php echo I18n::_('Because ignorance is bliss'); ?></small></h4>
|
|
||||||
<p class="col-md-1 col-xs-4 text-center"><?php echo $VERSION; ?></p>
|
|
||||||
<p id="aboutbox" class="col-md-6 col-xs-12">
|
|
||||||
<?php echo I18n::_('%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href="https://privatebin.info/">project page</a>.', I18n::_($NAME)), PHP_EOL; ?>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
</main>
|
|
||||||
<?php
|
|
||||||
if ($DISCUSSION):
|
|
||||||
?>
|
|
||||||
<div id="serverdata" class="hidden" aria-hidden="true">
|
|
||||||
<div id="templates">
|
|
||||||
<article id="commenttemplate" class="comment"><div class="commentmeta"><span class="nickname">name</span><span class="commentdate">0000-00-00</span></div><div class="commentdata">c</div><button class="btn btn-default btn-sm"><?php echo I18n::_('Reply'); ?></button></article>
|
|
||||||
<p id="commenttailtemplate" class="comment"><button class="btn btn-default btn-sm"><?php echo I18n::_('Add comment'); ?></button></p>
|
|
||||||
<div id="replytemplate" class="reply hidden"><input type="text" id="nickname" class="form-control" title="<?php echo I18n::_('Optional nickname…'); ?>" placeholder="<?php echo I18n::_('Optional nickname…'); ?>" /><textarea id="replymessage" class="replymessage form-control" cols="80" rows="7"></textarea><br /><div id="replystatus" role="alert" class="statusmessage hidden alert"><span class="glyphicon" aria-hidden="true"></span> </div><button id="replybutton" class="btn btn-default btn-sm"><?php echo I18n::_('Post comment'); ?></button></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<ul id="preview" class="nav nav-tabs hidden">
|
||||||
<?php
|
<li role="presentation" class="active"><a id="messageedit" href="#"><?php echo I18n::_('Editor'); ?></a></li>
|
||||||
endif;
|
<li role="presentation"><a id="messagepreview" href="#"><?php echo I18n::_('Preview'); ?></a></li>
|
||||||
?>
|
</ul>
|
||||||
|
</header>
|
||||||
|
<section class="container">
|
||||||
|
<article class="row">
|
||||||
|
<div id="image" class="col-md-12 text-center hidden"></div>
|
||||||
|
<div id="prettymessage" class="col-md-12 hidden">
|
||||||
|
<pre id="prettyprint" class="col-md-12 prettyprint linenums:1"></pre>
|
||||||
|
</div>
|
||||||
|
<div id="cleartext" class="col-md-12 hidden"></div>
|
||||||
|
<p class="col-md-12"><textarea id="message" name="message" cols="80" rows="25" class="form-control hidden"></textarea></p>
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
<section class="container">
|
||||||
|
<div id="discussion" class="hidden">
|
||||||
|
<h4><?php echo I18n::_('Discussion'); ?></h4>
|
||||||
|
<div id="comments"></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="container">
|
||||||
|
<div id="noscript" role="alert" class="nonworking alert alert-info noscript-hide"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true">
|
||||||
|
<span> <?php echo I18n::_('Loading…'); ?></span><br>
|
||||||
|
<span class="small"><?php echo I18n::_('In case this message never disappears please have a look at <a href="https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away">this FAQ for information to troubleshoot</a>.'); ?></span>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<footer class="container">
|
||||||
|
<div class="row">
|
||||||
|
<h4 class="col-md-5 col-xs-8"><?php echo I18n::_($NAME); ?> <small>- <?php echo I18n::_('Because ignorance is bliss'); ?></small></h4>
|
||||||
|
<p class="col-md-1 col-xs-4 text-center"><?php echo $VERSION; ?></p>
|
||||||
|
<p id="aboutbox" class="col-md-6 col-xs-12">
|
||||||
|
<?php echo I18n::_('%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted <i>in the browser</i> using 256 bits AES. More information on the <a href="https://privatebin.info/">project page</a>.', I18n::_($NAME)), PHP_EOL; ?>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
<div id="cipherdata" class="hidden"><?php echo htmlspecialchars($CIPHERDATA, ENT_NOQUOTES); ?></div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
80
tpl/page.php
80
tpl/page.php
@@ -20,40 +20,34 @@ if ($SYNTAXHIGHLIGHTING):
|
|||||||
endif;
|
endif;
|
||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/jquery-3.3.1.js" integrity="sha512-+NqPlbbtM1QqiK8ZAo4Yrj2c4lNQoGv8P79DPtKzj++l5jnN39rHA/xsqn8zE9l0uSoxaCdrOgFs6yjyfbBxSg==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/jquery-3.1.1.js" integrity="sha512-U6K1YLIFUWcvuw5ucmMtT9HH4t0uz3M366qrF5y4vnyH6dgDzndlcGvH/Lz5k8NFh80SN95aJ5rqGZEdaQZ7ZQ==" crossorigin="anonymous"></script>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/sjcl-1.0.7.js" integrity="sha512-J2eNenPwyfXkMVNMFz9Q54kKfYi5AA3mQWpNgtjSJzsKHtpbhUt/7bvcjGwwmzE8ZUVWMI/ndagIX1lG+SfxGA==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/sjcl-1.0.6.js" integrity="sha512-DsyxLV/uBoQlRTJmW5Gb2SxXUXB+aYeZ6zk+NuXy8LuLyi8oGti9AGn6He5fUY2DtgQ2//RjfaZog8exFuunUQ==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
if ($QRCODE):
|
|
||||||
?>
|
|
||||||
<script async type="text/javascript" data-cfasync="false" src="js/kjua-0.1.2.js" integrity="sha512-hmvfOhcr4J8bjQ2GuNVzfSbuulv72wgQCJpgnXc2+cCHKqvYo8pK2nc0Q4Esem2973zo1radyIMTEkt+xJlhBA==" crossorigin="anonymous"></script>
|
|
||||||
<?php
|
|
||||||
endif;
|
|
||||||
if ($ZEROBINCOMPATIBILITY):
|
if ($ZEROBINCOMPATIBILITY):
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/base64-1.7.js" integrity="sha512-JdwsSP3GyHR+jaCkns9CL9NTt4JUJqm/BsODGmYhBcj5EAPKcHYh+OiMfyHbcDLECe17TL0hjXADFkusAqiYgA==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/base64-1.7.js" integrity="sha512-JdwsSP3GyHR+jaCkns9CL9NTt4JUJqm/BsODGmYhBcj5EAPKcHYh+OiMfyHbcDLECe17TL0hjXADFkusAqiYgA==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
else:
|
else:
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/base64-2.4.5.js" integrity="sha512-YINE6agO8ZrYuzlrZZwQJTu0uqURJDxD4gjsfZ6mV4fP2gW5j8giNJ734iyJVTBrnF2XMiUBM/DSi7ON1V5RMQ==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/base64-2.1.9.js" integrity="sha512-rbqAby7hObftbEoGQzkhUbEh5YkUn2MtekTLs4btvo2oly4CZ3DxhJzEh0u/rNzS54tcJdqi5Ug1ruugEd2U1g==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/rawdeflate-0.5.js" integrity="sha512-tTdZ7qMr7tt5VQy4iCHu6/aGB12eRwbUy+AEI5rXntfsjcRfBeeqJloMsBU9FrGk1bIYLiuND/FhU42LO1bi0g==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/rawdeflate-0.5.js" integrity="sha512-tTdZ7qMr7tt5VQy4iCHu6/aGB12eRwbUy+AEI5rXntfsjcRfBeeqJloMsBU9FrGk1bIYLiuND/FhU42LO1bi0g==" crossorigin="anonymous"></script>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/rawinflate-0.3.js" integrity="sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/rawinflate-0.3.js" integrity="sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
if ($SYNTAXHIGHLIGHTING):
|
if ($SYNTAXHIGHLIGHTING):
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/prettify.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/prettify.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-m8iHxoN+Fe12xxFwWNdY/TS4KoFntHp29qY0xUzBnPd0bkKMOR/dFhEdTWydpt0b/fIXyhB+znGYUvgjfJ2RzQ==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
if ($MARKDOWN):
|
if ($MARKDOWN):
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/showdown-1.8.6.js" integrity="sha512-YFg2sBCGT00I6X5KzgCLP4VqRlmPMRhkVvJS9oJKk5LxiUzzcjzV5m4fNf6mQMctLrhgS5LFKiFF3vzIuXbjAw==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/showdown-1.6.1.js" integrity="sha512-e6kAsBTgFnTBnEQXrq8BV6+XFwxb3kyWHeEPOl+KhxaWt3xImE2zAW2+yP3E2CQ7F9yoJl1poVU9qxkOEtVsTQ==" crossorigin="anonymous"></script>
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/purify-1.0.7.js" integrity="sha512-VnKJHLosO8z2ojNvWk9BEKYqnhZyWK9rM90FgZUUEp/PRnUqR5OLLKE0a3BkVmn7YgB7LXRrjHgFHQYKd6DAIA==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-vYYJYraxQNOf41XtehLBU2JbIQ2Uffe+n8TjHyWkpqoZdZX4aL5zyABrUNvRUP02+AxoRsmNJkpvIbmeQqcIXg==" crossorigin="anonymous"></script>
|
||||||
<script type="text/javascript" data-cfasync="false" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-5xT6WHyurvC0LFESbkycBMAjhsi0KL/Xhx2oU+d0bqiJPkWK6ZAZgZ7I02oQiXaLtFSLf7UqpBo5XEePlfhH7Q==" crossorigin="anonymous"></script>
|
|
||||||
<!--[if lt IE 10]>
|
<!--[if lt IE 10]>
|
||||||
<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
|
<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
@@ -85,27 +79,25 @@ endif;
|
|||||||
<div id="ienotice"><?php echo I18n::_('Still using Internet Explorer? Do yourself a favor, switch to a modern browser:'), PHP_EOL; ?>
|
<div id="ienotice"><?php echo I18n::_('Still using Internet Explorer? Do yourself a favor, switch to a modern browser:'), PHP_EOL; ?>
|
||||||
<a href="https://www.mozilla.org/firefox/">Firefox</a>,
|
<a href="https://www.mozilla.org/firefox/">Firefox</a>,
|
||||||
<a href="https://www.opera.com/">Opera</a>,
|
<a href="https://www.opera.com/">Opera</a>,
|
||||||
<a href="https://www.google.com/chrome">Chrome</a>…
|
<a href="https://www.google.com/chrome">Chrome</a>,
|
||||||
|
<a href="https://www.apple.com/safari">Safari</a>...
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<section>
|
<section>
|
||||||
<article>
|
<article>
|
||||||
<div id="loadingindicator" class="hidden"><?php echo I18n::_('Loading…'); ?></div>
|
|
||||||
<div id="status"><?php echo htmlspecialchars($STATUS); ?></div>
|
<div id="status"><?php echo htmlspecialchars($STATUS); ?></div>
|
||||||
<div id="errormessage" class="hidden"><?php echo htmlspecialchars($ERROR); ?></div>
|
<div id="errormessage" class="hidden"><?php echo htmlspecialchars($ERROR); ?></div>
|
||||||
<div id="toolbar">
|
<div id="toolbar">
|
||||||
<button id="newbutton" class="reloadlink hidden"><img src="img/icon_new.png" width="11" height="15" alt="" /><?php echo I18n::_('New'); ?></button>
|
<button id="newbutton" class="reloadlink hidden"><img src="img/icon_new.png" width="11" height="15" alt="" /><?php echo I18n::_('New'); ?></button>
|
||||||
<button id="retrybutton" class="reloadlink hidden"><?php echo I18n::_('Retry'), PHP_EOL; ?></button>
|
|
||||||
<button id="sendbutton" class="hidden"><img src="img/icon_send.png" width="18" height="15" alt="" /><?php echo I18n::_('Send'); ?></button>
|
<button id="sendbutton" class="hidden"><img src="img/icon_send.png" width="18" height="15" alt="" /><?php echo I18n::_('Send'); ?></button>
|
||||||
<button id="clonebutton" class="hidden"><img src="img/icon_clone.png" width="15" height="17" alt="" /><?php echo I18n::_('Clone'); ?></button>
|
|
||||||
<button id="rawtextbutton" class="hidden"><img src="img/icon_raw.png" width="15" height="15" alt="" /><?php echo I18n::_('Raw text'); ?></button>
|
|
||||||
<?php
|
<?php
|
||||||
if ($QRCODE):
|
if ($EXPIRECLONE):
|
||||||
?>
|
?>
|
||||||
<button id="qrcodelink" class="hidden"><img src="img/icon_qr.png" width="15" height="15" alt="" /><?php echo I18n::_('QR code'); ?></button>
|
<button id="clonebutton" class="hidden"><img src="img/icon_clone.png" width="15" height="17" alt="" /><?php echo I18n::_('Clone'); ?></button>
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
|
<button id="rawtextbutton" class="hidden"><img src="img/icon_raw.png" width="15" height="15" alt="" /><?php echo I18n::_('Raw text'); ?></button>
|
||||||
<div id="expiration" class="hidden button"><?php echo I18n::_('Expires'); ?>:
|
<div id="expiration" class="hidden button"><?php echo I18n::_('Expires'); ?>:
|
||||||
<select id="pasteExpiration" name="pasteExpiration">
|
<select id="pasteExpiration" name="pasteExpiration">
|
||||||
<?php
|
<?php
|
||||||
@@ -133,13 +125,17 @@ endif;
|
|||||||
<?php
|
<?php
|
||||||
if ($DISCUSSION):
|
if ($DISCUSSION):
|
||||||
?>
|
?>
|
||||||
<div id="opendiscussionoption" class="button hidden">
|
<div id="opendisc" class="button hidden">
|
||||||
<input type="checkbox" id="opendiscussion" name="opendiscussion"<?php
|
<input type="checkbox" id="opendiscussion" name="opendiscussion"<?php
|
||||||
if ($OPENDISCUSSION):
|
if ($OPENDISCUSSION):
|
||||||
?> checked="checked"<?php
|
?> checked="checked"<?php
|
||||||
endif;
|
endif;
|
||||||
?> />
|
?> />
|
||||||
<label for="opendiscussion"><?php echo I18n::_('Open discussion'); ?></label>
|
<label for="opendiscussion" <?php
|
||||||
|
if (!$OPENDISCUSSION):
|
||||||
|
?> style="color: #BBBBBB;"<?php
|
||||||
|
endif;
|
||||||
|
?>><?php echo I18n::_('Open discussion'); ?></label>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
@@ -188,22 +184,17 @@ if (strlen($LANGUAGESELECTION)):
|
|||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<div id="pasteresult" class="hidden">
|
||||||
if ($QRCODE):
|
|
||||||
?>
|
|
||||||
<div id="qrcode-display"></div>
|
|
||||||
<?php
|
|
||||||
endif;
|
|
||||||
?> <div id="pastesuccess" class="hidden">
|
|
||||||
<div id="deletelink"></div>
|
<div id="deletelink"></div>
|
||||||
<div id="pastelink"></div>
|
<div id="pastelink">
|
||||||
<?php
|
<?php
|
||||||
if (strlen($URLSHORTENER)):
|
if (strlen($URLSHORTENER)):
|
||||||
?>
|
?>
|
||||||
<button id="shortenbutton" data-shortener="<?php echo htmlspecialchars($URLSHORTENER); ?>"><img src="img/icon_shorten.png" width="13" height="15" /><?php echo I18n::_('Shorten URL'); ?></button>
|
<button id="shortenbutton" data-shortener="<?php echo htmlspecialchars($URLSHORTENER); ?>"><img src="img/icon_shorten.png" width="13" height="15" /><?php echo I18n::_('Shorten URL'); ?></button>
|
||||||
<?php
|
<?php
|
||||||
endif;
|
endif;
|
||||||
?>
|
?>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
if ($FILEUPLOAD):
|
if ($FILEUPLOAD):
|
||||||
@@ -212,7 +203,6 @@ if ($FILEUPLOAD):
|
|||||||
<div id="attach" class="hidden">
|
<div id="attach" class="hidden">
|
||||||
<span id="clonedfile" class="hidden"><?php echo I18n::_('Cloned file attached.'); ?></span>
|
<span id="clonedfile" class="hidden"><?php echo I18n::_('Cloned file attached.'); ?></span>
|
||||||
<span id="filewrap"><?php echo I18n::_('Attach a file'); ?>: <input type="file" id="file" name="file" /></span>
|
<span id="filewrap"><?php echo I18n::_('Attach a file'); ?>: <input type="file" id="file" name="file" /></span>
|
||||||
<span id="dragAndDropFileName" class="dragAndDropFile"><?php echo I18n::_('alternatively drag & drop a file or paste an image from the clipboard'); ?></span>
|
|
||||||
<button id="fileremovebutton"><?php echo I18n::_('Remove attachment'); ?></button>
|
<button id="fileremovebutton"><?php echo I18n::_('Remove attachment'); ?></button>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
@@ -222,34 +212,22 @@ endif;
|
|||||||
<button id="messageedit"><?php echo I18n::_('Editor'); ?></button>
|
<button id="messageedit"><?php echo I18n::_('Editor'); ?></button>
|
||||||
<button id="messagepreview"><?php echo I18n::_('Preview'); ?></button>
|
<button id="messagepreview"><?php echo I18n::_('Preview'); ?></button>
|
||||||
</div>
|
</div>
|
||||||
<div id="attachmentPreview" class="hidden"></div>
|
<div id="image" class="hidden"></div>
|
||||||
<div id="prettymessage" class="hidden">
|
<div id="prettymessage" class="hidden">
|
||||||
<pre id="prettyprint" class="prettyprint linenums:1"></pre>
|
<pre id="prettyprint" class="prettyprint linenums:1"></pre>
|
||||||
</div>
|
</div>
|
||||||
<div id="plaintext" class="hidden"></div>
|
<div id="cleartext" class="hidden"></div>
|
||||||
<textarea id="message" name="message" cols="80" rows="25" class="hidden"></textarea>
|
<textarea id="message" name="message" cols="80" rows="25" class="hidden"></textarea>
|
||||||
</article>
|
</article>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<div id="discussion" class="hidden">
|
<div id="discussion" class="hidden">
|
||||||
<h4 class="title"><?php echo I18n::_('Discussion'); ?></h4>
|
<h4 class="title"><?php echo I18n::_('Discussion'); ?></h4>
|
||||||
<div id="commentcontainer"></div>
|
<div id="comments"></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<?php
|
<div id="cipherdata" class="hidden"><?php echo htmlspecialchars($CIPHERDATA, ENT_NOQUOTES); ?></div>
|
||||||
if ($DISCUSSION):
|
<section class="container">
|
||||||
?>
|
|
||||||
<div id="serverdata" class="hidden" aria-hidden="true">
|
|
||||||
<div id="templates">
|
|
||||||
<article id="commenttemplate" class="comment"><div class="commentmeta"><span class="nickname">name</span><span class="commentdate">0000-00-00</span></div><div class="commentdata">c</div><button class="btn btn-default btn-sm"><?php echo I18n::_('Reply'); ?></button></article>
|
|
||||||
<div id="commenttailtemplate" class="comment"><button class="btn btn-default btn-sm"><?php echo I18n::_('Add comment'); ?></button></div>
|
|
||||||
<div id="replytemplate" class="reply hidden"><input type="text" id="nickname" class="form-control" title="<?php echo I18n::_('Optional nickname…'); ?>" placeholder="<?php echo I18n::_('Optional nickname…'); ?>" /><textarea id="replymessage" class="replymessage form-control" cols="80" rows="7"></textarea><br /><div id="replystatus" role="alert" class="statusmessage hidden alert"><span class="glyphicon" aria-hidden="true"></span> </div><button id="replybutton" class="btn btn-default btn-sm"><?php echo I18n::_('Post comment'); ?></button></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
endif;
|
|
||||||
?>
|
|
||||||
<section class="container">
|
|
||||||
<div id="noscript" role="alert" class="nonworking alert alert-info noscript-hide"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true">
|
<div id="noscript" role="alert" class="nonworking alert alert-info noscript-hide"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true">
|
||||||
<span> <?php echo I18n::_('Loading…'); ?></span><br>
|
<span> <?php echo I18n::_('Loading…'); ?></span><br>
|
||||||
<span class="small"><?php echo I18n::_('In case this message never disappears please have a look at <a href="https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away">this FAQ for information to troubleshoot</a>.'); ?></span>
|
<span class="small"><?php echo I18n::_('In case this message never disappears please have a look at <a href="https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away">this FAQ for information to troubleshoot</a>.'); ?></span>
|
||||||
|
|||||||
1
tst/.gitignore
vendored
Normal file
1
tst/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/ConfigurationCombinationsTest.php
|
||||||
2
tst/.htaccess
Normal file
2
tst/.htaccess
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Allow from none
|
||||||
|
Deny from all
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user