Compare commits
330 Commits
master
...
release-1.
Author | SHA1 | Date |
---|---|---|
Mark Scarbrough | d0a14ffc05 | 5 years ago |
Thomas Bruederli | fe0dc4eef8 | 6 years ago |
Aleksander Machniak | 0c9074f286 | 6 years ago |
Thomas Bruederli | d4475e58db | 6 years ago |
Thomas Bruederli | aaafe8f917 | 6 years ago |
Thomas Bruederli | 498ff0a283 | 6 years ago |
Aleksander Machniak | 5d889cca13 | 6 years ago |
Aleksander Machniak | a5dac2e694 | 6 years ago |
Aleksander Machniak | bb9db12a79 | 6 years ago |
Aleksander Machniak | a5e4578482 | 6 years ago |
Thomas Bruederli | 7f992eac3d | 7 years ago |
Aleksander Machniak | b707e19f4b | 7 years ago |
Aleksander Machniak | e757cc4101 | 7 years ago |
Thomas Bruederli | 4181f29608 | 7 years ago |
Aleksander Machniak | 24902b7fc3 | 7 years ago |
Aleksander Machniak | 10b227d70a | 7 years ago |
Aleksander Machniak | bcdba37a82 | 7 years ago |
Aleksander Machniak | 6b16e0d593 | 7 years ago |
Aleksander Machniak | 2a2b04eb2a | 7 years ago |
Thomas Bruederli | f1483204c7 | 7 years ago |
Thomas Bruederli | d6ddd31a1b | 7 years ago |
Aleksander Machniak | 9b5eee2946 | 7 years ago |
Aleksander Machniak | 11b65a905f | 7 years ago |
Aleksander Machniak | 7536739c7a | 7 years ago |
Aleksander Machniak | 6c6b299d2a | 7 years ago |
Aleksander Machniak | b7a4257ffb | 7 years ago |
Aleksander Machniak | 4cd090aa24 | 7 years ago |
Aleksander Machniak | fca2bb7869 | 7 years ago |
Aleksander Machniak | f8e0e1d4ed | 7 years ago |
Aleksander Machniak | 72975042a5 | 7 years ago |
Aleksander Machniak | e6132dda95 | 8 years ago |
Aleksander Machniak | 28e3da2325 | 8 years ago |
Thomas Bruederli | 4c1394cf2d | 8 years ago |
Aleksander Machniak | 45a3e81653 | 8 years ago |
Aleksander Machniak | aa6bf38843 | 8 years ago |
Aleksander Machniak | 860a3b47e7 | 8 years ago |
Bostjan Skufca | 9b8db4c9e0 | 8 years ago |
Aleksander Machniak | 1123f39cf4 | 8 years ago |
Bostjan Skufca | 6fb8da08f3 | 8 years ago |
Thomas Bruederli | 802d119153 | 8 years ago |
Aleksander Machniak | 008f310f3a | 8 years ago |
Aleksander Machniak | 32ddcfd3d0 | 8 years ago |
Aleksander Machniak | 8e2fdee671 | 8 years ago |
Aleksander Machniak | 16b6c8a0ce | 8 years ago |
Aleksander Machniak | 93cb7b1fea | 8 years ago |
Aleksander Machniak | 3f10f9a2e6 | 8 years ago |
Aleksander Machniak | a647f994d8 | 8 years ago |
Aleksander Machniak | 264dfbbf82 | 8 years ago |
Aleksander Machniak | 425e31dc27 | 8 years ago |
Aleksander Machniak | b2781e145e | 8 years ago |
Aleksander Machniak | 4fa70856b9 | 8 years ago |
Aleksander Machniak | d10c591a61 | 8 years ago |
Aleksander Machniak | 25510199be | 8 years ago |
Thomas Bruederli | f1d80c649e | 8 years ago |
Aleksander Machniak | fbf89913a3 | 8 years ago |
Aleksander Machniak | 72a09408e9 | 8 years ago |
dsoares | f85227358a | 8 years ago |
Aleksander Machniak | 194690f59b | 8 years ago |
Aleksander Machniak | ac592fd169 | 8 years ago |
urc | 3e508e9587 | 8 years ago |
Aleksander Machniak | e48f8945b3 | 8 years ago |
Aleksander Machniak | 73f411db7d | 8 years ago |
Aleksander Machniak | 7d14065baa | 8 years ago |
Aleksander Machniak | 877b911dc4 | 8 years ago |
Aleksander Machniak | 550143269a | 8 years ago |
Thomas Bruederli | 25bc871ee7 | 8 years ago |
Aleksander Machniak | ead0846934 | 8 years ago |
Aleksander Machniak | 848410042c | 8 years ago |
Aleksander Machniak | c91d4975ff | 8 years ago |
Aleksander Machniak | d54eb6c951 | 8 years ago |
Bostjan Skufca | 55d90b2f62 | 8 years ago |
Thomas Bruederli | e1ae200201 | 8 years ago |
Aleksander Machniak | 473dc0b86d | 8 years ago |
Aleksander Machniak | b99a1bce89 | 8 years ago |
Aleksander Machniak | 86bc1f95ea | 8 years ago |
Aleksander Machniak | 2bfce1ae20 | 8 years ago |
Thomas Bruederli | 066b205c72 | 8 years ago |
Aleksander Machniak | 7c04110698 | 8 years ago |
Aleksander Machniak | 4d3f055ce0 | 8 years ago |
Aleksander Machniak | 126d099e83 | 8 years ago |
Aleksander Machniak | 160013555f | 8 years ago |
Thomas Bruederli | 699af1e520 | 8 years ago |
Aleksander Machniak | b01689caf8 | 8 years ago |
Aleksander Machniak | 7a73635214 | 8 years ago |
Aleksander Machniak | 58c03846e7 | 8 years ago |
Aleksander Machniak | d66793f0af | 8 years ago |
Aleksander Machniak | f915d15c43 | 8 years ago |
Aleksander Machniak | c8023ac6b1 | 8 years ago |
Aleksander Machniak | 8d047c668f | 8 years ago |
Aleksander Machniak | 3e55a2d9cb | 8 years ago |
Aleksander Machniak | a2d5db0a98 | 8 years ago |
Aleksander Machniak | d3b98eb4dc | 8 years ago |
Aleksander Machniak | 4de4438340 | 8 years ago |
Aleksander Machniak | 768e3e1b09 | 8 years ago |
Aleksander Machniak | 847c771d9e | 8 years ago |
Aleksander Machniak | 3e4b7cd19d | 8 years ago |
Aleksander Machniak | 7bbefdb63b | 8 years ago |
Aleksander Machniak | 3f6fbdcc6d | 8 years ago |
Aleksander Machniak | db76c50a7c | 9 years ago |
Francis Russell | 8a53588940 | 9 years ago |
Francis Russell | f8911c2a7f | 9 years ago |
Aleksander Machniak | fc5befff0f | 9 years ago |
Thomas Bruederli | 772e08fa2a | 9 years ago |
Thomas Bruederli | f2ff464002 | 9 years ago |
Aleksander Machniak | ded453cdc4 | 9 years ago |
Aleksander Machniak | 7d0099f28e | 9 years ago |
Aleksander Machniak | 89a5dcb946 | 9 years ago |
Aleksander Machniak | 9fbabc4668 | 9 years ago |
Aleksander Machniak | c67e7e8f85 | 9 years ago |
Aleksander Machniak | c82d09a052 | 9 years ago |
Aleksander Machniak | 6e71c958fc | 9 years ago |
Aleksander Machniak | 2382c6e822 | 9 years ago |
Aleksander Machniak | b6b92c0ddd | 9 years ago |
Aleksander Machniak | 5143c47e0f | 9 years ago |
Aleksander Machniak | 818b78a893 | 9 years ago |
Aleksander Machniak | 78a9870e00 | 9 years ago |
Thomas Bruederli | 62ee427b7e | 9 years ago |
Aleksander Machniak | 9953d5c10c | 9 years ago |
Aleksander Machniak | c7c09f85d9 | 9 years ago |
Aleksander Machniak | 2c3634df04 | 9 years ago |
Aleksander Machniak | 8e7f32fddc | 9 years ago |
Aleksander Machniak | 9e808942ba | 9 years ago |
Aleksander Machniak | a04a16c285 | 9 years ago |
Aleksander Machniak | 72be74508f | 9 years ago |
Aleksander Machniak | 6ee039e10e | 9 years ago |
Aleksander Machniak | 5de338e45e | 9 years ago |
Aleksander Machniak | 70942083ce | 9 years ago |
Aleksander Machniak | 280395a544 | 9 years ago |
Aleksander Machniak | c5acbc6c94 | 9 years ago |
Aleksander Machniak | 5e6f6ac539 | 9 years ago |
Aleksander Machniak | ba48318e2c | 9 years ago |
Aleksander Machniak | 3d9798da1f | 9 years ago |
Aleksander Machniak | 7d9a29cbc0 | 9 years ago |
Aleksander Machniak | c2269df436 | 9 years ago |
Aleksander Machniak | 0596f79a18 | 9 years ago |
Aleksander Machniak | 357cd5103d | 9 years ago |
Aleksander Machniak | 6731d2116c | 9 years ago |
Aleksander Machniak | 73d98c4766 | 9 years ago |
Aleksander Machniak | 9f98332240 | 9 years ago |
Aleksander Machniak | bbef212b0e | 9 years ago |
Aleksander Machniak | 7bfe676d53 | 9 years ago |
Aleksander Machniak | ac3078fe93 | 9 years ago |
Aleksander Machniak | 03be470538 | 9 years ago |
Aleksander Machniak | 52b75f2506 | 9 years ago |
Aleksander Machniak | 8ef86f5253 | 9 years ago |
Aleksander Machniak | b9bbc69ddc | 9 years ago |
Aleksander Machniak | 5f10f13472 | 9 years ago |
Thomas Bruederli | 106d47992b | 9 years ago |
Thomas Bruederli | 27e02f0f3b | 9 years ago |
Aleksander Machniak | 8a2d5561b6 | 9 years ago |
Aleksander Machniak | 1e15c50e87 | 9 years ago |
Aleksander Machniak | 6564cf8a4b | 9 years ago |
Aleksander Machniak | dddc985ce2 | 9 years ago |
Aleksander Machniak | 495b5c3883 | 9 years ago |
Aleksander Machniak | b45b15e5a8 | 9 years ago |
Aleksander Machniak | 794b2f1d46 | 9 years ago |
Aleksander Machniak | b44a6554bb | 9 years ago |
Aleksander Machniak | 14693832b2 | 9 years ago |
Aleksander Machniak | ca7fc75bec | 9 years ago |
Thomas Bruederli | 8b26f548b5 | 9 years ago |
Aleksander Machniak | f3c12bf7ef | 9 years ago |
Aleksander Machniak | eddae8976d | 9 years ago |
Aleksander Machniak | b45e9b49b9 | 9 years ago |
Aleksander Machniak | 1172330b2a | 9 years ago |
Aleksander Machniak | 0e647e4aa0 | 9 years ago |
Aleksander Machniak | 468e61b264 | 9 years ago |
Aleksander Machniak | 9ca27756f1 | 9 years ago |
Aleksander Machniak | fe82e213c3 | 9 years ago |
Aleksander Machniak | 424c25e5bc | 9 years ago |
Aleksander Machniak | 844ee296a8 | 9 years ago |
Aleksander Machniak | f0feb7701e | 9 years ago |
Aleksander Machniak | 19a61851ae | 9 years ago |
Aleksander Machniak | 71bfa5f207 | 9 years ago |
Aleksander Machniak | 612b04ac30 | 9 years ago |
Aleksander Machniak | 895efa1d42 | 9 years ago |
Aleksander Machniak | 383749eeff | 9 years ago |
Aleksander Machniak | a9035b1561 | 9 years ago |
Aleksander Machniak | f7dd463174 | 9 years ago |
Aleksander Machniak | 8cc6b18bcd | 9 years ago |
Aleksander Machniak | 70422cd7a2 | 9 years ago |
Aleksander Machniak | 947c4dc30b | 9 years ago |
Thomas Bruederli | c0087512aa | 9 years ago |
Thomas Bruederli | b91adb30a2 | 9 years ago |
Aleksander Machniak | 0aadd71183 | 9 years ago |
Aleksander Machniak | 8e68430749 | 9 years ago |
Aleksander Machniak | 3a428d9571 | 9 years ago |
Aleksander Machniak | 25c457dc68 | 9 years ago |
Aleksander Machniak | fec877f038 | 9 years ago |
Aleksander Machniak | 3f4521bcf4 | 9 years ago |
Aleksander Machniak | 92e36f6839 | 9 years ago |
Aleksander Machniak | 8cab554252 | 9 years ago |
Aleksander Machniak | e8028083b9 | 9 years ago |
Aleksander Machniak | 2ddd3b1a25 | 9 years ago |
Aleksander Machniak | cb0e0777ce | 9 years ago |
Aleksander Machniak | 30e71606a0 | 9 years ago |
Aleksander Machniak | 5eafc4b9d6 | 9 years ago |
Aleksander Machniak | ef07e9e546 | 9 years ago |
Aleksander Machniak | d438147ddc | 9 years ago |
Aleksander Machniak | 552854d738 | 9 years ago |
Daniel Hoffend | 8fab64e594 | 9 years ago |
Thomas Bruederli | a552b506da | 9 years ago |
Aleksander Machniak | 15fd8f9dc7 | 9 years ago |
Aleksander Machniak | 5529d94ed7 | 9 years ago |
Aleksander Machniak | 4312ac809c | 9 years ago |
Aleksander Machniak | a76693ef4c | 9 years ago |
Thomas Bruederli | 245619e98d | 9 years ago |
Thomas Bruederli | 024de499e5 | 9 years ago |
Thomas Bruederli | f1ae19dc6b | 9 years ago |
Thomas Bruederli | d8ffedbd5e | 9 years ago |
Aleksander Machniak | d5694ef84f | 9 years ago |
Aleksander Machniak | 4d97838ed9 | 9 years ago |
Aleksander Machniak | 1f61e55a33 | 9 years ago |
Aleksander Machniak | 84af0db103 | 9 years ago |
Aleksander Machniak | b33c076d8c | 9 years ago |
Aleksander Machniak | 942b82a418 | 9 years ago |
Aleksander Machniak | 244a46fdea | 9 years ago |
Aleksander Machniak | 92459da0e2 | 9 years ago |
Aleksander Machniak | a7d269253f | 9 years ago |
Thomas Bruederli | 16640c7fb0 | 9 years ago |
Aleksander Machniak | 1d024f37cc | 9 years ago |
Aleksander Machniak | 884070db68 | 9 years ago |
Aleksander Machniak | 100780d837 | 9 years ago |
Aleksander Machniak | c084a6ab8b | 9 years ago |
Aleksander Machniak | 04e767613d | 9 years ago |
Aleksander Machniak | 4471b2bffb | 9 years ago |
Thomas Bruederli | b765160fd5 | 9 years ago |
Thomas Bruederli | 15bcfbd55f | 9 years ago |
Aleksander Machniak | 7310a6d66c | 9 years ago |
Aleksander Machniak | 6efad5325d | 9 years ago |
Thomas Bruederli | 9c24e1963a | 9 years ago |
Aleksander Machniak | 322186014c | 9 years ago |
Aleksander Machniak | d0a4f1152e | 9 years ago |
Aleksander Machniak | 4d35a983cc | 9 years ago |
Aleksander Machniak | 84dde88680 | 9 years ago |
Aleksander Machniak | 3a46e7defc | 9 years ago |
Aleksander Machniak | d3333df32b | 9 years ago |
Aleksander Machniak | 4315619cfe | 9 years ago |
Aleksander Machniak | 35a32df940 | 9 years ago |
Aleksander Machniak | 0f797eddd8 | 9 years ago |
Aleksander Machniak | 9dd3559ee4 | 9 years ago |
Aleksander Machniak | ef595a10e0 | 9 years ago |
Thomas Bruederli | 306bbba353 | 9 years ago |
Aleksander Machniak | 6188233705 | 9 years ago |
Aleksander Machniak | 3d87a667b1 | 9 years ago |
Aleksander Machniak | 24f046cf47 | 9 years ago |
Aleksander Machniak | 22c0b291f6 | 9 years ago |
Aleksander Machniak | 72863836e5 | 9 years ago |
Aleksander Machniak | 61c35b4a2b | 9 years ago |
Aleksander Machniak | 3832e4507b | 9 years ago |
Aleksander Machniak | d671bed7eb | 9 years ago |
Aleksander Machniak | b41140ba37 | 9 years ago |
Aleksander Machniak | 998afb1725 | 9 years ago |
Aleksander Machniak | fdcef5ef7e | 9 years ago |
Aleksander Machniak | 88578e27d5 | 9 years ago |
Aleksander Machniak | 91ac83e82f | 9 years ago |
Aleksander Machniak | 68f76fddbe | 9 years ago |
Thomas Bruederli | 6066619818 | 9 years ago |
Thomas Bruederli | d5b4ef0de2 | 9 years ago |
Thomas Bruederli | c7a88ff0c2 | 9 years ago |
Thomas Bruederli | 91d3545193 | 9 years ago |
Thomas Bruederli | 4ba89c9f99 | 9 years ago |
Thomas Bruederli | 2c0861495b | 9 years ago |
Thomas Bruederli | ee9742c873 | 9 years ago |
Aleksander Machniak | f62fe135bf | 9 years ago |
Aleksander Machniak | 979f08e4df | 9 years ago |
Thomas Bruederli | 791c66c5fb | 9 years ago |
Thomas Bruederli | d9e854ccfe | 9 years ago |
Thomas Bruederli | bb345b4b4b | 9 years ago |
Thomas Bruederli | b50ae45698 | 9 years ago |
Thomas Bruederli | c14c21472e | 9 years ago |
Thomas Bruederli | 70f47ffc0b | 9 years ago |
Thomas Bruederli | 1aa49741b2 | 9 years ago |
Thomas Bruederli | edabce3091 | 9 years ago |
Aleksander Machniak | 00a1759129 | 9 years ago |
Thomas Bruederli | 7ba82e0992 | 9 years ago |
Thomas Bruederli | 3e09bcdef0 | 9 years ago |
Aleksander Machniak | 8f74b23dd2 | 9 years ago |
Thomas Bruederli | 50e1ca2814 | 9 years ago |
Aleksander Machniak | b9f8bb3cab | 9 years ago |
Aleksander Machniak | 6855623cf5 | 9 years ago |
Aleksander Machniak | 5c74c978f8 | 9 years ago |
Aleksander Machniak | 2d5b35eb5b | 9 years ago |
Aleksander Machniak | ef09b2751b | 9 years ago |
Aleksander Machniak | 2ea55829be | 9 years ago |
Aleksander Machniak | 1e7c877a66 | 9 years ago |
Aleksander Machniak | 100fea325e | 9 years ago |
Aleksander Machniak | 5bdd767a48 | 9 years ago |
Aleksander Machniak | c13dd984e1 | 9 years ago |
Aleksander Machniak | 6d876a3b54 | 9 years ago |
Aleksander Machniak | 26c9930103 | 9 years ago |
Aleksander Machniak | d8efe06f4c | 9 years ago |
Aleksander Machniak | c861ba15fe | 9 years ago |
Aleksander Machniak | e14e631947 | 9 years ago |
Aleksander Machniak | 14f4633b0b | 9 years ago |
Aleksander Machniak | d093e96ec2 | 9 years ago |
Aleksander Machniak | 199446c16d | 9 years ago |
Aleksander Machniak | 9613687428 | 9 years ago |
Aleksander Machniak | df4243b80a | 9 years ago |
Aleksander Machniak | c4104166e3 | 9 years ago |
Aleksander Machniak | 5bb2fe27a0 | 9 years ago |
Aleksander Machniak | b7048d8d2d | 9 years ago |
Aleksander Machniak | 2799f049bb | 9 years ago |
Aleksander Machniak | ab84cc15e5 | 9 years ago |
Aleksander Machniak | f985cbedc6 | 9 years ago |
Aleksander Machniak | f129972361 | 9 years ago |
Aleksander Machniak | b56a3b00f0 | 9 years ago |
Aleksander Machniak | 16c326380d | 9 years ago |
Aleksander Machniak | bbbd02bd6a | 9 years ago |
Thomas Bruederli | 230ec1104f | 9 years ago |
Aleksander Machniak | 44f58b0bcb | 9 years ago |
Aleksander Machniak | cd8bcf3801 | 9 years ago |
Aleksander Machniak | 1cb0b1481d | 9 years ago |
Aleksander Machniak | 366ffd7aa0 | 9 years ago |
Aleksander Machniak | ce08e08dad | 9 years ago |
Thomas Bruederli | 39434509cd | 9 years ago |
Aleksander Machniak | 9e147a36ad | 9 years ago |
Aleksander Machniak | 334eb48cfe | 9 years ago |
Aleksander Machniak | 99dafc41a3 | 9 years ago |
Aleksander Machniak | bec8735d66 | 9 years ago |
Aleksander Machniak | c8468c2960 | 9 years ago |
Aleksander Machniak | 825b2b9ab9 | 9 years ago |
Aleksander Machniak | ca85a8e32c | 9 years ago |
Aleksander Machniak | afd5e4f8a9 | 9 years ago |
Aleksander Machniak | dab95db19c | 9 years ago |
Aleksander Machniak | c8aa7a2048 | 9 years ago |
Aleksander Machniak | cd51e611ff | 9 years ago |
Aleksander Machniak | 9a833f6faa | 9 years ago |
Aleksander Machniak | 9920097bfc | 9 years ago |
Aleksander Machniak | 2839caa7e7 | 9 years ago |
Aleksander Machniak | 9ed3c429eb | 9 years ago |
@ -1,30 +0,0 @@
|
||||
<?php
|
||||
|
||||
$config = array();
|
||||
|
||||
// Database configuration
|
||||
$config['db_dsnw'] = 'sqlite:////tmp/sqlite.db?mode=0646';
|
||||
|
||||
// Test user credentials
|
||||
$config['tests_username'] = 'test';
|
||||
$config['tests_password'] = 'test';
|
||||
|
||||
// GreenMail
|
||||
$config['smtp_port'] = 25;
|
||||
|
||||
// Settings required by the tests
|
||||
|
||||
$config['create_default_folders'] = true;
|
||||
$config['skin'] = 'elastic';
|
||||
$config['support_url'] = 'http://support.url';
|
||||
|
||||
// Plugins with tests
|
||||
|
||||
$config['plugins'] = [
|
||||
'archive',
|
||||
'attachment_reminder',
|
||||
'markasjunk',
|
||||
'zipdownload'
|
||||
];
|
||||
|
||||
$config['archive_mbox'] = 'Archive';
|
@ -1,22 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# The script is intended for use on Travis with Trusty distribution
|
||||
|
||||
DIR=$(dirname $0)
|
||||
|
||||
# Enable xdebug for code coverage
|
||||
if [ "$CODE_COVERAGE" != 1 ]; then phpenv config-rm xdebug.ini || true; fi
|
||||
|
||||
cd $DIR/..
|
||||
|
||||
cp composer.json-dist composer.json
|
||||
|
||||
# Add laravel/dusk for Browser tests
|
||||
if [ "$BROWSER_TESTS" = 1 ]; then composer require "laravel/dusk:~5.9.1" --no-update; fi
|
||||
|
||||
# Remove qr-code as it requires php-gd which is not always available on Travis
|
||||
# and we don't really need it for tests
|
||||
composer remove endroid/qr-code --no-update
|
||||
|
||||
# Install PHP dependencies
|
||||
composer install --prefer-dist
|
@ -1,25 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# The script is intended for use on Travis with Trusty distribution
|
||||
# It executes unit and functional tests
|
||||
|
||||
DIR=$(dirname $0)
|
||||
cd $DIR/..
|
||||
|
||||
if [ "$CODE_COVERAGE" = 1 ]
|
||||
then
|
||||
CODE_COVERAGE_ARGS="--coverage-text"
|
||||
fi
|
||||
|
||||
vendor/bin/phpunit -c tests/phpunit.xml $CODE_COVERAGE_ARGS
|
||||
|
||||
if [ "$BROWSER_TESTS" = 1 ] && [ $? = 0 ]
|
||||
then
|
||||
.ci/setup.sh \
|
||||
&& echo "TESTS_MODE: DESKTOP" \
|
||||
&& TESTS_MODE=desktop vendor/bin/phpunit -c tests/Browser/phpunit.xml \
|
||||
&& echo "TESTS_MODE: PHONE" \
|
||||
&& TESTS_MODE=phone vendor/bin/phpunit -c tests/Browser/phpunit.xml \
|
||||
&& echo "TESTS_MODE: TABLET" \
|
||||
&& TESTS_MODE=tablet vendor/bin/phpunit -c tests/Browser/phpunit.xml
|
||||
fi
|
@ -1,30 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# The script is intended for use on Travis with Trusty distribution
|
||||
# It installs in-browser tests dependencies and prepares Roundcube instance
|
||||
|
||||
GMV=1.5.11
|
||||
CHROMEVERSION=$(google-chrome-stable --version | tr -cd [:digit:]. | cut -d . -f 1)
|
||||
GMARGS="-Dgreenmail.setup.all -Dgreenmail.users=test:test -Dgreenmail.startup.timeout=3000"
|
||||
|
||||
# Roundcube tests and instance configuration
|
||||
cp .ci/config-test.inc.php config/config-test.inc.php
|
||||
|
||||
# Make temp and logs writeable
|
||||
sudo chmod 777 temp logs
|
||||
|
||||
# Install javascript dependencies
|
||||
bin/install-jsdeps.sh
|
||||
|
||||
# Compile Elastic's styles
|
||||
lessc skins/elastic/styles/styles.less > skins/elastic/styles/styles.css
|
||||
lessc skins/elastic/styles/print.less > skins/elastic/styles/print.css
|
||||
lessc skins/elastic/styles/embed.less > skins/elastic/styles/embed.css
|
||||
|
||||
# Install proper WebDriver version for installed Chrome browser
|
||||
php tests/Browser/install.php $CHROMEVERSION
|
||||
|
||||
# GreenMail server download, setup and start
|
||||
wget https://repo1.maven.org/maven2/com/icegreen/greenmail-standalone/$GMV/greenmail-standalone-$GMV.jar \
|
||||
&& (sudo java $GMARGS -jar greenmail-standalone-$GMV.jar &) \
|
||||
&& sleep 5
|
@ -1,37 +0,0 @@
|
||||
language: php
|
||||
|
||||
dist: trusty #
|
||||
sudo: false
|
||||
|
||||
matrix:
|
||||
fast_finish: true
|
||||
include:
|
||||
- php: 5.4
|
||||
- php: 5.5
|
||||
- php: 5.6
|
||||
- php: 7.0
|
||||
- php: 7.1
|
||||
env: CODE_COVERAGE=1
|
||||
- php: 7.2
|
||||
- php: 7.3
|
||||
dist: bionic # for proper node-less version
|
||||
env: BROWSER_TESTS=1
|
||||
addons:
|
||||
chrome: stable
|
||||
apt:
|
||||
packages:
|
||||
- node-less
|
||||
- php: 7.4
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.composer
|
||||
|
||||
install:
|
||||
- .ci/install.sh
|
||||
|
||||
script:
|
||||
- .ci/run.sh
|
||||
|
||||
notifications:
|
||||
email: false
|
@ -0,0 +1,34 @@
|
||||
FROM debian:latest
|
||||
MAINTAINER Alex Brandt <alunduil@alunduil.com>
|
||||
|
||||
EXPOSE 80 443
|
||||
|
||||
RUN apt-get -qq update
|
||||
RUN apt-get install -qq apache2-mpm-event
|
||||
|
||||
RUN sed -e 's|/var/www|&/public_html|' -e 's/\(Log \+\)[^ ]\+/\1"|cat"/' -i /etc/apache2/sites-available/default
|
||||
RUN a2ensite default
|
||||
|
||||
RUN sed -e 's|/var/www|&/public_html|' -e 's/\(Log \+\)[^ ]\+/\1"|cat"/' -i /etc/apache2/sites-available/default-ssl
|
||||
RUN sed -e '/SSLCertificateKeyFile/s|ssl-cert-snakeoil.key|ssl-cert.key|' -e '/SSLCertificateFile/s|ssl-cert-snakeoil.pem|ssl-cert.pem|' -i /etc/apache2/sites-available/default-ssl
|
||||
RUN ln -snf ssl-cert-snakeoil.pem /etc/ssl/certs/ssl-cert.pem
|
||||
RUN ln -snf ssl-cert-snakeoil.key /etc/ssl/private/ssl-cert.key
|
||||
RUN a2ensite default-ssl
|
||||
|
||||
RUN a2enmod expires
|
||||
RUN a2enmod headers
|
||||
RUN a2enmod ssl
|
||||
|
||||
RUN apt-get install -qq php5 php-pear php5-mysql php5-pgsql php5-sqlite
|
||||
RUN pear install mail_mime mail_mimedecode net_smtp net_idna2-beta auth_sasl net_sieve crypt_gpg
|
||||
|
||||
RUN rm -rf /var/www
|
||||
ADD . /var/www
|
||||
|
||||
RUN echo -e '<?php\n$config = array();\n' > /var/www/config/config.inc.php
|
||||
RUN rm -rf /var/www/installer
|
||||
|
||||
RUN . /etc/apache2/envvars && chown -R ${APACHE_RUN_USER}:${APACHE_RUN_GROUP} /var/www/temp /var/www/logs
|
||||
|
||||
ENTRYPOINT [ "/usr/sbin/apache2ctl", "-D", "FOREGROUND" ]
|
||||
CMD [ "-k", "start" ]
|
@ -1,4 +0,0 @@
|
||||
ALTER TABLE [dbo].[users] ADD [failed_login] [datetime] NULL
|
||||
GO
|
||||
ALTER TABLE [dbo].[users] ADD [failed_login_counter] [int] NULL
|
||||
GO
|
@ -1,2 +0,0 @@
|
||||
ALTER TABLE [dbo].[session] DROP COLUMN [created]
|
||||
GO
|
@ -1,2 +0,0 @@
|
||||
ALTER TABLE [dbo].[session] ALTER COLUMN [ip] [varchar] (40) COLLATE Latin1_General_CI_AI NOT NULL
|
||||
GO
|
@ -1,36 +0,0 @@
|
||||
DROP TABLE [dbo].[cache]
|
||||
GO
|
||||
DROP TABLE [dbo].[cache_shared]
|
||||
GO
|
||||
|
||||
CREATE TABLE [dbo].[cache] (
|
||||
[user_id] [int] NOT NULL ,
|
||||
[cache_key] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
|
||||
[expires] [datetime] NULL ,
|
||||
[data] [text] COLLATE Latin1_General_CI_AI NOT NULL
|
||||
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
|
||||
GO
|
||||
CREATE TABLE [dbo].[cache_shared] (
|
||||
[cache_key] [varchar] (255) COLLATE Latin1_General_CI_AI NOT NULL ,
|
||||
[expires] [datetime] NULL ,
|
||||
[data] [text] COLLATE Latin1_General_CI_AI NOT NULL
|
||||
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
|
||||
GO
|
||||
ALTER TABLE [dbo].[cache] ADD
|
||||
CONSTRAINT [DF_cache_user_id] DEFAULT ('0') FOR [user_id],
|
||||
CONSTRAINT [DF_cache_cache_key] DEFAULT ('') FOR [cache_key],
|
||||
GO
|
||||
CREATE INDEX [IX_cache_expires] ON [dbo].[cache]([expires]) ON [PRIMARY]
|
||||
GO
|
||||
CREATE INDEX [IX_cache_shared_expires] ON [dbo].[cache_shared]([expires]) ON [PRIMARY]
|
||||
GO
|
||||
ALTER TABLE [dbo].[cache] WITH NOCHECK ADD
|
||||
PRIMARY KEY CLUSTERED (
|
||||
[user_id],[cache_key]
|
||||
) ON [PRIMARY]
|
||||
GO
|
||||
ALTER TABLE [dbo].[cache_shared] WITH NOCHECK ADD
|
||||
PRIMARY KEY CLUSTERED (
|
||||
[cache_key]
|
||||
) ON [PRIMARY]
|
||||
GO
|
@ -1,24 +0,0 @@
|
||||
CREATE TABLE [dbo].[filestore] (
|
||||
[file_id] [int] IDENTITY (1, 1) NOT NULL ,
|
||||
[user_id] [int] NOT NULL ,
|
||||
[filename] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
|
||||
[mtime] [int] NOT NULL ,
|
||||
[data] [text] COLLATE Latin1_General_CI_AI NULL ,
|
||||
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
|
||||
GO
|
||||
|
||||
ALTER TABLE [dbo].[filestore] WITH NOCHECK ADD
|
||||
CONSTRAINT [PK_filestore_file_id] PRIMARY KEY CLUSTERED
|
||||
(
|
||||
[file_id]
|
||||
) ON [PRIMARY]
|
||||
GO
|
||||
|
||||
CREATE INDEX [IX_filestore_user_id] ON [dbo].[filestore]([user_id]) ON [PRIMARY]
|
||||
GO
|
||||
|
||||
ALTER TABLE [dbo].[filestore] ADD CONSTRAINT [FK_filestore_user_id]
|
||||
FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])
|
||||
ON DELETE CASCADE ON UPDATE CASCADE
|
||||
GO
|
||||
|
@ -1,9 +0,0 @@
|
||||
ALTER TABLE [dbo].[filestore] ADD COLUMN [context] [varchar] (32) COLLATE Latin1_General_CI_AI NOT NULL
|
||||
GO
|
||||
|
||||
UPDATE [dbo].[filestore] SET [dbo].[context] = 'enigma'
|
||||
GO
|
||||
|
||||
CREATE UNIQUE INDEX [IX_filestore_user_id_context_filename] ON [dbo].[filestore]([user_id],[context],[filename]) ON [PRIMARY]
|
||||
GO
|
||||
|
@ -1,18 +0,0 @@
|
||||
ALTER TABLE [dbo].[cache] ALTER COLUMN
|
||||
[cache_key] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL
|
||||
GO
|
||||
ALTER TABLE [dbo].[cache_shared] ALTER COLUMN
|
||||
[cache_key] [varchar] (255) COLLATE Latin1_General_CS_AS NOT NULL
|
||||
GO
|
||||
ALTER TABLE [dbo].[cache_index] ALTER COLUMN
|
||||
[mailbox] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL
|
||||
GO
|
||||
ALTER TABLE [dbo].[cache_messages] ALTER COLUMN
|
||||
[mailbox] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL
|
||||
GO
|
||||
ALTER TABLE [dbo].[cache_thread] ALTER COLUMN
|
||||
[mailbox] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL
|
||||
GO
|
||||
ALTER TABLE [dbo].[users] ALTER COLUMN
|
||||
[username] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL
|
||||
GO
|
@ -1,4 +0,0 @@
|
||||
ALTER TABLE [dbo].[users] ALTER COLUMN [language] [varchar] (16) COLLATE Latin1_General_CI_AI NULL
|
||||
GO
|
||||
ALTER TABLE [dbo].[dictionary] ALTER COLUMN [language] [varchar] (16) COLLATE Latin1_General_CI_AI NOT NULL
|
||||
GO
|
@ -1,3 +0,0 @@
|
||||
ALTER TABLE `users`
|
||||
ADD `failed_login` datetime DEFAULT NULL,
|
||||
ADD `failed_login_counter` int(10) UNSIGNED DEFAULT NULL;
|
@ -1 +0,0 @@
|
||||
ALTER TABLE `session` DROP COLUMN `created`;
|
@ -1 +0,0 @@
|
||||
ALTER TABLE `session` MODIFY `ip` varchar(40) NOT NULL;
|
@ -1,24 +0,0 @@
|
||||
ALTER TABLE `dictionary` ADD COLUMN `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; -- redundant, for compat. with Galera Cluster
|
||||
|
||||
DROP TABLE `cache`;
|
||||
DROP TABLE `cache_shared`;
|
||||
|
||||
CREATE TABLE `cache` (
|
||||
`user_id` int(10) UNSIGNED NOT NULL,
|
||||
`cache_key` varchar(128) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL,
|
||||
`expires` datetime DEFAULT NULL,
|
||||
`data` longtext NOT NULL,
|
||||
PRIMARY KEY (`user_id`, `cache_key`),
|
||||
CONSTRAINT `user_id_fk_cache` FOREIGN KEY (`user_id`)
|
||||
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
INDEX `expires_index` (`expires`)
|
||||
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
|
||||
|
||||
|
||||
CREATE TABLE `cache_shared` (
|
||||
`cache_key` varchar(255) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL,
|
||||
`expires` datetime DEFAULT NULL,
|
||||
`data` longtext NOT NULL,
|
||||
PRIMARY KEY (`cache_key`),
|
||||
INDEX `expires_index` (`expires`)
|
||||
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
|
@ -1,11 +0,0 @@
|
||||
CREATE TABLE `filestore` (
|
||||
`file_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int(10) UNSIGNED NOT NULL,
|
||||
`filename` varchar(128) NOT NULL,
|
||||
`mtime` int(10) NOT NULL,
|
||||
`data` longtext NOT NULL,
|
||||
PRIMARY KEY (`file_id`),
|
||||
CONSTRAINT `user_id_fk_filestore` FOREIGN KEY (`user_id`)
|
||||
REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
UNIQUE `uniqueness` (`user_id`, `filename`)
|
||||
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
|
@ -1,7 +0,0 @@
|
||||
ALTER TABLE `filestore` ADD COLUMN `context` varchar(32) NOT NULL;
|
||||
UPDATE `filestore` SET `context` = 'enigma';
|
||||
ALTER TABLE `filestore` DROP FOREIGN KEY `user_id_fk_filestore`;
|
||||
ALTER TABLE `filestore` DROP INDEX `uniqueness`;
|
||||
ALTER TABLE `filestore` ADD UNIQUE INDEX `uniqueness` (`user_id`, `context`, `filename`);
|
||||
ALTER TABLE `filestore` ADD CONSTRAINT `user_id_fk_filestore` FOREIGN KEY (`user_id`)
|
||||
REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
@ -1,2 +0,0 @@
|
||||
ALTER TABLE `cache` CHANGE `cache_key` `cache_key` varchar(128) BINARY NOT NULL;
|
||||
ALTER TABLE `cache_shared` CHANGE `cache_key` `cache_key` varchar(255) BINARY NOT NULL;
|
@ -1,2 +0,0 @@
|
||||
ALTER TABLE `users` MODIFY `language` varchar(16);
|
||||
ALTER TABLE `dictionary` MODIFY `language` varchar(16) NOT NULL;
|
@ -1,21 +0,0 @@
|
||||
ALTER TABLE `session` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `cache` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `cache_shared` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `cache_index` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `cache_thread` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `cache_messages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `contacts` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `contactgroups` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `identities` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `dictionary` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `searches` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `filestore` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
ALTER TABLE `system` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
ALTER TABLE `users` CHANGE `username` `username` varchar(128) BINARY NOT NULL;
|
||||
ALTER TABLE `cache` CHANGE `cache_key` `cache_key` varchar(128) BINARY NOT NULL;
|
||||
ALTER TABLE `cache_shared` CHANGE `cache_key` `cache_key` varchar(255) BINARY NOT NULL;
|
||||
ALTER TABLE `cache_index` CHANGE `mailbox` `mailbox` varchar(255) BINARY NOT NULL;
|
||||
ALTER TABLE `cache_thread` CHANGE `mailbox` `mailbox` varchar(255) BINARY NOT NULL;
|
||||
ALTER TABLE `cache_messages` CHANGE `mailbox` `mailbox` varchar(255) BINARY NOT NULL;
|
@ -1,2 +0,0 @@
|
||||
ALTER TABLE "users" ADD "failed_login" timestamp with time zone DEFAULT NULL;
|
||||
ALTER TABLE "users" ADD "failed_login_counter" integer DEFAULT NULL;
|
@ -1 +0,0 @@
|
||||
ALTER TABLE "session" DROP COLUMN "created";
|
@ -1 +0,0 @@
|
||||
ALTER TABLE "session" MODIFY "ip" varchar(41) NOT NULL;
|
@ -1,23 +0,0 @@
|
||||
DROP TABLE "cache";
|
||||
DROP TABLE "cache_shared";
|
||||
|
||||
CREATE TABLE "cache" (
|
||||
"user_id" integer NOT NULL
|
||||
REFERENCES "users" ("user_id") ON DELETE CASCADE,
|
||||
"cache_key" varchar(128) NOT NULL,
|
||||
"expires" timestamp with time zone DEFAULT NULL,
|
||||
"data" long NOT NULL,
|
||||
PRIMARY KEY ("user_id", "cache_key")
|
||||
);
|
||||
|
||||
CREATE INDEX "cache_expires_idx" ON "cache" ("expires");
|
||||
|
||||
|
||||
CREATE TABLE "cache_shared" (
|
||||
"cache_key" varchar(255) NOT NULL,
|
||||
"expires" timestamp with time zone DEFAULT NULL,
|
||||
"data" long NOT NULL,
|
||||
PRIMARY KEY ("cache_key")
|
||||
);
|
||||
|
||||
CREATE INDEX "cache_shared_expires_idx" ON "cache_shared" ("expires");
|
@ -1,19 +0,0 @@
|
||||
CREATE TABLE "filestore" (
|
||||
"file_id" integer PRIMARY KEY,
|
||||
"user_id" integer NOT NULL
|
||||
REFERENCES "users" ("user_id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
"filename" varchar(128) NOT NULL,
|
||||
"mtime" integer NOT NULL,
|
||||
"data" long,
|
||||
CONSTRAINT "filestore_user_id_key" UNIQUE ("user_id", "filename")
|
||||
);
|
||||
|
||||
CREATE SEQUENCE "filestore_seq"
|
||||
START WITH 1 INCREMENT BY 1 NOMAXVALUE;
|
||||
|
||||
CREATE TRIGGER "filestore_seq_trig"
|
||||
BEFORE INSERT ON "filestore" FOR EACH ROW
|
||||
BEGIN
|
||||
:NEW."user_id" := "filestore_seq".nextval;
|
||||
END;
|
||||
/
|
@ -1,4 +0,0 @@
|
||||
ALTER TABLE "filestore" ADD COLUMN "context" varchar(32) NOT NULL;
|
||||
UPDATE "filestore" SET "context" = 'enigma';
|
||||
ALTER TABLE "filestore" DROP CONSTRAINT "filestore_user_id_key";
|
||||
ALTER TABLE "filestore" ADD CONSTRAINT "filestore_user_id_key" UNIQUE ("user_id", "context", "filename");
|
@ -1 +0,0 @@
|
||||
-- empty
|
@ -1,2 +0,0 @@
|
||||
ALTER TABLE "users" MODIFY "language" varchar(16) NOT NULL;
|
||||
ALTER TABLE "dictionary" MODIFY "language" varchar(16);
|
@ -1 +0,0 @@
|
||||
-- empty
|
@ -1,2 +0,0 @@
|
||||
ALTER TABLE "users" ADD failed_login timestamp with time zone DEFAULT NULL;
|
||||
ALTER TABLE "users" ADD failed_login_counter integer DEFAULT NULL;
|
@ -1 +0,0 @@
|
||||
ALTER TABLE "session" DROP COLUMN created;
|
@ -1 +0,0 @@
|
||||
ALTER TABLE session ALTER COLUMN ip TYPE character varying(41);
|
@ -1,21 +0,0 @@
|
||||
DROP TABLE "cache";
|
||||
DROP TABLE "cache_shared";
|
||||
|
||||
CREATE TABLE "cache" (
|
||||
user_id integer NOT NULL
|
||||
REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
cache_key varchar(128) DEFAULT '' NOT NULL,
|
||||
expires timestamp with time zone DEFAULT NULL,
|
||||
data text NOT NULL,
|
||||
PRIMARY KEY (user_id, cache_key)
|
||||
);
|
||||
|
||||
CREATE INDEX cache_expires_idx ON "cache" (expires);
|
||||
|
||||
CREATE TABLE "cache_shared" (
|
||||
cache_key varchar(255) NOT NULL PRIMARY KEY,
|
||||
expires timestamp with time zone DEFAULT NULL,
|
||||
data text NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX cache_shared_expires_idx ON "cache_shared" (expires);
|
@ -1,15 +0,0 @@
|
||||
CREATE SEQUENCE "filestore_seq"
|
||||
INCREMENT BY 1
|
||||
NO MAXVALUE
|
||||
NO MINVALUE
|
||||
CACHE 1;
|
||||
|
||||
CREATE TABLE "filestore" (
|
||||
file_id integer DEFAULT nextval('filestore_seq'::text) PRIMARY KEY,
|
||||
user_id integer NOT NULL
|
||||
REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
filename varchar(128) NOT NULL,
|
||||
mtime integer NOT NULL,
|
||||
data text NOT NULL,
|
||||
CONSTRAINT filestore_user_id_filename UNIQUE (user_id, filename)
|
||||
);
|
@ -1,4 +0,0 @@
|
||||
ALTER TABLE "filestore" ADD COLUMN context varchar(32) NOT NULL;
|
||||
UPDATE "filestore" SET context = 'enigma';
|
||||
ALTER TABLE "filestore" DROP CONSTRAINT "filestore_user_id_filename";
|
||||
ALTER TABLE "filestore" ADD CONSTRAINT "filestore_user_id_context_filename" UNIQUE (user_id, context, filename);
|
@ -1 +0,0 @@
|
||||
-- empty
|
@ -1,2 +0,0 @@
|
||||
ALTER TABLE "dictionary" ALTER COLUMN "language" TYPE varchar(16);
|
||||
ALTER TABLE "users" ALTER COLUMN "language" TYPE varchar(16);
|
@ -1 +0,0 @@
|
||||
-- empty
|
@ -1,35 +0,0 @@
|
||||
CREATE TABLE tmp_users (
|
||||
user_id integer NOT NULL PRIMARY KEY,
|
||||
username varchar(128) NOT NULL default '',
|
||||
mail_host varchar(128) NOT NULL default '',
|
||||
created datetime NOT NULL default '0000-00-00 00:00:00',
|
||||
last_login datetime DEFAULT NULL,
|
||||
failed_login datetime DEFAULT NULL,
|
||||
failed_login_counter integer DEFAULT NULL,
|
||||
language varchar(5),
|
||||
preferences text NOT NULL default ''
|
||||
);
|
||||
|
||||
INSERT INTO tmp_users (user_id, username, mail_host, created, last_login, language, preferences)
|
||||
SELECT user_id, username, mail_host, created, last_login, language, preferences FROM users;
|
||||
|
||||
DROP TABLE users;
|
||||
|
||||
CREATE TABLE users (
|
||||
user_id integer NOT NULL PRIMARY KEY,
|
||||
username varchar(128) NOT NULL default '',
|
||||
mail_host varchar(128) NOT NULL default '',
|
||||
created datetime NOT NULL default '0000-00-00 00:00:00',
|
||||
last_login datetime DEFAULT NULL,
|
||||
failed_login datetime DEFAULT NULL,
|
||||
failed_login_counter integer DEFAULT NULL,
|
||||
language varchar(5),
|
||||
preferences text NOT NULL default ''
|
||||
);
|
||||
|
||||
INSERT INTO users (user_id, username, mail_host, created, last_login, language, preferences)
|
||||
SELECT user_id, username, mail_host, created, last_login, language, preferences FROM tmp_users;
|
||||
|
||||
CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host);
|
||||
|
||||
DROP TABLE tmp_users;
|
@ -1,9 +0,0 @@
|
||||
DROP TABLE session;
|
||||
CREATE TABLE session (
|
||||
sess_id varchar(128) NOT NULL PRIMARY KEY,
|
||||
changed datetime NOT NULL default '0000-00-00 00:00:00',
|
||||
ip varchar(40) NOT NULL default '',
|
||||
vars text NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX ix_session_changed ON session (changed);
|
@ -1,21 +0,0 @@
|
||||
DROP TABLE cache;
|
||||
DROP TABLE cache_shared;
|
||||
|
||||
CREATE TABLE cache (
|
||||
user_id integer NOT NULL default 0,
|
||||
cache_key varchar(128) NOT NULL default '',
|
||||
expires datetime DEFAULT NULL,
|
||||
data text NOT NULL,
|
||||
PRIMARY KEY (user_id, cache_key)
|
||||
);
|
||||
|
||||
CREATE INDEX ix_cache_expires ON cache(expires);
|
||||
|
||||
CREATE TABLE cache_shared (
|
||||
cache_key varchar(255) NOT NULL,
|
||||
expires datetime DEFAULT NULL,
|
||||
data text NOT NULL,
|
||||
PRIMARY KEY (cache_key)
|
||||
);
|
||||
|
||||
CREATE INDEX ix_cache_shared_expires ON cache_shared(expires);
|
@ -1,9 +0,0 @@
|
||||
CREATE TABLE filestore (
|
||||
file_id integer PRIMARY KEY,
|
||||
user_id integer NOT NULL,
|
||||
filename varchar(128) NOT NULL,
|
||||
mtime integer NOT NULL,
|
||||
data text NOT NULL
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX ix_filestore_user_id ON filestore(user_id, filename);
|
@ -1,29 +0,0 @@
|
||||
CREATE TABLE tmp_filestore (
|
||||
file_id integer PRIMARY KEY,
|
||||
user_id integer NOT NULL,
|
||||
filename varchar(128) NOT NULL,
|
||||
mtime integer NOT NULL,
|
||||
data text NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO tmp_filestore (file_id, user_id, filename, mtime, data)
|
||||
SELECT file_id, user_id, filename, mtime, data FROM filestore;
|
||||
|
||||
DROP TABLE filestore;
|
||||
|
||||
CREATE TABLE filestore (
|
||||
file_id integer NOT NULL PRIMARY KEY,
|
||||
user_id integer NOT NULL,
|
||||
context varchar(32) NOT NULL,
|
||||
filename varchar(128) NOT NULL,
|
||||
mtime integer NOT NULL,
|
||||
data text NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO filestore (file_id, user_id, filename, mtime, data, context)
|
||||
SELECT file_id, user_id, filename, mtime, data, 'enigma' FROM tmp_filestore;
|
||||
|
||||
CREATE UNIQUE INDEX ix_filestore_user_id ON filestore(user_id, context, filename);
|
||||
|
||||
DROP TABLE tmp_filestore;
|
||||
|
@ -1 +0,0 @@
|
||||
-- empty
|
@ -1,57 +0,0 @@
|
||||
CREATE TABLE tmp_users (
|
||||
user_id integer NOT NULL PRIMARY KEY,
|
||||
username varchar(128) NOT NULL default '',
|
||||
mail_host varchar(128) NOT NULL default '',
|
||||
created datetime NOT NULL default '0000-00-00 00:00:00',
|
||||
last_login datetime DEFAULT NULL,
|
||||
failed_login datetime DEFAULT NULL,
|
||||
failed_login_counter integer DEFAULT NULL,
|
||||
language varchar(16),
|
||||
preferences text NOT NULL default ''
|
||||
);
|
||||
|
||||
INSERT INTO tmp_users (user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences)
|
||||
SELECT user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences FROM users;
|
||||
|
||||
DROP TABLE users;
|
||||
|
||||
CREATE TABLE users (
|
||||
user_id integer NOT NULL PRIMARY KEY,
|
||||
username varchar(128) NOT NULL default '',
|
||||
mail_host varchar(128) NOT NULL default '',
|
||||
created datetime NOT NULL default '0000-00-00 00:00:00',
|
||||
last_login datetime DEFAULT NULL,
|
||||
failed_login datetime DEFAULT NULL,
|
||||
failed_login_counter integer DEFAULT NULL,
|
||||
language varchar(16),
|
||||
preferences text NOT NULL default ''
|
||||
);
|
||||
|
||||
INSERT INTO users (user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences)
|
||||
SELECT user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences FROM tmp_users;
|
||||
|
||||
CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host);
|
||||
|
||||
DROP TABLE tmp_users;
|
||||
|
||||
DROP TABLE users;
|
||||
|
||||
CREATE TABLE tmp_dictionary (
|
||||
user_id integer DEFAULT NULL,
|
||||
language varchar(16) NOT NULL,
|
||||
data text NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO tmp_dictionary (user_id, language, data) SELECT user_id, language, data FROM dictionary;
|
||||
|
||||
CREATE TABLE dictionary (
|
||||
user_id integer DEFAULT NULL,
|
||||
language varchar(16) NOT NULL,
|
||||
data text NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO dictionary (user_id, language, data) SELECT user_id, language, data FROM tmp_dictionary;
|
||||
|
||||
CREATE UNIQUE INDEX ix_dictionary_user_language ON dictionary (user_id, language);
|
||||
|
||||
DROP TABLE tmp_dictionary;
|
@ -1 +0,0 @@
|
||||
-- empty
|
@ -0,0 +1,97 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| bin/dumpschema.sh |
|
||||
| |
|
||||
| This file is part of the Roundcube Webmail client |
|
||||
| Copyright (C) 2005-2009, The Roundcube Dev Team |
|
||||
| |
|
||||
| Licensed under the GNU General Public License version 3 or |
|
||||
| any later version with exceptions for skins & plugins. |
|
||||
| See the README file for a full license statement. |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Dumps database schema in XML format using MDB2_Schema |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
|
||||
|
||||
require INSTALL_PATH.'program/include/clisetup.php';
|
||||
|
||||
/** callback function for schema dump **/
|
||||
function print_schema($dump)
|
||||
{
|
||||
foreach ((array)$dump as $part)
|
||||
echo $dump . "\n";
|
||||
}
|
||||
|
||||
$config = new rcube_config();
|
||||
|
||||
// don't allow public access if not in devel_mode
|
||||
if (!$config->get('devel_mode') && $_SERVER['REMOTE_ADDR']) {
|
||||
header("HTTP/1.0 401 Access denied");
|
||||
die("Access denied!");
|
||||
}
|
||||
|
||||
$options = array(
|
||||
'use_transactions' => false,
|
||||
'log_line_break' => "\n",
|
||||
'idxname_format' => '%s',
|
||||
'debug' => false,
|
||||
'quote_identifier' => true,
|
||||
'force_defaults' => false,
|
||||
'portability' => false,
|
||||
);
|
||||
|
||||
$dsnw = $config->get('db_dsnw');
|
||||
$dsn_array = MDB2::parseDSN($dsnw);
|
||||
|
||||
// set options for postgres databases
|
||||
if ($dsn_array['phptype'] == 'pgsql') {
|
||||
$options['disable_smart_seqname'] = true;
|
||||
$options['seqname_format'] = '%s';
|
||||
}
|
||||
|
||||
$schema =& MDB2_Schema::factory($dsnw, $options);
|
||||
$schema->db->supported['transactions'] = false;
|
||||
|
||||
|
||||
// send as text/xml when opened in browser
|
||||
if ($_SERVER['REMOTE_ADDR'])
|
||||
header('Content-Type: text/xml');
|
||||
|
||||
|
||||
if (PEAR::isError($schema)) {
|
||||
$error = $schema->getMessage() . ' ' . $schema->getUserInfo();
|
||||
}
|
||||
else {
|
||||
$dump_config = array(
|
||||
// 'output_mode' => 'file',
|
||||
'output' => 'print_schema',
|
||||
);
|
||||
|
||||
$definition = $schema->getDefinitionFromDatabase();
|
||||
$definition['charset'] = 'utf8';
|
||||
|
||||
if (PEAR::isError($definition)) {
|
||||
$error = $definition->getMessage() . ' ' . $definition->getUserInfo();
|
||||
}
|
||||
else {
|
||||
$operation = $schema->dumpDatabase($definition, $dump_config, MDB2_SCHEMA_DUMP_STRUCTURE);
|
||||
if (PEAR::isError($operation)) {
|
||||
$error = $operation->getMessage() . ' ' . $operation->getUserInfo();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$schema->disconnect();
|
||||
|
||||
if ($error && !$_SERVER['REMOTE_ADDR'])
|
||||
fputs(STDERR, $error);
|
||||
|
||||
?>
|
@ -0,0 +1,233 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| bin/exportgettext.sh |
|
||||
| |
|
||||
| This file is part of the Roundcube Webmail client |
|
||||
| Copyright (C) 2011, The Roundcube Dev Team |
|
||||
| Licensed under the GNU General Public License |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Export PHP-based localization files to PO files for gettext |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
|
||||
require INSTALL_PATH.'program/include/clisetup.php';
|
||||
|
||||
if ($argc < 2) {
|
||||
die("Usage: " . basename($argv[0]) . " SRCDIR DESTDIR\n");
|
||||
}
|
||||
|
||||
$srcdir = unslashify(realpath($argv[1]));
|
||||
$destdir = unslashify($argv[2]);
|
||||
$layout = 'launchpad'; # or 'narro';
|
||||
$langcode_map = array(
|
||||
'hy_AM' => 'hy',
|
||||
'ar_SA' => 'ar',
|
||||
'az_AZ' => 'az',
|
||||
'bg_BG' => 'bg',
|
||||
'bs_BA' => 'bs',
|
||||
'ca_ES' => 'ca',
|
||||
'cs_CZ' => 'cs',
|
||||
'cy_GB' => 'cy',
|
||||
'da_DK' => 'da',
|
||||
'et_EE' => 'et',
|
||||
'el_GR' => 'el',
|
||||
'eu_ES' => 'eu',
|
||||
'fa_IR' => 'fa',
|
||||
'ga_IE' => 'ga',
|
||||
'ka_GE' => 'ka',
|
||||
'gl_ES' => 'gl',
|
||||
'he_IL' => 'he',
|
||||
'hi_IN' => 'hi',
|
||||
'hr_HR' => 'hr',
|
||||
'ja_JP' => 'ja',
|
||||
'ko_KR' => 'ko',
|
||||
'km_KH' => 'km',
|
||||
'ms_MY' => 'ms',
|
||||
'mr_IN' => 'mr',
|
||||
'ml_IN' => 'ml',
|
||||
'pl_PL' => 'pl',
|
||||
'si_LK' => 'si',
|
||||
'sl_SI' => 'sl',
|
||||
'sq_AL' => 'sq',
|
||||
'sr_CS' => 'sr',
|
||||
'sv_SE' => 'sv',
|
||||
'uk_UA' => 'uk',
|
||||
'vi_VN' => 'vi',
|
||||
);
|
||||
|
||||
|
||||
// converting roundcube localization dir
|
||||
if (is_dir($srcdir.'/en_US')) {
|
||||
load_en_US($srcdir.'/en_US');
|
||||
|
||||
foreach (glob($srcdir.'/*') as $locdir) {
|
||||
if (is_dir($locdir)) {
|
||||
$lang = basename($locdir);
|
||||
//echo "$locdir => $destdir$lang\n";
|
||||
convert_dir($locdir, $destdir . ($layout != 'launchpad' ? $lang : ''));
|
||||
}
|
||||
}
|
||||
}
|
||||
// converting single localization directory
|
||||
else if (is_dir($srcdir)) {
|
||||
if (is_file($srcdir.'/en_US.inc')) // plugin localization
|
||||
load_en_US($srcdir.'/en_US.inc');
|
||||
else
|
||||
load_en_US(realpath($srcdir.'/../en_US')); // single language
|
||||
convert_dir($srcdir, $destdir);
|
||||
}
|
||||
// converting a single file
|
||||
else if (is_file($srcdir)) {
|
||||
//load_en_US();
|
||||
convert_file($srcdir, $destdir);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Load en_US localization which is used to build msgids
|
||||
*/
|
||||
function load_en_US($fn)
|
||||
{
|
||||
$texts = array();
|
||||
|
||||
if (is_dir($fn)) {
|
||||
foreach (glob($fn.'/*.inc') as $ifn) {
|
||||
include($ifn);
|
||||
$texts = array_merge($texts, (array)$labels, (array)$messages);
|
||||
}
|
||||
}
|
||||
else if (is_file($fn)) {
|
||||
include($fn);
|
||||
$texts = array_merge($texts, (array)$labels, (array)$messages);
|
||||
}
|
||||
|
||||
$GLOBALS['en_US'] = $texts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert all .inc files in the given src directory
|
||||
*/
|
||||
function convert_dir($indir, $outdir)
|
||||
{
|
||||
global $layout;
|
||||
|
||||
if (!is_dir($outdir)) // attempt to create destination dir
|
||||
mkdir($outdir, 0777, true);
|
||||
|
||||
foreach (glob($indir.'/*.inc') as $fn) {
|
||||
$filename = basename($fn);
|
||||
|
||||
// create subdir for each template (launchpad rules)
|
||||
if ($layout == 'launchpad' && preg_match('/^(labels|messages)/', $filename, $m)) {
|
||||
$lang = end(explode('/', $indir));
|
||||
$destdir = $outdir . '/' . $m[1];
|
||||
if (!is_dir($destdir))
|
||||
mkdir($destdir, 0777, true);
|
||||
$outfn = $destdir . '/' . $lang . '.po';
|
||||
}
|
||||
else {
|
||||
$outfn = $outdir . '/' . preg_replace('/\.[a-z0-9]+$/i', '', basename($fn)) . '.po';
|
||||
}
|
||||
|
||||
convert_file($fn, $outfn);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the given Roundcube localization file into a gettext .po file
|
||||
*/
|
||||
function convert_file($fn, $outfn)
|
||||
{
|
||||
global $layout, $langcode_map;
|
||||
|
||||
$basename = basename($fn);
|
||||
$srcname = str_replace(INSTALL_PATH, '', $fn);
|
||||
$product = preg_match('!plugins/(\w+)!', $srcname, $m) ? 'roundcube-plugin-' . $m[1] : 'roundcubemail';
|
||||
$lang = preg_match('!/([a-z]{2}(_[A-Z]{2})?)[./]!', $outfn, $m) ? $m[1] : '';
|
||||
$labels = $messages = $seen = array();
|
||||
|
||||
if (is_dir($outfn))
|
||||
$outfn .= '/' . $basename . '.po';
|
||||
|
||||
// launchpad requires the template file to have the same name as the directory
|
||||
if (strstr($outfn, '/en_US') && $layout == 'launchpad') {
|
||||
$a = explode('/', $outfn);
|
||||
array_pop($a);
|
||||
$templ = end($a);
|
||||
$a[] = $templ . '.pot';
|
||||
$outfn = join('/', $a);
|
||||
$is_pot = true;
|
||||
}
|
||||
// launchpad is very picky about file names
|
||||
else if ($layout == 'launchpad' && preg_match($regex = '!/([a-z]{2})_([A-Z]{2})!', $outfn, $m)) {
|
||||
if ($shortlang = $langcode_map[$lang])
|
||||
$outfn = preg_replace($regex, '/'.$shortlang, $outfn);
|
||||
else if ($m[1] == strtolower($m[2]))
|
||||
$outfn = preg_replace($regex, '/\1', $outfn);
|
||||
}
|
||||
|
||||
include($fn);
|
||||
$texts = array_merge($labels, $messages);
|
||||
|
||||
// write header
|
||||
$header = <<<EOF
|
||||
# Converted from Roundcube PHP localization files
|
||||
# Copyright (C) 2011 The Roundcube Dev Team
|
||||
# This file is distributed under the same license as the Roundcube package.
|
||||
#
|
||||
#: %s
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: %s\\n"
|
||||
"Report-Msgid-Bugs-To: \\n"
|
||||
"%s: %s\\n"
|
||||
"Last-Translator: \\n"
|
||||
"Language-Team: Translations <hello@roundcube.net>\\n"
|
||||
"Language: %s\\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\\n"
|
||||
"Content-Transfer-Encoding: 8bit\\n"
|
||||
EOF;
|
||||
|
||||
$out = sprintf($header, $srcname, $product, $is_pot ? "POT-Creation-Date" : "PO-Revision-Date", date('c'), $shortlang ? $shortlang : $lang);
|
||||
$out .= "\n";
|
||||
|
||||
$messages = array();
|
||||
foreach ((array)$texts as $label => $msgstr) {
|
||||
$msgid = $is_pot ? $msgstr : ($GLOBALS['en_US'][$label] ?: $label);
|
||||
$messages[$msgid][] = $label;
|
||||
}
|
||||
|
||||
foreach ($messages as $msgid => $labels) {
|
||||
$out .= "\n";
|
||||
foreach ($labels as $label)
|
||||
$out .= "#: $srcname:$label\n";
|
||||
$msgstr = $texts[$label];
|
||||
$out .= 'msgid ' . gettext_quote($msgid) . "\n";
|
||||
$out .= 'msgstr ' . gettext_quote(!$is_pot ? $msgstr : '') . "\n";
|
||||
}
|
||||
|
||||
if ($outfn == '-')
|
||||
echo $out;
|
||||
else {
|
||||
echo "$fn\t=>\t$outfn\n";
|
||||
file_put_contents($outfn, $out);
|
||||
}
|
||||
}
|
||||
|
||||
function gettext_quote($str)
|
||||
{
|
||||
$out = "";
|
||||
$lines = explode("\n", wordwrap(stripslashes($str)));
|
||||
$last = count($lines) - 1;
|
||||
foreach ($lines as $i => $line)
|
||||
$out .= '"' . addcslashes($line, '"') . ($i < $last ? ' ' : '') . "\"\n";
|
||||
return rtrim($out);
|
||||
}
|
||||
|
||||
?>
|
@ -0,0 +1,196 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| bin/importgettext.sh |
|
||||
| |
|
||||
| This file is part of the Roundcube Webmail client |
|
||||
| Copyright (C) 2011, The Roundcube Dev Team |
|
||||
| Licensed under the GNU General Public License |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Import localizations from gettext PO format |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
|
||||
require INSTALL_PATH.'program/include/clisetup.php';
|
||||
|
||||
if ($argc < 2) {
|
||||
die("Usage: " . basename($argv[0]) . " SRCDIR\n");
|
||||
}
|
||||
|
||||
$srcdir = unslashify(realpath($argv[1]));
|
||||
|
||||
if (is_dir($srcdir)) {
|
||||
$out = import_dir($srcdir);
|
||||
}
|
||||
else if (is_file($srcdir)) {
|
||||
$out = import_file($srcdir);
|
||||
}
|
||||
|
||||
// write output files
|
||||
foreach ($out as $outfn => $texts) {
|
||||
$lang = preg_match('!/([a-z]{2}(_[A-Z]{2})?)[./]!', $outfn, $m) ? $m[1] : '';
|
||||
$varname = strpos($outfn, 'messages.inc') !== false ? 'messages' : 'labels';
|
||||
|
||||
$header = <<<EOF
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| localization/%s/%-51s|
|
||||
| |
|
||||
| Language file of the Roundcube Webmail client |
|
||||
| Copyright (C) %s, The Roundcube Dev Team |
|
||||
| Licensed under the GNU General Public License |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: %-62s|
|
||||
+-----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
$%s = array();
|
||||
|
||||
EOF;
|
||||
|
||||
$author = preg_replace('/\s*<Unknown>/i', '', $texts['_translator']);
|
||||
$output = sprintf($header, $lang, $varname.'.inc', date('Y'), $author, $varname);
|
||||
|
||||
foreach ($texts as $label => $value) {
|
||||
if (is_array($value)) { var_dump($outfn, $label, $value); exit; }
|
||||
if ($label[0] != '_' && strlen($value))
|
||||
$output .= sprintf("\$%s['%s'] = '%s';\n", $varname, $label, strtr(addcslashes($value, "'"), array("\r" => '', "\n" => '\n')));
|
||||
}
|
||||
|
||||
$output .= "\n";
|
||||
$dir = dirname($outfn);
|
||||
@mkdir($dir, 0755, true);
|
||||
if (file_put_contents($outfn, $output))
|
||||
echo "-> $outfn\n";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert all .po files in the given src directory
|
||||
*/
|
||||
function import_dir($indir)
|
||||
{
|
||||
$out = array();
|
||||
foreach (glob($indir.'/*.po') as $fn) {
|
||||
$out = array_merge_recursive($out, import_file($fn));
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the given .po file into a Roundcube localization array
|
||||
*/
|
||||
function import_file($fn)
|
||||
{
|
||||
$out = array();
|
||||
$lines = file($fn);
|
||||
$language = '';
|
||||
$translator = '';
|
||||
|
||||
// get language code from file name
|
||||
if (preg_match('/-([a-z_]+).po$/i', $fn, $m))
|
||||
$language = expand_langcode($m[1]);
|
||||
|
||||
$is_header = true;
|
||||
$msgid = null;
|
||||
$msgstr = '';
|
||||
$dests = array();
|
||||
foreach ($lines as $i => $line) {
|
||||
$line = trim($line);
|
||||
|
||||
// parse header
|
||||
if ($is_header && $line[0] == '"') {
|
||||
list($key, $val) = explode(": ", preg_replace('/\\\n$/', '', trim($line, '"')), 2);
|
||||
switch (strtolower($key)) {
|
||||
case 'language':
|
||||
$language = expand_langcode($val);
|
||||
break;
|
||||
case 'last-translator':
|
||||
$translator = $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// empty line
|
||||
if ($line == '') {
|
||||
if ($msgid && $dests) {
|
||||
foreach ($dests as $dest) {
|
||||
list($file, $label) = explode(':', $dest);
|
||||
$out[$file][$label] = $msgstr;
|
||||
$out[$file]['_translator'] = $translator;
|
||||
}
|
||||
}
|
||||
|
||||
$msgid = null;
|
||||
$msgstr = '';
|
||||
$dests = array();
|
||||
}
|
||||
|
||||
// meta line
|
||||
if ($line[0] == '#') {
|
||||
$value = trim(substr($line, 2));
|
||||
if ($line[1] == ':')
|
||||
$dests[] = str_replace('en_US', $language, $value);
|
||||
}
|
||||
else if (strpos($line, 'msgid') === 0) {
|
||||
$msgid = gettext_decode(substr($line, 6));
|
||||
|
||||
if (!empty($msgid))
|
||||
$is_header = false;
|
||||
}
|
||||
else if (strpos($line, 'msgstr') === 0) {
|
||||
$msgstr = gettext_decode(substr($line, 7));
|
||||
}
|
||||
else if ($msgid && $line[0] == '"') {
|
||||
$msgstr .= gettext_decode($line);
|
||||
}
|
||||
else if ($msgid !== null && $line[0] == '"') {
|
||||
$msgid .= gettext_decode($line);
|
||||
}
|
||||
}
|
||||
|
||||
if ($msgid && $dests) {
|
||||
foreach ($dests as $dest) {
|
||||
list($file, $label) = explode(':', $dest);
|
||||
$out[$file][$label] = $msgstr;
|
||||
$out[$file]['_translator'] = $translator;
|
||||
}
|
||||
}
|
||||
|
||||
return $language ? $out : array();
|
||||
}
|
||||
|
||||
|
||||
function gettext_decode($str)
|
||||
{
|
||||
return stripslashes(trim($str, '"'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate two-chars language codes to our internally used language identifiers
|
||||
*/
|
||||
function expand_langcode($lang)
|
||||
{
|
||||
static $rcube_language_aliases, $rcube_languages;
|
||||
|
||||
if (!$rcube_language_aliases)
|
||||
include(INSTALL_PATH . 'program/localization/index.inc');
|
||||
|
||||
if ($rcube_language_aliases[$lang])
|
||||
return $rcube_language_aliases[$lang];
|
||||
else if (strlen($lang) == 2 && !isset($rcube_languages[$lang]))
|
||||
return strtolower($lang) . '_' . strtoupper($lang);
|
||||
else
|
||||
return $lang;
|
||||
}
|
||||
|
||||
|
||||
?>
|
@ -1,39 +0,0 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| This file is part of the Roundcube Webmail client |
|
||||
| |
|
||||
| Copyright (C) The Roundcube Dev Team |
|
||||
| Copyright (C) Kolab Systems AG |
|
||||
| |
|
||||
| Licensed under the GNU General Public License version 3 or |
|
||||
| any later version with exceptions for skins & plugins. |
|
||||
| See the README file for a full license statement. |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Create database schema |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Aleksander Machniak <alec@alec.pl> |
|
||||
+-----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
|
||||
|
||||
require_once INSTALL_PATH . 'program/include/clisetup.php';
|
||||
|
||||
// get arguments
|
||||
$opts = rcube_utils::get_opt(array(
|
||||
'd' => 'dir',
|
||||
));
|
||||
|
||||
if (empty($opts['dir'])) {
|
||||
rcube::raise_error("Database schema directory not specified (--dir).", false, true);
|
||||
}
|
||||
|
||||
// Check if directory exists
|
||||
if (!file_exists($opts['dir'])) {
|
||||
rcube::raise_error("Specified database schema directory doesn't exist.", false, true);
|
||||
}
|
||||
|
||||
rcmail_utils::db_init($opts['dir']);
|
@ -1,385 +0,0 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| This file is part of the Roundcube Webmail client |
|
||||
| |
|
||||
| Copyright (C) The Roundcube Dev Team |
|
||||
| |
|
||||
| Licensed under the GNU General Public License version 3 or |
|
||||
| any later version with exceptions for skins & plugins. |
|
||||
| See the README file for a full license statement. |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Utility script to fetch and install all 3rd party javascript |
|
||||
| libraries used in Roundcube from source. |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <thomas@roundcube.net> |
|
||||
+-----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
|
||||
|
||||
require_once INSTALL_PATH . 'program/include/clisetup.php';
|
||||
|
||||
if (!function_exists('exec')) {
|
||||
rcube::raise_error("PHP exec() function is required. Check disable_functions in php.ini.", false, true);
|
||||
}
|
||||
|
||||
$cfgfile = INSTALL_PATH . 'jsdeps.json';
|
||||
$SOURCES = json_decode(file_get_contents($cfgfile), true);
|
||||
|
||||
if (empty($SOURCES['dependencies'])) {
|
||||
rcube::raise_error("Failed to read dependencies list from $cfgfile", false, true);
|
||||
}
|
||||
|
||||
$CURL = trim(`which curl`);
|
||||
$WGET = trim(`which wget`);
|
||||
$UNZIP = trim(`which unzip`);
|
||||
|
||||
if (($CACHEDIR = getenv("CACHEDIR")) && is_writeable($CACHEDIR)) {
|
||||
// use $CACHEDIR
|
||||
}
|
||||
else if (is_writeable(INSTALL_PATH . 'temp/js_cache') || @mkdir(INSTALL_PATH . 'temp/js_cache', 0774, true)) {
|
||||
$CACHEDIR = INSTALL_PATH . 'temp/js_cache';
|
||||
}
|
||||
else {
|
||||
$CACHEDIR = sys_get_temp_dir();
|
||||
}
|
||||
|
||||
|
||||
//////////////// License definitions
|
||||
|
||||
$LICENSES = array();
|
||||
$LICENSES['MIT'] = <<<EOM
|
||||
* Licensed under the MIT licenses
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
EOM;
|
||||
|
||||
$LICENSES['GPLv3'] = <<<EOG
|
||||
* The JavaScript code in this page is free software: you can
|
||||
* redistribute it and/or modify it under the terms of the GNU
|
||||
* General Public License (GNU GPL) as published by the Free Software
|
||||
* Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version. The code is distributed WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
|
||||
*
|
||||
* As additional permission under GNU GPL version 3 section 7, you
|
||||
* may distribute non-source (e.g., minimized or compacted) forms of
|
||||
* that code without the copy of the GNU GPL normally required by
|
||||
* section 4, provided you include this license notice and a URL
|
||||
* through which recipients can access the Corresponding Source.
|
||||
|
||||
EOG;
|
||||
|
||||
$LICENSES['LGPL'] = <<<EOL
|
||||
* The JavaScript code in this page is free software: you can
|
||||
* redistribute it and/or modify it under the terms of the GNU
|
||||
* Lesser General Public License as published by the Free Software
|
||||
* Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
|
||||
EOL;
|
||||
|
||||
|
||||
//////////////// Functions
|
||||
|
||||
/**
|
||||
* Fetch package file from source
|
||||
*/
|
||||
function fetch_from_source($package, $useCache = true, &$filetype = null)
|
||||
{
|
||||
global $CURL, $WGET;
|
||||
|
||||
$cache_file = extract_filetype($package, $filetype);
|
||||
|
||||
if (!is_readable($cache_file) || !$useCache) {
|
||||
if (empty($CURL) && empty($WGET)) {
|
||||
rcube::raise_error("Required 'wget' or 'curl' program not found.", false, true);
|
||||
}
|
||||
|
||||
$url = str_replace('$v', $package['version'], $package['url']);
|
||||
|
||||
echo "Fetching $url\n";
|
||||
|
||||
if ($CURL)
|
||||
exec(sprintf('%s -L -s %s -o %s', $CURL, escapeshellarg($url), $cache_file), $out, $retval);
|
||||
else
|
||||
exec(sprintf('%s -q %s -O %s', $WGET, escapeshellarg($url), $cache_file), $out, $retval);
|
||||
|
||||
// Try Github API as a fallback (#6248)
|
||||
if ($retval !== 0 && $package['api_url']) {
|
||||
$url = str_replace('$v', $package['version'], $package['api_url']);
|
||||
$header = 'Accept:application/vnd.github.v3.raw';
|
||||
|
||||
rcube::raise_error("Fetching failed. Using Github API on $url");
|
||||
|
||||
if ($CURL)
|
||||
exec(sprintf('%s -L -H %s -s %s -o %s', $CURL, escapeshellarg($header), escapeshellarg($url), $cache_file), $out, $retval);
|
||||
else
|
||||
exec(sprintf('%s --header %s -q %s -O %s', $WGET, escapeshellarg($header), escapeshellarg($url), $cache_file), $out, $retval);
|
||||
}
|
||||
|
||||
if ($retval !== 0) {
|
||||
rcube::raise_error("Failed to download source file from $url", false, true);
|
||||
}
|
||||
}
|
||||
|
||||
return $cache_file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns package source file location and type
|
||||
*/
|
||||
function extract_filetype($package, &$filetype = null)
|
||||
{
|
||||
global $CACHEDIR;
|
||||
|
||||
$filetype = pathinfo($package['url'], PATHINFO_EXTENSION) ?: 'tmp';
|
||||
$cache_file = $CACHEDIR . '/' . $package['lib'] . '-' . $package['version'] . '.' . $filetype;
|
||||
|
||||
// Make sure it is a zip file
|
||||
if (file_exists($cache_file)) {
|
||||
$magic = file_get_contents($cache_file, false, null, 0, 4);
|
||||
if ($magic === "PK\003\004") {
|
||||
$filetype = 'zip';
|
||||
}
|
||||
}
|
||||
|
||||
return $cache_file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a destination javascript file with copyright and license header
|
||||
*/
|
||||
function compose_destfile($package, $srcfile)
|
||||
{
|
||||
global $LICENSES;
|
||||
|
||||
$header = sprintf("/**\n * %s - v%s\n *\n", $package['name'], $package['version']);
|
||||
|
||||
if (!empty($package['source'])) {
|
||||
$header .= " * @source " . str_replace('$v', $package['version'], $package['source']) . "\n";
|
||||
$header .= " *\n";
|
||||
}
|
||||
|
||||
if (!empty($package['license']) && isset($LICENSES[$package['license']])) {
|
||||
$header .= " * @licstart The following is the entire license notice for the\n";
|
||||
$header .= " * JavaScript code in this file.\n";
|
||||
$header .= " *\n";
|
||||
if (!empty($package['copyright'])) {
|
||||
$header .= " * " . $package['copyright'] . "\n";
|
||||
$header .= " *\n";
|
||||
}
|
||||
|
||||
$header .= $LICENSES[$package['license']];
|
||||
$header .= " *\n";
|
||||
$header .= " * @licend The above is the entire license notice\n";
|
||||
$header .= " * for the JavaScript code in this file.\n";
|
||||
}
|
||||
|
||||
$header .= " */\n";
|
||||
|
||||
if (file_put_contents(INSTALL_PATH . $package['dest'], $header . file_get_contents($srcfile))) {
|
||||
echo "Wrote file " . INSTALL_PATH . $package['dest'] . "\n";
|
||||
}
|
||||
else {
|
||||
rcube::raise_error("Failed to write destination file " . INSTALL_PATH . $package['dest'], false, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract a Zip archive into the destination specified by the package config
|
||||
*/
|
||||
function extract_zipfile($package, $srcfile)
|
||||
{
|
||||
global $UNZIP, $CACHEDIR;
|
||||
|
||||
if (empty($UNZIP)) {
|
||||
rcube::raise_error("Required 'unzip' program not found.", false, true);
|
||||
}
|
||||
|
||||
$destdir = INSTALL_PATH . $package['dest'];
|
||||
if (!is_dir($destdir)) {
|
||||
mkdir($destdir, 0775, true);
|
||||
}
|
||||
|
||||
if (!is_writeable($destdir)) {
|
||||
rcube::raise_error("Cannot write to destination directory: $destdir", false, true);
|
||||
}
|
||||
|
||||
// pick files from zip archive
|
||||
if (!empty($package['pick'])) {
|
||||
foreach ($package['pick'] as $pattern) {
|
||||
echo "Extracting files $pattern into $destdir\n";
|
||||
exec(sprintf('%s -o %s %s -d %s', $UNZIP, escapeshellarg($srcfile), escapeshellarg($pattern), $destdir), $out, $retval);
|
||||
if ($retval !== 0) {
|
||||
rcube::raise_error("Failed to unpack $pattern; " . implode('; ' . $out));
|
||||
}
|
||||
}
|
||||
}
|
||||
// unzip the archive and map source to dest files/directories
|
||||
else if (!empty($package['map'])) {
|
||||
$extract = $CACHEDIR . '/' . $package['lib'] . '-extract';
|
||||
if (!is_dir($extract)) {
|
||||
mkdir($extract, 0774, true);
|
||||
}
|
||||
|
||||
$zip_command = '%s -' . ($package['flat'] ? 'j' : 'o') . ' %s -d %s';
|
||||
exec(sprintf($zip_command, $UNZIP, escapeshellarg($srcfile), $extract), $out, $retval);
|
||||
|
||||
// get the root folder of the extracted package
|
||||
$extract_tree = glob("$extract/*", GLOB_ONLYDIR);
|
||||
$sourcedir = count($extract_tree) ? $extract_tree[0] : $extract;
|
||||
|
||||
foreach ($package['map'] as $src => $dest) {
|
||||
echo "Installing $sourcedir/$src into $destdir/$dest\n";
|
||||
|
||||
$dest_file = $destdir . '/' . $dest;
|
||||
$src_file = $sourcedir . '/' . $src;
|
||||
|
||||
// make sure the destination's parent directory exists
|
||||
if (strpos($dest, '/') !== false) {
|
||||
$parentdir = dirname($dest_file);
|
||||
if (!is_dir($parentdir)) {
|
||||
mkdir($parentdir, 0775, true);
|
||||
}
|
||||
}
|
||||
|
||||
// avoid copying source directory as a child into destination
|
||||
if (is_dir($src_file) && is_dir($dest_file)) {
|
||||
exec(sprintf('rm -rf %s', $dest_file));
|
||||
}
|
||||
|
||||
exec(sprintf('mv -f %s %s', $src_file, $dest_file), $out, $retval);
|
||||
if ($retval !== 0) {
|
||||
rcube::raise_error("Failed to move $src into $dest_file; " . implode('; ' . $out));
|
||||
}
|
||||
// Remove sourceMappingURL
|
||||
else if (isset($package['sourcemap']) && $package['sourcemap'] === false) {
|
||||
if ($content = file($dest_file)) {
|
||||
$index = count($content);
|
||||
if (preg_match('|sourceMappingURL=|', $content[$index-1])) {
|
||||
array_pop($content);
|
||||
file_put_contents($dest_file, implode('', $content));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// remove temp extraction dir
|
||||
exec('rm -rf ' . $extract);
|
||||
}
|
||||
// extract the archive into the destination directory
|
||||
else {
|
||||
echo "Extracting zip archive into $destdir\n";
|
||||
exec(sprintf('%s -o %s -d %s', $UNZIP, escapeshellarg($srcfile), $destdir), $out, $retval);
|
||||
if ($retval !== 0) {
|
||||
rcube::raise_error("Failed to unzip $srcfile; " . implode('; ' . $out));
|
||||
}
|
||||
}
|
||||
|
||||
// remove some files from the destination
|
||||
if (!empty($package['omit'])) {
|
||||
foreach ((array)$package['omit'] as $glob) {
|
||||
exec(sprintf('rm -rf %s/%s', $destdir, escapeshellarg($glob)));
|
||||
}
|
||||
}
|
||||
|
||||
// prepend license header to extracted files
|
||||
if (!empty($package['addlicense'])) {
|
||||
foreach ((array)$package['addlicense'] as $filename) {
|
||||
$pkg = $package;
|
||||
$pkg['dest'] = $package['dest'] . '/' . $filename;
|
||||
compose_destfile($pkg, $destdir . '/' . $filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the package destination file/dir
|
||||
*/
|
||||
function delete_destfile($package)
|
||||
{
|
||||
$destdir = INSTALL_PATH . ($package['rm'] ?: $package['dest']);
|
||||
|
||||
if (file_exists($destdir)) {
|
||||
if (PHP_OS === 'Windows') {
|
||||
exec(sprintf("rd /s /q %s", escapeshellarg($destdir)));
|
||||
}
|
||||
else {
|
||||
exec(sprintf("rm -rf %s", escapeshellarg($destdir)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////// Execution
|
||||
|
||||
$args = rcube_utils::get_opt(array('f' => 'force:bool', 'd' => 'delete:bool', 'g' => 'get:bool', 'e' => 'extract:bool'))
|
||||
+ array('force' => false, 'delete' => false, 'get' => false, 'extract' => false);
|
||||
$WHAT = $args[0];
|
||||
$useCache = !$args['force'] && !$args['get'];
|
||||
|
||||
if (!$args['get'] && !$args['extract'] && !$args['delete']) {
|
||||
$args['get'] = $args['extract'] = 1;
|
||||
}
|
||||
|
||||
foreach ($SOURCES['dependencies'] as $package) {
|
||||
if (!isset($package['name'])) {
|
||||
$package['name'] = $package['lib'];
|
||||
}
|
||||
|
||||
if ($WHAT && $package['lib'] !== $WHAT) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($args['delete']) {
|
||||
delete_destfile($package);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($args['get']) {
|
||||
$srcfile = fetch_from_source($package, $useCache, $filetype);
|
||||
}
|
||||
else {
|
||||
$srcfile = extract_filetype($package, $filetype);
|
||||
}
|
||||
|
||||
if (!empty($package['sha1']) && ($sum = sha1_file($srcfile)) !== $package['sha1']) {
|
||||
rcube::raise_error("Incorrect sha1 sum of $srcfile. Expected: {$package['sha1']}, got: $sum", false, true);
|
||||
}
|
||||
|
||||
if ($args['extract']) {
|
||||
echo "Installing {$package['name']}...\n";
|
||||
|
||||
if ($filetype === 'zip') {
|
||||
extract_zipfile($package, $srcfile);
|
||||
}
|
||||
else {
|
||||
compose_destfile($package, $srcfile);
|
||||
}
|
||||
|
||||
echo "Done.\n";
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| Roundcube Webmail Selenium Tests Entry Point |
|
||||
| |
|
||||
| Copyright (C) 2005-2014, The Roundcube Dev Team |
|
||||
| |
|
||||
| Licensed under the GNU General Public License version 3 or |
|
||||
| any later version with exceptions for skins & plugins. |
|
||||
| See the README file for a full license statement. |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| This is the public entry point for all HTTP requests to the |
|
||||
| Roundcube webmail application loading the 'tests' environment. |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <thomas@roundcube.net> |
|
||||
+-----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
define('INSTALL_PATH', realpath(__DIR__) . '/');
|
||||
|
||||
$GLOBALS['env'] = 'test';
|
||||
|
||||
// include index.php from application root directory
|
||||
include INSTALL_PATH . 'index.php';
|
||||
|
Before Width: | Height: | Size: 653 B After Width: | Height: | Size: 733 B |
Before Width: | Height: | Size: 637 B After Width: | Height: | Size: 715 B |
Before Width: | Height: | Size: 565 B After Width: | Height: | Size: 666 B |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 7.8 KiB |
@ -1,115 +0,0 @@
|
||||
{
|
||||
"dependencies": [
|
||||
{
|
||||
"lib": "jquery",
|
||||
"name": "jQuery",
|
||||
"version": "3.4.1",
|
||||
"url": "https://code.jquery.com/jquery-$v.min.js",
|
||||
"dest": "program/js/jquery.min.js",
|
||||
"sha1": "88523924351bac0b5d560fe0c5781e2556e7693d",
|
||||
"license": "MIT",
|
||||
"copyright": "Copyright JS Foundation and other contributors",
|
||||
"source": "https://github.com/jquery/jquery/tree/$v"
|
||||
},
|
||||
{
|
||||
"lib": "jstz",
|
||||
"name": "jsTimezoneDetect",
|
||||
"version": "1.0.6",
|
||||
"url": "https://bitbucket.org/pellepim/jstimezonedetect/raw/6c427658686c664da52c6a87cd62ec910baab276/dist/jstz.min.js",
|
||||
"dest": "program/js/jstz.min.js",
|
||||
"sha1": "4291cd3b259d2060460c2a6ab99f428d3c0c9537",
|
||||
"license": "MIT",
|
||||
"copyright": "Copyright (c) Jon Nylander",
|
||||
"source": "https://bitbucket.org/pellepim/jstimezonedetect/raw/6c427658686c664da52c6a87cd62ec910baab276/dist/jstz.js"
|
||||
},
|
||||
{
|
||||
"lib": "publickey",
|
||||
"name": "PublicKey.js",
|
||||
"version": "0e011cb1",
|
||||
"url": "https://raw.githubusercontent.com/diafygi/publickeyjs/$v/publickey.js",
|
||||
"api_url": "https://api.github.com/repos/diafygi/publickeyjs/contents/publickey.js?ref=$v",
|
||||
"dest": "program/js/publickey.js",
|
||||
"sha1": "d0920e190754e024c4be76ad5bbc7e76b2e37a4d",
|
||||
"license": "GPLv3",
|
||||
"copyright": "Copyright (c) 2015 Daniel Roesler",
|
||||
"source": "https://github.com/diafygi/publickeyjs/blob/master/publickey.js"
|
||||
},
|
||||
{
|
||||
"lib": "tinymce",
|
||||
"version": "4.8.2",
|
||||
"url": "https://download.tiny.cloud/tinymce/community/tinymce_$v.zip",
|
||||
"dest": "program/js",
|
||||
"sha1": "d7fced05acdeeb78299585ea9909b0de2b3d759d",
|
||||
"license": "LGPL",
|
||||
"copyright": "Copyright (c) 1999-2015 Ephox Corp. All rights reserved",
|
||||
"rm": "program/js/tinymce",
|
||||
"map": {
|
||||
"js/tinymce": "tinymce"
|
||||
},
|
||||
"omit": [
|
||||
"tinymce/license.txt",
|
||||
"tinymce/jquery.tinymce.min.js"
|
||||
],
|
||||
"addlicense": [
|
||||
"tinymce/tinymce.min.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"lib": "tinymce-langs",
|
||||
"version": "4.8.2",
|
||||
"url": "https://www.tiny.cloud/docs-4x/language/tinymce4x_languages.zip",
|
||||
"dest": "program/js/tinymce"
|
||||
},
|
||||
{
|
||||
"lib": "openpgp",
|
||||
"name": "OpenPGP.js",
|
||||
"version": "4.4.6",
|
||||
"url": "https://raw.githubusercontent.com/openpgpjs/openpgpjs/v$v/dist/openpgp.min.js",
|
||||
"api_url": "https://api.github.com/repos/openpgpjs/openpgpjs/contents/dist/openpgp.min.js?ref=v$v",
|
||||
"dest": "plugins/enigma/openpgp.min.js",
|
||||
"sha1": "e142168db8e666a40fcb4c48ef89c9d774134f8b",
|
||||
"license": "LGPL",
|
||||
"copyright": "Copyright (c) OpenPGP Development Team",
|
||||
"source": "https://github.com/openpgpjs/openpgpjs/blob/v$v/dist/openpgp.js"
|
||||
},
|
||||
{
|
||||
"lib": "codemirror",
|
||||
"version": "5.46.0",
|
||||
"url": "https://codemirror.net/codemirror-$v.zip",
|
||||
"dest": "plugins/managesieve/codemirror",
|
||||
"sha1": "c11fcb9b63cee2b276e3b9f24a8ad6d7c374c624",
|
||||
"license": "MIT",
|
||||
"map": {
|
||||
"lib": "lib",
|
||||
"addon/selection": "addon/selection",
|
||||
"mode/sieve": "mode/sieve"
|
||||
}
|
||||
},
|
||||
{
|
||||
"lib": "bootstrap",
|
||||
"name": "Bootstrap",
|
||||
"version": "4.3.1",
|
||||
"url": "https://github.com/twbs/bootstrap/releases/download/v$v/bootstrap-$v-dist.zip",
|
||||
"dest": "skins/elastic/deps",
|
||||
"sha1": "ee9e9d6bbbb6181dc519778af2b38804a6aa62a4",
|
||||
"license": "MIT",
|
||||
"flat": true,
|
||||
"sourcemap": false,
|
||||
"map": {
|
||||
"bootstrap.bundle.min.js": "bootstrap.bundle.min.js",
|
||||
"bootstrap.min.css": "bootstrap.min.css"
|
||||
}
|
||||
},
|
||||
{
|
||||
"lib": "less",
|
||||
"name": "LessJS",
|
||||
"version": "2.7.3",
|
||||
"url": "https://raw.githubusercontent.com/less/less.js/v$v/dist/less.min.js",
|
||||
"api_url": "https://api.github.com/repos/less/less.js/contents/dist/less.min.js?ref=v$v",
|
||||
"dest": "skins/elastic/deps/less.min.js",
|
||||
"sha1": "45ea4f9fed6c0568ec11faba048c3e3cb7612e9e",
|
||||
"license": "Apache-2.0",
|
||||
"source": "https://raw.githubusercontent.com/less/less.js/v$v/dist/less.js"
|
||||
}
|
||||
]
|
||||
}
|