diff --git a/.codecov.yml b/.codecov.yml index 4592266d8..0c54747c9 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1,36 +1,14 @@ codecov: branch: develop - -comment: off + ci: + - drone.friendi.ca coverage: + precision: 2 + round: down + range: "70...100" status: - patch: - default: off - source: - target: 80% - flags: source - backend: - target: 80% - flags: backend - project: - default: off - source: - flags: source - backend: - flags: backend + project: off + patch: off -flags: - source: - paths: - - src/ - backend: - paths: - - mod/ - - include/ - binary: - paths: - - bin/ - tests: - paths: - - tests/ +comment: off diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 000000000..65211da2c --- /dev/null +++ b/.drone.yml @@ -0,0 +1,439 @@ +kind: pipeline +name: mysql8.0-php7.1 + +steps: +- name: mysql8.0-php7.1 + image: friendicaci/php7.1:php7.1.32 + commands: + - NOCOVERAGE=true ./autotest.sh mysql + environment: + MYSQL_USERNAME: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + MYSQL_HOST: mysql + +services: +- name: mysql + image: mysql:8.0 + command: [ "--default-authentication-plugin=mysql_native_password" ] + environment: + MYSQL_ROOT_PASSWORD: friendica + MYSQL_USER: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + volumes: + - name: cache + path: /var/lib/mysql + +volumes: +- name: cache + temp: {} + +trigger: + branch: + - master + - develop + - "*-rc" + event: + - pull_request + - push +--- +kind: pipeline +name: mysql8.0-php7.2 + +steps: +- name: mysql8.0-php7.2 + image: friendicaci/php7.2:php7.2.22 + commands: + - NOCOVERAGE=true ./autotest.sh mysql + environment: + MYSQL_USERNAME: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + MYSQL_HOST: mysql + +services: +- name: mysql + image: mysql:8.0 + command: [ "--default-authentication-plugin=mysql_native_password" ] + environment: + MYSQL_ROOT_PASSWORD: friendica + MYSQL_USER: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + volumes: + - name: cache + path: /var/lib/mysql + +volumes: + - name: cache + temp: {} + +trigger: + branch: + - master + - develop + - "*-rc" + event: + - pull_request + - push +--- +kind: pipeline +name: mysql8.0-php7.3 + +steps: +- name: mysql8.0-php7.3 + image: friendicaci/php7.3:php7.3.9 + commands: + - NOCOVERAGE=true ./autotest.sh mysql + environment: + MYSQL_USERNAME: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + MYSQL_HOST: mysql + +services: +- name: mysql + image: mysql:8.0 + command: [ "--default-authentication-plugin=mysql_native_password" ] + environment: + MYSQL_ROOT_PASSWORD: friendica + MYSQL_USER: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + volumes: + - name: cache + path: /var/lib/mysql + +volumes: + - name: cache + temp: {} + +trigger: + branch: + - master + - develop + - "*-rc" + event: + - pull_request + - push +--- +kind: pipeline +name: mariadb10.1-php7.1 + +steps: +- name: mariadb10.1-php7.1 + image: friendicaci/php7.1:php7.1.32 + commands: + - phpenmod xdebug + - sleep 20 + - ./autotest.sh mariadb + - wget https://codecov.io/bash -O codecov.sh + - sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 5ce7d64e-07b4-4adf-8700-e2eae27e14ec -f tests/autotest-clover.xml; fi" + - sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 5ce7d64e-07b4-4adf-8700-e2eae27e14ec -f tests/autotest-clover.xml; fi" + environment: + MYSQL_USER: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + MYSQL_HOST: mariadb + +services: +- name: mariadb + image: mariadb:10.1 + environment: + MYSQL_ROOT_PASSWORD: friendica + MYSQL_USER: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + volumes: + - name: cache + path: /var/lib/mysql + +volumes: + - name: cache + temp: {} + +trigger: + branch: + - master + - develop + - "*-rc" + event: + - pull_request + - push +--- +kind: pipeline +name: mariadb10.1-php7.2 + +steps: +- name: mariadb10.1-php7.2 + image: friendicaci/php7.2:php7.2.22 + commands: + - NOCOVERAGE=true ./autotest.sh mariadb + environment: + MYSQL_USER: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + MYSQL_HOST: mariadb + +services: +- name: mariadb + image: mariadb:10.1 + environment: + MYSQL_ROOT_PASSWORD: friendica + MYSQL_USER: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + volumes: + - name: cache + path: /var/lib/mysql + +volumes: + - name: cache + temp: {} + +trigger: + branch: + - master + - develop + - "*-rc" + event: + - pull_request + - push +--- +kind: pipeline +name: mariadb10.1-php7.3 + +steps: +- name: mariadb10.1-php7.3 + image: friendicaci/php7.3:php7.3.9 + commands: + - NOCOVERAGE=true ./autotest.sh mariadb + environment: + MYSQL_USER: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + MYSQL_HOST: mariadb + +services: +- name: mariadb + image: mariadb:10.1 + environment: + MYSQL_ROOT_PASSWORD: friendica + MYSQL_USER: friendica + MYSQL_PASSWORD: friendica + MYSQL_DATABASE: friendica + volumes: + - name: cache + path: /var/lib/mysql + +volumes: + - name: cache + temp: {} + +--- +kind: pipeline +name: redis-php7.1 + +steps: +- name: redis-php7.1 + image: friendicaci/php7.1:php7.1.32 + commands: + - phpenmod xdebug + - sleep 20 + - NOINSTALL=true TEST_SELECTION=REDIS ./autotest.sh mysql + - wget https://codecov.io/bash -O codecov.sh + - sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 5ce7d64e-07b4-4adf-8700-e2eae27e14ec -f tests/autotest-clover.xml; fi" + - sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 5ce7d64e-07b4-4adf-8700-e2eae27e14ec -f tests/autotest-clover.xml; fi" + environment: + REDIS_HOST: redis + +services: +- name: redis + image: redis + +trigger: + branch: + - master + - develop + - "*-rc" + event: + - pull_request + - push +--- +kind: pipeline +name: redis-php7.2 + +steps: +- name: redis-php7.2 + image: friendicaci/php7.2:php7.2.22 + commands: + - NOCOVERAGE=true NOINSTALL=true TEST_SELECTION=REDIS ./autotest.sh mysql + environment: + REDIS_HOST: redis + +services: +- name: redis + image: redis + +trigger: + branch: + - master + - develop + - "*-rc" + event: + - pull_request + - push +--- +kind: pipeline +name: redis-php7.3 + +steps: +- name: redis-php7.3 + image: friendicaci/php7.3:php7.3.9 + commands: + - NOCOVERAGE=true NOINSTALL=true TEST_SELECTION=REDIS ./autotest.sh mysql + environment: + REDIS_HOST: redis + +services: +- name: redis + image: redis + +--- +kind: pipeline +name: memcache-php7.1 + +steps: +- name: memcache-php7.1 + image: friendicaci/php7.1:php7.1.32 + commands: + - phpenmod xdebug + - sleep 20 + - NOINSTALL=true TEST_SELECTION=MEMCACHE ./autotest.sh mysql + - wget https://codecov.io/bash -O codecov.sh + - sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 5ce7d64e-07b4-4adf-8700-e2eae27e14ec -f tests/autotest-clover.xml; fi" + - sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 5ce7d64e-07b4-4adf-8700-e2eae27e14ec -f tests/autotest-clover.xml; fi" + environment: + MEMCACHE_HOST: memcached + +services: +- name: memcached + image: memcached + +trigger: + branch: + - master + - develop + - "*-rc" + event: + - pull_request + - push +--- +kind: pipeline +name: memcache-php7.2 + +steps: +- name: memcache-php7.2 + image: friendicaci/php7.2:php7.2.22 + commands: + - NOCOVERAGE=true NOINSTALL=true TEST_SELECTION=MEMCACHE ./autotest.sh mysql + environment: + MEMCACHE_HOST: memcached + +services: +- name: memcached + image: memcached + +trigger: + branch: + - master + - develop + - "*-rc" + event: + - pull_request + - push +--- +kind: pipeline +name: memcache-php7.3 + +steps: +- name: memcache-php7.3 + image: friendicaci/php7.3:php7.3.9 + commands: + - NOCOVERAGE=true NOINSTALL=true TEST_SELECTION=MEMCACHE ./autotest.sh mysql + environment: + MEMCACHE_HOST: memcached + +services: +- name: memcached + image: memcached + +--- +kind: pipeline +name: memcached-php7.1 + +steps: +- name: memcached-php7.1 + image: friendicaci/php7.1:php7.1.32 + commands: + - phpenmod xdebug + - sleep 20 + - NOINSTALL=true TEST_SELECTION=MEMCACHED ./autotest.sh mysql + - wget https://codecov.io/bash -O codecov.sh + - sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 5ce7d64e-07b4-4adf-8700-e2eae27e14ec -f tests/autotest-clover.xml; fi" + - sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 5ce7d64e-07b4-4adf-8700-e2eae27e14ec -f tests/autotest-clover.xml; fi" + environment: + MEMCACHED_HOST: memcached + +services: +- name: memcached + image: memcached + +trigger: + branch: + - master + - develop + - "*-rc" + event: + - pull_request + - push +--- +kind: pipeline +name: memcached-php7.2 + +steps: +- name: memcached-php7.2 + image: friendicaci/php7.2:php7.2.22 + commands: + - NOCOVERAGE=true NOINSTALL=true TEST_SELECTION=MEMCACHED ./autotest.sh mysql + environment: + MEMCACHED_HOST: memcached + +services: +- name: memcached + image: memcached + +trigger: + branch: + - master + - develop + - "*-rc" + event: + - pull_request + - push +--- +kind: pipeline +name: memcached-php7.3 + +steps: +- name: memcached-php7.3 + image: friendicaci/php7.3:php7.3.9 + commands: + - NOCOVERAGE=true NOINSTALL=true TEST_SELECTION=MEMCACHED ./autotest.sh mysql + environment: + MEMCACHED_HOST: memcached + +services: +- name: memcached + image: memcached diff --git a/.gitignore b/.gitignore index db1c3c130..e70f651f5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,16 +1,17 @@ favicon.* -.htconfig.php -.htpreconfig.php +/.htconfig.php +/.htpreconfig.php \#* *.log *.out *.version* home.html - *~ robots.txt #ignore local config +/config/local.config.php +/config/addon.config.php /config/local.ini.php /config/addon.ini.php @@ -69,3 +70,9 @@ venv/ #ignore .htaccess .htaccess + +#ignore filesystem storage default path +/storage + +#Ignore log folder +/log diff --git a/.travis.yml b/.travis.yml index bb8b11311..376748bcb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,10 @@ --- language: php -## Friendica supports PHP version >= 5.6.1 +## Friendica officially supports PHP version >= 7.1 php: - - 5.6 - - 7.0 - 7.1 - 7.2 + - 7.3 services: - mysql @@ -17,9 +16,14 @@ env: install: - composer install before_script: - - cp config/local-sample.ini.php config/local.ini.php + - cp config/local-sample.config.php config/local.config.php - mysql -e 'CREATE DATABASE IF NOT EXISTS test;' - mysql -utravis test < database.sql - - echo "extension=redis.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - - echo "extension=memcached.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini -after_success: bash <(curl -s https://codecov.io/bash) + - pecl channel-update pecl.php.net + - pecl config-set preferred_state beta + - if [[ $TRAVIS_PHP_VERSION != "7.1" ]]; then echo yes | pecl upgrade apcu; fi + - if [[ $TRAVIS_PHP_VERSION != "7.1" ]]; then phpenv config-add .travis/apcu.ini; fi + - phpenv config-add .travis/redis.ini + - phpenv config-add .travis/memcached.ini + +script: vendor/bin/phpunit --configuration tests/phpunit.xml diff --git a/.travis/apcu.ini b/.travis/apcu.ini new file mode 100644 index 000000000..92598662c --- /dev/null +++ b/.travis/apcu.ini @@ -0,0 +1,4 @@ +extension="apcu.so" + +apc.enabled = 1 +apc.enable_cli = 1 \ No newline at end of file diff --git a/.travis/memcached.ini b/.travis/memcached.ini new file mode 100644 index 000000000..c9a2ff0c9 --- /dev/null +++ b/.travis/memcached.ini @@ -0,0 +1 @@ +extension="memcached.so" \ No newline at end of file diff --git a/.travis/redis.ini b/.travis/redis.ini new file mode 100644 index 000000000..ab995b837 --- /dev/null +++ b/.travis/redis.ini @@ -0,0 +1 @@ +extension="redis.so" \ No newline at end of file diff --git a/.tx/config b/.tx/config index b42998b86..d639642de 100644 --- a/.tx/config +++ b/.tx/config @@ -3,7 +3,7 @@ host = https://www.transifex.com [friendica.messagespo] file_filter = view/lang//messages.po -source_file = util/messages.po +source_file = view/lang/C/messages.po source_lang = en type = PO diff --git a/CHANGELOG b/CHANGELOG index 2f675fb6d..9f253c810 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,352 @@ +Version 2019.12-dev (unreleased) + Friendica Core: + Enhanced the manage functionality [annando] + Fixed some problems with the remote auth functionality [annando] + Added router configuration file [nupplaphil] + Added drone.io as CI service [nupplaphil] + + Friendica Addons: + mailstream: + Support for new img format was added [mexon] + BB Code is now included as plaintext [mexon] + Logging format is enhanced [mexon] + ActivityPub "announce" notifications are not included [mexon] + + Closed Issues: + 1071, 7548, 7657, 7681 + +Version 2019.09 (2019-09-29) + Friendica Core: + Update to the translations (CS, DE, EN GB, EN US, FR, JA, NL, PL) [translation teams] + Update to the themes (frio, vier) [JeroenED, MrPetovan, tobiasd, vinzv] + Update to the documentation [annando, tobiasd, guzzisti, vinzv] + Enhanced the log output of the background process [annando] + Enhanced the vcard translation in the profile [JeroenED] + Enhanced the delivery count [annando] + Enhanced ActivityPub envelopes [MrPetovan] + Enhanced communication about deleted accounts via AP [annando] + Enhanced the following process [annando] + Enhanced the tests [nupplaphil] + Enhanced the front-end worker [annando] + Enhanced the img format to allow alternative texts [annando] + Enhanced the detection of supported protocols for contacts [annando] + Enhanced the re-share of items [annando] + Enhanced 2FA process [MrPetovan] + Enhanced server wide theme settings [MrPetovan] + Enhanced config loading process [MrPetovan, nupplaphil] + Enhanced handling of emoticons [MrPetovan] + Enhanced performance [annando] + Fixed a bug in the admin panel leading to orphaned options [tobiasd] + Fixed a problem that could lead to duplicated Pleroma contacts [annando] + Fixed a problem with the hide profile setting [annando] + Fixed the problem sending out the post when hitting the enter key in the ACL dialog [MrPetovan] + Fixed a bug in HTML special character escaping of event titles [MrPetovan] + Fixed a bug in HTML special character conversion in item titles [MrPetovan] + Fixed a bug in the auto linker for URLs [MrPetovan] + Fixed a bug that prevented the display of images in some postings from diaspora* [MrPetovan] + Fixed a bug in setting the permissions on uploaded images [annando] + Fixed a bug that lead to potentially unwanted importing threads started by contacts of contacts [annando] + Fixed implicit self mentions [MrPetovan] + Fixed display of register links on closed nodes landing pages [MrPetovan] + Fixed the display of [spoiler] tags [MrPetovan] + Fixed an issue with photo permissions in private mails [annando] + Fixed a bug in the process of following Pleroma accounts [annando] + Fixed a bug that caused notifications about locally deleted items [annando] + Fixed the link to the source of an event [MrPetovan] + Fixed a problem that caused authors from twitter postings having no profile pic [annando] + Fixed a bug in BBCode -> Markdown conversation for font size [annando] + Fixed a BBCode parser problem with the audio tag [MrPetovan] + Fixed a session problem [annando] + Fixed a problem with the auto-installer [nupplaphil] + Fixed a bug with magic links redirection for non profiles [annando] + General code cleaning [annando, MrPetovan, nupplaphil] + Removed contacts auto completion (in /contacts [MrPetovan] + Replaced FontAwesome by ForkAwesome in frio theme [vinzv] + Added new compose page for the frio theme [MrPetovan] + Added new console command: lock [nupplaphil] + Added new additional feature to show trending tags on community page [MrPetovan] + Added support of image descriptions [annando] + Added support of wildcards to server block lists [MrPetovan] + Added app specific passwords when using 2FA [MrPetovan] + Added fetching of postings via URL to interact with public postings [annando] + Added opt-out flag for federated search engines and associated header information for profiles [annando] + + Friendica Addons: + Update to the translation (CS, DE, EN GB, EN US, ES, FR, JA, NL SV) [translation teams] + General code cleanup [nupplaphil, Quix0r] + blockbot: + Added translations + Added more bots [annando] + Added admin panel settings [annando] + tumblr: + Changed used URLs to https adopting tumblrs change [annando] + twitter: + Enhanced handling of multi image postings [annando] + Enhanced display of quoted tweets [MrPetovan] + Added alternative text support for images [annando] + + Closed Issues: + 870, 1605, 2199, 3239, 3816, 4117, 4815, 5721, 6384, 6521, 6553, + 6675, 7212, 7235, 7285, 7293, 7314, 7317, 7337, 7338, 7346, 7350, + 7367, 7383, 7396, 7397, 7401, 7406, 7408, 7426, 7428, 7456, 7442, + 7457, 7468, 7471, 7473, 7488, 7497, 7498, 7501, 7507, 7521, 7526, + 7527, 7536, 7542, 7545, 7576, 7586, 7594, 7597, 7603, 7610, 7618, + 7629, 7635, 7638, 7663, 7665, 7672 + +Version 2019.06 (2019-06-23) + Friendica Core: + Update to the tranlation (CS, DE, EN-GB, EN-US, ET, FR, IT, PL, PT-BR, SV) [translation teams] + Update to the documentation [nupplaphil, realkinetix, MrPetovan] + Update to the themes (frio, vier) [BinkaDroid, MrPetovan, tobiasd] + Enhancements to the API [annando, MrPetovan] + Enhancements to the way reshares are handled [annando] + Enhancements to the redis configuration [nupplaphil] + Enhancements to the federation stats display in the admin panel [tobiasd] + Enhancements to the processing of changed storage engine [MrPetovan] + Enhancements to ActivityPub support [annando, MrPetovan] + Enhancements to code security [MrPetovan] + Enhancements to delivery counter [annando] + Fixed the notification order [JeroenED] + Fixed the timezone of Friendica logs [nupplaphil] + Fixed tag completion painfully slow [AlfredSK] + Fixed a regression in notifications [MrPetovan, annando] + Fixed an issue with smilies and code blocks [MrPetovan] + Fixed an AP issue with unavailable local profiles [MrPetovan] + Fixed an issue with the File to Folder feature [MrPetovan] + Fixed an issue with the legacy storage engine [fabrixxm] + Fixed an issue with the theme and addon path items [MrPetovan] + Fixed an issue occuring when the BasePath was not set [tobiasd] + Fixed an issue with additionally opened Sessions [MrPetovan] + Fixed an issue with legacy loglevel mapping [nupplaphil] + Fixed contact suggestions [annando] + Fixed an issue with frio hovercard [nupplaphil] + Fixed event interaction federation [annando] + Fixed remote image permission [deantownsley] + General Code cleaning and restructuring [annando, nupplaphil, tobiasd] + Added frio color scheme sharing [JeroenED] + Added syslog and stream Logger [nupplaphil] + Added storage move cronjob [MrPetovan] + Added collapsible panel for connector permission fields [MrPetovan] + Added rule-based router [MrPetovan] + Added Estonian translation [Rain Hawk] + Added APCu caching [nupplaphil] + Added BlockServer command to the Friendica console [nupplaphil] + Added reshare count [annando] + Added rule-based router [MrPetovan, nupplaphil] + Added themed error pages with mascot [MrPetovan, lostinlight] + Added contact relationship filter [MrPetovan] + Added native reshares and reshare count [annando] + Removed the old queue mechanism (deferred workers are now used) [annando] + Removed BasePath and Hostname settings from the admin panel [nupplaphil] + Remove support for defunct F-Droid Friendica app [MrPetovan] + + Friendica Addons: + Update to the tranlation (ET, SV, ZH_CN) [translation teams] + botdetection: + Added a new addon for preventing access by bots [nupplaphil, annando] + buffer: + Traces of Google+ were removed [annando] + curweather: + Fixed a problem with the display of the correct temperature unit [tobiasd] + fromgplus: + Deprecated the addon as Google+ was closed [tobiasd] + fortunate: + Deprecated addon for incompatibility with latest Friendica version [MrPetovan] + phpmailer: + Added a new addon to use external SMTP for email [M-arcus, kecalcze, MrPetovan] + pledgie: + Deprecated addon as service was discontinued [M-arcus] + xmpp: + Marked addon as unsupported because of various incompatibilities with themes [MrPetovan] + + Closed Issues: + 838, 1012, 2209, 2528, 3309, 3717, 3816, 3869, 4453, 4999, 5011, + 5047, 5276, 5850, 5983, 6245, 6303, 6319, 6379, 6410, 6477, 6478, + 6720, 6799, 6813, 6819, 6861, 6864, 6879, 6903, 6916, 6917, 6918, + 6921, 6927, 6929, 6936, 6938, 6941, 6943, 6947, 6948, 6950, 6952, + 6983, 6999, 7012, 7020, 7023, 7031, 7036, 7047, 7106, 7110, 7112, + 7119, 7128, 7130, 7131, 7141, 7142, 7150, 7171, 7183, 7196, 7209, + 7223, 7226, 7240, 7241, 7249, 7264, 7269, 7271, 7275, 7300, 7303 + +Version 2019.04 (2019-04-28) + Friendica Core: + Fixed a privacy problem with postings accessed by feed [MrPetovan] + +Version 2019.03 (2019-03-22) + Friendica Core: + Update to the translation (CS, DE, EN-GB, EN-US, ES, FR, IT, PL, SV, ZH-CN) [translation teams] + Update to the documentation [Aditoo17, JeroenED, m4sk1n, softmetz, tobiasd] + Update to the themes (duepuntozero, frio, smoothy, quattro, vier) [lxiter, MrPetovan, nupplaphil, rabuzarus, tobiasd] + Enhancements to the API [jasonscheng] + Enhancements to the Vagrant development VM [JeroenED] + Enhancements to the storage of gender, sexual preferences and maritial status [JeroenED] + Enhancements to the wording of notifications [MrPetovan] + Enhancements to the display of contacts in the profile [MrPetovan] + Enhancements to the handling of local links [lxiter] + Enhancements to the explicit and implicit mentioning in conversations [annando, MrPetovan] + Enhancements to the warnings in the admin panel [tobiasd] + Enhancements to the AP implementation [annando] + Enhancements to the worker process [annando] + Enhancements to the testing process [MrPetovan, nupplaphil] + Enhancements to the LibreJS compatibility [tobiasd] + Enhancements to the federated display of postings [MrPetovan] + Enhancements to the photo menu [annando] + Enhancements to the probing of contacts [annando] + Fixed several bugs with weird tagging in code blocks [lxiter] + Fixed a bug during contact entries update [rabuzarus] + Fixed several PHP warnings and errors [annando, MrPetovan, tobiasd] + Fixed an issue when Friendica is installed in a subdirectory [rabuzarus] + Fixed several issues in the handling of the Markdown parsing from and to d* [lxiter, MrPetovan] + Fixed a bug that prevented blocked contacts from being removed from groups [MrPetovan] + Fixed a bug in the ACL with preselected items [lxiter] + Fixed an issue with polling Events via AP [annando] + Fixed a memory issue with the JSON-LD parser [annando] + Fixed an issue with the forced DB structure update [nupplaphil] + Fixed an issue with wrongly encoded HTML entities in URLs [annando] + Fixed an issue with the rotation of images in the gallery [nupplaphil] + Fixed issues with redirs in the photo menu of Friendica contacts [tobiasd] + Fixed an issue with sending out notification mails to the admin [nupplaphil] + Fixed an the issue, that the API was ignoring the globalsilence setting [nupplaphil] + Fixed issues with the autolinker of URLs in postings [MrPetovan] + Fixed an issue resulting in multible emails after successful updates of the database [nupplaphil] + Fixed a timeout issue during detection process of the remote profile [annando] + Fixed an issue with postings from blocked servers [annando, MrPetovan] + Fixed an issue with the paging of stored folders [MrPetovan] + Fixed an issue with notifications about interactions with Friendica contacts [annando] + Fixed an issue that caused double postings of images uploaded to the gallery [annando] + Fixed an issue handling legacy config files [nupplaphil] + Fixed an issue that caused notifications about interaction with a locally deleted posting [annando] + If the node does not want to publish information, nodeinfo now returns 404 instead of non-existing entries [nupplaphil] + General Code cleaning and restructuring [annando, JeroenED, MrPetovan, nupplaphil] + Switched logging engine to monolog [nupplaphil] + Added plugable storage backend [fabrixxm, nupplaphil] + Added item delivery indicator to posting header [MrPetovan] + Added URL parameter to force a specific language [JeroenED] + Added live preview of attachments to frio [rabuzarus] + Added a "friendica_author" field to the API results which holds the real author [annando] + Added support for AP with forum postings [annando] + Added a summary of articles send over AP [annando] + + Friendica Addons: + Updates to the translations (CS, DE, EN-GB, ES, FR, NL, PL, SV) [translation teams] + Updated documentation [softmetz, tobiasd] + blackout: + Fix applying the translations [JeroenED, tobiasd] + Fixed some templating of the settings [tobiasd] + blogger: + The addon was marked as unsupported as it does currently not work (needs OAuth support) [annando] + cookienotice: + Added new addon to display a cookie usage notice in the browser [lxiter] + forumdirectory: + Fixed a theming issue with frio [rabuzarus] + js_upload: + Fixed a missing extionsion index [nupplaphil] + mailstream: + Fixed a curl issue [MrPetovan] + piwik: + Make it clear that Piwik is now Matomo but the addon supports both [tobiasd] + securemail: + updated the addon dependencies [MrPetovan] + twitter: + @ mentions are now stripped from the posts send to Twitter [MrPetovan] + + Closed Issues: + 1777, 2487, 3218, 3506, 3837, 4496, 5884, 6087, 6161, 6167, 6205, + 6232, 6263, 6274, 6292, 6337, 6338, 6375, 6378, 6382, 6384, 6386, + 6403, 6405, 6449, 6468, 6472, 6489, 6491, 6492, 6495, 6498, 6501, + 6503, 6505, 6511, 6514, 6521, 6522, 6529, 6532, 6533, 6544, 6545, + 6551, 6553, 6537, 6558, 6552, 6561, 6570, 6575, 6585, 6603, 6610, + 6629, 6630, 6633, 6635, 6652, 6656, 6658, 6667, 6668, 6669, 6672, + 6674, 6676, 6677, 6679, 6691, 6710, 6711, 6714, 6716, 6733, 6758, + 6772, 6778, 6785, 6788, 6800, 6805, 6812, 6819, 6822, 6823, 6840, + 6855, 6866, 6874, 6891, 6901, 6913 + +Version 2019.01 (2019-01-21) + Friendica Core: + Update to the translation (CS, DE, EN-UK, EN-US, FR, NB-NO, NL, PL) [translation teams] + Update to the documentation [AndyHee, FiXato, hoergen, JeroenED, MrPetovan, rebeka-catalina, tobiasd, wouter705] + Enhancements to the themes (frio, vier) [annando, JonnyTischbein, MrPetovan, rabuzarus] + Enhancements to the usage of MagicLinks [annando, rabuzarus] + Enhancements to the escaping of user submitted content [annando, MrPetovan, tobiasd] + Enhancements to the installation wizard [annando, JonnyTischbein, vinzv] + Enhancements to the OWA compatibility with Hubzilla [annando] + Enhancements to Friendica on the iOS Home Screen [MrPetovan] + Enhancements to the Welcome email after registration [MrPetovan] + Enhancements to the API [annando] + Enhancements to the methods to find potentially interesting contacts [MrPetovan] + Enhancements to the remote detection of already existing relationships [MrPetovan] + Enhancements to the handling of large posts [annando] + Enhancements to the user removal process [annando, MrPetovan] + Enhancements to the generation of HTTP error messages [annando] + Enhancements to the admin panel [AndyHee, annando] + Enhancements to the display of birthday reminders [MrPetovan] + Enhancements to the display of the group filter [annando] + Enhancements to the Worker [annando] + Enhancements to the exported Atom feeds [Alkarex] + Enhancements to the Vagrant VM [fabrixxm, tobiasd] + Enhancements to the tests [nupplaphil] + Enhancements to the node info [annando] + Enhancements to the DBclean process [annando] + Enhancements to the PasswordExposedChecker [MrPetovan] + Enhancements to the BBCode handling [MrPetovan] + Enhancements to the diaspora* protocol implementation [annando] + Enhancements to the automatic installation [nupplaphil] + Fixed various PHP notice occurrences [annando, MrPetovan] + Fixed the display of private postings in contact overview [annando] + Fixed a problem with the display of forums in the widget [annando] + Fixed a bug in the email support [MrPetovan] + Fixed a bug in the endless scroll of the network stream [MrPetovan] + Fixed a style problem with iOS mobile browser [MrPetovan] + Fixed a bug handling links to Hubzilla forums [MrPetovan] + Fixed a bug in the character set detection [MrPetovan] + Fixed a bug with the display of private notes [annando] + Fixed a bug in setting the photo permissions [JonnyTischbein] + Fixed a bug that caused some photo albums having no permissions [JonnyTischbein] + Fixed a problem adding multiple hashtags [JonnyTischbein] + Fixed a bug when subscribing to OStatus accounts [MrPetovan] + Fixed a bug in SQL grammar [Alkarex] + Fixed a bug with WebSub [Alkarex] + Fixed a bug in the generated node info JSON [fabrixxm] + Fixed a bug displaying videos when using the frio theme [JeroenED] + Moved config format to PHP arrays [MrPetovan] + Moved several additional features back to the default features [annando] + Started to deprecate the Google+ support [annando] + Added support of ActivityPub (tested with Hubzilla, Mastodon, Nextcloud Social, Osada, PeerTube, Pixelfed, Pleroma) [annando] + Added support for custom emojis [annando, MrPetovan] + The util folder was removed and the content restructured elsewhere [MrPetovan] + Removed the old /p endpoint from diaspora* compatibility [annando] + + Friendica Addons: + Updating the translations (DE, FR) [translation teams] + twitter: + use original URL for link display [MrPetovan] + enhancements to shares [MrPetovan] + leistungsschutzrecht: + show preview pictures of videos [annando] + optionally suppress pictures [annando] + wordpress: + posting should work again [annando] + forumdirectory: + paging enhancements [MrPetovan] + mathjax: + addon rewritten [MrPetovan] + highlightjs: + added addon to highlight source code [MrPetovan] + + Closed Issues: + 1430, 1495, 1572, 1575, 1580, 1581, 2123, 2893, 3016, 3466, 3777, + 3870, 3897, 4242, 4584, 4592, 4609, 4688, 4708, 4715, 4738, 4804, + 5264, 5368, 5547, 5596, 5627, 5716, 5723, 5737, 5757, 5771, 5779, + 5797, 5798, 5811, 5809, 5814, 5820, 5834, 5847, 5801, 5805, 5857, + 5858, 5859, 5863, 5875, 5879, 5886, 5890, 5893, 5896, 5908, 5911, + 5915, 5913, 5924, 5932, 5934, 5943, 5955, 5956, 5960, 5966, 5968, + 5971, 5975, 5992, 5994, 5996, 6006, 6010, 6015, 6027, 6032, 6036, + 6038, 6047, 6081, 6100, 6109, 6119, 6124, 6125, 6128, 6140, 6149, + 6157, 6173, 6202, 6211, 6212, 6213, 6236, 6243, 6255, 6257, 6259, + 6268, 6282, 6283, 6208, 6289, 6294, 6308, 6309, 6313, 6316, 6323, + 6329, 6334, 6344, 6347, 6343, 6349, 6350, 6355, 6358, 6360, 6361, + 6363, 6368, 6370, 6391, 6394, 6424, 6425, 6439, 6459 + Version 2018.09 (2018-09-23) Friendica Core: Update to the translation (CS, DE, EN-US, FI, IT, NL, PL, ZH-CN) [translation teams] diff --git a/util/credits.txt b/CREDITS.txt similarity index 87% rename from util/credits.txt rename to CREDITS.txt index ff430c927..460ba4a95 100644 --- a/util/credits.txt +++ b/CREDITS.txt @@ -1,11 +1,13 @@ + + 23n Abinoam P. Marques Jr. +Abraham Pérez Hernández Abrax Adam Clark Adam Jurkiewicz Adam Magness Aditoo -Aditoo17 AgnesElisa Albert Alberto Díaz Tormo @@ -21,12 +23,13 @@ Andreas Neustifter Andrej Stieben André Alves André Lohan -Andy H3 +Andy Andy Hee -AndyHee Angristan Anthronaut +Antron Samurai Arian - Cazare Muncitori +Asher Pen Athalbert aweiher axelt @@ -38,6 +41,8 @@ Beluga Ben Ben Roberts ben-utzer +BinkaDroid +Bjoessi bufalo1973 Calango Jr Carlos Solís @@ -49,6 +54,7 @@ Christian M. Grube Christian Vogeley Cohan Robinson Copiis Praeesse +CrystalStiletto Cyboulette Cyryl Sochacki czarnystokrotek @@ -78,6 +84,7 @@ Fabian Dost Fabio Comuni felixgilles Filip Bugaj +Filip H.F. "FiXato" Slagter FlxAlbroscheit foss Francesco Apruzzese @@ -89,13 +96,13 @@ Gert Cauwenberg GLComo greeneyedred Gregory Smith +guzzisti Haakon Meland Eriksen Hans Meine -hauke Hauke Hauke Altmann -Hauke Zühl Herbert Thielen +hlad hoergen Hubert Kościański Hypolite Petovan @@ -108,9 +115,11 @@ Jens Tautenhahn jensp Jeroen De Meerleer jeroenpraat +JOduMonT Johannes Schwab John Brazil Jonatan Nyberg +Jonny Tischbein Josef Moravek juanman julia.domagalska @@ -131,7 +140,9 @@ Magdalena Gazda Mai Anh Nguyen Manuel Pérez Monís Marcin Klessa +Marcin Mikołajczak Marcus Müller +Marie Olive Mariusz Pisz marmor Marquis_de_Carabas @@ -157,12 +168,15 @@ Oliver Olivier Olivier Mehani Olivier Migeot +Ozero Dien Paolo Wave Pascal Pascal Deklerck Pavel Morozov PerigGouanvic +Peter Liebetrau peturisfeld +Phigger Phigger Philipp Philipp Holzer Pierre Rudloff @@ -172,16 +186,20 @@ R C Rabuzarus Radek Rafael Garau +Rain Hawk Rainulf Pineda +Ralf Thees Ralph Ratten rcmaniac rebeka-catalina repat Ricardo Pereira +Rik 4 RJ Madsen Roland Häder Rui Andrada +rwa RyDroid S.Krumbholz Sakałoŭ Alaksiej @@ -195,6 +213,7 @@ Seth Silke Meyer Simon L'nu Simó Albert i Beltran +softmetz soko1 St John Karp Stanislav N. @@ -202,6 +221,7 @@ Steffen K9 StefOfficiel Sveinn í Felli Sven Anders +Sylke Vicious Sylvain Lagacé szymon.filip Sérgio Lima @@ -212,6 +232,8 @@ Thecross Thomas Thomas Willingham thorsten23 +Tim Stahel +TiMESPLiNTER Tino Tobias Diekershoff Tobias Hößl @@ -219,6 +241,7 @@ tomacat tomamplius tomtom84 Tony Baldwin +Torbjörn Andersson TORminator trebor tschlotfeldt @@ -226,13 +249,20 @@ Tubuntu Tupambae.org U-SOUND\mike ufic +Ulf Rompe Unknown +Valvin +Valvin A Vasudev Kamath Vasya Novikov +Vinzenz Vietzke vislav +vladimir N +Vladimir Núñez VVelox Vít Šesták 'v6ak' Waldemar Stoczkowski +Wouter Broers Yasen Pramatarov ylms Zach Prezkuta @@ -243,4 +273,4 @@ zottel Zvi ben Yaakov (a.k.a rdc) Михаил Олексій Замковий -朱陈锬 \ No newline at end of file +朱陈锬 diff --git a/util/Doxyfile b/Doxyfile similarity index 62% rename from util/Doxyfile rename to Doxyfile index aef230792..a1676eba7 100644 --- a/util/Doxyfile +++ b/Doxyfile @@ -1,9 +1,9 @@ -INPUT = README.md index.php boot.php testargs.php update.php mod/ object/ include/ js/ util/ view/ src/ version.inc +INPUT = README.md index.php boot.php update.php bin/ mod/ include/ view/ src/ VERSION RECURSIVE = YES PROJECT_NAME = "Friendica" PROJECT_LOGO = images/friendica-64.jpg -EXCLUDE = .htconfig.php config/ library/ doc/ .git/ log/ util/zotsh/easywebdav/ addon/ report/ privacy_image_cache/ photo/ proxy/ local/ -EXCLUDE_PATTERNS = *smarty3* *strings.php*.log *.out *test* +EXCLUDE = .htconfig.php config/ library/ doc/ .git/ log/ addon/ report/ privacy_image_cache/ photo/ proxy/ local/ +EXCLUDE_PATTERNS = *smarty3* strings.php *.log *.out *test* OUTPUT_DIRECTORY = doc GENERATE_HTML = YES HTML_OUTPUT = html/ @@ -15,7 +15,6 @@ GENERATE_TODOLIST = YES USE_MDFILE_AS_MAINPAGE = README.md REFERENCED_BY_RELATION = YES GENERATE_TREEVIEW = YES -HTML_FOOTER = util/Doxygen.footer ALIASES += "license=@par License:\n" ALIASES += "fixme=\xrefitem fixme \"Fixme\" \"Fixme List\"" ALIASES += "FIXME=\fixme" diff --git a/INSTALL.txt b/INSTALL.txt deleted file mode 100644 index 2f0613fb7..000000000 --- a/INSTALL.txt +++ /dev/null @@ -1,364 +0,0 @@ - -Friendica Installation - -We've tried very hard to ensure that Friendica will run on commodity hosting -platforms - such as those used to host Wordpress blogs and Drupal websites. -But be aware that Friendica is more than a simple web application. It is a -complex communications system which more closely resembles an email server -than a web server. For reliability and performance, messages are delivered in -the background and are queued for later delivery when sites are down. This -kind of functionality requires a bit more of the host system than the typical -blog. Not every PHP/MySQL hosting provider will be able to support Friendica. -Many will. But please review the requirements and confirm these with your -hosting provider prior to installation. - -Before you begin: Choose a domain name or subdomain name for your server. -Put some thought into this - because changing it is currently not-supported. -Things will break, and some of your friends may have difficulty communicating -with you. We plan to address this limitation in a future release. Also decide -if you wish to connect with members of the Diaspora network, as this will -impact the installation requirements. - -Decide if you will use SSL and obtain an SSL cert. Communications with the -Diaspora network MAY require both SSL AND an SSL cert signed by a CA which is -recognised by the major browsers. Friendica will work with self-signed certs -but Diaspora communication may not. For best results, install your cert PRIOR -to installing Friendica and when visiting your site for the initial -installation in step 5, please use the https: link. (Use the http: or non-SSL -link if your cert is self-signed). - - -1. Requirements - - Apache with mod-rewrite enabled and "Options All" so you can use a -local .htaccess file - - - PHP 5.6.1+ (PHP 7 recommended for performance). - - - PHP *command line* access with register_argc_argv set to true in the -php.ini file [or see 'poormancron' in section 8] - - - curl, gd (with at least jpeg support), mysql, mbstring, xml, zip and openssl extensions - - - some form of email server or email gateway such that PHP mail() works - - - The POSIX module of PHP needs to be activated (e.g. RHEL, CentOS have disabled it) - - - Mysql 5.5.3+ or an equivalant alternative for MySQL (MariaDB, Percona Server etc.) - - - ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks -(Windows) [Note: other options are presented in Section 8 of this document] - - - Installation into a top-level domain or sub-domain (without a -directory/path component in the URL) is preferred. This is REQUIRED if -you wish to communicate with the Diaspora network. - - - - For alternative server configurations (such as Nginx server and MariaDB - database engine), refer to the wiki at https://github.com/friendica/friendica/wiki - -This guide will walk you through the manual installation process of Friendica. -If this is nothing for you, you might be interested in - -* the Friendica Docker image (https://github.com/friendica/docker) or -* how install Friendica with YunoHost (https://github.com/YunoHost-Apps/friendica_ynh). - - -2. Unpack the Friendica files into the root of your web server document area. - - - If you copy the directory tree to your webserver, make sure - that you also copy .htaccess - as "dot" files are often hidden - and aren't normally copied. - -OR - -2b. Clone the friendica/friendica GitHub repository and import dependencies - - git clone https://github.com/friendica/friendica -b master [web server folder] - cd [web server folder] - php bin/composer.phar install - -Make sure the folder view/smarty3 exists and is writable by the webserver -user, in this case `www-data` - - mkdir view/smarty3 - chown www-data:www-data view/smarty3 - chmod 775 view/smarty3 - -Get the addons by going into your website folder. - - cd mywebsite - -Clone the addon repository (separately): - - git clone https://github.com/friendica/friendica-addons.git -b master addon - -If you copy the directory tree to your webserver, make sure that you also -copy .htaccess - as "dot" files are often hidden and aren't normally copied. - -If you want to use the development version of Friendica you can switch to -the devel branch in the repository by running - - git checkout develop - bin/composer.phar install - cd addon - git checkout develop - -please be aware that the develop branch may break your Friendica node at any -time. If you encounter a bug, please let us know. - -3. Create an empty database and note the access details (hostname, username, -password, database name). - - - Friendica needs the permission to create and delete fields and tables in its own database. - - Please check the additional notes if running on MySQ 5.7.17 or newer - -4. If you know in advance that it will be impossible for the web server to -write or create files in the config/ subfolder, create an empty file called -local.ini.php and make it writable by the web server. - -5. Visit your website with a web browser and follow the instructions. Please -note any error messages and correct these before continuing. - -If you are using SSL with a known signature authority (recommended), use the -https: link to your website. If you are using a self-signed cert or no cert, -use the http: link. - -If you need to specify a port for the connection to the database, you can do -so in the host name setting for the database. - -6. *If* the automated installation fails for any reason, check the following: - - - "config/local.ini.php" exists - If not, edit local-sample.ini.php and change system settings. Rename -to local.ini.php - - Database is populated. - If not, import the contents of "database.sql" with phpmyadmin -or mysql command line - -7. At this point visit your website again, and register your personal account. -Registration errors should all be recoverable automatically. -If you get any *critical* failure at this point, it generally indicates the -database was not installed correctly. You might wish to move/rename -local.ini.php to another name and empty (called 'dropping') the database -tables, so that you can start fresh. - -**************************************************************************** -**************************************************************************** -******** THIS NEXT STEP IS IMPORTANT!!!! *********** -**************************************************************************** -**************************************************************************** - -8. Set up a cron job or scheduled task to run the worker once every 5-10 -minutes to pick up the recent "public" postings of your friends. Example: - - cd /base/directory; /path/to/php bin/worker.php - -Change "/base/directory", and "/path/to/php" as appropriate for your situation. - -If you are using a Linux server, run "crontab -e" and add a line like the -one shown, substituting for your unique paths and settings: - -*/10 * * * * cd /home/myname/mywebsite; /usr/bin/php bin/worker.php - -You can generally find the location of PHP by executing "which php". If you -have troubles with this section please contact your hosting provider for -assistance. Friendica will not work correctly if you cannot perform this step. - -You should also be sure that $a->config['php_path'] is set correctly, it should -look like (changing it to the correct PHP location) - -$a->config['php_path'] = '/usr/local/php56/bin/php' - -Alternative: If you cannot use a cron job as described above, you can use -the frontend worker and an external cron service to trigger the execution -of the worker script. You can enable the frontend worker after the installation -from the admin panel of your node and call - - https://example.com/worker - -with the service of your choice. - -9. (Recommended) Set up a backup plan - -Bad things will happen. Let there be a hardware failure, a corrupted -database or whatever you can think of. So once the installation of your -Friendica node is done, you should make yoursef a backup plan. - -The most important file is the `config/local.ini.php` file in the base directory. -As it stores all your data, you should also have a recent dump of your -Friendica database at hand, should you have to recover your node. - -10. (Optional) Reverse-proxying and HTTPS - -Friendica looks for some well-known HTTP headers indicating a reverse-proxy -terminating an HTTPS connection. While the standard from RFC 7239 specifies -the use of the `Forwaded` header. - - Forwarded: for=192.0.2.1; proto=https; by=192.0.2.2 - -Friendica also supports a number on non-standard headers in common use. - - - X-Forwarded-Proto: https - - Front-End-Https: on - - X-Forwarded-Ssl: on - -It is however preferable to use the standard approach if configuring a new server. - -##################################################################### - - If things don't work... - -##################################################################### - - -##################################################################### -- If you get the message - "System is currently unavailable. Please try again later" -##################################################################### - - Check your database settings. It usually means your database could not -be opened or accessed. If the database resides on the same machine, check that -the database server name is "localhost". - -##################################################################### -- 500 Internal Error -##################################################################### - - This could be the result of one of our Apache directives not being -supported by your version of Apache. Examine your apache server logs. - You might remove the line "Options -Indexes" from the .htaccess file if -you are using a Windows server as this has been known to cause problems. -Also check your file permissions. Your website and all contents must generally -be world-readable. - - It is likely that your web server reported the source of the problem in -its error log files. Please review these system error logs to determine what -caused the problem. Often this will need to be resolved with your hosting -provider or (if self-hosted) your web server configuration. - -##################################################################### -- 400 and 4xx "File not found" errors -##################################################################### - - First check your file permissions. Your website and all contents must -generally be world-readable. - - Ensure that mod-rewite is installed and working, and that your -.htaccess file is being used. To verify the latter, create a file test.out -containing the word "test" in the top directory of Friendica, make it world -readable and point your web browser to - -http://yoursitenamehere.com/test.out - - This file should be blocked. You should get a permission denied message. - - If you see the word "test" your Apache configuration is not allowing -your .htaccess file to be used (there are rules in this file to block access -to any file with .out at the end, as these are typically used for system logs). - - Make certain the .htaccess file exists and is readable by everybody, then -look for the existence of "AllowOverride None" in the Apache server -configuration for your site. This will need to be changed to -"AllowOverride All". - - If you do not see the word "test", your .htaccess is working, but it is -likely that mod-rewrite is not installed in your web server or is not working. - - On most flavour of Linux, - -% a2enmod rewrite -% /etc/init.d/apache2 restart - - Consult your hosting provider, experts on your particular Linux -distribution or (if Windows) the provider of your Apache server software if -you need to change either of these and can not figure out how. There is -a lot of help available on the web. Google "mod-rewrite" along with the -name of your operating system distribution or Apache package (if using -Windows). - - -##################################################################### -- If you are unable to write the file config/local.ini.php during installation -due to permissions issues: -##################################################################### - - create an empty file with that name and give it world-write permission. -For Linux: - -% touch config/local.ini.php -% chmod 664 config/local.ini.php - -Retry the installation. As soon as the database has been created, - -******* this is important ********* - -% chmod 644 config/local.ini.php - -##################################################################### -- Some configurations with "suhosin" security are configured without -an ability to run external processes. Friendica requires this ability. -Following are some notes provided by one of our members. -##################################################################### - -On my server I use the php protection system Suhosin -[http://www.hardened-php.net/suhosin/]. One of the things it does is to block -certain functions like proc_open, as configured in /etc/php5/conf.d/suhosin.ini: - - suhosin.executor.func.blacklist = proc_open, ... - -For those sites like Friendica that really need these functions they can be -enabled, e.g. in /etc/apache2/sites-available/friendica: - - - php_admin_value suhosin.executor.func.blacklist none - php_admin_value suhosin.executor.eval.blacklist none - - -This enables every function for Friendica if accessed via browser, but not for -the cronjob that is called via php command line. I attempted to enable it for -cron by using something like - - */10 * * * * cd /var/www/friendica/friendica/ && sudo -u www-data /usr/bin/php --d suhosin.executor.func.blacklist=none -d suhosin.executor.eval.blacklist=none --f bin/worker.php - -This worked well for simple test cases, but the friendica-cron still failed with -a fatal error: -suhosin[22962]: ALERT - function within blacklist called: proc_open() (attacker -'REMOTE_ADDR not set', file '/var/www/friendica/friendica/boot.php', line 1341) - -After a while I noticed, that bin/worker.php calls further php script via -proc_open. These scripts themselves also use proc_open and fail, because they -are NOT called with -d suhosin.executor.func.blacklist=none. - -So the simple solution is to put the correct parameters into config/local.ini.php: - -[config] -; Location of PHP command line processor -php_path = "/usr/bin/php -d suhosin.executor.func.blacklist=none -d suhosin.executor.eval.blacklist=none" - -This is obvious as soon as you notice that the friendica-cron uses proc_open to -execute php-scripts that also use proc_open, but it took me quite some time to -find that out. I hope this saves some time for other people using suhosin with -function blacklists. - -######################################################################## -Unable to create all mysql tables on MySQL 5.7.17 or newer -####################################################################### - -If the setup fails to create all the database tables and/or manual -creation from the command line fails, with this error: - -ERROR 1067 (42000) at line XX: Invalid default value for 'created' - -You need to adjust your my.cnf and add the following setting under -the [mysqld] section : - -sql_mode = ''; - -After that, restart mysql and try again. - - diff --git a/LICENSE b/LICENSE index 6b8f18d0c..e720a404d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ Friendica Communications Server -Copyright (c) 2010-2018 the Friendica Project +Copyright (c) 2010-2019 the Friendica Project This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by diff --git a/README.md b/README.md index 20d6b0ef5..1406678be 100644 --- a/README.md +++ b/README.md @@ -13,29 +13,30 @@ With Friendica, you can also fully interact with anyone on Twitter, post on Face Join today and [get your Friendica profile!](https://dir.friendica.social/servers 'Join Friendica today!') +Have a look at the [installation documentation](doc/Install.md) for further information about installing and using Friendica. ### Friendica Screenshots -| ![Frio theme in mobile browser](/images/screenshots/friendica-frio-mobile-profle-1.png?raw=true "Frio theme in mobile browser") ![Frio theme in mobile browser](/images/screenshots/friendica-frio-mobile-profle-2.png?raw=true "Frio theme in mobile browser") +| ![Frio theme in mobile browser](images/screenshots/friendica-frio-mobile-profle-1.png?raw=true "Frio theme in mobile browser") ![Frio theme in mobile browser](images/screenshots/friendica-frio-mobile-profle-2.png?raw=true "Frio theme in mobile browser") |:--:| |*Frio theme, mobile browser. Timeline and composer view.*| -|![Frio theme in desktop browser](/images/screenshots/friendica-frio-green-profle-1.png?raw=true "Frio theme in desktop browser") +|![Frio theme in desktop browser](images/screenshots/friendica-frio-green-profle-1.png?raw=true "Frio theme in desktop browser") |*Frio theme, desktop browser. Timeline view, contact info popped up, control menu open.*| -|![Frio theme in desktop browser](/images/screenshots/friendica-frio-green-profle-2.png?raw=true "Frio theme in desktop browser") +|![Frio theme in desktop browser](images/screenshots/friendica-frio-green-profle-2.png?raw=true "Frio theme in desktop browser") |*Frio theme, desktop browser. Menu open for controlling individual posts.*| -|![Frio theme in desktop browser](/images/screenshots/friendica-frio-red-profle-3.png?raw=true "Frio theme in desktop browser") +|![Frio theme in desktop browser](images/screenshots/friendica-frio-red-profle-3.png?raw=true "Frio theme in desktop browser") |*Frio theme, desktop browser. Profile view, notification menu open.*| -|![Frio theme in desktop browser](/images/screenshots/friendica-frio-red-profle-2.png?raw=true "Frio theme in desktop browser") +|![Frio theme in desktop browser](images/screenshots/friendica-frio-red-profle-2.png?raw=true "Frio theme in desktop browser") |*Number of new posts, in total and by group.*| -|![Frio theme in desktop browser](/images/screenshots/friendica-frio-red-profle-1.png?raw=true "Frio theme in desktop browser") +|![Frio theme in desktop browser](images/screenshots/friendica-frio-red-profle-1.png?raw=true "Frio theme in desktop browser") |*Calender with popup of event.*| -|![Frio theme default colour in standard browser on tablet](/images/screenshots/friendica-frio-default-profile-1.png?raw=true "Frio theme default colour in standard browser on tablet") +|![Frio theme default colour in standard browser on tablet](images/screenshots/friendica-frio-default-profile-1.png?raw=true "Frio theme default colour in standard browser on tablet") |*Notifications menu and private messages counter, standard browser on tablet.*| -|![Frio theme in desktop browser](/images/screenshots/friendica-frio-brown-profile-2.png?raw=true "Frio theme in desktop browser") +|![Frio theme in desktop browser](images/screenshots/friendica-frio-brown-profile-2.png?raw=true "Frio theme in desktop browser") |*Number of visible contacts, standard browser.*| -|![Frio theme in desktop browser](/images/screenshots/friendica-frio-brown-profile-1.png?raw=true "Frio theme in desktop browser") +|![Frio theme in desktop browser](images/screenshots/friendica-frio-brown-profile-1.png?raw=true "Frio theme in desktop browser") |*Network posts chronologically ordered, standard browser.*| -|![Vier theme in desktop browser](/images/screenshots/friendica-vier-profile.png?raw=true "Vier theme in desktop browser") +|![Vier theme in desktop browser](images/screenshots/friendica-vier-profile.png?raw=true "Vier theme in desktop browser") |*Vier theme, desktop browser. Public timeline view.*| -|![Vier theme in desktop browser](/images/screenshots/friendica-vier-community.png?raw=true "Vier theme in desktop browser") +|![Vier theme in desktop browser](images/screenshots/friendica-vier-community.png?raw=true "Vier theme in desktop browser") |*Vier theme, desktop browser. Community post displayed.*| diff --git a/README.translate.md b/README.translate.md deleted file mode 100644 index a4f61a1b9..000000000 --- a/README.translate.md +++ /dev/null @@ -1,101 +0,0 @@ -Friendica translations -====================== - -Translation Process -------------------- - -The strings used in the UI of Friendica is translated at [Transifex] [1] and then included in the git repository at github. -If you want to help with translation for any language, be it correcting terms or translating friendica to a currently not supported language, please register an account at transifex.com and contact the friendica translation team there. - -Translating friendica is simple. -Just use the online tool at transifex. -If you don't want to deal with git & co. that is fine, we check the status of the translations regularly and import them into the source tree at github so that others can use them. - -We do not include every translation from transifex in the source tree to avoid a scattered and disturbed overall experience. -As an uneducated guess we have a lower limit of 50% translated strings before we include the language (for the core messages.po file, addont translation will be included once all strings of an addon are translated. -This limit is judging only by the amount of translated strings under the assumption that the most prominent strings for the UI will be translated first by a translation team. -If you feel your translation useable before this limit, please contact us and we will probably include your teams work in the source tree. - -If you want to help translating, please concentrate on the core messages.po file first. -We will only include translations with a sufficient translated messages.po file. -Translations of addons will only be included, when the core file is included as well. - -If you want to get your work into the source tree yourself, feel free to do so and contact us with and question that arises. -The process is simple and friendica ships with all the tools necessary. - -The location of the translated files in the source tree is - /view/lang/LNG-CODE/ -where LNG-CODE is the language code used, e.g. de for German or fr for French. -The translated strings come as a "message.po" file from transifex which needs to be translated into the PHP file friendica uses. -To do so, place the file in the directory mentioned above and use the "po2php" command from the console. -*Please note that the console tool has to be called from the base directory of your Friendica installation.* - -Assuming you want to convert the German localization which is placed in view/lang/de/message.po you would do the following. - - 1. Navigate at the command prompt to the base directory of your - friendica installation - - 2. Execute the po2php command, which will place the translation - in the strings.php file that is used by friendica. - - $> php bin/console.php po2php view/lang/de/messages.po - - The output of the script will be placed at view/lang/de/strings.php where - friendica is expecting it, so you can test your translation immediately. - - 3. Visit your friendica page to check if it still works in the language you - just translated. If not try to find the error, most likely PHP will give - you a hint in the log/warnings.about the error. - - For debugging you can also try to "run" the file with PHP. This should - not give any output if the file is ok but might give a hint for - searching the bug in the file. - - $> php view/lang/de/strings.php - - 4. commit the two files with a meaningful commit message to your git - repository, push it to your fork of the friendica repository at github and - issue a pull request for that commit. - -You should translate the PO files at Transifex. -Otherwise your work might get lost, when the translation from Transifex is included to the Friendica repository after it was updated there. - -Utilities ---------- - -Additional to the po2php command there are some more utilities for translation in the console. -If you only want to translate friendica into another language you wont need any of these tools most likely but it gives you an idea how the translation process of friendica works. - -For further information see the utils/README file. - -Transifex-Client ----------------- - -Transifex has a client program which let you interact with the translation files in a similar way to git. -Help for the client can be found at the [Transifex Help Center] [2]. -Here we will only cover basic usage. - -After installation of the client, you should have a `tx` command available on your system. -To use it, first create a configuration file with your credentials. -On Linux this file should be placed into your home directory `~/.transifexrc`. -The content of the file should be something like the following: - - [https://www.transifex.com] - username = user - token = - password = p@ssw0rd - hostname = https://www.transifex.com - -Since Friendica version 3.5.1 we ship configuration files for the Transifex client in the core repository and the addon repository. -To update the translation files after you have translated strings of e.g. Esperanto in the web-UI of transifex you can use `tx` to download the file. - - $> tx pull -l eo - -And then use the `po2php` command described above to convert the `messages.po` file to the `strings.php` file Friendica is loading. - - $> php bin/console.php po2php view/lang/eo/messages.po - -Afterwards, just commit the two changed files to a feature branch of your Friendica repository, push the changes to github and open a pull request for your changes. - -[1]: https://www.transifex.com/projects/p/friendica/ -[2]: https://docs.transifex.com/client/introduction diff --git a/VERSION b/VERSION index 8033ba208..41367d09e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2018.12-dev +2019.12-dev diff --git a/Vagrantfile b/Vagrantfile index e5f30b307..f9ffe0c75 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -6,8 +6,8 @@ server_timezone = "UTC" public_folder = "/vagrant" Vagrant.configure(2) do |config| - # Set server to Ubuntu 16.04 - config.vm.box = "ubuntu/xenial64" + # Set server to Debian 10 / Buster 64bit + config.vm.box = "debian/buster64" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs diff --git a/autotest.sh b/autotest.sh new file mode 100755 index 000000000..15067bf9d --- /dev/null +++ b/autotest.sh @@ -0,0 +1,279 @@ +#!/usr/bin/env bash +# +# This script is used for autotesting the Friendica codebase with different +# types of tests and environments. +# +# Currently, there are three types of autotesting possibilities: +# - "USEDOCKER=true ./autotest.sh" will start a database docker container for testing +# - "./autotest.sh" on the Drone CI environment will use the database container of the drone CI pipeline +# - "./autotest.sh" on a local environment will try to use the local database instance for testing +# +# You can specify a database (mysql, mariadb currently) for the db backend of Friendica ("./autotest.sh mysql") +# And you can specify some parameters for the test, like: +# - NOCOVERAGE=true ... Don't create a coverage XML (this is only useful if you will send coverage to codecov.io) +# - NOINSTALL=true ... Skip the whole Friendica installation process (e.g. you just test Caching drivers) +# - TEST_SELECTION= ... Specify which tests are used to run (based on the test-labeling) +# - XDEBUG_CONFIG= ... Set some XDEBUG specific environment settings for development + +DATABASENAME=${MYSQL_DATABASE:-test} +DATABASEUSER=${MYSQL_USERNAME:-friendica} +DATABASEHOST=${MYSQL_HOST:-localhost} +BASEDIR=$PWD + +DBCONFIGS="mysql mariadb" +TESTS="REDIS MEMCACHE MEMCACHED APCU NODB" + +export MYSQL_DATABASE="$DATABASENAME" +export MYSQL_USERNAME="$DATABASEUSER" +export MYSQL_PASSWORD="friendica" + +if [ -z "$PHP_EXE" ]; then + PHP_EXE=php +fi +PHP=$(which "$PHP_EXE") +# Use the Friendica internal composer +COMPOSER="$BASEDIR/bin/composer.phar" + +set -e + +_XDEBUG_CONFIG=$XDEBUG_CONFIG +unset XDEBUG_CONFIG + +function show_syntax() { + echo -e "Syntax: ./autotest.sh [dbconfigname] [testfile]\n" >&2 + echo -e "\t\"dbconfigname\" can be one of: $DBCONFIGS" >&2 + echo -e "\t\"testfile\" is the name of a test file, for example lib/template.php" >&2 + echo -e "\nDatabase environment variables:\n" >&2 + echo -e "\t\"MYSQL_HOST\" Mysql Hostname (Default: localhost)" >&2 + echo -e "\t\"MYSQL_USDRNAME\" Mysql Username (Default: friendica)" >&2 + echo -e "\t\"MYSQL_DATABASE\" Mysql Database (Default: test)" >&2 + echo -e "\nOther environment variables:\n" >&2 + echo -e "\t\"TEST_SELECTION\" test a specific group of tests, can be one of: $TESTS" >&2 + echo -e "\t\"NOINSTALL\" If set to true, skip the db and install process" >&2 + echo -e "\t\"NOCOVERAGE\" If set to true, don't create a coverage output" >&2 + echo -e "\t\"USEDOCKER\" If set to true, the DB server will be executed inside a docker container" >&2 + echo -e "\nExample: NOCOVERAGE=true ./autotest.sh mysql src/Core/Cache/MemcacheTest.php" >&2 + echo "will run the test suite from \"tests/src/Core/Cache/MemcacheTest.php\" without a Coverage" >&2 + echo -e "\nIf no arguments are specified, all tests will be run with all database configs" >&2 +} + +if [ -x "$PHP" ]; then + echo "Using PHP executable $PHP" +else + echo "Could not find PHP executable $PHP_EXE" >&2 + exit 3 +fi + +echo "Installing depdendencies" +$PHP "$COMPOSER" install + +PHPUNIT="$BASEDIR/vendor/bin/phpunit" + +if [ -x "$PHPUNIT" ]; then + echo "Using PHPUnit executable $PHPUNIT" +else + echo "Could not find PHPUnit executable after composer $PHPUNIT" >&2 + exit 3 +fi + +if ! [ \( -w config -a ! -f config/local.config.php \) -o \( -f config/local.config.php -a -w config/local.config.php \) ]; then + echo "Please enable write permissions on config and config/config.php" >&2 + exit 1 +fi + +if [ "$1" ]; then + FOUND=0 + for DBCONFIG in $DBCONFIGS; do + if [ "$1" = "$DBCONFIG" ]; then + FOUND=1 + break + fi + done + if [ $FOUND = 0 ]; then + echo -e "Unknown database config name \"$1\"\n" >&2 + show_syntax + exit 2 + fi +fi + +# Back up existing (dev) config if one exists and backup not already there +if [ -f config/local.config.php ] && [ ! -f config/local.config-autotest-backup.php ]; then + mv config/local.config.php config/local.config-autotest-backup.php +fi + +function cleanup_config() { + + if [ -n "$DOCKER_CONTAINER_ID" ]; then + echo "Kill the docker $DOCKER_CONTAINER_ID" + docker stop "$DOCKER_CONTAINER_ID" + docker rm -f "$DOCKER_CONTAINER_ID" + fi + + cd "$BASEDIR" + + # Restore existing config + if [ -f config/local.config-autotest-backup.php ]; then + mv config/local.config-autotest-backup.php config/local.config.php + fi +} + +# restore config on exit +trap cleanup_config EXIT + +function execute_tests() { + DB=$1 + echo "Setup environment for $DB testing ..." + # back to root folder + cd "$BASEDIR" + + # backup current config + if [ -f config/local.config.php ]; then + mv config/local.config.php config/local.config-autotest-backup.php + fi + + if [ -z "$NOINSTALL" ]; then + #drop database + if [ "$DB" == "mysql" ]; then + if [ -n "$USEDOCKER" ]; then + echo "Fire up the mysql docker" + DOCKER_CONTAINER_ID=$(docker run \ + -e MYSQL_ROOT_PASSWORD=friendica \ + -e MYSQL_USER="$DATABASEUSER" \ + -e MYSQL_PASSWORD=friendica \ + -e MYSQL_DATABASE="$DATABASENAME" \ + -d mysql) + DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID") + + else + if [ -z "$DRONE" ]; then # no need to drop the DB when we are on CI + if [ "mysql" != "$(mysql --version | grep -o mysql)" ]; then + echo "Your mysql binary is not provided by mysql" + echo "To use the docker container set the USEDOCKER environment variable" + exit 3 + fi + mysql -u "$DATABASEUSER" -pfriendica -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true + mysql -u "$DATABASEUSER" -pfriendica -e "CREATE DATABASE $DATABASENAME DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" -h $DATABASEHOST + else + DATABASEHOST=mysql + fi + fi + + echo "Waiting for MySQL $DATABASEHOST initialization..." + if ! bin/wait-for-connection $DATABASEHOST 3306 300; then + echo "[ERROR] Waited 300 seconds, no response" >&2 + exit 1 + fi + + echo "MySQL is up." + fi + if [ "$DB" == "mariadb" ]; then + if [ -n "$USEDOCKER" ]; then + echo "Fire up the mariadb docker" + DOCKER_CONTAINER_ID=$(docker run \ + -e MYSQL_ROOT_PASSWORD=friendica \ + -e MYSQL_USER="$DATABASEUSER" \ + -e MYSQL_PASSWORD=friendica \ + -e MYSQL_DATABASE="$DATABASENAME" \ + -d mariadb) + DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID") + + else + if [ -z "$DRONE" ]; then # no need to drop the DB when we are on CI + if [ "MariaDB" != "$(mysql --version | grep -o MariaDB)" ]; then + echo "Your mysql binary is not provided by mysql" + echo "To use the docker container set the USEDOCKER environment variable" + exit 3 + fi + mysql -u "$DATABASEUSER" -pfriendica -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true + mysql -u "$DATABASEUSER" -pfriendica -e "CREATE DATABASE $DATABASENAME DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" -h $DATABASEHOST + else + DATABASEHOST=mariadb + fi + fi + + echo "Waiting for MariaDB $DATABASEHOST initialization..." + if ! bin/wait-for-connection $DATABASEHOST 3306 300; then + echo "[ERROR] Waited 300 seconds, no response" >&2 + exit 1 + fi + + echo "MariaDB is up." + fi + + if [ -n "$USEDOCKER" ]; then + echo "Initialize database..." + docker exec $DOCKER_CONTAINER_ID mysql -u root -pfriendica -e 'CREATE DATABASE IF NOT EXISTS $DATABASENAME;' + fi + + export MYSQL_HOST="$DATABASEHOST" + + #call installer + echo "Installing Friendica..." + "$PHP" ./bin/console.php autoinstall --dbuser="$DATABASEUSER" --dbpass=friendica --dbdata="$DATABASENAME" --dbhost="$DATABASEHOST" --url=https://friendica.local --admin=admin@friendica.local + fi + + #test execution + echo "Testing..." + rm -fr "coverage-html" + mkdir "coverage-html" + if [[ "$_XDEBUG_CONFIG" ]]; then + export XDEBUG_CONFIG=$_XDEBUG_CONFIG + fi + + COVER='' + if [ -z "$NOCOVERAGE" ]; then + COVER="--coverage-clover tests/autotest-clover.xml" + else + echo "No coverage" + fi + + # per default, there is no cache installed + GROUP='--exclude-group REDIS,MEMCACHE,MEMCACHED,APCU' + if [ "$TEST_SELECTION" == "REDIS" ]; then + GROUP="--group REDIS" + fi + if [ "$TEST_SELECTION" == "MEMCACHE" ]; then + GROUP="--group MEMCACHE" + fi + if [ "$TEST_SELECTION" == "MEMCACHED" ]; then + GROUP="--group MEMCACHED" + fi + if [ "$TEST_SELECTION" == "APCU" ]; then + GROUP="--group APCU" + fi + if [ "$TEST_SELECTION" == "NODB" ]; then + GROUP="--exclude-group DB,SLOWDB" + fi + + INPUT="$BASEDIR/tests" + if [ -n "$2" ]; then + INPUT="$INPUT/$2" + fi + + echo "${PHPUNIT[@]}" --configuration tests/phpunit.xml $GROUP $COVER --log-junit "autotest-results.xml" "$INPUT" "$3" + "${PHPUNIT[@]}" --configuration tests/phpunit.xml $GROUP $COVER --log-junit "autotest-results.xml" "$INPUT" "$3" + RESULT=$? + + if [ -n "$DOCKER_CONTAINER_ID" ]; then + echo "Kill the docker $DOCKER_CONTAINER_ID" + docker stop $DOCKER_CONTAINER_ID + docker rm -f $DOCKER_CONTAINER_ID + unset $DOCKER_CONTAINER_ID + fi +} + +# +# Start the test execution +# +if [ -z "$1" ] && [ -n "$TEST_SELECTION" ]; then + # run all known database configs + for DBCONFIG in $DBCONFIGS; do + execute_tests "$DBCONFIG" + done +else + FILENAME="$2" + if [ -n "$2" ] && [ ! -f "tests/$FILENAME" ] && [ "${FILENAME:0:2}" != "--" ]; then + FILENAME="../$FILENAME" + fi + execute_tests "$1" "$FILENAME" "$3" +fi diff --git a/bin/auth_ejabberd.php b/bin/auth_ejabberd.php index 1f03b94af..5ccdd0174 100755 --- a/bin/auth_ejabberd.php +++ b/bin/auth_ejabberd.php @@ -32,8 +32,11 @@ * */ -use Friendica\App; +use Dice\Dice; +use Friendica\App\Mode; +use Friendica\BaseObject; use Friendica\Util\ExAuth; +use Psr\Log\LoggerInterface; if (sizeof($_SERVER["argv"]) == 0) { die(); @@ -49,12 +52,16 @@ $directory = realpath($directory . DIRECTORY_SEPARATOR . ".."); chdir($directory); -require_once "boot.php"; -require_once "include/dba.php"; +require dirname(__DIR__) . '/vendor/autoload.php'; -$a = new App(dirname(__DIR__)); +$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php'); +$dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['auth_ejabberd']]); -if ($a->getMode()->isNormal()) { +BaseObject::setDependencyInjection($dice); + +$appMode = $dice->create(Mode::class); + +if ($appMode->isNormal()) { $oAuth = new ExAuth(); $oAuth->readStdin(); } diff --git a/bin/console.php b/bin/console.php index 9c25279d3..a6513a2e8 100755 --- a/bin/console.php +++ b/bin/console.php @@ -1,9 +1,12 @@ #!/usr/bin/env php execute(); +$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php'); +$dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['console']]); + +(new Friendica\Core\Console($dice, $argv))->execute(); diff --git a/bin/daemon.php b/bin/daemon.php index f0f5826d9..948829c1b 100755 --- a/bin/daemon.php +++ b/bin/daemon.php @@ -7,10 +7,12 @@ * This script was taken from http://php.net/manual/en/function.pcntl-fork.php */ -use Friendica\App; +use Dice\Dice; use Friendica\Core\Config; +use Friendica\Core\Logger; use Friendica\Core\Worker; use Friendica\Database\DBA; +use Psr\Log\LoggerInterface; // Get options $shortopts = 'f'; @@ -29,10 +31,13 @@ if (!file_exists("boot.php") && (sizeof($_SERVER["argv"]) != 0)) { chdir($directory); } -require_once "boot.php"; -require_once "include/dba.php"; +require dirname(__DIR__) . '/vendor/autoload.php'; -$a = new App(dirname(__DIR__)); +$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php'); +$dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['daemon']]); + +\Friendica\BaseObject::setDependencyInjection($dice); +$a = \Friendica\BaseObject::getApp(); if ($a->getMode()->isInstall()) { die("Friendica isn't properly installed yet.\n"); @@ -41,9 +46,14 @@ if ($a->getMode()->isInstall()) { Config::load(); if (empty(Config::get('system', 'pidfile'))) { - die('Please set system.pidfile in config/local.ini.php. For example:'."\n". - '[system]'."\n". - 'pidfile = /path/to/daemon.pid'."\n"); + die(<< [ + 'pidfile' => '/path/to/daemon.pid', + ], +TXT + ); } $pidfile = Config::get('system', 'pidfile'); @@ -97,7 +107,7 @@ if ($mode == "stop") { unlink($pidfile); - logger("Worker daemon process $pid was killed.", LOGGER_DEBUG); + Logger::notice("Worker daemon process was killed", ["pid" => $pid]); Config::set('system', 'worker_daemon_mode', false); die("Worker daemon process $pid was killed.\n"); @@ -107,7 +117,7 @@ if (!empty($pid) && posix_kill($pid, 0)) { die("Daemon process $pid is already running.\n"); } -logger('Starting worker daemon.', LOGGER_DEBUG); +Logger::notice('Starting worker daemon.', ["pid" => $pid]); if (!$foreground) { echo "Starting worker daemon.\n"; @@ -139,7 +149,7 @@ if (!$foreground) { file_put_contents($pidfile, $pid); // We lose the database connection upon forking - $a->loadDatabase(); + DBA::reconnect(); } Config::set('system', 'worker_daemon_mode', true); @@ -155,7 +165,7 @@ $last_cron = 0; // Now running as a daemon. while (true) { if (!$do_cron && ($last_cron + $wait_interval) < time()) { - logger('Forcing cron worker call.', LOGGER_DEBUG); + Logger::info('Forcing cron worker call.', ["pid" => $pid]); $do_cron = true; } @@ -169,7 +179,7 @@ while (true) { $last_cron = time(); } - logger("Sleeping", LOGGER_DEBUG); + Logger::info("Sleeping", ["pid" => $pid]); $start = time(); do { $seconds = (time() - $start); @@ -186,10 +196,10 @@ while (true) { if ($timeout) { $do_cron = true; - logger("Woke up after $wait_interval seconds.", LOGGER_DEBUG); + Logger::info("Woke up after $wait_interval seconds.", ["pid" => $pid, 'sleep' => $wait_interval]); } else { $do_cron = false; - logger("Worker jobs are calling to be forked.", LOGGER_DEBUG); + Logger::info("Worker jobs are calling to be forked.", ["pid" => $pid]); } } diff --git a/bin/dev/friendica-to-smarty-tpl.py b/bin/dev/friendica-to-smarty-tpl.py deleted file mode 100755 index 017b8b77a..000000000 --- a/bin/dev/friendica-to-smarty-tpl.py +++ /dev/null @@ -1,241 +0,0 @@ -#!/usr/bin/python -# -# Script to convert Friendica internal template files into Smarty template files -# Copyright 2013 Zach Prezkuta -# Licensed under GPL v3 - -import os, re, string -import sys, getopt - -ldelim = '{{' -rdelim = '}}' - -addheader = True - -def fToSmarty(matches): - match = matches.group(0) - if match == '$j': - return match - match = string.replace(match, '[', '') - match = string.replace(match, ']', '') - - ldel = ldelim - rdel = rdelim - if match.find("'") > -1: - match = string.replace(match, "'", '') - ldel = "'" + ldel - rdel = rdel + "'" - elif match.find('"') > -1: - match = string.replace(match, '"', '') - ldel = '"' + ldel - rdel = rdel + '"' - - return ldel + match + rdel - - -def fix_element(element): - # Much of the positioning here is important, e.g. if you do element.find('if ') before you do - # element.find('endif'), then you may get some multiply-replaced delimiters - - if element.find('endif') > -1: - element = ldelim + '/if' + rdelim - return element - - if element.find('if ') > -1: - element = string.replace(element, '{{ if', ldelim + 'if') - element = string.replace(element, '{{if', ldelim + 'if') - element = string.replace(element, ' }}', rdelim) - element = string.replace(element, '}}', rdelim) - return element - - if element.find('else') > -1: - element = ldelim + 'else' + rdelim - return element - - if element.find('endfor') > -1: - element = ldelim + '/foreach' + rdelim - return element - - if element.find('for ') > -1: - element = string.replace(element, '{{ for ', ldelim + 'foreach ') - element = string.replace(element, '{{for ', ldelim + 'foreach ') - element = string.replace(element, ' }}', rdelim) - element = string.replace(element, '}}', rdelim) - return element - - if element.find('endinc') > -1: - element = '' - return element - - if element.find('inc ') > -1: - parts = element.split(' ') - element = ldelim + 'include file="' - - # We need to find the file name. It'll either be in parts[1] if the element was written as {{ inc file.tpl }} - # or it'll be in parts[2] if the element was written as {{inc file.tpl}} - if parts[0].find('inc') > -1: - first = 0 - else: - first = 1 - - if parts[first+1][0] == '$': - # This takes care of elements where the filename is a variable, e.g. {{ inc $file }} - element += ldelim + parts[first+1].rstrip('}') + rdelim - else: - # This takes care of elements where the filename is a path, e.g. {{ inc file.tpl }} - element += parts[first+1].rstrip('}') - - element += '"' - - if len(parts) > first + 1 and parts[first+2] == 'with': - # Take care of variable substitutions, e.g. {{ inc file.tpl with $var=this_var }} - element += ' ' + parts[first+3].rstrip('}')[1:] - - element += rdelim - return element - - -def convert(filename, tofilename, php_tpl): - if addheader: - header = ldelim + "*\n *\tAUTOMATICALLY GENERATED TEMPLATE\n *\tDO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN\n *\n *" + rdelim + "\n" - tofilename.write(header) - - for line in filename: - newline = '' - st_pos = 0 - brack_pos = line.find('{{') - - if php_tpl: - # If php_tpl is True, this script will only convert variables in quotes, like '$variable' - # or "$variable". This is for .tpl files that produce PHP scripts, where you don't want - # all the PHP variables converted into Smarty variables - pattern1 = re.compile(r""" -([\'\"]\$\[[a-zA-Z]\w* -(\. -(\d+|[a-zA-Z][\w-]*) -)* -(\|[\w\$:\.]*)* -\][\'\"]) -""", re.VERBOSE) - pattern2 = re.compile(r""" -([\'\"]\$[a-zA-Z]\w* -(\. -(\d+|[a-zA-Z][\w-]*) -)* -(\|[\w\$:\.]*)* -[\'\"]) -""", re.VERBOSE) - else: - # Compile the pattern for bracket-style variables, e.g. $[variable.key|filter:arg1:arg2|filter2:arg1:arg2] - # Note that dashes are only allowed in array keys if the key doesn't start - # with a number, e.g. $[variable.key-id] is ok but $[variable.12-id] isn't - # - # Doesn't currently process the argument position key 'x', i.e. filter:arg1:x:arg2 doesn't get - # changed to arg1|filter:variable:arg2 like Smarty requires - # - # Filter arguments can be variables, e.g. $variable, but currently can't have array keys with dashes - # like filter:$variable.key-name - pattern1 = re.compile(r""" -(\$\[[a-zA-Z]\w* -(\. -(\d+|[a-zA-Z][\w-]*) -)* -(\|[\w\$:\.]*)* -\]) -""", re.VERBOSE) - - # Compile the pattern for normal style variables, e.g. $variable.key - pattern2 = re.compile(r""" -(\$[a-zA-Z]\w* -(\. -(\d+|[a-zA-Z][\w-]*) -)* -(\|[\w\$:\.]*)* -) -""", re.VERBOSE) - - while brack_pos > -1: - if brack_pos > st_pos: - line_segment = line[st_pos:brack_pos] - line_segment = pattern2.sub(fToSmarty, line_segment) - newline += pattern1.sub(fToSmarty, line_segment) - - end_brack_pos = line.find('}}', brack_pos) - if end_brack_pos < 0: - print "Error: no matching bracket found" - - newline += fix_element(line[brack_pos:end_brack_pos + 2]) - st_pos = end_brack_pos + 2 - - brack_pos = line.find('{{', st_pos) - - line_segment = line[st_pos:] - line_segment = pattern2.sub(fToSmarty, line_segment) - newline += pattern1.sub(fToSmarty, line_segment) - newline = newline.replace("{#", ldelim + "*") - newline = newline.replace("#}", "*" + rdelim) - tofilename.write(newline) - - -def help(pname): - print "\nUsage:" - print "\t" + pname + " -h\n\n\t\t\tShow this help screen\n" - print "\t" + pname + " -p directory\n\n\t\t\tConvert all .tpl files in directory to\n\t\t\tSmarty templates in directory/smarty3/\n" - print "\t" + pname + "\n\n\t\t\tInteractive mode\n" - - - - -# -# Main script -# - -path = '' - -try: - opts, args = getopt.getopt(sys.argv[1:], "hp:", ['no-header']) - for opt, arg in opts: - if opt == '-h': - help(sys.argv[0]) - sys.exit() - elif opt == '-p': - path = arg - elif opt == '--no-header': - addheader = False -except getopt.GetoptError: - help(sys.argv[0]) - sys.exit(2) - - -if path == '': - path = raw_input('Path to template folder to convert: ') - -if path[-1:] != '/': - path = path + '/' - -outpath = path + 'smarty3/' - -if not os.path.exists(outpath): - os.makedirs(outpath) - -files = os.listdir(path) -for a_file in files: - if a_file == 'local.ini.tpl': - php_tpl = True - else: - php_tpl = False - - filename = os.path.join(path,a_file) - ext = a_file.split('.')[-1] - if os.path.isfile(filename) and ext == 'tpl': - f = open(filename, 'r') - - newfilename = os.path.join(outpath,a_file) - outf = open(newfilename, 'w') - - print "Converting " + filename + " to " + newfilename - convert(f, outf, php_tpl) - - outf.close() - f.close() - diff --git a/bin/dev/make_credits.py b/bin/dev/make_credits.py index edd34c751..d89521390 100755 --- a/bin/dev/make_credits.py +++ b/bin/dev/make_credits.py @@ -5,7 +5,7 @@ This script will collect the contributors to friendica and its translations from * the git log of the friendica core and addons repositories * the translated messages.po from core and the addons. -The collected names will be saved in /util/credits.txt which is also parsed from +The collected names will be saved in CREDITS.txt which is also parsed from yourfriendica.tld/credits. The output is not perfect, so remember to open a fresh (re)created credits.txt file @@ -23,10 +23,12 @@ import os, glob, subprocess # not work in some cases. dontinclude = ['root', 'friendica', 'bavatar', 'tony baldwin', 'Taek', 'silke m', 'leberwurscht', 'abinoam', 'fabrixxm', 'FULL NAME', 'Hauke Zuehl', - 'Michal Supler', 'michal_s', 'Manuel Pérez', 'rabuzarus', 'Alberto Díaz'] + 'Michal Supler', 'michal_s', 'Manuel Pérez', 'rabuzarus', + 'Alberto Díaz', 'hoergen oostende', 'Friendica', 'vinzv', + 'Vincent Vindarel'] -# this script is in the /util sub-directory of the friendica installation +# this script is in the /bin/dev directory of the friendica installation # so the friendica path is the 0th argument of calling this script but we # need to remove the name of the file and the name of the directory path = os.path.abspath(argv[0].split('bin/dev/make_credits.py')[0]) @@ -88,10 +90,14 @@ for f in glob.glob(path+'/addon/*/lang/*/messages.po'): for ll in l: if intrans and ll.strip()=='': intrans = False; - if intrans and ll[0]=='#': - name = ll.split('# ')[1].split(',')[0].split(' <')[0] - if not name in contributors and name not in dontinclude: - contributors.append(name) + # at this point Transifex sometimes includes a "#, fuzzy" we eill + # ignore all lines starting with "#," as they do not contains any + # "Name email, year" information. + if not "#," in ll: + if intrans and ll[0]=='#': + name = ll.split('# ')[1].split(',')[0].split(' <')[0] + if not name in contributors and name not in dontinclude: + contributors.append(name) if "# Translators:" in ll: intrans = True # done with the translators @@ -101,7 +107,7 @@ print(' > found %d translators' % (n3-n2)) print('> found a total of %d contributors and translators' % n3) contributors.sort(key=str.lower) -f = open(path+'/util/credits.txt', 'w') +f = open(path+'/CREDITS.txt', 'w') f.write("\n".join(contributors)) f.close() -print('> list saved to util/credits.txt') +print('> list saved to CREDITS.txt') diff --git a/bin/dev/updatetpl.py b/bin/dev/updatetpl.py deleted file mode 100755 index 7b552fadd..000000000 --- a/bin/dev/updatetpl.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/python -# -# Script to update Smarty template files from all internal templates -# Copyright 2013 Zach Prezkuta -# Licensed under GPL v3 - - -import os -import sys, getopt -import subprocess - - -def help(pname): - print "\nUsage:" - print "\t" + pname + " -h\n\n\t\t\tShow this help screen\n" - print "\t" + pname + " -p directory\n\n\t\t\tConvert all .tpl files in top-level\n\t\t\tFriendica directory to Smarty templates\n" - print "\t" + pname + "\n\n\t\t\tInteractive mode\n" - - - -# -# Main script -# - -path = '' - -try: - opts, args = getopt.getopt(sys.argv[1:], "hp:") - for opt, arg in opts: - if opt == '-h': - help(sys.argv[0]) - sys.exit() - elif opt == '-p': - path = arg -except getopt.GetoptError: - help(sys.argv[0]) - sys.exit(2) - -if path == '': - path = raw_input('Path to top-level Friendica directory: ') - -if path[-1:] != '/': - path = path + '/' - -tplpaths = ['view/'] -names = os.listdir(path + 'view/') -for name in names: - if os.path.isdir(path + 'view/' + name): - if name != 'smarty3' and name != 'theme': - tplpaths.append('view/' + name + '/') - -names = os.listdir(path + 'view/theme/') -for name in names: - if os.path.isdir(path + 'view/theme/' + name): - tplpaths.append('view/theme/' + name + '/') - -fnull = open(os.devnull, "w") - -for tplpath in tplpaths: - print "Converting " + path + tplpath - subprocess.call(['python', path + 'util/friendica-to-smarty-tpl.py', '-p', path + tplpath], stdout = fnull) - -fnull.close() - diff --git a/bin/dev/vagrant_provision.sh b/bin/dev/vagrant_provision.sh index 0599efa0c..dc24f8799 100755 --- a/bin/dev/vagrant_provision.sh +++ b/bin/dev/vagrant_provision.sh @@ -37,9 +37,9 @@ sudo apt-get install -y apache2 sudo a2enmod rewrite actions ssl sudo cp /vagrant/bin/dev/vagrant_vhost.sh /usr/local/bin/vhost sudo chmod guo+x /usr/local/bin/vhost - sudo vhost -s 192.168.22.10.xip.io -d /var/www -p /etc/ssl/xip.io -c xip.io -a friendica.local - sudo a2dissite 000-default - sudo service apache2 restart +sudo vhost -s 192.168.22.10.xip.io -d /var/www -p /etc/ssl/xip.io -c xip.io -a friendica.local +sudo a2dissite 000-default +sudo service apache2 restart #Install php echo ">>> Installing PHP7" @@ -48,9 +48,9 @@ sudo systemctl restart apache2 #Install mysql echo ">>> Installing Mysql" -sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password root" -sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password root" -sudo apt-get install -qq mysql-server +sudo debconf-set-selections <<< "mariadb-server mariadb-server/root_password password root" +sudo debconf-set-selections <<< "mariadb-server mariadb-server/root_password_again password root" +sudo apt-get install -qq mariadb-server # enable remote access # setting the mysql bind-address to allow connections from everywhere sed -i "s/bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf @@ -76,6 +76,9 @@ debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Local Only' sudo apt-get install -y postfix mailutils libmailutils-dev sudo echo -e "friendica1: vagrant\nfriendica2: vagrant\nfriendica3: vagrant\nfriendica4: vagrant\nfriendica5: vagrant" >> /etc/aliases && sudo newaliases +# Friendica needs git for fetching some dependencies +sudo apt-get install -y git + #make the vagrant directory the docroot sudo rm -rf /var/www/ sudo ln -fs /vagrant /var/www @@ -83,11 +86,13 @@ sudo ln -fs /vagrant /var/www # install deps with composer sudo apt install unzip cd /var/www -php bin/composer.phar install +sudo -u www-data php bin/composer.phar install # initial config file for friendica in vagrant -#cp /vagrant/util/htconfig.vagrant.php /vagrant/.htconfig.php -cp /vagrant/util/local.ini.vagrant.php /vagrant/config/local.ini.php +cp /vagrant/mods/local.config.vagrant.php /vagrant/config/local.config.php + +# copy the .htaccess-dist file to .htaccess so that rewrite rules work +cp /vagrant/.htaccess-dist /vagrant/.htaccess # create the friendica database echo "create database friendica DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" | $MYSQL -u root -proot diff --git a/bin/run_xgettext.sh b/bin/run_xgettext.sh index a4faf5f91..5c40df8b5 100755 --- a/bin/run_xgettext.sh +++ b/bin/run_xgettext.sh @@ -45,7 +45,7 @@ case "$MODE" in ;; 'default') cd "$FULLPATH/.." - OUTFILE="$FULLPATH/../util/messages.po" + OUTFILE="$FULLPATH/../view/lang/C/messages.po" FINDSTARTDIR="." # skip addon folder FINDOPTS="( -wholename */addon -or -wholename */addons -or -wholename */addons-extra -or -wholename */smarty3 ) -prune -o" diff --git a/testargs.php b/bin/testargs.php similarity index 100% rename from testargs.php rename to bin/testargs.php diff --git a/bin/wait-for-connection b/bin/wait-for-connection new file mode 100755 index 000000000..eeb9ba980 --- /dev/null +++ b/bin/wait-for-connection @@ -0,0 +1,45 @@ +#!/usr/bin/php +# +# This script tries to connect to a database for a given interval +# Useful in case of installation e.g. to wait for the database to not generate unnecessary errors +# +# Usage: php bin/wait-for-connection {HOST} {PORT} [{TIMEOUT}] + + $timeout) { + $socketTimeout = $timeout; +} +$stopTime = time() + $timeout; +do { + $sock = @fsockopen($host, $port, $errno, $errstr, $socketTimeout); + if ($sock !== false) { + fclose($sock); + fwrite(STDOUT, "\n"); + exit(0); + } + sleep(1); + fwrite(STDOUT, '.'); +} while (time() < $stopTime); +fwrite(STDOUT, "\n"); +exit(1); diff --git a/bin/worker.php b/bin/worker.php index d5cd1f6b4..469dcb001 100755 --- a/bin/worker.php +++ b/bin/worker.php @@ -4,9 +4,14 @@ * @file bin/worker.php * @brief Starts the background processing */ + +use Dice\Dice; use Friendica\App; +use Friendica\BaseObject; use Friendica\Core\Config; +use Friendica\Core\Update; use Friendica\Core\Worker; +use Psr\Log\LoggerInterface; // Get options $shortopts = 'sn'; @@ -25,12 +30,16 @@ if (!file_exists("boot.php") && (sizeof($_SERVER["argv"]) != 0)) { chdir($directory); } -require_once "boot.php"; +require dirname(__DIR__) . '/vendor/autoload.php'; -$a = new App(dirname(__DIR__)); +$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php'); +$dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['worker']]); + +BaseObject::setDependencyInjection($dice); +$a = BaseObject::getApp(); // Check the database structure and possibly fixes it -check_db(true); +Update::check($a->getBasePath(), true, $a->getMode()); // Quit when in maintenance if (!$a->getMode()->has(App\Mode::MAINTENANCEDISABLED)) { @@ -43,7 +52,7 @@ $spawn = array_key_exists('s', $options) || array_key_exists('spawn', $options); if ($spawn) { Worker::spawnWorker(); - killme(); + exit(); } $run_cron = !array_key_exists('n', $options) && !array_key_exists('no_cron', $options); diff --git a/boot.php b/boot.php index 6b66625c6..ae9c35ae5 100644 --- a/boot.php +++ b/boot.php @@ -17,39 +17,25 @@ * easily as email does today. */ -require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; - use Friendica\App; use Friendica\BaseObject; -use Friendica\Core\Addon; -use Friendica\Core\Cache; use Friendica\Core\Config; -use Friendica\Core\L10n; use Friendica\Core\PConfig; use Friendica\Core\Protocol; use Friendica\Core\System; -use Friendica\Core\Worker; +use Friendica\Core\Session; use Friendica\Database\DBA; -use Friendica\Database\DBStructure; use Friendica\Model\Contact; -use Friendica\Model\Conversation; +use Friendica\Model\Term; +use Friendica\Util\BasePath; use Friendica\Util\DateTimeFormat; -require_once 'include/text.php'; - define('FRIENDICA_PLATFORM', 'Friendica'); -define('FRIENDICA_CODENAME', 'The Tazmans Flax-lily'); -define('FRIENDICA_VERSION', '2018.12-dev'); +define('FRIENDICA_CODENAME', 'Dalmatian Bellflower'); +define('FRIENDICA_VERSION', '2019.12-dev'); define('DFRN_PROTOCOL_VERSION', '2.23'); define('NEW_UPDATE_ROUTINE_VERSION', 1170); -/** - * @brief Constants for the database update check - */ -const DB_UPDATE_NOT_CHECKED = 0; // Database check wasn't executed before -const DB_UPDATE_SUCCESSFUL = 1; // Database check was successful -const DB_UPDATE_FAILED = 2; // Database check failed - /** * @brief Constant with a HTML line break. * @@ -63,13 +49,13 @@ define('EOL', "
\r\n"); * @brief Image storage quality. * * Lower numbers save space at cost of image detail. - * For ease of upgrade, please do not change here. Set [system] jpegquality = n in config/local.ini.php, + * For ease of upgrade, please do not change here. Set system.jpegquality = n in config/local.config.php, * where n is between 1 and 100, and with very poor results below about 50 */ define('JPEG_QUALITY', 100); /** - * [system] png_quality = n where is between 0 (uncompressed) to 9 + * system.png_quality = n where is between 0 (uncompressed) to 9 */ define('PNG_QUALITY', 8); @@ -80,10 +66,12 @@ define('PNG_QUALITY', 8); * this length (on the longest side, the other side will be scaled appropriately). * Modify this value using * - * [system] - * max_image_length = n; + * 'system' => [ + * 'max_image_length' => 'n', + * ... + * ], * - * in config/local.ini.php + * in config/local.config.php * * If you don't want to set a maximum length, set to -1. The default value is * defined by 'MAX_IMAGE_LENGTH' below. @@ -95,55 +83,12 @@ define('MAX_IMAGE_LENGTH', -1); */ define('DEFAULT_DB_ENGINE', 'InnoDB'); -/** - * @name SSL Policy - * - * SSL redirection policies - * @{ - */ -define('SSL_POLICY_NONE', 0); -define('SSL_POLICY_FULL', 1); -define('SSL_POLICY_SELFSIGN', 2); -/* @}*/ - -/** - * @name Logger - * - * log levels - * @{ - */ -define('LOGGER_WARNING', 0); -define('LOGGER_INFO', 1); -define('LOGGER_TRACE', 2); -define('LOGGER_DEBUG', 3); -define('LOGGER_DATA', 4); -define('LOGGER_ALL', 5); -/* @}*/ - -/** - * @name Register - * - * Registration policies - * @{ - */ -define('REGISTER_CLOSED', 0); -define('REGISTER_APPROVE', 1); -define('REGISTER_OPEN', 2); -/** - * @} -*/ - -/** - * @name Update - * - * DB update return values - * @{ - */ -define('UPDATE_SUCCESS', 0); -define('UPDATE_FAILED', 1); -/** - * @} - */ +/** @deprecated since version 2019.03, please use \Friendica\Module\Register::CLOSED instead */ +define('REGISTER_CLOSED', \Friendica\Module\Register::CLOSED); +/** @deprecated since version 2019.03, please use \Friendica\Module\Register::APPROVE instead */ +define('REGISTER_APPROVE', \Friendica\Module\Register::APPROVE); +/** @deprecated since version 2019.03, please use \Friendica\Module\Register::OPEN instead */ +define('REGISTER_OPEN', \Friendica\Module\Register::OPEN); /** * @name CP @@ -199,41 +144,45 @@ define('MAX_LIKERS', 75); * Email notification options * @{ */ -define('NOTIFY_INTRO', 0x0001); -define('NOTIFY_CONFIRM', 0x0002); -define('NOTIFY_WALL', 0x0004); -define('NOTIFY_COMMENT', 0x0008); -define('NOTIFY_MAIL', 0x0010); -define('NOTIFY_SUGGEST', 0x0020); -define('NOTIFY_PROFILE', 0x0040); -define('NOTIFY_TAGSELF', 0x0080); -define('NOTIFY_TAGSHARE', 0x0100); -define('NOTIFY_POKE', 0x0200); -define('NOTIFY_SHARE', 0x0400); +define('NOTIFY_INTRO', 1); +define('NOTIFY_CONFIRM', 2); +define('NOTIFY_WALL', 4); +define('NOTIFY_COMMENT', 8); +define('NOTIFY_MAIL', 16); +define('NOTIFY_SUGGEST', 32); +define('NOTIFY_PROFILE', 64); +define('NOTIFY_TAGSELF', 128); +define('NOTIFY_TAGSHARE', 256); +define('NOTIFY_POKE', 512); +define('NOTIFY_SHARE', 1024); -define('SYSTEM_EMAIL', 0x4000); +define('SYSTEM_EMAIL', 16384); -define('NOTIFY_SYSTEM', 0x8000); +define('NOTIFY_SYSTEM', 32768); /* @}*/ -/** - * @name Term - * - * Tag/term types - * @{ - */ -define('TERM_UNKNOWN', 0); -define('TERM_HASHTAG', 1); -define('TERM_MENTION', 2); -define('TERM_CATEGORY', 3); -define('TERM_PCATEGORY', 4); -define('TERM_FILE', 5); -define('TERM_SAVEDSEARCH', 6); -define('TERM_CONVERSATION', 7); +/** @deprecated since 2019.03, use Term::UNKNOWN instead */ +define('TERM_UNKNOWN', Term::UNKNOWN); +/** @deprecated since 2019.03, use Term::HASHTAG instead */ +define('TERM_HASHTAG', Term::HASHTAG); +/** @deprecated since 2019.03, use Term::MENTION instead */ +define('TERM_MENTION', Term::MENTION); +/** @deprecated since 2019.03, use Term::CATEGORY instead */ +define('TERM_CATEGORY', Term::CATEGORY); +/** @deprecated since 2019.03, use Term::PCATEGORY instead */ +define('TERM_PCATEGORY', Term::PCATEGORY); +/** @deprecated since 2019.03, use Term::FILE instead */ +define('TERM_FILE', Term::FILE); +/** @deprecated since 2019.03, use Term::SAVEDSEARCH instead */ +define('TERM_SAVEDSEARCH', Term::SAVEDSEARCH); +/** @deprecated since 2019.03, use Term::CONVERSATION instead */ +define('TERM_CONVERSATION', Term::CONVERSATION); -define('TERM_OBJ_POST', 1); -define('TERM_OBJ_PHOTO', 2); +/** @deprecated since 2019.03, use Term::OBJECT_TYPE_POST instead */ +define('TERM_OBJ_POST', Term::OBJECT_TYPE_POST); +/** @deprecated since 2019.03, use Term::OBJECT_TYPE_PHOTO instead */ +define('TERM_OBJ_PHOTO', Term::OBJECT_TYPE_PHOTO); /** * @name Namespaces @@ -245,6 +194,7 @@ define('NAMESPACE_ZOT', 'http://purl.org/zot'); define('NAMESPACE_DFRN', 'http://purl.org/macgirvin/dfrn/1.0'); define('NAMESPACE_THREAD', 'http://purl.org/syndication/thread/1.0'); define('NAMESPACE_TOMB', 'http://purl.org/atompub/tombstones/1.0'); +define('NAMESPACE_ACTIVITY2', 'https://www.w3.org/ns/activitystreams#'); define('NAMESPACE_ACTIVITY', 'http://activitystrea.ms/spec/1.0/'); define('NAMESPACE_ACTIVITY_SCHEMA', 'http://activitystrea.ms/schema/1.0/'); define('NAMESPACE_MEDIA', 'http://purl.org/syndication/atommedia'); @@ -287,6 +237,7 @@ define('ACTIVITY_FAVORITE', NAMESPACE_ACTIVITY_SCHEMA . 'favorite'); define('ACTIVITY_UNFAVORITE', NAMESPACE_ACTIVITY_SCHEMA . 'unfavorite'); define('ACTIVITY_SHARE', NAMESPACE_ACTIVITY_SCHEMA . 'share'); define('ACTIVITY_DELETE', NAMESPACE_ACTIVITY_SCHEMA . 'delete'); +define('ACTIVITY2_ANNOUNCE', NAMESPACE_ACTIVITY2 . 'Announce'); define('ACTIVITY_POKE', NAMESPACE_ZOT . '/activity/poke'); @@ -362,6 +313,8 @@ if (!defined('CURLE_OPERATION_TIMEDOUT')) { * * Useful in functions which require it but don't get it passed to them * + * @deprecated since version 2018.09 + * @see BaseObject::getApp() * @return App */ function get_app() @@ -369,41 +322,6 @@ function get_app() return BaseObject::getApp(); } -/** - * @brief Multi-purpose function to check variable state. - * - * Usage: x($var) or $x($array, 'key') - * - * returns false if variable/key is not set - * if variable is set, returns 1 if has 'non-zero' value, otherwise returns 0. - * e.g. x('') or x(0) returns 0; - * - * @param string|array $s variable to check - * @param string $k key inside the array to check - * - * @return bool|int - */ -function x($s, $k = null) -{ - if ($k != null) { - if ((is_array($s)) && (array_key_exists($k, $s))) { - if ($s[$k]) { - return (int) 1; - } - return (int) 0; - } - return false; - } else { - if (isset($s)) { - if ($s) { - return (int) 1; - } - return (int) 0; - } - return false; - } -} - /** * Return the provided variable value if it exists and is truthy or the provided * default value instead. @@ -414,13 +332,13 @@ function x($s, $k = null) * - defaults($var, $default) * - defaults($array, 'key', $default) * + * @param array $args * @brief Returns a defaut value if the provided variable or array key is falsy - * @see x() * @return mixed + * @deprecated since version 2019.06, use native coalesce operator (??) instead */ -function defaults() { - $args = func_get_args(); - +function defaults(...$args) +{ if (count($args) < 2) { throw new BadFunctionCallException('defaults() requires at least 2 parameters'); } @@ -431,158 +349,20 @@ function defaults() { throw new BadFunctionCallException('defaults($arr, $key, $def) $key is null'); } - $default = array_pop($args); + // The default value always is the last argument + $return = array_pop($args); - if (call_user_func_array('x', $args)) { - if (count($args) === 1) { - $return = $args[0]; - } else { - $return = $args[0][$args[1]]; - } - } else { - $return = $default; + if (count($args) == 2 && is_array($args[0]) && !empty($args[0][$args[1]])) { + $return = $args[0][$args[1]]; + } + + if (count($args) == 1 && !empty($args[0])) { + $return = $args[0]; } return $return; } -/** - * @brief Function to check if request was an AJAX (xmlhttprequest) request. - * - * @param boolean $via_worker boolean Is the check run via the worker? - */ -function check_db($via_worker) -{ - $build = Config::get('system', 'build'); - - if (empty($build)) { - Config::set('system', 'build', DB_UPDATE_VERSION - 1); - $build = DB_UPDATE_VERSION - 1; - } - - // We don't support upgrading from very old versions anymore - if ($build < NEW_UPDATE_ROUTINE_VERSION) { - die('You try to update from a version prior to database version 1170. The direct upgrade path is not supported. Please update to version 3.5.4 before updating to this version.'); - } - - if ($build < DB_UPDATE_VERSION) { - // When we cannot execute the database update via the worker, we will do it directly - if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) { - update_db(); - } - } -} - -/** - * @brief Automatic database updates - * @param object $a App - */ -function update_db() -{ - $build = Config::get('system', 'build'); - - if (empty($build) || ($build > DB_UPDATE_VERSION)) { - $build = DB_UPDATE_VERSION - 1; - Config::set('system', 'build', $build); - } - - if ($build != DB_UPDATE_VERSION) { - require_once 'update.php'; - - $stored = intval($build); - $current = intval(DB_UPDATE_VERSION); - if ($stored < $current) { - Config::load('database'); - - // Compare the current structure with the defined structure - $t = Config::get('database', 'dbupdate_' . DB_UPDATE_VERSION); - if (!is_null($t)) { - return; - } - - // run the pre_update_nnnn functions in update.php - for ($x = $stored + 1; $x <= $current; $x++) { - $r = run_update_function($x, 'pre_update'); - if (!$r) { - break; - } - } - - Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time()); - - // update the structure in one call - $retval = DBStructure::update(false, true); - if ($retval) { - DBStructure::updateFail( - DB_UPDATE_VERSION, - $retval - ); - return; - } else { - Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, 'success'); - } - - // run the update_nnnn functions in update.php - for ($x = $stored + 1; $x <= $current; $x++) { - $r = run_update_function($x, 'update'); - if (!$r) { - break; - } - } - } - } - - return; -} - -function run_update_function($x, $prefix) -{ - $funcname = $prefix . '_' . $x; - - if (function_exists($funcname)) { - // There could be a lot of processes running or about to run. - // We want exactly one process to run the update command. - // So store the fact that we're taking responsibility - // after first checking to see if somebody else already has. - // If the update fails or times-out completely you may need to - // delete the config entry to try again. - - $t = Config::get('database', $funcname); - if (!is_null($t)) { - return false; - } - Config::set('database', $funcname, time()); - - // call the specific update - $retval = $funcname(); - - if ($retval) { - //send the administrator an e-mail - DBStructure::updateFail( - $x, - L10n::t('Update %s failed. See error logs.', $x) - ); - return false; - } else { - Config::set('database', $funcname, 'success'); - - if ($prefix == 'update') { - Config::set('system', 'build', $x); - } - - return true; - } - } else { - Config::set('database', $funcname, 'success'); - - if ($prefix == 'update') { - Config::set('system', 'build', $x); - } - - return true; - } -} - /** * @brief Used to end the current process, after saving session state. * @deprecated @@ -614,15 +394,15 @@ function public_contact() { static $public_contact_id = false; - if (!$public_contact_id && x($_SESSION, 'authenticated')) { - if (x($_SESSION, 'my_address')) { + if (!$public_contact_id && !empty($_SESSION['authenticated'])) { + if (!empty($_SESSION['my_address'])) { // Local user $public_contact_id = intval(Contact::getIdForURL($_SESSION['my_address'], 0, true)); - } elseif (x($_SESSION, 'visitor_home')) { + } elseif (!empty($_SESSION['visitor_home'])) { // Remote user $public_contact_id = intval(Contact::getIdForURL($_SESSION['visitor_home'], 0, true)); } - } elseif (!x($_SESSION, 'authenticated')) { + } elseif (empty($_SESSION['authenticated'])) { $public_contact_id = false; } @@ -636,20 +416,14 @@ function public_contact() */ function remote_user() { - // You cannot be both local and remote. - // Unncommented by rabuzarus because remote authentication to local - // profiles wasn't possible anymore (2018-04-12). -// if (local_user()) { -// return false; -// } - - if (empty($_SESSION)) { + if (empty($_SESSION['authenticated'])) { return false; } - if (x($_SESSION, 'authenticated') && x($_SESSION, 'visitor_id')) { + if (!empty($_SESSION['visitor_id'])) { return intval($_SESSION['visitor_id']); } + return false; } @@ -666,8 +440,8 @@ function notice($s) return; } - $a = get_app(); - if (!x($_SESSION, 'sysmsg')) { + $a = \get_app(); + if (empty($_SESSION['sysmsg'])) { $_SESSION['sysmsg'] = []; } if ($a->interactive) { @@ -684,13 +458,13 @@ function notice($s) */ function info($s) { - $a = get_app(); + $a = \get_app(); if (local_user() && PConfig::get(local_user(), 'system', 'ignore_info')) { return; } - if (!x($_SESSION, 'sysmsg_info')) { + if (empty($_SESSION['sysmsg_info'])) { $_SESSION['sysmsg_info'] = []; } if ($a->interactive) { @@ -747,46 +521,13 @@ function feed_birthday($uid, $tz) */ function is_site_admin() { - $a = get_app(); + $a = \get_app(); $admin_email = Config::get('config', 'admin_email'); $adminlist = explode(',', str_replace(' ', '', $admin_email)); - return local_user() && $admin_email && in_array(defaults($a->user, 'email', ''), $adminlist); -} - -/** - * @brief Returns querystring as string from a mapped array. - * - * @param array $params mapped array with query parameters - * @param string $name of parameter, default null - * - * @return string - */ -function build_querystring($params, $name = null) -{ - $ret = ""; - foreach ($params as $key => $val) { - if (is_array($val)) { - /// @TODO maybe not compare against null, use is_null() - if ($name == null) { - $ret .= build_querystring($val, $key); - } else { - $ret .= build_querystring($val, $name . "[$key]"); - } - } else { - $val = urlencode($val); - /// @TODO maybe not compare against null, use is_null() - if ($name != null) { - /// @TODO two string concated, can be merged to one - $ret .= $name . "[$key]" . "=$val&"; - } else { - $ret .= "$key=$val&"; - } - } - } - return $ret; + return local_user() && $admin_email && in_array($a->user['email'] ?? '', $adminlist); } function explode_querystring($query) @@ -843,16 +584,6 @@ function curPageURL() return $pageURL; } -function random_digits($digits) -{ - $rn = ''; - for ($i = 0; $i < $digits; $i++) { - /// @TODO Avoid rand/mt_rand, when it comes to cryptography, they are generating predictable (seedable) numbers. - $rn .= rand(0, 9); - } - return $rn; -} - function get_server() { $server = Config::get("system", "directory"); @@ -866,22 +597,22 @@ function get_server() function get_temppath() { - $a = get_app(); + $a = \get_app(); $temppath = Config::get("system", "temppath"); - if (($temppath != "") && App::isDirectoryUsable($temppath)) { + if (($temppath != "") && System::isDirectoryUsable($temppath)) { // We have a temp path and it is usable - return App::getRealPath($temppath); + return BasePath::getRealPath($temppath); } // We don't have a working preconfigured temp path, so we take the system path. $temppath = sys_get_temp_dir(); // Check if it is usable - if (($temppath != "") && App::isDirectoryUsable($temppath)) { + if (($temppath != "") && System::isDirectoryUsable($temppath)) { // Always store the real path, not the path through symlinks - $temppath = App::getRealPath($temppath); + $temppath = BasePath::getRealPath($temppath); // To avoid any interferences with other systems we create our own directory $new_temppath = $temppath . "/" . $a->getHostName(); @@ -890,7 +621,7 @@ function get_temppath() mkdir($new_temppath); } - if (App::isDirectoryUsable($new_temppath)) { + if (System::isDirectoryUsable($new_temppath)) { // The new path is usable, we are happy Config::set("system", "temppath", $new_temppath); return $new_temppath; @@ -972,8 +703,8 @@ function get_itemcachepath() } $itemcache = Config::get('system', 'itemcache'); - if (($itemcache != "") && App::isDirectoryUsable($itemcache)) { - return App::getRealPath($itemcache); + if (($itemcache != "") && System::isDirectoryUsable($itemcache)) { + return BasePath::getRealPath($itemcache); } $temppath = get_temppath(); @@ -984,7 +715,7 @@ function get_itemcachepath() mkdir($itemcache); } - if (App::isDirectoryUsable($itemcache)) { + if (System::isDirectoryUsable($itemcache)) { Config::set("system", "itemcache", $itemcache); return $itemcache; } @@ -1000,7 +731,7 @@ function get_itemcachepath() function get_spoolpath() { $spoolpath = Config::get('system', 'spoolpath'); - if (($spoolpath != "") && App::isDirectoryUsable($spoolpath)) { + if (($spoolpath != "") && System::isDirectoryUsable($spoolpath)) { // We have a spool path and it is usable return $spoolpath; } @@ -1015,7 +746,7 @@ function get_spoolpath() mkdir($spoolpath); } - if (App::isDirectoryUsable($spoolpath)) { + if (System::isDirectoryUsable($spoolpath)) { // The new path is usable, we are happy Config::set("system", "spoolpath", $spoolpath); return $spoolpath; @@ -1069,3 +800,22 @@ function validate_include(&$file) // Simply return flag return $valid; } + +/** + * PHP 5 compatible dirname() with count parameter + * + * @see http://php.net/manual/en/function.dirname.php#113193 + * + * @deprecated with PHP 7 + * @param string $path + * @param int $levels + * @return string + */ +function rdirname($path, $levels = 1) +{ + if ($levels > 1) { + return dirname(rdirname($path, --$levels)); + } else { + return dirname($path); + } +} diff --git a/composer.json b/composer.json index 5df9a5355..9ed9017d8 100644 --- a/composer.json +++ b/composer.json @@ -13,32 +13,55 @@ "issues": "https://github.com/friendica/friendica/issues" }, "require": { - "php": ">=5.6.1", + "php": ">=7.0", + "ext-ctype": "*", + "ext-curl": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-simplexml": "*", "ext-xml": "*", "asika/simple-console": "^1.0", + "bacon/bacon-qr-code": "^1.0", "divineomega/password_exposed": "^2.4", "ezyang/htmlpurifier": "~4.7.0", "friendica/json-ld": "^1.0", "league/html-to-markdown": "~4.8.0", + "level-2/dice": ">1.0", "lightopenid/lightopenid": "dev-master", "michelf/php-markdown": "^1.7", "mobiledetect/mobiledetectlib": "2.8.*", - "paragonie/random_compat": "^2.0", - "pear/Text_LanguageDetect": "1.*", + "monolog/monolog": "^1.24", + "nikic/fast-route": "^1.3", + "paragonie/hidden-string": "^1.0", + "pear/console_table": "^1.3", + "pear/text_languagedetect": "1.*", + "pragmarx/google2fa": "^5.0", + "pragmarx/recovery": "^0.1.0", + "psr/container": "^1.0", "seld/cli-prompt": "^1.0", "smarty/smarty": "^3.1", "fxp/composer-asset-plugin": "~1.3", "bower-asset/base64": "^1.0", - "bower-asset/Chart-js": "^2.7", + "bower-asset/chart-js": "^2.7", + "bower-asset/dompurify": "^1.0", "bower-asset/perfect-scrollbar": "^0.6", "bower-asset/vue": "^2.5", "npm-asset/jquery": "^2.0", "npm-asset/jquery-colorbox": "^1.6", "npm-asset/jquery-datetimepicker": "^2.4.0", "npm-asset/jgrowl": "^1.4", + "npm-asset/moment": "^2.20.1", "npm-asset/fullcalendar": "^3.0.1", "npm-asset/cropperjs": "1.2.2", - "npm-asset/imagesloaded": "4.1.4" + "npm-asset/imagesloaded": "4.1.4", + "npm-asset/typeahead.js": "^0.11.1", + "bower-asset/fork-awesome": "^1.1" }, "repositories": [ { @@ -49,11 +72,20 @@ "autoload": { "psr-4": { "Friendica\\": "src/", - "Friendica\\Test\\": "tests/" + "Friendica\\Test\\": "tests/", + "Friendica\\Addon\\": "addon/" }, "psr-0": { "": "library/" - } + }, + "files": [ + "include/conversation.php", + "include/dba.php", + "include/enotify.php", + "include/items.php", + "include/text.php", + "boot.php" + ] }, "config": { "autoloader-suffix": "Friendica", @@ -68,15 +100,27 @@ }, "archive": { "exclude": [ - "log", "cache", "/photo", "/proxy" + "/.*", + "/*file", + "!/.htaccess-dist", + "/tests", + "/*.xml", + "/composer.*", + "/log", + "/cache", + "/photo", + "/proxy", + "/addon", + "!/vendor", + "!/view/asset" ] }, "require-dev": { - "phpunit/dbunit": "^2.0", "phpdocumentor/reflection-docblock": "^3.0.2", "phpunit/php-token-stream": "^1.4.2", - "mikey179/vfsStream": "^1.6", - "mockery/mockery": "^1.2" + "mikey179/vfsstream": "^1.6", + "mockery/mockery": "^1.2", + "johnkary/phpunit-speedtrap": "1.1" }, "scripts": { "test": "phpunit" diff --git a/composer.lock b/composer.lock index 9230bb4db..3aad3a154 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9f0dbeccbae197460a0ce74a940177cd", + "content-hash": "eda94f02683bea49b3d506d770749277", "packages": [ { "name": "asika/simple-console", @@ -40,17 +40,63 @@ "time": "2018-03-08T12:05:40+00:00" }, { - "name": "bower-asset/Chart-js", - "version": "v2.7.2", + "name": "bacon/bacon-qr-code", + "version": "1.0.3", "source": { "type": "git", - "url": "https://github.com/chartjs/Chart.js.git", - "reference": "98f104cdd03617f1300b417b3d60c23d4e3e3403" + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "5a91b62b9d37cee635bbf8d553f4546057250bee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chartjs/Chart.js/zipball/98f104cdd03617f1300b417b3d60c23d4e3e3403", - "reference": "98f104cdd03617f1300b417b3d60c23d4e3e3403", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/5a91b62b9d37cee635bbf8d553f4546057250bee", + "reference": "5a91b62b9d37cee635bbf8d553f4546057250bee", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": "^5.4|^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8" + }, + "suggest": { + "ext-gd": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-0": { + "BaconQrCode": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "http://www.dasprids.de", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "time": "2017-10-17T09:59:25+00:00" + }, + { + "name": "bower-asset/Chart-js", + "version": "v2.8.0", + "source": { + "type": "git", + "url": "https://github.com/chartjs/Chart.js.git", + "reference": "947d8a7ccfbfc76dd9d384ea75436fa4a7aeefb1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/chartjs/Chart.js/zipball/947d8a7ccfbfc76dd9d384ea75436fa4a7aeefb1", + "reference": "947d8a7ccfbfc76dd9d384ea75436fa4a7aeefb1", "shasum": "" }, "type": "bower-asset-library", @@ -69,20 +115,20 @@ "MIT" ], "description": "Simple HTML5 charts using the canvas element.", - "time": "2018-03-01T21:45:21+00:00" + "time": "2019-03-14T13:03:00+00:00" }, { "name": "bower-asset/base64", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/davidchambers/Base64.js.git", - "reference": "b2d49f347ed1bce61000a82769bffc837b7c79dc" + "reference": "10f0e9990dab0a73009fc106ff2b88102a0a13cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/davidchambers/Base64.js/zipball/b2d49f347ed1bce61000a82769bffc837b7c79dc", - "reference": "b2d49f347ed1bce61000a82769bffc837b7c79dc", + "url": "https://api.github.com/repos/davidchambers/Base64.js/zipball/10f0e9990dab0a73009fc106ff2b88102a0a13cf", + "reference": "10f0e9990dab0a73009fc106ff2b88102a0a13cf", "shasum": "" }, "type": "bower-asset-library", @@ -100,7 +146,96 @@ "WTFPL" ], "description": "Base64 encoding and decoding", - "time": "2017-03-25T21:16:21+00:00" + "time": "2019-02-12T17:19:36+00:00" + }, + { + "name": "bower-asset/dompurify", + "version": "1.0.11", + "source": { + "type": "git", + "url": "https://github.com/cure53/DOMPurify.git", + "reference": "3c1c0d7e11cda896b0c69cf82e0ca6e0c0e7dd38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cure53/DOMPurify/zipball/3c1c0d7e11cda896b0c69cf82e0ca6e0c0e7dd38", + "reference": "3c1c0d7e11cda896b0c69cf82e0ca6e0c0e7dd38", + "shasum": "" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": "src/purify.js", + "bower-asset-ignore": [ + "**/.*", + "demos", + "scripts", + "test", + "website" + ] + }, + "license": [ + "MPL-2.0", + "Apache-2.0" + ], + "description": "A DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG", + "keywords": [ + "cross site scripting", + "dom", + "filter", + "html", + "mathml", + "sanitize", + "sanitizer", + "secure", + "security", + "svg", + "xss" + ], + "time": "2019-06-18T13:33:05+00:00" + }, + { + "name": "bower-asset/fork-awesome", + "version": "1.1.7", + "source": { + "type": "git", + "url": "https://github.com/ForkAwesome/Fork-Awesome.git", + "reference": "326af9c8bee0c80ff4c00cb2fadd4f1edd2a08c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ForkAwesome/Fork-Awesome/zipball/326af9c8bee0c80ff4c00cb2fadd4f1edd2a08c3", + "reference": "326af9c8bee0c80ff4c00cb2fadd4f1edd2a08c3", + "shasum": "" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": [ + "less/fork-awesome.less", + "scss/fork-awesome.scss" + ], + "bower-asset-ignore": [ + "*/.*", + "*.json", + "src", + "*.yml", + "Gemfile", + "Gemfile.lock", + "*.md" + ] + }, + "license": [ + "OFL-1.1", + "MIT", + "CC-BY-3.0" + ], + "description": "Fork Awesome", + "keywords": [ + "awesome", + "font", + "fork", + "icon" + ], + "time": "2019-02-28T15:21:34+00:00" }, { "name": "bower-asset/perfect-scrollbar", @@ -135,35 +270,37 @@ }, { "name": "bower-asset/vue", - "version": "v2.5.17", + "version": "v2.6.10", "source": { "type": "git", "url": "https://github.com/vuejs/vue.git", - "reference": "636c9b4ef17f2062720b677cbbe613f146f4d4db" + "reference": "e90cc60c4718a69e2c919275a999b7370141f3bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vuejs/vue/zipball/636c9b4ef17f2062720b677cbbe613f146f4d4db", - "reference": "636c9b4ef17f2062720b677cbbe613f146f4d4db", + "url": "https://api.github.com/repos/vuejs/vue/zipball/e90cc60c4718a69e2c919275a999b7370141f3bf", + "reference": "e90cc60c4718a69e2c919275a999b7370141f3bf", "shasum": "" }, "type": "bower-asset-library" }, { "name": "divineomega/do-file-cache", - "version": "v2.0.2", + "version": "v2.0.6", "source": { "type": "git", "url": "https://github.com/DivineOmega/DO-File-Cache.git", - "reference": "261c6e30a0de8cd325f826d08b2e51b2e367a1a3" + "reference": "23696a8a4c3ebe2ab3d68a35b2698fa103f69334" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DivineOmega/DO-File-Cache/zipball/261c6e30a0de8cd325f826d08b2e51b2e367a1a3", - "reference": "261c6e30a0de8cd325f826d08b2e51b2e367a1a3", + "url": "https://api.github.com/repos/DivineOmega/DO-File-Cache/zipball/23696a8a4c3ebe2ab3d68a35b2698fa103f69334", + "reference": "23696a8a4c3ebe2ab3d68a35b2698fa103f69334", "shasum": "" }, "require": { + "ext-json": "*", + "ext-zlib": "*", "php": ">=5.6" }, "require-dev": { @@ -194,7 +331,7 @@ "library", "php" ], - "time": "2018-09-12T23:08:34+00:00" + "time": "2018-12-31T09:36:51+00:00" }, { "name": "divineomega/do-file-cache-psr-6", @@ -240,28 +377,28 @@ }, { "name": "divineomega/password_exposed", - "version": "v2.5.3", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/DivineOmega/password_exposed.git", - "reference": "1f1b49e3ec55b0f07115d342b145091368b081c4" + "reference": "908ed8e62ef95411bd0f866e29c69cef2bbca880" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DivineOmega/password_exposed/zipball/1f1b49e3ec55b0f07115d342b145091368b081c4", - "reference": "1f1b49e3ec55b0f07115d342b145091368b081c4", + "url": "https://api.github.com/repos/DivineOmega/password_exposed/zipball/908ed8e62ef95411bd0f866e29c69cef2bbca880", + "reference": "908ed8e62ef95411bd0f866e29c69cef2bbca880", "shasum": "" }, "require": { "divineomega/do-file-cache-psr-6": "^2.0", "guzzlehttp/guzzle": "^6.3", - "paragonie/certainty": "^1", + "paragonie/certainty": "^1|^2", "php": ">=5.6" }, "require-dev": { "fzaninotto/faker": "^1.7", "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5.7", + "phpunit/phpunit": "^6.5", "vimeo/psalm": "^1" }, "type": "library", @@ -284,7 +421,7 @@ } ], "description": "This PHP package provides a `password_exposed` helper function, that uses the haveibeenpwned.com API to check if a password has been exposed in a data breach.", - "time": "2018-07-12T22:09:43+00:00" + "time": "2019-01-25T12:00:28+00:00" }, { "name": "ezyang/htmlpurifier", @@ -376,16 +513,16 @@ }, { "name": "fxp/composer-asset-plugin", - "version": "v1.4.4", + "version": "v1.4.6", "source": { "type": "git", "url": "https://github.com/fxpio/composer-asset-plugin.git", - "reference": "0d07328eef6e6f3753aa835fd2faef7fed1717bf" + "reference": "886ece037849d3935c5a34cdcd984e46f2de5fae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fxpio/composer-asset-plugin/zipball/0d07328eef6e6f3753aa835fd2faef7fed1717bf", - "reference": "0d07328eef6e6f3753aa835fd2faef7fed1717bf", + "url": "https://api.github.com/repos/fxpio/composer-asset-plugin/zipball/886ece037849d3935c5a34cdcd984e46f2de5fae", + "reference": "886ece037849d3935c5a34cdcd984e46f2de5fae", "shasum": "" }, "require": { @@ -431,7 +568,7 @@ "npm", "package" ], - "time": "2018-07-02T11:37:17+00:00" + "time": "2019-08-08T18:36:07+00:00" }, { "name": "guzzlehttp/guzzle", @@ -551,32 +688,37 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.4.2", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", "shasum": "" }, "require": { "php": ">=5.4.0", - "psr/http-message": "~1.0" + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" }, "provide": { "psr/http-message-implementation": "1.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.6-dev" } }, "autoload": { @@ -606,26 +748,27 @@ "keywords": [ "http", "message", + "psr-7", "request", "response", "stream", "uri", "url" ], - "time": "2017-03-20T17:10:46+00:00" + "time": "2019-07-01T23:21:34+00:00" }, { "name": "league/html-to-markdown", - "version": "4.8.0", + "version": "4.8.2", "source": { "type": "git", "url": "https://github.com/thephpleague/html-to-markdown.git", - "reference": "f9a879a068c68ff47b722de63f58bec79e448f9d" + "reference": "e747489191f8e9144a7270eb61f8b9516e99e413" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/f9a879a068c68ff47b722de63f58bec79e448f9d", - "reference": "f9a879a068c68ff47b722de63f58bec79e448f9d", + "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/e747489191f8e9144a7270eb61f8b9516e99e413", + "reference": "e747489191f8e9144a7270eb61f8b9516e99e413", "shasum": "" }, "require": { @@ -657,17 +800,17 @@ "MIT" ], "authors": [ - { - "name": "Nick Cernis", - "email": "nick@cern.is", - "homepage": "http://modernnerd.net", - "role": "Original Author" - }, { "name": "Colin O'Dell", "email": "colinodell@gmail.com", "homepage": "https://www.colinodell.com", "role": "Lead Developer" + }, + { + "name": "Nick Cernis", + "email": "nick@cern.is", + "homepage": "http://modernnerd.net", + "role": "Original Author" } ], "description": "An HTML-to-markdown conversion helper for PHP", @@ -676,7 +819,53 @@ "html", "markdown" ], - "time": "2018-09-18T12:18:08+00:00" + "time": "2019-08-02T11:57:39+00:00" + }, + { + "name": "level-2/dice", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/Level-2/Dice.git", + "reference": "e631f110f0520294fec902814c61cac26566023c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Level-2/Dice/zipball/e631f110f0520294fec902814c61cac26566023c", + "reference": "e631f110f0520294fec902814c61cac26566023c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Dice\\": "./" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Tom Butler", + "email": "tom@r.je" + } + ], + "description": "A minimalist Dependency injection container (DIC) for PHP. Please note: 3.0+ is only compatible with PHP 7.0. The 2.0 branch is compatbile with PHP 5.6.", + "homepage": "http://r.je/dice.html", + "keywords": [ + "dependency injection", + "dependency injection container", + "di", + "ioc" + ], + "time": "2019-05-01T12:55:36+00:00" }, { "name": "lightopenid/lightopenid", @@ -759,16 +948,16 @@ }, { "name": "mobiledetect/mobiledetectlib", - "version": "2.8.33", + "version": "2.8.34", "source": { "type": "git", "url": "https://github.com/serbanghita/Mobile-Detect.git", - "reference": "cd385290f9a0d609d2eddd165a1e44ec1bf12102" + "reference": "6f8113f57a508494ca36acbcfa2dc2d923c7ed5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/cd385290f9a0d609d2eddd165a1e44ec1bf12102", - "reference": "cd385290f9a0d609d2eddd165a1e44ec1bf12102", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/6f8113f57a508494ca36acbcfa2dc2d923c7ed5b", + "reference": "6f8113f57a508494ca36acbcfa2dc2d923c7ed5b", "shasum": "" }, "require": { @@ -807,7 +996,131 @@ "mobile detector", "php mobile detect" ], - "time": "2018-09-01T15:05:15+00:00" + "time": "2019-09-18T18:44:20+00:00" + }, + { + "name": "monolog/monolog", + "version": "1.25.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "70e65a5470a42cfec1a7da00d30edb6e617e8dcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/70e65a5470a42cfec1a7da00d30edb6e617e8dcf", + "reference": "70e65a5470a42cfec1a7da00d30edb6e617e8dcf", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2019-09-06T13:49:17+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "FastRoute\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "time": "2018-02-13T20:26:39+00:00" }, { "name": "npm-asset/cropperjs", @@ -815,7 +1128,6 @@ "dist": { "type": "tar", "url": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.2.2.tgz", - "reference": null, "shasum": "30dc7a7ce872155b23a33bd10ad4c76c0d613f55" }, "require-dev": { @@ -909,7 +1221,6 @@ "dist": { "type": "tar", "url": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-1.1.1.tgz", - "reference": null, "shasum": "8f18b0ce5c76a5d18017f71c0a795c65b9138f2a" }, "type": "npm-asset-library", @@ -948,32 +1259,17 @@ }, { "name": "npm-asset/fullcalendar", - "version": "3.9.0", + "version": "3.10.1", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.9.0.tgz", - "reference": null, - "shasum": "b608a9989f3416f0b1d526c6bdfeeaf2ac79eda5" - }, - "require": { - "npm-asset/jquery": ">=2,<4.0", - "npm-asset/moment": ">=2.20.1,<3.0.0" + "url": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.10.1.tgz", + "shasum": "cca3f9a2656a7e978a3f3facb7f35934a91185db" }, "type": "npm-asset-library", "extra": { "npm-asset-bugs": { "url": "https://fullcalendar.io/wiki/Reporting-Bugs/" }, - "npm-asset-files": [ - "dist/*.js", - "dist/*.css", - "dist/*.d.ts", - "dist/locale/*.js", - "README.*", - "LICENSE.*", - "CHANGELOG.*", - "CONTRIBUTING.*" - ], "npm-asset-main": "dist/fullcalendar.js", "npm-asset-directories": [], "npm-asset-repository": { @@ -983,7 +1279,7 @@ "npm-asset-scripts": { "clean": "gulp clean", "dist": "gulp dist", - "lint": "gulp lint", + "lint": "gulp lint-and-example-repos", "test": "gulp test:single" } }, @@ -1005,7 +1301,7 @@ "full-sized", "jquery-plugin" ], - "time": "2018-03-05T03:30:23+00:00" + "time": "2019-08-10T16:05:46+00:00" }, { "name": "npm-asset/imagesloaded", @@ -1013,7 +1309,6 @@ "dist": { "type": "tar", "url": "https://registry.npmjs.org/imagesloaded/-/imagesloaded-4.1.4.tgz", - "reference": null, "shasum": "1376efcd162bb768c34c3727ac89cc04051f3cc7" }, "require": { @@ -1077,7 +1372,6 @@ "dist": { "type": "tar", "url": "https://registry.npmjs.org/jgrowl/-/jgrowl-1.4.6.tgz", - "reference": null, "shasum": "2736e332aaee73ccf0a14a5f0066391a0a13f4a3" }, "require-dev": { @@ -1118,7 +1412,6 @@ "dist": { "type": "tar", "url": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", - "reference": null, "shasum": "2c89d6889b5eac522a7eea32c14521559c6cbf02" }, "require-dev": { @@ -1189,7 +1482,6 @@ "dist": { "type": "tar", "url": "https://registry.npmjs.org/jquery-colorbox/-/jquery-colorbox-1.6.4.tgz", - "reference": null, "shasum": "799452523a6c494839224ef702e807deb9c06cc5" }, "require": { @@ -1232,12 +1524,11 @@ }, { "name": "npm-asset/jquery-datetimepicker", - "version": "2.5.20", + "version": "2.5.21", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/jquery-datetimepicker/-/jquery-datetimepicker-2.5.20.tgz", - "reference": null, - "shasum": "687d6204b90b03dc93f725f8df036e1d061f37ac" + "url": "https://registry.npmjs.org/jquery-datetimepicker/-/jquery-datetimepicker-2.5.21.tgz", + "shasum": "00c388a78df2732fedfdb5c6529b6e84d53e0235" }, "require": { "npm-asset/jquery": ">=1.7.2", @@ -1286,7 +1577,7 @@ "time", "timepicker" ], - "time": "2018-03-21T16:26:39+00:00" + "time": "2019-02-23T11:25:30+00:00" }, { "name": "npm-asset/jquery-mousewheel", @@ -1294,7 +1585,6 @@ "dist": { "type": "tar", "url": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz", - "reference": null, "shasum": "06f0335f16e353a695e7206bf50503cb523a6ee5" }, "require-dev": { @@ -1345,12 +1635,11 @@ }, { "name": "npm-asset/moment", - "version": "2.22.2", + "version": "2.24.0", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "reference": null, - "shasum": "3c257f9839fc0e93ff53149632239eb90783ff66" + "url": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "shasum": "0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" }, "type": "npm-asset-library", "extra": { @@ -1420,7 +1709,7 @@ "time", "validate" ], - "time": "2018-06-01T06:58:41+00:00" + "time": "2019-01-21T21:10:34+00:00" }, { "name": "npm-asset/php-date-formatter", @@ -1460,29 +1749,83 @@ "homepage": "https://github.com/kartik-v/php-date-formatter", "time": "2018-07-13T06:56:46+00:00" }, + { + "name": "npm-asset/typeahead.js", + "version": "0.11.1", + "dist": { + "type": "tar", + "url": "https://registry.npmjs.org/typeahead.js/-/typeahead.js-0.11.1.tgz", + "shasum": "4e64e671b22310a8606f4aec805924ba84b015b8" + }, + "require": { + "npm-asset/jquery": ">=1.7" + }, + "type": "npm-asset-library", + "extra": { + "npm-asset-bugs": { + "url": "https://github.com/twitter/typeahead.js/issues" + }, + "npm-asset-main": "dist/typeahead.bundle.js", + "npm-asset-directories": [], + "npm-asset-repository": { + "type": "git", + "url": "https://github.com/twitter/typeahead.js.git" + }, + "npm-asset-scripts": { + "test": "./node_modules/karma/bin/karma start --single-run --browsers PhantomJS" + } + }, + "authors": [ + { + "name": "Twitter, Inc.", + "url": "https://twitter.com/twitteross" + }, + { + "name": "Jake Harding", + "url": "https://twitter.com/JakeHarding" + }, + { + "name": "Tim Trueman", + "url": "https://twitter.com/timtrueman" + }, + { + "name": "Veljko Skarich", + "url": "https://twitter.com/vskarich" + } + ], + "description": "fast and fully-featured autocomplete library", + "homepage": "http://twitter.github.com/typeahead.js", + "keywords": [ + "autocomplete", + "typeahead" + ], + "time": "2015-04-27T04:03:42+00:00" + }, { "name": "paragonie/certainty", - "version": "v1.0.4", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/paragonie/certainty.git", - "reference": "d0f22c0fe579cf0e4f8ee301de5bc97ab124faac" + "reference": "cc39b91595e577fdff6128d7ce787892bd117274" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/certainty/zipball/d0f22c0fe579cf0e4f8ee301de5bc97ab124faac", - "reference": "d0f22c0fe579cf0e4f8ee301de5bc97ab124faac", + "url": "https://api.github.com/repos/paragonie/certainty/zipball/cc39b91595e577fdff6128d7ce787892bd117274", + "reference": "cc39b91595e577fdff6128d7ce787892bd117274", "shasum": "" }, "require": { + "ext-curl": "*", + "ext-json": "*", "guzzlehttp/guzzle": "^6", "paragonie/constant_time_encoding": "^1|^2", - "paragonie/sodium_compat": "^1.6", - "php": "^5.6|^7" + "paragonie/sodium_compat": "^1.11", + "php": "^5.5|^7" }, "require-dev": { - "phpunit/phpunit": "^5|^6", - "vimeo/psalm": "^1" + "composer/composer": "^1", + "phpunit/phpunit": "^4|^5|^6" }, "bin": [ "bin/certainty-cert-symlink" @@ -1518,29 +1861,28 @@ "ssl", "tls" ], - "time": "2018-04-09T07:21:55+00:00" + "time": "2019-09-27T22:26:33+00:00" }, { "name": "paragonie/constant_time_encoding", - "version": "v1.0.4", + "version": "v2.2.3", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "2132f0f293d856026d7d11bd81b9f4a23a1dc1f6" + "reference": "55af0dc01992b4d0da7f6372e2eac097bbbaffdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/2132f0f293d856026d7d11bd81b9f4a23a1dc1f6", - "reference": "2132f0f293d856026d7d11bd81b9f4a23a1dc1f6", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/55af0dc01992b4d0da7f6372e2eac097bbbaffdb", + "reference": "55af0dc01992b4d0da7f6372e2eac097bbbaffdb", "shasum": "" }, "require": { - "php": "^5.3|^7" + "php": "^7" }, "require-dev": { - "paragonie/random_compat": "^1.4|^2", - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^0.3|^1" + "phpunit/phpunit": "^6|^7", + "vimeo/psalm": "^1|^2" }, "type": "library", "autoload": { @@ -1581,37 +1923,82 @@ "hex2bin", "rfc4648" ], - "time": "2018-04-30T17:57:16+00:00" + "time": "2019-01-03T20:26:31+00:00" }, { - "name": "paragonie/random_compat", - "version": "v2.0.17", + "name": "paragonie/hidden-string", + "version": "v1.0.0", "source": { "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d" + "url": "https://github.com/paragonie/hidden-string.git", + "reference": "0bbb00be0e33b8e1d48fa79ea35cd42d3091a936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/29af24f25bab834fcbb38ad2a69fa93b867e070d", - "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d", + "url": "https://api.github.com/repos/paragonie/hidden-string/zipball/0bbb00be0e33b8e1d48fa79ea35cd42d3091a936", + "reference": "0bbb00be0e33b8e1d48fa79ea35cd42d3091a936", "shasum": "" }, "require": { - "php": ">=5.2.0" + "paragonie/constant_time_encoding": "^2", + "paragonie/sodium_compat": "^1.6", + "php": "^7" }, "require-dev": { - "phpunit/phpunit": "4.*|5.*" + "phpunit/phpunit": "^6|^7", + "vimeo/psalm": "^1" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\HiddenString\\": "./src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MPL-2.0" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "info@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "Encapsulate strings in an object to hide them from stack traces", + "homepage": "https://github.com/paragonie/hidden-string", + "keywords": [ + "hidden", + "stack trace", + "string" + ], + "time": "2018-05-07T20:28:06+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" }, "suggest": { "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, "type": "library", - "autoload": { - "files": [ - "lib/random.php" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -1630,25 +2017,25 @@ "pseudorandom", "random" ], - "time": "2018-07-04T16:31:37+00:00" + "time": "2018-07-02T15:55:56+00:00" }, { "name": "paragonie/sodium_compat", - "version": "v1.7.0", + "version": "v1.11.1", "source": { "type": "git", "url": "https://github.com/paragonie/sodium_compat.git", - "reference": "7b73005be3c224f12c47bd75a23ce24b762e47e8" + "reference": "a9f968bc99485f85f9303a8524c3485a7e87bc15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/7b73005be3c224f12c47bd75a23ce24b762e47e8", - "reference": "7b73005be3c224f12c47bd75a23ce24b762e47e8", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/a9f968bc99485f85f9303a8524c3485a7e87bc15", + "reference": "a9f968bc99485f85f9303a8524c3485a7e87bc15", "shasum": "" }, "require": { "paragonie/random_compat": ">=1", - "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7" + "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8" }, "require-dev": { "phpunit/phpunit": "^3|^4|^5" @@ -1712,7 +2099,62 @@ "secret-key cryptography", "side-channel resistant" ], - "time": "2018-09-22T03:59:58+00:00" + "time": "2019-09-12T12:05:58+00:00" + }, + { + "name": "pear/console_table", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/pear/Console_Table.git", + "reference": "1930c11897ca61fd24b95f2f785e99e0f36dcdea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/Console_Table/zipball/1930c11897ca61fd24b95f2f785e99e0f36dcdea", + "reference": "1930c11897ca61fd24b95f2f785e99e0f36dcdea", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "suggest": { + "pear/Console_Color2": ">=0.1.2" + }, + "type": "library", + "autoload": { + "classmap": [ + "Table.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Jan Schneider", + "homepage": "http://pear.php.net/user/yunosh" + }, + { + "name": "Tal Peer", + "homepage": "http://pear.php.net/user/tal" + }, + { + "name": "Xavier Noguer", + "homepage": "http://pear.php.net/user/xnoguer" + }, + { + "name": "Richard Heyes", + "homepage": "http://pear.php.net/user/richard" + } + ], + "description": "Library that makes it easy to build console style tables.", + "homepage": "http://pear.php.net/package/Console_Table/", + "keywords": [ + "console" + ], + "time": "2018-01-25T20:47:17+00:00" }, { "name": "pear/text_languagedetect", @@ -1758,6 +2200,189 @@ "homepage": "http://pear.php.net/package/Text_LanguageDetect", "time": "2017-03-02T16:14:08+00:00" }, + { + "name": "pragmarx/google2fa", + "version": "v5.0.0", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "17c969c82f427dd916afe4be50bafc6299aef1b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/17c969c82f427dd916afe4be50bafc6299aef1b4", + "reference": "17c969c82f427dd916afe4be50bafc6299aef1b4", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "~1.0|~2.0", + "paragonie/random_compat": ">=1", + "php": ">=5.4", + "symfony/polyfill-php56": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4|~5|~6" + }, + "type": "library", + "extra": { + "component": "package", + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/", + "PragmaRX\\Google2FA\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], + "time": "2019-03-19T22:44:16+00:00" + }, + { + "name": "pragmarx/random", + "version": "v0.2.2", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/random.git", + "reference": "daf08a189c5d2d40d1a827db46364d3a741a51b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/random/zipball/daf08a189c5d2d40d1a827db46364d3a741a51b7", + "reference": "daf08a189c5d2d40d1a827db46364d3a741a51b7", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "fzaninotto/faker": "~1.7", + "phpunit/phpunit": "~6.4", + "pragmarx/trivia": "~0.1", + "squizlabs/php_codesniffer": "^2.3" + }, + "suggest": { + "fzaninotto/faker": "Allows you to get dozens of randomized types", + "pragmarx/trivia": "For the trivia database" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "PragmaRX\\Random\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "homepage": "https://antoniocarlosribeiro.com", + "role": "Developer" + } + ], + "description": "Create random chars, numbers, strings", + "homepage": "https://github.com/antonioribeiro/random", + "keywords": [ + "Randomize", + "faker", + "pragmarx", + "random", + "random number", + "random pattern", + "random string" + ], + "time": "2017-11-21T05:26:22+00:00" + }, + { + "name": "pragmarx/recovery", + "version": "v0.1.0", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/recovery.git", + "reference": "e16573a1ae5345cc3b100eec6d0296a1a15a90fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/recovery/zipball/e16573a1ae5345cc3b100eec6d0296a1a15a90fe", + "reference": "e16573a1ae5345cc3b100eec6d0296a1a15a90fe", + "shasum": "" + }, + "require": { + "php": "~7.0", + "pragmarx/random": "~0.1" + }, + "require-dev": { + "phpunit/phpunit": ">=5.4.3", + "squizlabs/php_codesniffer": "^2.3", + "tightenco/collect": "^5" + }, + "suggest": { + "tightenco/collect": "Allows to generate recovery codes as collections" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "PragmaRX\\Recovery\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "homepage": "https://antoniocarlosribeiro.com", + "role": "Developer" + } + ], + "description": "Create recovery codes for two factor auth", + "homepage": "https://github.com/antonioribeiro/recovery", + "keywords": [ + "2fa", + "account recovery", + "auth", + "backup codes", + "google2fa", + "pragmarx", + "recovery", + "recovery codes", + "two factor auth" + ], + "time": "2017-09-19T16:58:00+00:00" + }, { "name": "psr/cache", "version": "1.0.1", @@ -1804,6 +2429,55 @@ ], "time": "2016-08-06T20:24:11+00:00" }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, { "name": "psr/http-message", "version": "1.0.1", @@ -1854,6 +2528,93 @@ ], "time": "2016-08-06T14:39:51+00:00" }, + { + "name": "psr/log", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2018-11-20T15:27:04+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, { "name": "seld/cli-prompt", "version": "1.0.3", @@ -1954,37 +2715,147 @@ "templating" ], "time": "2018-09-12T20:54:16+00:00" + }, + { + "name": "symfony/polyfill-php56", + "version": "v1.12.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php56.git", + "reference": "0e3b212e96a51338639d8ce175c046d7729c3403" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/0e3b212e96a51338639d8ce175c046d7729c3403", + "reference": "0e3b212e96a51338639d8ce175c046d7729c3403", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-util": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.12-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php56\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-08-06T08:03:45+00:00" + }, + { + "name": "symfony/polyfill-util", + "version": "v1.12.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-util.git", + "reference": "4317de1386717b4c22caed7725350a8887ab205c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/4317de1386717b4c22caed7725350a8887ab205c", + "reference": "4317de1386717b4c22caed7725350a8887ab205c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.12-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Util\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony utilities for portability of PHP codes", + "homepage": "https://symfony.com", + "keywords": [ + "compat", + "compatibility", + "polyfill", + "shim" + ], + "time": "2019-08-06T08:03:45+00:00" } ], "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.0.5", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + "reference": "a2c590166b2133a4633738648b6b064edae0814a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a", + "reference": "a2c590166b2133a4633738648b6b064edae0814a", "shasum": "" }, "require": { - "php": ">=5.3,<8.0-DEV" + "php": "^7.1" }, "require-dev": { - "athletic/athletic": "~0.1.8", + "doctrine/coding-standard": "^6.0", "ext-pdo": "*", "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -2004,12 +2875,12 @@ } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ "constructor", "instantiate" ], - "time": "2015-06-14T21:17:01+00:00" + "time": "2019-03-17T17:37:11+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -2060,24 +2931,72 @@ "time": "2016-01-20T08:20:44+00:00" }, { - "name": "mikey179/vfsStream", - "version": "v1.6.5", + "name": "johnkary/phpunit-speedtrap", + "version": "v1.1.0", "source": { "type": "git", - "url": "https://github.com/mikey179/vfsStream.git", - "reference": "d5fec95f541d4d71c4823bb5e30cf9b9e5b96145" + "url": "https://github.com/johnkary/phpunit-speedtrap.git", + "reference": "f7cfe17c5a7076ed0ccca5450fe3bb981ec56361" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mikey179/vfsStream/zipball/d5fec95f541d4d71c4823bb5e30cf9b9e5b96145", - "reference": "d5fec95f541d4d71c4823bb5e30cf9b9e5b96145", + "url": "https://api.github.com/repos/johnkary/phpunit-speedtrap/zipball/f7cfe17c5a7076ed0ccca5450fe3bb981ec56361", + "reference": "f7cfe17c5a7076ed0ccca5450fe3bb981ec56361", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "phpunit/phpunit": ">=4.7,<6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-0": { + "JohnKary": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Kary", + "email": "john@johnkary.net" + } + ], + "description": "Find slow tests in your PHPUnit test suite", + "homepage": "https://github.com/johnkary/phpunit-speedtrap", + "keywords": [ + "phpunit", + "profile", + "slow" + ], + "time": "2017-03-25T17:14:26+00:00" + }, + { + "name": "mikey179/vfsstream", + "version": "v1.6.7", + "source": { + "type": "git", + "url": "https://github.com/bovigo/vfsStream.git", + "reference": "2b544ac3a21bcc4dde5d90c4ae8d06f4319055fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/2b544ac3a21bcc4dde5d90c4ae8d06f4319055fb", + "reference": "2b544ac3a21bcc4dde5d90c4ae8d06f4319055fb", "shasum": "" }, "require": { "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "~4.5" + "phpunit/phpunit": "^4.5|^5.0" }, "type": "library", "extra": { @@ -2103,20 +3022,20 @@ ], "description": "Virtual file system to mock the real file system in unit tests.", "homepage": "http://vfs.bovigo.org/", - "time": "2017-08-01T08:02:14+00:00" + "time": "2019-08-01T01:38:37+00:00" }, { "name": "mockery/mockery", - "version": "1.2.0", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "100633629bf76d57430b86b7098cd6beb996a35a" + "reference": "4eff936d83eb809bde2c57a3cea0ee9643769031" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/100633629bf76d57430b86b7098cd6beb996a35a", - "reference": "100633629bf76d57430b86b7098cd6beb996a35a", + "url": "https://api.github.com/repos/mockery/mockery/zipball/4eff936d83eb809bde2c57a3cea0ee9643769031", + "reference": "4eff936d83eb809bde2c57a3cea0ee9643769031", "shasum": "" }, "require": { @@ -2125,7 +3044,7 @@ "php": ">=5.6.0" }, "require-dev": { - "phpunit/phpunit": "~5.7.10|~6.5|~7.0" + "phpunit/phpunit": "~5.7.10|~6.5|~7.0|~8.0" }, "type": "library", "extra": { @@ -2168,29 +3087,32 @@ "test double", "testing" ], - "time": "2018-10-02T21:52:37+00:00" + "time": "2019-08-07T15:01:07+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.7.0", + "version": "1.9.3", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/007c053ae6f31bba39dfa19a7726f56e9763bbea", + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", - "phpunit/phpunit": "^4.1" + "phpunit/phpunit": "^7.1" }, "type": "library", "autoload": { @@ -2213,7 +3135,7 @@ "object", "object graph" ], - "time": "2017-10-19T19:58:43+00:00" + "time": "2019-08-09T12:45:53+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -2363,16 +3285,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.8.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" + "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/1927e75f4ed19131ec9bcc3b002e07fb1173ee76", + "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76", "shasum": "" }, "require": { @@ -2393,8 +3315,8 @@ } }, "autoload": { - "psr-0": { - "Prophecy\\": "src/" + "psr-4": { + "Prophecy\\": "src/Prophecy" } }, "notification-url": "https://packagist.org/downloads/", @@ -2422,62 +3344,7 @@ "spy", "stub" ], - "time": "2018-08-05T17:53:17+00:00" - }, - { - "name": "phpunit/dbunit", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/dbunit.git", - "reference": "5c35d74549c21ba55d0ea74ba89d191a51f8cf25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/dbunit/zipball/5c35d74549c21ba55d0ea74ba89d191a51f8cf25", - "reference": "5c35d74549c21ba55d0ea74ba89d191a51f8cf25", - "shasum": "" - }, - "require": { - "ext-pdo": "*", - "ext-simplexml": "*", - "php": "^5.4 || ^7.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0", - "symfony/yaml": "^2.1 || ^3.0" - }, - "bin": [ - "dbunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "DbUnit port for PHP/PHPUnit to support database interaction testing.", - "homepage": "https://github.com/sebastianbergmann/dbunit/", - "keywords": [ - "database", - "testing", - "xunit" - ], - "time": "2016-12-02T14:39:14+00:00" + "time": "2019-06-13T12:50:23+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2867,6 +3734,7 @@ "mock", "xunit" ], + "abandoned": true, "time": "2017-06-30T09:13:00+00:00" }, { @@ -2970,7 +3838,7 @@ } ], "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", + "homepage": "http://www.github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", @@ -3072,7 +3940,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", + "homepage": "http://www.github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -3140,7 +4008,7 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://github.com/sebastianbergmann/exporter", + "homepage": "http://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" @@ -3192,7 +4060,7 @@ } ], "description": "Snapshotting of global state", - "homepage": "https://github.com/sebastianbergmann/global-state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], @@ -3294,7 +4162,7 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "time": "2016-11-19T07:33:16+00:00" }, { @@ -3384,16 +4252,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.9.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + "reference": "550ebaac289296ce228a706d0867afc34687e3f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4", + "reference": "550ebaac289296ce228a706d0867afc34687e3f4", "shasum": "" }, "require": { @@ -3405,7 +4273,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.12-dev" } }, "autoload": { @@ -3421,13 +4289,13 @@ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", @@ -3438,24 +4306,24 @@ "polyfill", "portable" ], - "time": "2018-08-06T14:22:27+00:00" + "time": "2019-08-06T08:03:45+00:00" }, { "name": "symfony/yaml", - "version": "v3.4.16", + "version": "v4.3.4", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "61973ecda60e9f3561e929e19c07d4878b960fc1" + "reference": "5a0b7c32dc3ec56fd4abae8a4a71b0cf05013686" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/61973ecda60e9f3561e929e19c07d4878b960fc1", - "reference": "61973ecda60e9f3561e929e19c07d4878b960fc1", + "url": "https://api.github.com/repos/symfony/yaml/zipball/5a0b7c32dc3ec56fd4abae8a4a71b0cf05013686", + "reference": "5a0b7c32dc3ec56fd4abae8a4a71b0cf05013686", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -3470,7 +4338,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -3497,28 +4365,28 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-09-24T08:15:45+00:00" + "time": "2019-08-20T14:27:59+00:00" }, { "name": "webmozart/assert", - "version": "1.3.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a" + "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a", + "url": "https://api.github.com/repos/webmozart/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4", + "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" }, "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" + "phpunit/phpunit": "^4.8.36 || ^7.5.13" }, "type": "library", "extra": { @@ -3547,7 +4415,7 @@ "check", "validate" ], - "time": "2018-01-29T19:49:41+00:00" + "time": "2019-08-24T08:43:50+00:00" } ], "aliases": [], @@ -3558,7 +4426,18 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.6.1", + "php": ">=7.0", + "ext-ctype": "*", + "ext-curl": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-simplexml": "*", "ext-xml": "*" }, "platform-dev": [] diff --git a/config/addon-sample.config.php b/config/addon-sample.config.php new file mode 100644 index 000000000..5159370c3 --- /dev/null +++ b/config/addon-sample.config.php @@ -0,0 +1,12 @@ + [ + 'consumerkey' => '1234567890', + 'consumersecret' => 'ABCDEFGHIJKLMONPQRSTUVWXYZ', + ], +]; diff --git a/config/addon-sample.ini.php b/config/addon-sample.ini.php deleted file mode 100644 index 2665412a5..000000000 --- a/config/addon-sample.ini.php +++ /dev/null @@ -1,10 +0,0 @@ - [ + 'hostname' => 'localhost', + 'username' => 'mysqlusername', + 'password' => 'mysqlpassword', + 'database' => 'mysqldatabasename', + 'charset' => 'utf8mb4', + ], + + // **************************************************************** + // The configuration below will be overruled by the admin panel. + // Changes made below will only have an effect if the database does + // not contain any configuration for the friendica system. + // **************************************************************** + + 'config' => [ + 'admin_email' => '', + 'sitename' => 'Friendica Social Network', + 'register_policy' => \Friendica\Module\Register::OPEN, + 'register_text' => '', + ], + 'system' => [ + 'default_timezone' => 'UTC', + 'language' => 'en', + ], +]; diff --git a/config/local-sample.ini.php b/config/local-sample.ini.php deleted file mode 100644 index 359f3ee68..000000000 --- a/config/local-sample.ini.php +++ /dev/null @@ -1,41 +0,0 @@ - [ ..info.. ], + 'option2name' => [ ..info.. ], + ... + ] + +An empty array can be returned if backend doesn't have any options. + +The info array for each option is defined as: + + [ + 'type', + +define the field used in form, and the type of data. +one of 'checkbox', 'combobox', 'custom', 'datetime', 'input', 'intcheckbox', 'password', 'radio', 'richtext', 'select', 'select_raw', 'textarea', 'yesno' + + 'label', + +Translatable label of the field. This label will be shown in admin page + + value, + +Current value of the option + + 'help text', + +Translatable description for the field. Will be shown in admin page + + extra data + +Optional. Depends on which 'type' this option is: + +- 'select': array `[ value => label ]` of choices +- 'intcheckbox': value of input element +- 'select_raw': prebuild html string of `