Compare commits
461 Commits
checkValid
...
v4.5.10
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3573991d6a | ||
|
|
94cd6f2ae7 | ||
|
|
1a2a156570 | ||
|
|
463039d5eb | ||
|
|
6b6cefef84 | ||
|
|
ade283169d | ||
|
|
9cc1530cdd | ||
|
|
d58457f4a5 | ||
|
|
e10a2f222d | ||
|
|
7514cdef94 | ||
|
|
58ef8faacd | ||
|
|
5181232aac | ||
|
|
84788d14f7 | ||
|
|
403ecaff34 | ||
|
|
02b46e990b | ||
|
|
edf7162762 | ||
|
|
206b9ebf20 | ||
|
|
0de2c955fc | ||
|
|
73d6a55245 | ||
|
|
28ff24d969 | ||
|
|
4968050d40 | ||
|
|
c33b217bfa | ||
|
|
0aef7ddd6c | ||
|
|
7b0a8f499d | ||
|
|
2364c792f5 | ||
|
|
4cff6df66b | ||
|
|
d48e927544 | ||
|
|
8fe2516a34 | ||
|
|
8e9577d62f | ||
|
|
574ff253bd | ||
|
|
8a6c380fca | ||
|
|
102d580eda | ||
|
|
c88f514078 | ||
|
|
e2faa92385 | ||
|
|
c1c39800c0 | ||
|
|
d885959187 | ||
|
|
57017ed7e0 | ||
|
|
81985c5f4f | ||
|
|
368c1eba1f | ||
|
|
3be64bb4aa | ||
|
|
cb174356e5 | ||
|
|
88248b644c | ||
|
|
24a7381e9f | ||
|
|
d746aa0b93 | ||
|
|
1fa54ef9bb | ||
|
|
073e129ffd | ||
|
|
b002cf3f81 | ||
|
|
0f7c6c00ce | ||
|
|
8f00f21413 | ||
|
|
e91ec52ebe | ||
|
|
2e65dc6cb0 | ||
|
|
2e819d6edd | ||
|
|
9e64de4024 | ||
|
|
ece08cd03e | ||
|
|
bb5a3bfd75 | ||
|
|
c67261fe46 | ||
|
|
4bd1ff360b | ||
|
|
f8b103fb13 | ||
|
|
9d7920755d | ||
|
|
9a6676e5e7 | ||
|
|
837c592936 | ||
|
|
612fb0a243 | ||
|
|
3bd1e82480 | ||
|
|
cf4a74a538 | ||
|
|
41c4cb9089 | ||
|
|
4ab4285a5b | ||
|
|
a146360479 | ||
|
|
83105438ca | ||
|
|
9e18531526 | ||
|
|
503a84c225 | ||
|
|
9bd5384209 | ||
|
|
5ec272d268 | ||
|
|
9282641d06 | ||
|
|
c3c9ad8462 | ||
|
|
e21a0d2105 | ||
|
|
f6ca16a49b | ||
|
|
09f2ac4ffa | ||
|
|
26e890eb62 | ||
|
|
0d97cf019c | ||
|
|
a1454ef518 | ||
|
|
324922818d | ||
|
|
d5df8870b6 | ||
|
|
6a4e667d16 | ||
|
|
7052b0759a | ||
|
|
8939d41c6c | ||
|
|
8c3519acf3 | ||
|
|
a5c854705b | ||
|
|
6c87a0713d | ||
|
|
c38e71d7e1 | ||
|
|
91133d6fa6 | ||
|
|
3007ef9970 | ||
|
|
bcbcb78d6d | ||
|
|
ada57de4d8 | ||
|
|
3cf9c431e4 | ||
|
|
1a9ac7012d | ||
|
|
7691176c28 | ||
|
|
3f7e75c255 | ||
|
|
543db100d3 | ||
|
|
a77bf8c971 | ||
|
|
a9228e1465 | ||
|
|
73104b0cdd | ||
|
|
fb334f3c1f | ||
|
|
b8e03090ea | ||
|
|
c05c8ab077 | ||
|
|
6f488e1684 | ||
|
|
f995d92c46 | ||
|
|
b9ce65655f | ||
|
|
0825f2c0bb | ||
|
|
25a051ffeb | ||
|
|
4b3563a3e3 | ||
|
|
5e6705a7cd | ||
|
|
ffc3f0702b | ||
|
|
34ddbc37fc | ||
|
|
b17d34f377 | ||
|
|
d814697fae | ||
|
|
4436e76959 | ||
|
|
cde6184725 | ||
|
|
ba7b24b9d4 | ||
|
|
258edce92e | ||
|
|
62b2940bc8 | ||
|
|
ae54364d7c | ||
|
|
f31d37cb10 | ||
|
|
07b589cf5f | ||
|
|
177c7feb01 | ||
|
|
d68cc6292b | ||
|
|
989d762140 | ||
|
|
afa8f68fe0 | ||
|
|
8241cfa9c4 | ||
|
|
469cf60015 | ||
|
|
efde07c4f7 | ||
|
|
3630cecbe6 | ||
|
|
bee52762cf | ||
|
|
5c421b753d | ||
|
|
ac98ac34ea | ||
|
|
3ca199f8bb | ||
|
|
7a138ca76f | ||
|
|
7a5f5a1fbe | ||
|
|
4766184140 | ||
|
|
474fdef5d4 | ||
|
|
42a2155136 | ||
|
|
f8004124c8 | ||
|
|
2cb5123dad | ||
|
|
55da127c36 | ||
|
|
74f75e693b | ||
|
|
68c020004b | ||
|
|
b9199b8f98 | ||
|
|
81d9ba8045 | ||
|
|
2a768018aa | ||
|
|
386044b7e4 | ||
|
|
9cd3e3b9e9 | ||
|
|
03494145d4 | ||
|
|
2f49c9042a | ||
|
|
1265bfa9b0 | ||
|
|
b1d9657478 | ||
|
|
a5a25eb2a8 | ||
|
|
db30d8621e | ||
|
|
ad9420f7fd | ||
|
|
e02e218a5a | ||
|
|
db7ca534c6 | ||
|
|
727d95f091 | ||
|
|
d8a596cb00 | ||
|
|
ca6aa13b40 | ||
|
|
09115c3cda | ||
|
|
a0b3b65fa3 | ||
|
|
73666ae123 | ||
|
|
8437dea9ff | ||
|
|
1bbaea5fce | ||
|
|
62cc311210 | ||
|
|
eda47816bd | ||
|
|
9db23b27fd | ||
|
|
23a5c2887e | ||
|
|
430ac501e0 | ||
|
|
d5328585dd | ||
|
|
fbd399ff1d | ||
|
|
9fb1746ff9 | ||
|
|
b0a81b5b0d | ||
|
|
f2eef0ccf8 | ||
|
|
5f30c84cd4 | ||
|
|
c035fe4cbf | ||
|
|
c50bbc8c04 | ||
|
|
35a44a6b1c | ||
|
|
c99348113a | ||
|
|
81578371f8 | ||
|
|
0e28a6675d | ||
|
|
db946256f9 | ||
|
|
5bf961b06a | ||
|
|
253e5f3cff | ||
|
|
5bf0ede3ef | ||
|
|
3a5271dd2e | ||
|
|
52b1f7ea66 | ||
|
|
57780bfa37 | ||
|
|
78c2a21836 | ||
|
|
eb92c9bd1b | ||
|
|
58347e3510 | ||
|
|
2cdc7b81f1 | ||
|
|
df49bb780b | ||
|
|
d35a22c763 | ||
|
|
7858ee8896 | ||
|
|
f417741ac9 | ||
|
|
9fe48e41f8 | ||
|
|
d0142ea1fb | ||
|
|
01a8af1a1c | ||
|
|
0516e936db | ||
|
|
af83a62ec5 | ||
|
|
2e7731cc7b | ||
|
|
c0d45c890f | ||
|
|
058918d101 | ||
|
|
bb8a274848 | ||
|
|
9e05781ec2 | ||
|
|
f96405e78a | ||
|
|
8a1145f607 | ||
|
|
39dbecdc10 | ||
|
|
3401cb5358 | ||
|
|
3bb0f45b9b | ||
|
|
da5fd1a3d0 | ||
|
|
144a435967 | ||
|
|
c0a8e3f436 | ||
|
|
2f21225155 | ||
|
|
ea7b980255 | ||
|
|
395eace356 | ||
|
|
cc948fe354 | ||
|
|
1a2fad128b | ||
|
|
67682ec259 | ||
|
|
c840a688ab | ||
|
|
3ede33a886 | ||
|
|
4d7910f424 | ||
|
|
10d97c8140 | ||
|
|
d57b870f3e | ||
|
|
44119e2051 | ||
|
|
8596226787 | ||
|
|
85382a5140 | ||
|
|
1f4713d320 | ||
|
|
b7dd48b41f | ||
|
|
4decc86598 | ||
|
|
6fb5095197 | ||
|
|
79a7ee656e | ||
|
|
71679c8921 | ||
|
|
44dbdd9632 | ||
|
|
97231e64ba | ||
|
|
cc785e2f1b | ||
|
|
a9f041a702 | ||
|
|
5daf512405 | ||
|
|
d6bc7757ab | ||
|
|
94db6c64a9 | ||
|
|
ef159cd863 | ||
|
|
263da2463a | ||
|
|
15a485cbdb | ||
|
|
440828f0f1 | ||
|
|
5d53e0d5ce | ||
|
|
07c0cda12d | ||
|
|
2f08d24743 | ||
|
|
1b4f249157 | ||
|
|
410d798e98 | ||
|
|
34937479a8 | ||
|
|
41bfd5e1f3 | ||
|
|
e56de16876 | ||
|
|
f385d32331 | ||
|
|
3c5470358e | ||
|
|
05db74e7db | ||
|
|
470e93e4df | ||
|
|
f359c2a716 | ||
|
|
88516dd8ae | ||
|
|
3e20032a32 | ||
|
|
f849dd0693 | ||
|
|
a566684564 | ||
|
|
dceb2b7c32 | ||
|
|
270d1199a6 | ||
|
|
89bdb78f0a | ||
|
|
756424b6dd | ||
|
|
e9c710e4fc | ||
|
|
8f2209680a | ||
|
|
95cee0eb5d | ||
|
|
ea54fe98f7 | ||
|
|
939470d771 | ||
|
|
84754d3d20 | ||
|
|
dd694b5fb4 | ||
|
|
e44e357381 | ||
|
|
ced12cbf76 | ||
|
|
2854ee56e9 | ||
|
|
fd71023dd6 | ||
|
|
124e4ba53c | ||
|
|
85a0ba28d7 | ||
|
|
54352fe566 | ||
|
|
326496ff80 | ||
|
|
6188f07c95 | ||
|
|
4fa86c4dc3 | ||
|
|
39a54f5abf | ||
|
|
52dd0274d3 | ||
|
|
3ed0960edb | ||
|
|
a12d3834d4 | ||
|
|
780f2293d6 | ||
|
|
f9c5a0fd4d | ||
|
|
a575e86b88 | ||
|
|
8f501a928a | ||
|
|
ad762980bb | ||
|
|
b019a57894 | ||
|
|
8724fe4b11 | ||
|
|
b1b1fe72e8 | ||
|
|
bfff3d3f9b | ||
|
|
cb0666e235 | ||
|
|
cb55229c1e | ||
|
|
9b1f2462bf | ||
|
|
3fab16603a | ||
|
|
66343f977f | ||
|
|
bcb9cf3c06 | ||
|
|
55d8057b7f | ||
|
|
5e19854d47 | ||
|
|
781b579074 | ||
|
|
77c07615f8 | ||
|
|
743d01d4a6 | ||
|
|
12cd67b8d9 | ||
|
|
6641af720d | ||
|
|
2d110f25f7 | ||
|
|
39b6bb8a18 | ||
|
|
7270be85a4 | ||
|
|
560d87e26a | ||
|
|
b3245ac327 | ||
|
|
a1a44a3582 | ||
|
|
da5c30efa2 | ||
|
|
1ffcd33817 | ||
|
|
9e0a6d86ba | ||
|
|
501bb0afd6 | ||
|
|
5f7d053c3a | ||
|
|
56c8976bac | ||
|
|
72d6c3246f | ||
|
|
166edb2cc1 | ||
|
|
8b31081c52 | ||
|
|
4619c662cc | ||
|
|
e8a0ceacaf | ||
|
|
4802f21a9e | ||
|
|
9c88857364 | ||
|
|
b71cc08ce1 | ||
|
|
0741598f58 | ||
|
|
e29b0d099f | ||
|
|
3fde72ea5c | ||
|
|
d022b89063 | ||
|
|
5b8155a578 | ||
|
|
b7a50a4f6f | ||
|
|
a606131a6a | ||
|
|
6b413b0d0f | ||
|
|
693c535a94 | ||
|
|
a25cf8ba83 | ||
|
|
a15a99b304 | ||
|
|
6e8f970999 | ||
|
|
bbe0cf376f | ||
|
|
f660247b47 | ||
|
|
1d2d2cf261 | ||
|
|
50d5ca71d0 | ||
|
|
189e8ab1e0 | ||
|
|
dbbbfd4b2b | ||
|
|
ece4a843c0 | ||
|
|
d62f138153 | ||
|
|
7fc1276ac7 | ||
|
|
ba2bba0f66 | ||
|
|
ab7561b2b6 | ||
|
|
3740ce2854 | ||
|
|
bfd53c5bd7 | ||
|
|
9691d56713 | ||
|
|
92829e8f94 | ||
|
|
c518f35e83 | ||
|
|
3e57a44829 | ||
|
|
5cf1fd8aa9 | ||
|
|
c64f579518 | ||
|
|
054c168b32 | ||
|
|
f599267459 | ||
|
|
3cd416b667 | ||
|
|
3139636906 | ||
|
|
0d349e331e | ||
|
|
51968cfd53 | ||
|
|
21488bdd7e | ||
|
|
3945f9cdb1 | ||
|
|
de1b95c8e7 | ||
|
|
725e733178 | ||
|
|
d226ed697e | ||
|
|
77b57fbbfe | ||
|
|
0dc3ffd29a | ||
|
|
10e45481be | ||
|
|
bfb8436ca2 | ||
|
|
edf3503779 | ||
|
|
a98cfbe868 | ||
|
|
12ea922389 | ||
|
|
db6fc916cf | ||
|
|
46e9bf5678 | ||
|
|
c6177d2629 | ||
|
|
0399a88eb6 | ||
|
|
8f715e12a9 | ||
|
|
4b39ce5134 | ||
|
|
53ae74200a | ||
|
|
9f570345a5 | ||
|
|
5d866295d8 | ||
|
|
9eae10b94a | ||
|
|
ca58aa1644 | ||
|
|
3b9c10dcf6 | ||
|
|
28e0fa7d1d | ||
|
|
3833f2315a | ||
|
|
e65c3ef9c9 | ||
|
|
552aee93fa | ||
|
|
1791fbdc49 | ||
|
|
c2e3999f76 | ||
|
|
677cec6e1c | ||
|
|
7435064cd3 | ||
|
|
0c57d94467 | ||
|
|
366aeb7228 | ||
|
|
296884b24a | ||
|
|
2e5ce9f4ec | ||
|
|
cc67ae9dbb | ||
|
|
71d33fa065 | ||
|
|
db3b0b63da | ||
|
|
5433932bd4 | ||
|
|
f5c6a22f17 | ||
|
|
f47c64cec6 | ||
|
|
7feb0f737b | ||
|
|
5271c1a9ad | ||
|
|
ef3e5899c6 | ||
|
|
badd2908b7 | ||
|
|
3f3b92a149 | ||
|
|
c3646f5554 | ||
|
|
a97d73d616 | ||
|
|
50684a5a34 | ||
|
|
f06467b95b | ||
|
|
9faae4b71c | ||
|
|
e49d5a5f9a | ||
|
|
ed10a5de5b | ||
|
|
e8b84145e8 | ||
|
|
38f8734014 | ||
|
|
a10564e214 | ||
|
|
ecef3b6b98 | ||
|
|
e65ea6a8b7 | ||
|
|
7139de2a6e | ||
|
|
b5403de5e5 | ||
|
|
0966f1358b | ||
|
|
a0ac64cbd6 | ||
|
|
b03b6dfb99 | ||
|
|
c11f9833ac | ||
|
|
9ee34ef6b3 | ||
|
|
df7e519159 | ||
|
|
5e60812ad4 | ||
|
|
1263604703 | ||
|
|
5904db580f | ||
|
|
1960067926 | ||
|
|
33bd9ecd9d | ||
|
|
7f7c1fcccf | ||
|
|
34fdd0e839 | ||
|
|
9de4eccd99 | ||
|
|
a0847dc852 | ||
|
|
87a3145ba1 | ||
|
|
85e236d798 | ||
|
|
cb4c3d7a9e | ||
|
|
e55fc87ad3 | ||
|
|
5398dea0df | ||
|
|
e0eb6bbd28 | ||
|
|
822b323f8e | ||
|
|
c1f645cd5f | ||
|
|
f1d9359acf | ||
|
|
550e774db2 | ||
|
|
e23b06ec8c | ||
|
|
4f8b8a8a59 | ||
|
|
c06d71e662 | ||
|
|
cce43652f0 | ||
|
|
9f0a4c8edb | ||
|
|
f571cfbf71 |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -54,3 +54,9 @@ nbproject
|
||||
# WebFinger
|
||||
.well-known
|
||||
/.buildpath
|
||||
|
||||
#tests - autogenerated filed
|
||||
data-autotest
|
||||
/tests/coverage*
|
||||
/tests/autoconfig*
|
||||
/tests/autotest*
|
||||
@@ -19,4 +19,8 @@ RewriteRule ^apps/contacts/carddav.php remote.php/carddav/ [QSA,L]
|
||||
RewriteRule ^apps/([^/]*)/(.*\.(css|php))$ index.php?app=$1&getfile=$2 [QSA,L]
|
||||
RewriteRule ^remote/(.*) remote.php [QSA,L]
|
||||
</IfModule>
|
||||
<IfModule mod_mime.c>
|
||||
AddType image/svg+xml svg svgz
|
||||
AddEncoding gzip svgz
|
||||
</IfModule>
|
||||
Options -Indexes
|
||||
|
||||
11
3rdparty/MDB2/Driver/Manager/pgsql.php
vendored
11
3rdparty/MDB2/Driver/Manager/pgsql.php
vendored
@@ -363,6 +363,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
|
||||
return MDB2_OK;
|
||||
}
|
||||
|
||||
$unquoted_name = $name;
|
||||
$name = $db->quoteIdentifier($name, true);
|
||||
|
||||
if (!empty($changes['remove']) && is_array($changes['remove'])) {
|
||||
@@ -398,6 +399,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
|
||||
|
||||
if (!empty($changes['change']) && is_array($changes['change'])) {
|
||||
foreach ($changes['change'] as $field_name => $field) {
|
||||
$unquoted_field_name = $field_name;
|
||||
$field_name = $db->quoteIdentifier($field_name, true);
|
||||
if (!empty($field['definition']['type'])) {
|
||||
$server_info = $db->getServerVersion();
|
||||
@@ -419,7 +421,14 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
if (array_key_exists('default', $field['definition'])) {
|
||||
if (array_key_exists('autoincrement', $field['definition'])) {
|
||||
$query = "ALTER $field_name SET DEFAULT nextval(".$db->quote($unquoted_name.'_'.$unquoted_field_name.'_seq', 'text').")";
|
||||
$result = $db->exec("ALTER TABLE $name $query");
|
||||
if (PEAR::isError($result)) {
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
elseif (array_key_exists('default', $field['definition'])) {
|
||||
$query = "ALTER $field_name SET DEFAULT ".$db->quote($field['definition']['default'], $field['definition']['type']);
|
||||
$result = $db->exec("ALTER TABLE $name $query");
|
||||
if (PEAR::isError($result)) {
|
||||
|
||||
4
3rdparty/Sabre/CardDAV/Plugin.php
vendored
4
3rdparty/Sabre/CardDAV/Plugin.php
vendored
@@ -153,10 +153,6 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin {
|
||||
if (is_resource($val))
|
||||
$val = stream_get_contents($val);
|
||||
|
||||
// Taking out \r to not screw up the xml output
|
||||
//$returnedProperties[200][$addressDataProp] = str_replace("\r","", $val);
|
||||
// The stripping of \r breaks the Mail App in OSX Mountain Lion
|
||||
// this is fixed in master, but not backported. /Tanghus
|
||||
$returnedProperties[200][$addressDataProp] = $val;
|
||||
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ class Sabre_CardDAV_Property_SupportedAddressData extends Sabre_DAV_Property {
|
||||
if (is_null($supportedData)) {
|
||||
$supportedData = array(
|
||||
array('contentType' => 'text/vcard', 'version' => '3.0'),
|
||||
array('contentType' => 'text/vcard', 'version' => '4.0'),
|
||||
// array('contentType' => 'text/vcard', 'version' => '4.0'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
2
3rdparty/Sabre/CardDAV/Version.php
vendored
2
3rdparty/Sabre/CardDAV/Version.php
vendored
@@ -16,7 +16,7 @@ class Sabre_CardDAV_Version {
|
||||
/**
|
||||
* Full version number
|
||||
*/
|
||||
const VERSION = '1.6.3';
|
||||
const VERSION = '1.6.7';
|
||||
|
||||
/**
|
||||
* Stability : alpha, beta, stable
|
||||
|
||||
14
3rdparty/Sabre/DAV/Browser/Plugin.php
vendored
14
3rdparty/Sabre/DAV/Browser/Plugin.php
vendored
@@ -338,7 +338,7 @@ class Sabre_DAV_Browser_Plugin extends Sabre_DAV_ServerPlugin {
|
||||
$icon = '';
|
||||
|
||||
if ($this->enableAssets) {
|
||||
$node = $parent->getChild($name);
|
||||
$node = $this->server->tree->getNodeForPath(($path?$path.'/':'') . $name);
|
||||
foreach(array_reverse($this->iconMap) as $class=>$iconName) {
|
||||
|
||||
if ($node instanceof $class) {
|
||||
@@ -439,12 +439,16 @@ class Sabre_DAV_Browser_Plugin extends Sabre_DAV_ServerPlugin {
|
||||
*/
|
||||
protected function getLocalAssetPath($assetName) {
|
||||
|
||||
$assetDir = realpath(__DIR__ . '/assets') . '/';
|
||||
$path = $assetDir . $assetName;
|
||||
|
||||
// Making sure people aren't trying to escape from the base path.
|
||||
$assetSplit = explode('/', $assetName);
|
||||
if (in_array('..',$assetSplit)) {
|
||||
throw new Sabre_DAV_Exception('Incorrect asset path');
|
||||
$path = realpath($path);
|
||||
|
||||
if ($path === false || substr($path, 0, strlen($assetDir))!==$assetDir) {
|
||||
throw new Sabre_DAV_Exception_Forbidden('Path does not exist, or escaping from the base path was detected');
|
||||
}
|
||||
$path = __DIR__ . '/assets/' . $assetName;
|
||||
|
||||
return $path;
|
||||
|
||||
}
|
||||
|
||||
55
3rdparty/Sabre/DAV/Client.php
vendored
55
3rdparty/Sabre/DAV/Client.php
vendored
@@ -16,12 +16,25 @@
|
||||
*/
|
||||
class Sabre_DAV_Client {
|
||||
|
||||
/**
|
||||
* The propertyMap is a key-value array.
|
||||
*
|
||||
* If you use the propertyMap, any {DAV:}multistatus responses with the
|
||||
* properties listed in this array, will automatically be mapped to a
|
||||
* respective class.
|
||||
*
|
||||
* The {DAV:}resourcetype property is automatically added. This maps to
|
||||
* Sabre\DAV\Property\ResourceType
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $propertyMap = array();
|
||||
|
||||
protected $baseUri;
|
||||
protected $userName;
|
||||
protected $password;
|
||||
protected $proxy;
|
||||
protected $trustedCertificates;
|
||||
|
||||
/**
|
||||
* Basic authentication
|
||||
@@ -45,6 +58,13 @@ class Sabre_DAV_Client {
|
||||
*/
|
||||
protected $authType;
|
||||
|
||||
/**
|
||||
* Indicates if SSL verification is enabled or not.
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
private $verifyPeer;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
@@ -87,6 +107,27 @@ class Sabre_DAV_Client {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Add trusted root certificates to the webdav client.
|
||||
*
|
||||
* The parameter certificates should be a absolute path to a file
|
||||
* which contains all trusted certificates
|
||||
*
|
||||
* @param string $certificates
|
||||
*/
|
||||
public function addTrustedCertificates($certificates) {
|
||||
$this->trustedCertificates = $certificates;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables/disables SSL peer verification
|
||||
*
|
||||
* @param boolean $value
|
||||
*/
|
||||
public function setVerifyPeer($value) {
|
||||
$this->verifyPeer = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does a PROPFIND request
|
||||
*
|
||||
@@ -143,13 +184,13 @@ class Sabre_DAV_Client {
|
||||
if ($depth===0) {
|
||||
reset($result);
|
||||
$result = current($result);
|
||||
return $result[200];
|
||||
return isset($result[200])?$result[200]:array();
|
||||
}
|
||||
|
||||
$newResult = array();
|
||||
foreach($result as $href => $statusList) {
|
||||
|
||||
$newResult[$href] = $statusList[200];
|
||||
$newResult[$href] = isset($statusList[200])?$statusList[200]:array();
|
||||
|
||||
}
|
||||
|
||||
@@ -279,10 +320,18 @@ class Sabre_DAV_Client {
|
||||
CURLOPT_MAXREDIRS => 5,
|
||||
);
|
||||
|
||||
if($this->verifyPeer !== null) {
|
||||
$curlSettings[CURLOPT_SSL_VERIFYPEER] = $this->verifyPeer;
|
||||
}
|
||||
|
||||
if($this->trustedCertificates) {
|
||||
$curlSettings[CURLOPT_CAINFO] = $this->trustedCertificates;
|
||||
}
|
||||
|
||||
switch ($method) {
|
||||
case 'HEAD' :
|
||||
|
||||
// do not read body with HEAD requests (this is neccessary because cURL does not ignore the body with HEAD
|
||||
// do not read body with HEAD requests (this is necessary because cURL does not ignore the body with HEAD
|
||||
// requests when the Content-Length header is given - which in turn is perfectly valid according to HTTP
|
||||
// specs...) cURL does unfortunately return an error in this case ("transfer closed transfer closed with
|
||||
// ... bytes remaining to read") this can be circumvented by explicitly telling cURL to ignore the
|
||||
|
||||
20
3rdparty/Sabre/DAV/Server.php
vendored
20
3rdparty/Sabre/DAV/Server.php
vendored
@@ -214,17 +214,23 @@ class Sabre_DAV_Server {
|
||||
$error->setAttribute('xmlns:s',self::NS_SABREDAV);
|
||||
$DOM->appendChild($error);
|
||||
|
||||
$error->appendChild($DOM->createElement('s:exception',get_class($e)));
|
||||
$error->appendChild($DOM->createElement('s:message',$e->getMessage()));
|
||||
$h = function($v) {
|
||||
|
||||
return htmlspecialchars($v, ENT_NOQUOTES, 'UTF-8');
|
||||
|
||||
};
|
||||
|
||||
$error->appendChild($DOM->createElement('s:exception',$h(get_class($e))));
|
||||
$error->appendChild($DOM->createElement('s:message',$h($e->getMessage())));
|
||||
if ($this->debugExceptions) {
|
||||
$error->appendChild($DOM->createElement('s:file',$e->getFile()));
|
||||
$error->appendChild($DOM->createElement('s:line',$e->getLine()));
|
||||
$error->appendChild($DOM->createElement('s:code',$e->getCode()));
|
||||
$error->appendChild($DOM->createElement('s:stacktrace',$e->getTraceAsString()));
|
||||
$error->appendChild($DOM->createElement('s:file',$h($e->getFile())));
|
||||
$error->appendChild($DOM->createElement('s:line',$h($e->getLine())));
|
||||
$error->appendChild($DOM->createElement('s:code',$h($e->getCode())));
|
||||
$error->appendChild($DOM->createElement('s:stacktrace',$h($e->getTraceAsString())));
|
||||
|
||||
}
|
||||
if (self::$exposeVersion) {
|
||||
$error->appendChild($DOM->createElement('s:sabredav-version',Sabre_DAV_Version::VERSION));
|
||||
$error->appendChild($DOM->createElement('s:sabredav-version',$h(Sabre_DAV_Version::VERSION)));
|
||||
}
|
||||
|
||||
if($e instanceof Sabre_DAV_Exception) {
|
||||
|
||||
2
3rdparty/Sabre/DAV/Version.php
vendored
2
3rdparty/Sabre/DAV/Version.php
vendored
@@ -14,7 +14,7 @@ class Sabre_DAV_Version {
|
||||
/**
|
||||
* Full version number
|
||||
*/
|
||||
const VERSION = '1.6.4';
|
||||
const VERSION = '1.6.8';
|
||||
|
||||
/**
|
||||
* Stability : alpha, beta, stable
|
||||
|
||||
2
3rdparty/Sabre/DAVACL/Version.php
vendored
2
3rdparty/Sabre/DAVACL/Version.php
vendored
@@ -14,7 +14,7 @@ class Sabre_DAVACL_Version {
|
||||
/**
|
||||
* Full version number
|
||||
*/
|
||||
const VERSION = '1.6.0';
|
||||
const VERSION = '1.6.8';
|
||||
|
||||
/**
|
||||
* Stability : alpha, beta, stable
|
||||
|
||||
9
3rdparty/Sabre/VObject/Component/VAlarm.php
vendored
9
3rdparty/Sabre/VObject/Component/VAlarm.php
vendored
@@ -29,7 +29,14 @@ class Sabre_VObject_Component_VAlarm extends Sabre_VObject_Component {
|
||||
|
||||
$parentComponent = $this->parent;
|
||||
if ($related === 'START') {
|
||||
$effectiveTrigger = clone $parentComponent->DTSTART->getDateTime();
|
||||
|
||||
if ($parentComponent->name === 'VTODO') {
|
||||
$propName = 'DUE';
|
||||
} else {
|
||||
$propName = 'DTSTART';
|
||||
}
|
||||
|
||||
$effectiveTrigger = clone $parentComponent->$propName->getDateTime();
|
||||
$effectiveTrigger->add($triggerDuration);
|
||||
} else {
|
||||
if ($parentComponent->name === 'VTODO') {
|
||||
|
||||
4
3rdparty/Sabre/VObject/DateTimeParser.php
vendored
4
3rdparty/Sabre/VObject/DateTimeParser.php
vendored
@@ -28,7 +28,7 @@ class Sabre_VObject_DateTimeParser {
|
||||
static public function parseDateTime($dt,DateTimeZone $tz = null) {
|
||||
|
||||
// Format is YYYYMMDD + "T" + hhmmss
|
||||
$result = preg_match('/^([1-3][0-9]{3})([0-1][0-9])([0-3][0-9])T([0-2][0-9])([0-5][0-9])([0-5][0-9])([Z]?)$/',$dt,$matches);
|
||||
$result = preg_match('/^([1-4][0-9]{3})([0-1][0-9])([0-3][0-9])T([0-2][0-9])([0-5][0-9])([0-5][0-9])([Z]?)$/',$dt,$matches);
|
||||
|
||||
if (!$result) {
|
||||
throw new Sabre_DAV_Exception_BadRequest('The supplied iCalendar datetime value is incorrect: ' . $dt);
|
||||
@@ -54,7 +54,7 @@ class Sabre_VObject_DateTimeParser {
|
||||
static public function parseDate($date) {
|
||||
|
||||
// Format is YYYYMMDD
|
||||
$result = preg_match('/^([1-3][0-9]{3})([0-1][0-9])([0-3][0-9])$/',$date,$matches);
|
||||
$result = preg_match('/^([1-4][0-9]{3})([0-1][0-9])([0-3][0-9])$/',$date,$matches);
|
||||
|
||||
if (!$result) {
|
||||
throw new Sabre_DAV_Exception_BadRequest('The supplied iCalendar date value is incorrect: ' . $date);
|
||||
|
||||
2
3rdparty/Sabre/VObject/Version.php
vendored
2
3rdparty/Sabre/VObject/Version.php
vendored
@@ -14,7 +14,7 @@ class Sabre_VObject_Version {
|
||||
/**
|
||||
* Full version number
|
||||
*/
|
||||
const VERSION = '1.3.4';
|
||||
const VERSION = '1.3.5';
|
||||
|
||||
/**
|
||||
* Stability : alpha, beta, stable
|
||||
|
||||
37
3rdparty/aws-sdk/_compatibility_test/README.md
vendored
37
3rdparty/aws-sdk/_compatibility_test/README.md
vendored
@@ -1,37 +0,0 @@
|
||||
# Compatibility Test
|
||||
|
||||
## Via your web browser
|
||||
|
||||
1. Upload `sdk_compatibility_test.php` to the web-accessible root of your website.
|
||||
For example, if your website is `www.example.com`, upload it so that you can get
|
||||
to it at `www.example.com/sdk_compatibility_test.php`
|
||||
|
||||
2. Open your web browser and go to the page you just uploaded.
|
||||
|
||||
|
||||
## Via the command line
|
||||
|
||||
### Windows
|
||||
|
||||
1. Upload `sdk_compatibility_test_cli.php` to your server via SFTP.
|
||||
|
||||
2. SSH/RDP into the machine, and find the directory where you uploaded the test.
|
||||
|
||||
3. Run the test, and review the results:
|
||||
|
||||
php .\sdk_compatibility_test_cli.php
|
||||
|
||||
|
||||
### Non-Windows (Mac or *nix)
|
||||
|
||||
1. Upload `sdk_compatibility_test_cli.php` to your server via SFTP.
|
||||
|
||||
2. SSH into the machine, and find the directory where you uploaded the test.
|
||||
|
||||
3. Set the executable bit:
|
||||
|
||||
chmod +x ./sdk_compatibility_test_cli.php
|
||||
|
||||
4. Run the test, and review the results:
|
||||
|
||||
./sdk_compatibility_test_cli.php
|
||||
@@ -1,75 +0,0 @@
|
||||
<?php
|
||||
|
||||
define('REQUIREMENTS_ALL_MET', 100);
|
||||
define('REQUIREMENTS_MIN_MET', 10);
|
||||
define('REQUIREMENTS_NOT_MET', 0);
|
||||
|
||||
// Required
|
||||
$php_ok = (function_exists('version_compare') && version_compare(phpversion(), '5.2.0', '>='));
|
||||
$simplexml_ok = extension_loaded('simplexml');
|
||||
$dom_ok = extension_loaded('dom');
|
||||
$json_ok = (extension_loaded('json') && function_exists('json_encode') && function_exists('json_decode'));
|
||||
$spl_ok = extension_loaded('spl');
|
||||
$pcre_ok = extension_loaded('pcre');
|
||||
$curl_ok = false;
|
||||
if (function_exists('curl_version'))
|
||||
{
|
||||
$curl_version = curl_version();
|
||||
$curl_ok = (function_exists('curl_exec') && in_array('https', $curl_version['protocols'], true));
|
||||
}
|
||||
$file_ok = (function_exists('file_get_contents') && function_exists('file_put_contents'));
|
||||
|
||||
// Optional, but recommended
|
||||
$openssl_ok = (extension_loaded('openssl') && function_exists('openssl_sign'));
|
||||
$zlib_ok = extension_loaded('zlib');
|
||||
|
||||
// Optional
|
||||
$apc_ok = extension_loaded('apc');
|
||||
$xcache_ok = extension_loaded('xcache');
|
||||
$memcached_ok = extension_loaded('memcached');
|
||||
$memcache_ok = extension_loaded('memcache');
|
||||
$mc_ok = ($memcache_ok || $memcached_ok);
|
||||
$pdo_ok = extension_loaded('pdo');
|
||||
$pdo_sqlite_ok = extension_loaded('pdo_sqlite');
|
||||
$sqlite2_ok = extension_loaded('sqlite');
|
||||
$sqlite3_ok = extension_loaded('sqlite3');
|
||||
$sqlite_ok = ($pdo_ok && $pdo_sqlite_ok && ($sqlite2_ok || $sqlite3_ok));
|
||||
|
||||
// Other
|
||||
$int64_ok = (PHP_INT_MAX === 9223372036854775807);
|
||||
$ini_memory_limit = get_ini('memory_limit');
|
||||
$ini_open_basedir = get_ini('open_basedir');
|
||||
$ini_safe_mode = get_ini('safe_mode');
|
||||
$ini_zend_enable_gc = get_ini('zend.enable_gc');
|
||||
|
||||
if ($php_ok && $int64_ok && $curl_ok && $simplexml_ok && $dom_ok && $spl_ok && $json_ok && $pcre_ok && $file_ok && $openssl_ok && $zlib_ok && ($apc_ok || $xcache_ok || $mc_ok || $sqlite_ok))
|
||||
{
|
||||
$compatiblity = REQUIREMENTS_ALL_MET;
|
||||
}
|
||||
elseif ($php_ok && $curl_ok && $simplexml_ok && $dom_ok && $spl_ok && $json_ok && $pcre_ok && $file_ok)
|
||||
{
|
||||
$compatiblity = REQUIREMENTS_MIN_MET;
|
||||
}
|
||||
else
|
||||
{
|
||||
$compatiblity = REQUIREMENTS_NOT_MET;
|
||||
}
|
||||
|
||||
function get_ini($config)
|
||||
{
|
||||
$cfg_value = ini_get($config);
|
||||
|
||||
if ($cfg_value === false || $cfg_value === '' || $cfg_value === 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
elseif ($cfg_value === true || $cfg_value === '1' || $cfg_value === 1)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function is_windows()
|
||||
{
|
||||
return strtolower(substr(PHP_OS, 0, 3)) === 'win';
|
||||
}
|
||||
@@ -1,789 +0,0 @@
|
||||
<?php
|
||||
if (isset($_GET['logopng']))
|
||||
{
|
||||
$data = <<<IMAGE
|
||||
iVBORw0KGgoAAAANSUhEUgAAASwAAABwCAYAAACkRk1NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
|
||||
AAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAU
|
||||
dEVYdENyZWF0aW9uIFRpbWUAOS80LzEwZyhWjQAAGJpJREFUeNrtnQ2wXEWVgJvwjKksP2MKMAKV
|
||||
HXbZIqUgU1CLWBtkLLZc1IU3CK4ssDAEFVlhM7qIyhYwiqALCqOFIkbNGDSsSszsqllA1zfhT0SX
|
||||
DD8aFgJv+DU/JG9CfpYErNluc+6m35m+ffvvvrkz75yqU8mbudO3b9/u755z+txuxkhISEhISEhI
|
||||
SEgyJa8tnlvgWgUtZqxuOa4lqFtF1JXuGAnJ9AJUHgZ/g2uHa1ehTYBEoQ/1K3KtcW3F1K3Ntc61
|
||||
LK6F7igJyfABqgyDvB0DAZ12AG6VNAABFl4FINl10BYATlhiObrjJCSDBajIjdJZKT4qWzg5h/qZ
|
||||
WHg+2syie0tCQqKGwYoUIBCnq23AAKBaPUV1mwBok9VFQjIAVtZ5AK+JwCAY47rIxz0EsC5KAV7i
|
||||
WpdwHaVeQEIyuAAbhYHsCq8VAMBcCnXzhdc4QYqEZHBg1IR4kFFMyQJexpCCmJmIa3XQ50WIedVM
|
||||
Zhwt4CUgdaNFmVFQv0Y9hoSk/8CSB3PDdMpfgte4DaTA5YxmHicFzhXAUgXsS5ZurSuk8KRDk3oM
|
||||
CUm2gIWn/IOkI0iQauisnwRg4XQJI3gZ1q9gMDNKwCIhyTCwVPAqWJSdN4GUI7BUuV5WqRISpEzz
|
||||
ywhYJCQDAizsminjShp3Kk1gdWPc2pwmXuaSBEvAIiEZQGDJWkTleaUWBAKWEjCQEBqsPBISEgIW
|
||||
AYuEhISARcAiISFgEbBISEgIWAQsEhISApa7UqY7CQkBa2CAVaUeQ0JCwCJgkZCQELAIWCQkBCwC
|
||||
FgkJCQGLgEVCQkLAImCRkBCwCFgkJCQELAIWCQkJAYuARUJCwCJgkZCQELAIWCQkJNkE1jgqq+C5
|
||||
L2JoYFWox5CQ9BdYJc/dnn2Blbibjce+iCGAtdp341cSEpLw4MLbYqUJLOMttzzh5QqsFQQpEpLh
|
||||
hJcpsJwh5QEvG2Cltjs1CUnWB3wRD+SM1a8AdcwFgJcOWMEhZQmvJGCNEaRIpqtFUlLsZOy0X16K
|
||||
sSrVHnwN081SJXit1gBrDMBR7OO1jgJgawpgUUyKZFpCKtp/r2ETBA61k7IhXKJNTDsWm6VWLbZz
|
||||
p4FPQpJxV6rqukmo6WakASDaDFS/YFvBk5CQ9NeVCqkdVzg4bLfuWr9MuLYkJCR6GNwIweNuyhoF
|
||||
qE+0tKgWoZhSWjoBsalR6hkkJIMBr9BwCDaLlhK8CFIkJEMALx84GEPKNaAN9TvPMYPd2NKDwH5q
|
||||
LuLIjL1zXItcK1yrSMXn+am87+J8cF6hBYffR78t9qG9SlPdXinfi6LPvQhUh4JUh3y/YGQVEDeE
|
||||
l/juKsPyJgX2Fd83bWJehkmgVhCFwH5LldYQCApigLW4dg20DcfnLQd2VaM5xbFtxbk7XOvy8TED
|
||||
qxFTd3GN5QCQqli2V812gME5mgG1YQMa6Be1hOtsQj1zDuCJ6wsVRT3qcO/j+kN+qoGlms0rGQ7m
|
||||
CA5jptP+usB5DLCcAvYIXmMekIpNHPUceDXDQRenVYunc2I50JE7Buft4MEH19MwrHfL1kqQ2quT
|
||||
dnvB+bopaDWlftHBoEk4h/Y+oX5j2h/K/QJWkNk8xXmKJrN7BsDqKhJBvWfzLGYfiwFgVYixYFy0
|
||||
HgJYFrDqgRYMspbDIMtbtFcrUHu1TCySfgArQL9oGl5bMwlYUBfb85f6DSwVvIzhEJMN3w0MLGd4
|
||||
OaZIFD1hlfe0ElRaCwCspsvgh/JdLcWmocURur3qWQOWwwPDGciGwHIBZ8fWPU0TWEZwcIFUQGCp
|
||||
suyD1i8AsFopDYaCB7B8nupVz3oXfQZXiuedMmA5Wqg6bXi2acXj3JWsAiv1FTg9gZVK/XyAJfz8
|
||||
lAaC1mowAFY/taapd6kf7dUHYNVSOFfFA1g+D7AWAWt4gNUytFjyCDYmv2sPKLCantZVDbVXwfB3
|
||||
HZ/AtKO7lI8JERgFtaW0gqqB+xjrnqVotU4K2hOwBhhYhh2zrHEZ2q4dxRJYdRgQNccnbfR70wHf
|
||||
0VyzU3tZPBy84y0W7lMl5vd1F3ffMCheDQCshpTy0A7hbhOwBgNYRZ8AtGGsKOcJrIJHbKWFLQjT
|
||||
maaU2quc9sCymEBpekBZ5zLXXaxuC2CVHfsDAWtILKyWi7VgAZ2ix2/rnnG3gqsF4dhelbTaK7CL
|
||||
H5u+Ydi2ec8YX8ERWPV+PQgIWBmJYSkGVPRaSSWAheYLrKJHALrlY+lY5GIVobxU28uwPqazo6XQ
|
||||
FpKlhVZ1BFbBoz9UCVhDBqwUXEovYCWcu+3hthT7EaRNE1gWSZUNz3Y1yVPr2JZhAKyO5zlTBdYE
|
||||
ASs7wFK80FuHDtbqI7CaI+4JkakCS2qvcqj2MjhfeyRAEqVvQrArfAx+00yrP4QAVpOA1T9gQaym
|
||||
ArMxvpnOrsDqDAqwpJefGwFeb3IBVm0kTGJqMYRrZeLeOfymRsAiYKlAVR+ZguztADNufQfWVLZX
|
||||
gPSQWqCyTIBVd5j99QIOAWuaAcvz1YdpByxw9zpT1V4ay65jmN6Rm0JgVW2vk4BFwLKBVX0kvSzj
|
||||
oQNWinC3BVbDJ72DgEXAGuZ3CTsQKylDx86lPEuYSWBZvEsYLSQXpL086lG16AsELAJWphNHTV2K
|
||||
Wh/SGjIHLJv2UrlgoYDlm81OwCJgDSqwTGaXKn3Kw8oisCo+AzogsJojHtnsnrlcIdIauqGBQ8Ca
|
||||
HsBKmoJv9zFxNIvAavWrvRziZ2XHPhFigUMCFgErLLAMV2pIyn0pTzNg+a5nVfIBVqhs9oQ6ekHZ
|
||||
8EHYHDZgVT2z3UMCYUXG67faZSuyEPEKw9nFoQBWoPaqeQLLdQXQDrRXNWmNc8N7mkuIi6bxLmF2
|
||||
gSUN5FHYRHRiioGwAna2yWW0fsa7AaUFLIsAdIWAZWx56NaLqgZMnejEbTNmaAWWPK3uwlACywMO
|
||||
LkAwgpRB/cazWD/HAdjwnAmKXTVhSIHVChB7anvAzkXLDg+ipsd9aacBnMwByxJepkAwhgDsJ5g3
|
||||
rF8B9hscn6r6pQSsuKeh7TrwlSEAlmn8qOjR1jqXKc0loXMObmHZEcrlaQcsA3jpgGADqWjz0qZi
|
||||
U9eCBbxs6jeWFqQcYg3y2t3RWll1RxekMA2C7tG1Vj3bS/WuXZrAKjpMyET5ZkVwI02us+2xpvtw
|
||||
AAtZQNGOygX03ZgFpGz2BbTa1FWCq6p+XjGplGaEUtsRZkCB1ZjC9mr0C1gpxMxMYl/TC1ieoPPd
|
||||
FxDvi5gfhGtPeYuvpFjJIAJrKnf6qfYTWCk80OppAmeogQWuXhkA001JW+BOFjIOLd9OWTaYri8P
|
||||
Qx6W4XlN2qvq0F46NyvaRaYkuaKRqxbtFtRyAFaozVTrBv2QgKWB1ZIAq5ra5EmVMgys3Ij7FuCl
|
||||
BPB1hvDlZ9dB3JFBFFP/TpzbpIBUxeHVm2hhxqbFWum+0Kob1o2AlWKe15SmIEwRtGwsh6Zi+yzc
|
||||
sdueW9X7Aqvsce6OQXvVA7dXJ6G9amApFQPOEtcN3w3MOcS02klJqpbxQV9gVdgwSQB4DRSkNJ24
|
||||
prj5bSlTOulp3ICBkDMYBBVpQ0yshYTfFzS/rRicX3fukmF75aX26ni0V8PWWurjg62isbg6cC1l
|
||||
h7J197NqcD+9fp81GDVtAuIArxsNkkBtUiT+P7DPSEiGQADYUbwsRy0SFliqgLgJvOQk0Amwwkxe
|
||||
28lJgf2O7mVqEhISEh2wnOBlcJ6cyewj3REvmc31QK5voKYgmY7A6rpmsUPZqmz4LgErFbmG6wau
|
||||
W+HfedQkwWQG13O5rgE9m5ok+8AygpcEqVaI9bVIjOXHXLuSvoeaJJj8GddXpLYVD4UjqFkGB1hT
|
||||
tiAgibGsJGClJl9CbSv0FGoWAhYBi4CVRZnDdZPUti+z3fFCEgIWCQErk7If11u4fp2agoBFwCJg
|
||||
kZAQsAZQ5nO9nO0OoovZvse43s71Aq4HOAJLTI6czvVUrkdynRmgngdx/dMArpG4JtGHjuU6bAmW
|
||||
oo1EmsnrPMqYy/VdcN/28ShHTBzMI2ANN7D+iu2exv4t12Wa40a53s11jOtZmuMENO7kegdX/IrL
|
||||
/mx3asILrDfAG+kTXBdaAOtvuK7l2pE+38ZVLFf8dw7tIcq7B+q4GeI6W7g+znU517dw3dugHDHw
|
||||
ylx/zfVZqNME1xe53g9toxvkZ3A9h+vBXPeCzy7m+ijUZ5zrvvD5J7neB/UuG9TtMK5LoT2jd+xE
|
||||
WkMVyl/N9TLN74/i+hVoE9H2T3N9jutd0DdmGcbMLoW+Jx5aO6C918F1HGvYzlWpP70C7bwT6nSd
|
||||
1EZ/lIPnHFDm2kQqPqvB//NwXDH6joCVLfmBNNB3wUBRyf3ScaJTjyiOEZ/9r3TcF6XvZsGA36mB
|
||||
VVfqeGcaAEuU/7KmHHE9N1hYQT/huj2hbuL77yaUdQiAfVdC3e6MsbgE1F+F40R7/gW0HS7v43D8
|
||||
i9JnG8Ha1Mld0vF/gM9yAI2udF4se8EDqYXucxed/46E8x8HD0hdX9iZ0M7HAOiS+tJ6+QELIKpy
|
||||
bYNWJTh1xd9wXF3+m4CVHbkYWSfLYwbgk9Ix68BVwnIydJAuWAGyhXWbooM+A+f7BXR0+TtRp7cl
|
||||
AGtnwt8RGC4zaId7DDq/fJ4vayyH31uU9ZDCfV0qff8S11tjri0C1n3o808ngFmu35gErO3ooYHl
|
||||
eAOgR78dA4say59D3zBtn9sUD8f5YLWaliEs2wXI0vqjdYX+7gDEcgArAlYGgXUkuBfRzX1Rccz7
|
||||
EVCEVXOu4rgrpCfvBohNRE/UHagT3Q6xD9lNeRgd83gCsOSnurBKTgIXB8PvNa6Ha9rgVMVA/B3X
|
||||
xVy/wPU/wV3Bg3Kewg28QwHMu+EcZ8BA3oaOuVYDrC2Kc++Ez6NBuAhZPPdrrvU0qX3ENXzYEFiH
|
||||
Iis76gfiem8GV162dkXi6T8pYNlSPJiEZftutju7/lfIknxVESL4maI9xO++yXbPcD7JJifBdsFl
|
||||
TQJWZFXVAF5NAlY2g+6y9STAkkffq5IK64py5Cf9g1Js5CH027jtsMSgaKO6HJ8ArE0KGB2rAKRu
|
||||
qn4MHbtSEYeZCxYhPk6WhWiwCVBeqDjfpZLLFw3aA2KA9Qfkji6DwS0f/1aweuXBGRd8riNL+WBD
|
||||
YC1ClriwcE5Ex1yPjmmhIPo1CCTbwSrH8m1kUa6VytkXrE45Xnk+ineNQPxvAt2Lv04AlnAPWwCt
|
||||
OgEru8Bagp5WH9bEr2QLZCayLmTL5ibJnXwZxUaO0dTlixowrlRYL+8ziM1FlmNcMPgFdP3HxRz3
|
||||
dmkgiXOvQt//Cp1zVUzgeCbEAeVjL4sBljzg4t7vmwUxIRmA5yiOez2yYtdI3yUB62H03eWK8l+H
|
||||
Hk6bJSDtB1aYfE1LYq5nNopP7YJZxMhal/vZU4bxWdHv3msArAoAq0TAyi6wFqIn479J3x2k6Ghd
|
||||
iIPI75qdInWyrWxPysEV6HfPxgTsI1mABs46DbB+l+DqTiBr7a0xx76EgPXOmONmwGzpVxXHFFBs
|
||||
5hWYTdO5obI1dl8CsFYk3MOvo+OXxwSqn5eO+awhsI5Cv9scE5+KZjfljPnPS/1jK3L1kmb/5Ov5
|
||||
AXw+itrtSQCxSgQk/4XrJyB2JruEBaHo7zzEr4ryZwSs7MnhyBV7nu2ZSh+VgrTbpEEpOvSHUPxK
|
||||
DhRHs18/QR3vFxCwj9N3INB0ARQqYH0l4bqeQ8cvijluHB13vxR/M5V/VABdJ/OQ5bmR7UlzWKqw
|
||||
JJPyi96F2u1Z1pvTdKkU61qHJjV0wKqgGNk9mnrMRX1pKXx+C7qm3yRczwmoPmsk6G5GbXMp88vf
|
||||
ypYQsIzkURRbiAbs51CQVY6V3Cr9/t6YGNXjikDtRo2+hOIX2yAgrwJW0lLGOAC+2CCuI7uQPwdX
|
||||
bQHTJ7QKaSgmDD6o0UuQRbYVYngqYD0tPUCYxi2cQLE9HGNaJX0/jr7TAesbhuCP5GRot49wfTN8
|
||||
9iAq496E9rkStc8mcKVnIgsugtYasMLOAotwNgFruIH1NTR4TofPH5A+F0mQjyCXbBYM5rXS51+K
|
||||
Cei7qADW0THASno151Z0/PdjjjsMYkRxdRDtsR4GnQgcz0+YcHDVY2OAdZvhPfwvjQWKU1OWWQDr
|
||||
TnQ/XHaBesKzbTZBeELIlxOO7YCFK/rLeQNnfRGwjORs9ERbAjMyckBaDNZr0WzU0chtFIP7A1K5
|
||||
L3p21B2SO4SBdWrCNWHLoKE59iLFkztON4AFMDMmKO2qb4sB1rcM7+H5bHLKxNPSd/8gxRi3wD0z
|
||||
Bdbd6NpH+wSsg6XyHjD83S7og0cTsIYLWIdCB49u9CNgwWyQOsxJAKPNUqf+KJj/cpLeG6Vy26gD
|
||||
fQbiE6aa0wTdkyysGwwC0bKcCYDeZTAQXkUxPOz6boRBaqq/kcC8VDODqJP9UWB7o+SSLUEza4dY
|
||||
AKsZAFjPKGJ8bQt9QOHm3YwmTHT6HNPn4mUKWPUMAWs8w031axQ4v5ZNTgTdF2C0Cc3ejKHBMEMq
|
||||
839Qx/m8R/0wsE5POB7Hpr5neB6R+/VVcHm3aQAm7mU0i4QTIm/2uE4MrEssfvtLNnnGU/z2T+Ba
|
||||
cHa7i0u4Faw1W8H94MxAfTYH3sESiMNOsPhXfpazQRFY1ngR7MQ81cAah513Chlvpn9FwfFHFbM6
|
||||
M5B5vxZZZt9AZeJljW8NCKxywvE/Qsdf43je46Bt1ikGwUVwzO3o85/2CVjyTGAXXFXRf6O0BPHd
|
||||
hZbAwjltVyfUQUxSLET35xFUxg0p9eE54AksY71vPKyD7wcuCG8LLxdgDQqkZDkDmdhyIFp+d+6b
|
||||
yO2IYl+iw+MVEq5WWCU6mQ1PSzF1fhMKcGNgfTuhLOymvduzfeaiyQW5Dtcx8xwx2YU7LDCwjlDE
|
||||
DT/H9mT+i0F7pCWwPsV6U1Pi5E1gZa+HvvSjGKD/h8G1HKhwXW3kBIV1/HY2yGIIL1NgDSKkZDmA
|
||||
TU4QjF6jWI8C6adJkNqBXBC8+oBoCzkpdTtDL6Iq4khyJ/uZBlhrNeW8mU3OcxLXcFAMhH4Mg1wM
|
||||
sKMS2ujqGDfzJOSK7Ig5nwzmh+CcImfqqkDAYqw3RUWOH/03U68VpgNWCYUBhJU2SxP436KYMLiQ
|
||||
9b6QrEsgFvG8NdA+T0kupEjYfQz6yG8T2mEG682xG55FHzXw0gFr0CGF5UGF2/MMsgT2Z+o37p+P
|
||||
KRO7A+uZOhFyHnRO+djrNcDapoljLWe9yaAq+Rg6Trxeo1uHaTFT53bNYb0rCCzWlPNJNvm9ujUB
|
||||
gYVfb5JdxJs0saA4YOWQZbmdxS9DhFMgzpTurfy6jZi0+KCFWxw9uNqojI8ntAV2C49nwygAr6sA
|
||||
SBhYY7ADdHEIL/0aBYhUT7LHmHopEJWcznpXQxCD+yPQkXNgweEZHzFjd6gGWNG09QL0VD0XWXW6
|
||||
dw4LyEoUbvC1McceznpXWrgoxlWOrCzVYoRFNnk2T+iVAYG1AFnKslVzogOwGOtNEXmM9c66XYLa
|
||||
XZQhL1J4N+tNIlY9cD6K2kfcv7NiHhjPQXuq5Ep0TZuY/RsMJBmXU1jvqzGqGa/Pst4lPj6gKfen
|
||||
TL2ulEiR+D3rXYjvNcXTc6XCXY0G4kpwz1ax3sXlxOB6vaZu9yog+CTA+xywJm5gva/6dBBQD0QD
|
||||
NrIyxJT8h8DaaCjaVwykfQICazbrfbk6SiXYxxFYf6mAtZj5uwWgvIJNXmdL/B6vyzWf9S77IsB0
|
||||
B5Tx93D/8DGPSy7ofLZnzTX5PtwJ/eU0cEvvUjwU7qXhPXyyD4pXiM5wgeK4k5GJjwcvljkKMOiS
|
||||
/aoK10wG1jJFh4xbITQp/6agCKab5GF9RlHW2QpoJWVlnxAw6B7J1xTn+nfN8SYL+H1M4WJFuXX4
|
||||
M9W7gnuB1bPTon1eUFhFCy3LiMCYp+E9nPIQeiqrBvy+yO1Ya1j29Sw5KznOfVspuVri7ft/Vjz1
|
||||
8fuAJxjWa36MGxX3utB1msDzBcwsa35DjEuEgXWxwz18L+vdZ/B8zfH7sd4JFJXcyPTLUgvr9p6E
|
||||
h8QXEu6bbFnFxYYvYuYrlz7F1OtukQyJCBiI4PsvwdJhmoEppq1/yPasV2QiYpaqAgNTTJGLd+C+
|
||||
Y1CGeL2iyXYvFyJbR6sArC/BIBUzQ3XmtoPK5eDqbGeTZyt3wFNaBH+PMShHDNifQxmvIijvhDaL
|
||||
i6ecA4NxA0PrOFmIsJi+C23xBLhMSe/UidQVsQGFSCC+IuaYvWHwi+TTdaDRDKvIx7vaME4kZnEf
|
||||
hrbZhSy7DliIcwzaOLrGLQqLStxH8V7rm2hIk2RNhLXzRhZmG60Z0MmLXP8WBugRHuWJcspsd3qA
|
||||
yWzyCFzLkZ7nTVNEHQ+BazvZ8Lri7ts7wZV+D9vzKpFtGW+BuogyFjAKrpOQkJCQkJCQkJCQkJCE
|
||||
l/8Df+8XDp+g0JUAAAAASUVORK5CYII=
|
||||
IMAGE;
|
||||
|
||||
|
||||
header('Content-type: image/png');
|
||||
echo base64_decode($data);
|
||||
exit;
|
||||
}
|
||||
elseif (isset($_GET['background']))
|
||||
{
|
||||
$data = <<<IMAGE
|
||||
R0lGODlhMAEeAeYAAP///8ni6cTf5+72+PD3+c3k6+nz9ufy9ev099Pn7bnZ48bg6LfY4uHv8/r8
|
||||
/f3+/v7//7bX4cjh6fj7/Mvj6vz9/rva4+z19/X6+/f7/Pn8/fb6+7jZ4vv9/bra473b5Lzb5LXX
|
||||
4b7c5b/c5e31+NTo7tvs8dfq7/H3+bjY4tnq79Hm7c/l69nr8PL4+t7t8sDd5cLe5uPw9Nvr8Mri
|
||||
6fP4+tLn7er099Hm7O/2+dDm7OTw9OXx9Nbp7tbp7+Lv8+Du8szj6sXg57bY4d3s8djq7+jz9tzs
|
||||
8cPe58fh6M7k68Pf5+by9fz+/sDd5vT5+vT5+97t8bbY4trr8P7+/v7+/+Pw8+Xx9dXo7sHe5vH4
|
||||
+fP5+sHd5t/u8s/l7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
|
||||
BAAAAAAALAAAAAAwAR4BAAf/gCGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKNEaWm
|
||||
p6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExbBDyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7K
|
||||
UuHi4+Tl5ufo6err7O3u7/Dx8vP09fb34wz6+/z9/v8AAwocSLCgwYMIEypcyLChw4cQI0qcSLGi
|
||||
xYsYM2osmKKjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qc+ZGDzZs4c+rcybOnz59AgwodSrSo0aNI
|
||||
kypdyrSp06dQo0qdSrWq1aAKsmrdyrWr169gw4odS7as2bNo06pdy7at27dw/+PKnUu3rt27ePOS
|
||||
9cC3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sz5sIXPoEOLHk26tOnTqFOrXs26
|
||||
tevXsGPLnk27tu3buHPr3s27t+/fqkEIH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv
|
||||
4MOLb/6hvPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFgifCAgmqOCCDDbo4IMQ
|
||||
RijhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okoTjjCiiy26OKLMMYo44w01mjjjTjmqOOOPPbo
|
||||
449ABinkkEQWaeSRSCap5P+SNsLg5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZELpxJlopqnm
|
||||
mmy26eabcMYp55x01mnnnXjmqeeefPaZJheABirooIQWauihiCaq6KKMNuroo5BGKumklFZqqaBZ
|
||||
ZKrpppx26umnoIYq6qiklmrqqaimquqqrLbq6qubxiDrrLTWauutuOaq66689urrr8AGK+ywxBZr
|
||||
7LHI0orEssw26+yz0EYr7bTUVmvttdhmq+223Hbr7bfghtvsEuSWa+656Kar7rrstuvuu/DGK++8
|
||||
9NZr77345quvuQL06++/AAcs8MAEF2zwwQgnrPDCDDfs8MMQRyzxxBRXbPH/xRhnrPHGHHeMsBAg
|
||||
hyzyyCSXbPLJKKes8sost+zyyzDHLPPMNNdss8gL5Kzzzjz37PPPQAct9NBEF2300UgnrfTSTDft
|
||||
9NNQRy311FRXbfXVWGdNdBJcd+3112CHLfbYZJdt9tlop6322my37fbbcMctt9cS1G333Xjnrffe
|
||||
fPft99+ABy744IQXbvjhiCeu+OKMN+7445BHLvnklFcOeACYZ6755px37vnnoIcu+uikl2766ain
|
||||
rvrqrLfu+uuwxy777LTXbvvtuI9Ow+689+7778AHL/zwxBdv/PHIJ6/88sw37/zz0EffOwXUV2/9
|
||||
9dhnr/323Hfv/ffghy/+//jkl2/++einr/767Lfv/vvwxy///PR/H8T9+Oev//789+///wAMoAAH
|
||||
SMACGvCACEygAhfIwAbmrwAQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTKEKV8jC
|
||||
FrrwhTDcoBJmSMMa2vCGOMyhDnfIwx768IdADKIQh0jEIhrxiEhMYg1ZwMQmOvGJUIyiFKdIxSpa
|
||||
8YpYzKIWt8jFLnrxi2AMoxid6IUymvGMaEyjGtfIxja68Y1wjKMc50jHOtrxjnjMox73eEYd+PGP
|
||||
gAykIAdJyEIa8pCITKQiF8nIRjrykZCMpCQnSUlA4uCSmMykJjfJyU568v+ToAylKEdJylKa8pSo
|
||||
TKUqV8nKVmZyBbCMpSxnScta2vKWuMylLnfJy1768pfADKYwh0nMYhpTljZIpjKXycxmOvOZ0Iym
|
||||
NKdJzWpa85rYzKY2t8nNbnrzm8tMgDjHSc5ymvOc6EynOtfJzna6853wjKc850nPetrznvjMpz73
|
||||
yc9++vOfAA2oQNtZgoIa9KAITahCF8rQhjr0oRCNqEQnStGKWvSiGM2oRjd6UCx49KMgDalIR0rS
|
||||
kpr0pChNqUpXytKWuvSlMI2pTGdKU5D24KY4zalOd8rTnvr0p0ANqlCHStSiGvWoSE2qUpfK1Kbm
|
||||
1AdQjapUp0rVqlr1qlj/zapWt8rVrnr1q2ANq1jHStaymlWqJ0irWtfK1ra69a1wjatc50rXutr1
|
||||
rnjNq173yte++vWvay2CYAdL2MIa9rCITaxiF8vYxjr2sZCNrGQnS9nKWvaymCWsCjbL2c569rOg
|
||||
Da1oR0va0pr2tKhNrWpXy9rWuva1sI1tZ1tA29ra9ra4za1ud8vb3vr2t8ANrnCHS9ziGve4yE2u
|
||||
cm07heY697nQja50p0vd6lr3utjNrna3y93ueve74A2veMf73BmY97zoTa9618ve9rr3vfCNr3zn
|
||||
S9/62ve++M2vfvfLX/Sa4L8ADrCAB0zgAhv4wAhOsIIXzOAGO/jBEI6w/4QnTOEKB/gIGM6whjfM
|
||||
4Q57+MMgDrGIR0ziEpv4xChOsYpXzOIWu1jDRIixjGdM4xrb+MY4zrGOd8zjHvv4x0AOspCHTOQi
|
||||
G/nIM46CkpfM5CY7+clQjrKUp0zlKlv5yljOspa3zOUue/nLYGbyC8ZM5jKb+cxoTrOa18zmNrv5
|
||||
zXCOs5znTOc62/nOeM5zmbvA5z77+c+ADrSgB03oQhv60IhOtKIXzehGO/rRkI60pP0MhEpb+tKY
|
||||
zrSmN83pTnv606AOtahHTepSm/rUqE61qld96Qa4+tWwjrWsZ03rWtv61rjOta53zete+/rXwA62
|
||||
sIdN7GIb+9jITrayl//N7GY7O9c/iLa0p03talv72tjOtra3ze1ue/vb4A63uMdN7nKb+9zTtoK6
|
||||
183udrv73fCOt7znTe962/ve+M63vvfN7377+98AZ7cMBk7wghv84AhPuMIXzvCGO/zhEI+4xCdO
|
||||
8Ypb/OIYz3jBd8Dxjnv84yAPuchHTvKSm/zkKE+5ylfO8pa7/OUwj7nMPc6Dmtv85jjPuc53zvOe
|
||||
+/znQA+60IdO9KIb/ehIT7rSl37zKzj96VCPutSnTvWqW/3qWM+61rfO9a57/etgD7vYx052qDPh
|
||||
7GhPu9rXzva2u/3tcI+73OdO97rb/e54z7ve9873vqf9AIAPvOAHT/j/whv+8IhPvOIXz/jGO/7x
|
||||
kI+85CdP+cpb/vKYz7zmN8/5znv+86BfvBFGT/rSm/70qE+96lfP+ta7/vWwj73sZ0/72tv+9rjP
|
||||
fekNwPve+/73wA++8IdP/OIb//jIT77yl8/85jv/+dCPvvSnT/3qW//62M++9rfP/ePf4PvgD7/4
|
||||
x0/+8pv//OhPv/rXz/72u//98I+//OdP//qHHwH4z7/+98///vv//wAYgAI4gARYgAZ4gAiYgAq4
|
||||
gAzYgA74gBAYgRI4gRRYgRZ4gRg4gBewgRzYgR74gSAYgiI4giRYgiZ4giiYgiq4gizYgi74gjAY
|
||||
gzI4gzRYgzZ4gziY/4M6uIMmSAI++INAGIRCOIREWIRGeIRImIRKuIRM2IRO+IRQGIVSOIVUCIQD
|
||||
cIVYmIVauIVc2IVe+IVgGIZiOIZkWIZmeIZomIZquIZs2IZu+IZwGIdyOId0WId2eIdimAN6uId8
|
||||
2Id++IeAGIiCOIiEWIiGeIiImIiKuIiM2IiO+IiQyIcEMImUWImWeImYmImauImc2Ime+ImgGIqi
|
||||
OIqkWIqmeIqomIqquIqs2Iqu+IqwGIuyOIueiAK2eIu4mIu6uIu82Iu++IvAGIzCOIzEWIzGeIzI
|
||||
mIzKuIzMiIta8IzQGI3SOI3UWI3WeI3YmI3auI3c2I3e+I3gGI7iOP+O5FiO0egC6JiO6riO7NiO
|
||||
7viO8BiP8jiP9FiP9niP+JiP+riP/NiP/qiONRCQAjmQBFmQBnmQCJmQCrmQDNmQDvmQEBmREjmR
|
||||
FFmRFnmRA7kFGrmRHNmRHvmRIBmSIjmSJFmSJnmSKJmSKrmSLNmSLvmSMMmRTzCTNFmTNnmTOJmT
|
||||
OrmTPNmTPvmTQBmUQjmURFmURnmUSJmUNQkFTNmUTvmUUBmVUjmVVFmVVnmVWJmVWrmVXNmVXvmV
|
||||
YBmWYumUGFCWZnmWaJmWarmWbNmWbvmWcBmXcjmXdFmXdnmXeJmXermXfNmXfvmXgBmYgjmYhFmY
|
||||
cLkBiJmYirmYjNn/mI75mJAZmZI5mZRZmZZ5mZiZmZq5mZzZmZ75maAZmqI5mqRZmqZ5mqg5mRmw
|
||||
mqzZmq75mrAZm7I5m7RZm7Z5m7iZm7q5m7zZm775m8AZnMI5nMRZnMZ5nMiZnMq5nLY5Ac75nNAZ
|
||||
ndI5ndRZndZ5ndiZndq5ndzZnd75neAZnuI5nuRZnuZ5nuiZnuq5nuzZnu6ZnRoQn/I5n/RZn/Z5
|
||||
n/iZn/q5n/zZn/75nwAaoAI6oARaoAZ6oAiaoAq6oAzaoA76oBAaofzpABRaoRZ6oRiaoRq6oRza
|
||||
oR76oSAaoiI6oiRaoiZ6oiiaoiq6oizaoi76ojAaozI6ozT6oR1w/6M4mqM6uqM82qM++qNAGqRC
|
||||
OqREWqRGeqRImqRKuqRM2qRO+qRQGqVSOqVUWqVWeqVCWgFauqVc2qVe+qVgGqZiOqZkWqZmeqZo
|
||||
mqZquqZs2qZu+qZwGqdyOqd0Wqd2eqd4mqd6WqZN0Kd++qeAGqiCOqiEWqiGeqiImqiKuqiM2qiO
|
||||
+qiQGqmSOql/+gCWeqmYmqmauqmc2qme+qmgGqqiOqqkWqqmeqqomqqquqqs2qqu+qqwGquyOqu0
|
||||
Wqu2GqpUkKu6uqu82qu++qvAGqzCOqzEWqzGeqzImqzKuqzM2qzO+qy7WgXSOq3UWq3Weq3Ymq3a
|
||||
uq3c2q3e+q3gGv+u4jqu5Fqu5nqu6EqtELCu7Nqu7vqu8Bqv8jqv9Fqv9nqv+Jqv+rqv/Nqv/vqv
|
||||
ABuwAjuwBFuwBnuwCJuwCruw9goADvuwEBuxEjuxFFuxFnuxGJuxGruxHNuxHvuxIBuyIjuyJFuy
|
||||
JnuyKJuyKruyLNuyLvuyMBuzMjuzNFuzNnuzOJuzOruzPNuzPvuzQBu0Qju0RFu0Rnu0SJu0Sru0
|
||||
TNu0Tvu0UBu1Uju1VFu1Vnu1WJu1Wru1XNu1Xvu1YBu2Yju2ZFu2Znu2aJu2aru2bNu2bvu2cBu3
|
||||
cju3dFu3dnu3eJu3eru3fNu3fvu3gBu4gju4hFu4hnu4iJu4irv/uIzbuI77uJAbuZI7uZRbuZZ7
|
||||
uZibuZq7uZzbuZ77uaAbuqI7uqRbuqZ7uqibuqq7uqzbuq77urAbu7I7u7Rbu7Z7u7ibu7q7u7zb
|
||||
u777u8AbvMI7vMRbvMZ7vMibvMq7vMzbvM77vNAbvdI7vdRbvdZ7vdibvdq7vdzbvd77veAbvuI7
|
||||
vuRbvuZ7vuibvuq7vuzbvu77vvAbv/I7v/Rbv/Z7v/ibv/q7v/zbv/77vwAcwAI8wARcwAZ8wAic
|
||||
wAq8wAzcwA78wBAcwRI8wRRcwRZ8wRicwRq8wRzcwR78wSAcwiI8wiRcwiZ8wiicwiq8wizcwi78
|
||||
wjAcwzI8wzRcFcM2fMM4nMM6vMM83MM+/MNArLmBAAA7
|
||||
IMAGE;
|
||||
|
||||
header('Content-type: image/gif');
|
||||
echo base64_decode($data);
|
||||
exit;
|
||||
}
|
||||
elseif (isset($_GET['loader']))
|
||||
{
|
||||
$data = <<<IMAGE
|
||||
R0lGODlhEAALAPQAAP///wBmzNro9tDi9Ory+gZpzQBmzC6B1YKz5WCf3rrV8CJ60kqS2oq452Sh
|
||||
377X8SZ80wRozE6U2+bv+djn9vT4/DiH19zp9/L2+7bS76DF68re8+70+gAAAAAAAAAAACH/C05F
|
||||
VFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAA
|
||||
EAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJ
|
||||
CwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJ
|
||||
CwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHT
|
||||
uBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V5
|
||||
5zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme
|
||||
1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAA
|
||||
ABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2
|
||||
y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2
|
||||
isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0
|
||||
DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA
|
||||
IMAGE;
|
||||
header('Content-type: image/gif');
|
||||
echo base64_decode($data);
|
||||
exit;
|
||||
}
|
||||
elseif (isset($_GET['ssl_check']))
|
||||
{
|
||||
header('Content-type: text/plain; charset=utf-8');
|
||||
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, 'https://email.us-east-1.amazonaws.com');
|
||||
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
|
||||
curl_setopt($ch, CURLOPT_HEADER, false);
|
||||
curl_setopt($ch, CURLOPT_NOBODY, true);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 5184000);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
|
||||
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
|
||||
curl_setopt($ch, CURLOPT_USERAGENT, 'aws-sdk-php/compat-www');
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
|
||||
curl_setopt($ch, CURLOPT_VERBOSE, true);
|
||||
|
||||
curl_exec($ch);
|
||||
echo (curl_getinfo($ch, CURLINFO_SSL_VERIFYRESULT) === 0) ? 'false' : 'true';
|
||||
curl_close($ch);
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
// Include the compatibility test logic
|
||||
require dirname(__FILE__) . DIRECTORY_SEPARATOR . 'sdk_compatibility.inc.php';
|
||||
|
||||
header('Content-type: text/html; charset=UTF-8');
|
||||
|
||||
?><!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>AWS SDK for PHP: Environment Compatibility Test</title>
|
||||
<meta name="ROBOTS" content="NOINDEX, NOFOLLOW, NOARCHIVE" />
|
||||
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
/*!
|
||||
* Reqwest! A x-browser general purpose XHR connection manager
|
||||
* copyright Dustin Diaz 2011
|
||||
* https://github.com/ded/reqwest
|
||||
* license MIT
|
||||
*/
|
||||
!function(window){function serial(a){var b=a.name;if(a.disabled||!b)return"";b=enc(b);switch(a.tagName.toLowerCase()){case"input":switch(a.type){case"reset":case"button":case"image":case"file":return"";case"checkbox":case"radio":return a.checked?b+"="+(a.value?enc(a.value):!0)+"&":"";default:return b+"="+(a.value?enc(a.value):"")+"&"}break;case"textarea":return b+"="+enc(a.value)+"&";case"select":return b+"="+enc(a.options[a.selectedIndex].value)+"&"}return""}function enc(a){return encodeURIComponent(a)}function reqwest(a,b){return new Reqwest(a,b)}function init(o,fn){function error(a){o.error&&o.error(a),complete(a)}function success(resp){o.timeout&&clearTimeout(self.timeout)&&(self.timeout=null);var r=resp.responseText;if(r)switch(type){case"json":resp=window.JSON?window.JSON.parse(r):eval("("+r+")");break;case"js":resp=eval(r);break;case"html":resp=r}fn(resp),o.success&&o.success(resp),complete(resp)}function complete(a){o.complete&&o.complete(a)}this.url=typeof o=="string"?o:o.url,this.timeout=null;var type=o.type||setType(this.url),self=this;fn=fn||function(){},o.timeout&&(this.timeout=setTimeout(function(){self.abort(),error()},o.timeout)),this.request=getRequest(o,success,error)}function setType(a){return/\.json$/.test(a)?"json":/\.jsonp$/.test(a)?"jsonp":/\.js$/.test(a)?"js":/\.html?$/.test(a)?"html":/\.xml$/.test(a)?"xml":"js"}function Reqwest(a,b){this.o=a,this.fn=b,init.apply(this,arguments)}function getRequest(a,b,c){if(a.type!="jsonp"){var f=xhr();f.open(a.method||"GET",typeof a=="string"?a:a.url,!0),setHeaders(f,a),f.onreadystatechange=readyState(f,b,c),a.before&&a.before(f),f.send(a.data||null);return f}var d=doc.createElement("script");window[getCallbackName(a)]=generalCallback,d.type="text/javascript",d.src=a.url,d.async=!0;var e=function(){a.success&&a.success(lastValue),lastValue=undefined,head.removeChild(d)};d.onload=e,d.onreadystatechange=function(){/^loaded|complete$/.test(d.readyState)&&e()},head.appendChild(d)}function generalCallback(a){lastValue=a}function getCallbackName(a){var b=a.jsonpCallback||"callback";if(a.url.slice(-(b.length+2))==b+"=?"){var c="reqwest_"+uniqid++;a.url=a.url.substr(0,a.url.length-1)+c;return c}var d=new RegExp(b+"=([\\w]+)");return a.url.match(d)[1]}function setHeaders(a,b){var c=b.headers||{};c.Accept=c.Accept||"text/javascript, text/html, application/xml, text/xml, */*",b.crossOrigin||(c["X-Requested-With"]=c["X-Requested-With"]||"XMLHttpRequest");if(b.data){c["Content-type"]=c["Content-type"]||"application/x-www-form-urlencoded";for(var d in c)c.hasOwnProperty(d)&&a.setRequestHeader(d,c[d],!1)}}function readyState(a,b,c){return function(){a&&a.readyState==4&&(twoHundo.test(a.status)?b(a):c(a))}}var v=window.v;!v&&typeof require!="undefined"&&(v=require("valentine"));var twoHundo=/^20\d$/,doc=document,byTag="getElementsByTagName",head=doc[byTag]("head")[0],xhr="XMLHttpRequest"in window?function(){return new XMLHttpRequest}:function(){return new ActiveXObject("Microsoft.XMLHTTP")},uniqid=0,lastValue;Reqwest.prototype={abort:function(){this.request.abort()},retry:function(){init.call(this,this.o,this.fn)}},reqwest.serialize=function(a){var b=a[byTag]("input"),c=a[byTag]("select"),d=a[byTag]("textarea");return(v(b).chain().toArray().map(serial).value().join("")+v(c).chain().toArray().map(serial).value().join("")+v(d).chain().toArray().map(serial).value().join("")).replace(/&$/,"")},reqwest.serializeArray=function(a){for(var b=this.serialize(a).split("&"),c=0,d=b.length,e=[],f;c<d;c++)b[c]&&(f=b[c].split("="))&&e.push({name:f[0],value:f[1]});return e};var old=window.reqwest;reqwest.noConflict=function(){window.reqwest=old;return this},window.reqwest=reqwest}(this)
|
||||
</script>
|
||||
|
||||
<style type="text/css">
|
||||
body {
|
||||
font:14px/1.4em "Helvetica Neue", Helvetica, "Lucida Grande", Roboto, "Droid Sans", Ubuntu, Verdana, Arial, Clean, Sans, sans-serif;
|
||||
letter-spacing:0px;
|
||||
color:#333;
|
||||
margin:0;
|
||||
padding:0;
|
||||
background:#fff url(<?php echo pathinfo(__FILE__, PATHINFO_BASENAME); ?>?background) repeat-x top left;
|
||||
}
|
||||
|
||||
div#site {
|
||||
width:650px;
|
||||
margin:20px auto 0 auto;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #326EA1;
|
||||
text-decoration: underline;
|
||||
padding: 1px 2px;
|
||||
-webkit-transition: background-color 0.15s;
|
||||
-webkit-transition: color 0.15s;
|
||||
-moz-transition: background-color 0.15s;
|
||||
-moz-transition: color 0.15s;
|
||||
transition: background-color 0.15s;
|
||||
transition: color 0.15s;
|
||||
-webkit-border-radius: 2px;
|
||||
-moz-border-radius: 2px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
a:hover, a.hover {
|
||||
color: #fff;
|
||||
background-color: #333;
|
||||
text-decoration: none;
|
||||
padding: 1px 2px;
|
||||
}
|
||||
|
||||
p {
|
||||
margin:0;
|
||||
padding:5px 0;
|
||||
}
|
||||
|
||||
em {
|
||||
font-style:normal;
|
||||
background-color:#ffc;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
margin:10px 0 10px 20px;
|
||||
padding:0 0 0 15px;
|
||||
}
|
||||
|
||||
ul li, ol li {
|
||||
margin:0 0 4px 0;
|
||||
padding:0 0 0 3px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size:18px;
|
||||
padding:0;
|
||||
margin:0 0 10px 0;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size:16px;
|
||||
padding:0;
|
||||
margin:20px 0 5px 0;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size:14px;
|
||||
padding:0;
|
||||
margin:15px 0 5px 0;
|
||||
}
|
||||
|
||||
pre, code {
|
||||
font-family: "Panic Sans", "Bitstream Vera Sans Mono", Monaco, Consolas, "Andale Mono", monospace;
|
||||
background-color: #F0F0F0;
|
||||
border-radius: 3px 3px 3px 3px;
|
||||
padding: 0 3px;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
em strong {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
table.chart {
|
||||
border-collapse:collapse;
|
||||
}
|
||||
|
||||
table.chart th {
|
||||
background-color:#eee;
|
||||
padding:2px 3px;
|
||||
border:1px solid #fff;
|
||||
}
|
||||
|
||||
table.chart td {
|
||||
text-align:center;
|
||||
padding:2px 3px;
|
||||
border:1px solid #eee;
|
||||
}
|
||||
|
||||
table.chart tr.enabled td {
|
||||
/* Leave this alone */
|
||||
}
|
||||
|
||||
table.chart tr.disabled td,
|
||||
table.chart tr.disabled td a {
|
||||
color:#999;
|
||||
font-style:italic;
|
||||
}
|
||||
|
||||
table.chart tr.disabled td a {
|
||||
text-decoration:underline;
|
||||
}
|
||||
|
||||
div.chunk {
|
||||
margin:0;
|
||||
padding:10px;
|
||||
border-bottom:1px solid #ccc;
|
||||
}
|
||||
|
||||
div.important {
|
||||
background-color:#ffc;
|
||||
}
|
||||
|
||||
div.ok {
|
||||
background-color:#cfc;
|
||||
}
|
||||
|
||||
div.error {
|
||||
background-color:#fcc;
|
||||
}
|
||||
|
||||
div.important h3 {
|
||||
margin: 7px 0 5px 0;
|
||||
}
|
||||
|
||||
.footnote,
|
||||
.footnote a {
|
||||
font:12px/1.4em "Helvetica Neue", Helvetica, "Lucida Grande", Verdana, Arial, Clean, Sans, sans-serif;
|
||||
color:#aaa;
|
||||
}
|
||||
|
||||
.footnote em {
|
||||
background-color:transparent;
|
||||
font-style:italic;
|
||||
}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="site">
|
||||
<div id="content">
|
||||
|
||||
<div class="chunk">
|
||||
<h2 style="text-align:center;"><img src="<?php echo pathinfo(__FILE__, PATHINFO_BASENAME); ?>?logopng" alt="SDK Compatibility Test" title="SDK Compatibility Test" /></h2>
|
||||
|
||||
<h3>Minimum Requirements</h3>
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%" class="chart">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Test</th>
|
||||
<th>Should Be</th>
|
||||
<th>What You Have</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="<?php echo ($php_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td>PHP</td>
|
||||
<td>5.2 or newer</td>
|
||||
<td><?php echo phpversion(); ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($curl_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/curl">cURL</a></td>
|
||||
<td>7.15.0 or newer, with SSL</td>
|
||||
<td><?php echo ($curl_ok) ? ($curl_version['version'] . ' (' . $curl_version['ssl_version'] . ')') : ($curl_version['version'] . (in_array('https', $curl_version['protocols'], true) ? ' (with ' . $curl_version['ssl_version'] . ')' : ' (without SSL)')); ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($simplexml_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/simplexml">SimpleXML</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($simplexml_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($dom_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/dom">DOM</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($dom_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($spl_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/spl">SPL</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($spl_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($json_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/json">JSON</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($json_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($pcre_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/pcre">PCRE</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($pcre_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($file_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td>File System <a href="http://php.net/file_get_contents">Read</a>/<a href="http://php.net/file_put_contents">Write</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($file_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3>Optional Extensions</h3>
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%" class="chart">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Test</th>
|
||||
<th>Would Like To Be</th>
|
||||
<th>What You Have</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="<?php echo ($openssl_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/openssl">OpenSSL</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($openssl_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($zlib_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/zlib">Zlib</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($zlib_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($apc_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/apc">APC</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($apc_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($xcache_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://xcache.lighttpd.net">XCache</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($xcache_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($memcache_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/memcache">Memcache</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($memcache_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($memcached_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/memcached">Memcached</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($memcached_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($pdo_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/pdo">PDO</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($pdo_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($pdo_sqlite_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/pdo-sqlite">PDO-SQLite</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($pdo_sqlite_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($sqlite2_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/sqlite">SQLite 2</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($sqlite2_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($sqlite3_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/sqlite3">SQLite 3</a></td>
|
||||
<td>Enabled</td>
|
||||
<td><?php echo ($sqlite3_ok) ? 'Enabled' : 'Disabled'; ?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3>Settings for php.ini</h3>
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%" class="chart">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Test</th>
|
||||
<th>Would Like To Be</th>
|
||||
<th>What You Have</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="<?php echo (!$ini_open_basedir) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/open_basedir">open_basedir</a></td>
|
||||
<td>off</td>
|
||||
<td><?php echo ($ini_open_basedir) ? 'on' : 'off'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo (!$ini_safe_mode) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/safe_mode">safe_mode</a></td>
|
||||
<td>off</td>
|
||||
<td><?php echo ($ini_safe_mode) ? 'on' : 'off'; ?></td>
|
||||
</tr>
|
||||
<tr class="<?php echo ($ini_zend_enable_gc) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="http://php.net/zend.enable_gc">zend.enable_gc</a></td>
|
||||
<td>on</td>
|
||||
<td><?php echo ($ini_zend_enable_gc) ? 'on' : 'off'; ?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3>Other</h3>
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%" class="chart">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Test</th>
|
||||
<th>Would Like To Be</th>
|
||||
<th>What You Have</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="<?php echo ($int64_ok) ? 'enabled' : 'disabled'; ?>">
|
||||
<td><a href="https://aws.amazon.com/amis/4158">Architecture</a></td>
|
||||
<td>64-bit</td>
|
||||
<td><?php echo ($int64_ok) ? '64-bit' : '32-bit'; ?><?php if (is_windows()): ?>
|
||||
(<a href="#win64">why?</a>)
|
||||
<?php endif; ?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<?php if ($compatiblity == REQUIREMENTS_ALL_MET): ?>
|
||||
<div class="chunk important ok">
|
||||
<h3>Bottom Line: Yes, you can!</h3>
|
||||
<p>Your PHP environment is ready to go, and can take advantage of all possible features!</p>
|
||||
</div>
|
||||
<div class="chunk">
|
||||
<h3>What's Next?</h3>
|
||||
<p>You can download the latest version of the <a href="http://aws.amazon.com/sdkforphp"><strong>AWS SDK for PHP</strong></a> and install it by <a href="http://aws.amazon.com/articles/4261">following the instructions</a>. Also, check out our library of <a href="http://aws.amazon.com/articles/4262">screencasts and tutorials</a>.</p>
|
||||
<p>Take the time to read <a href="http://aws.amazon.com/articles/4261">"Getting Started"</a> to make sure you're prepared to use the AWS SDK for PHP. No seriously, read it.</p>
|
||||
</div>
|
||||
<?php elseif ($compatiblity == REQUIREMENTS_MIN_MET): ?>
|
||||
<div class="chunk important ok">
|
||||
<h3>Bottom Line: Yes, you can!</h3>
|
||||
<p>Your PHP environment is ready to go! <i>There are a couple of minor features that you won't be able to take advantage of, but nothing that's a show-stopper.</i></p>
|
||||
</div>
|
||||
<div class="chunk">
|
||||
<h3>What's Next?</h3>
|
||||
<p>You can download the latest version of the <a href="http://aws.amazon.com/sdkforphp"><strong>AWS SDK for PHP</strong></a> and install it by <a href="http://aws.amazon.com/articles/4261">following the instructions</a>. Also, check out our library of <a href="http://aws.amazon.com/articles/4262">screencasts and tutorials</a>.</p>
|
||||
<p>Take the time to read <a href="http://aws.amazon.com/articles/4261">"Getting Started"</a> to make sure you're prepared to use the AWS SDK for PHP. No seriously, read it.</p>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div class="chunk important error">
|
||||
<h3>Bottom Line: We're sorry…</h3>
|
||||
<p>Your PHP environment does not support the minimum requirements for the <strong>AWS SDK for PHP</strong>.</p>
|
||||
</div>
|
||||
<div class="chunk">
|
||||
<h3>What's Next?</h3>
|
||||
<p>If you're using a shared hosting plan, it may be a good idea to contact your web host and ask them to install a more recent version of PHP and relevant extensions.</p>
|
||||
<p>If you have control over your PHP environment, we recommended that you upgrade your PHP environment. Check out the "Set Up Your Environment" section of the <a href="http://aws.amazon.com/articles/4261">Getting Started Guide</a> for more information.</p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($compatiblity >= REQUIREMENTS_MIN_MET): ?>
|
||||
<div class="chunk">
|
||||
<h3>Recommended settings for config.inc.php</h3>
|
||||
<p>Based on your particular server configuration, the following settings are recommended.</p>
|
||||
<br>
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%" class="chart">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Configuration Setting</th>
|
||||
<th>Recommended Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>default_cache_config</code></td>
|
||||
<?php if ($apc_ok): ?>
|
||||
<td><code>apc</code></td>
|
||||
<?php elseif ($xcache_ok): ?>
|
||||
<td><code>xcache</code></td>
|
||||
<?php elseif ($file_ok): ?>
|
||||
<td>Any valid, server-writable file system path</td>
|
||||
<?php endif; ?>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>certificate_authority</code></td>
|
||||
<?php if (is_windows()): ?>
|
||||
<td id="ssl_check"><code>true</code></td>
|
||||
<?php else: ?>
|
||||
<td id="ssl_check"><img src="<?php echo pathinfo(__FILE__, PATHINFO_BASENAME); ?>?loader" alt="Loading..."></td>
|
||||
<?php endif; ?>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<br>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="chunk">
|
||||
<h3>Give me the details!</h3>
|
||||
<?php if ($compatiblity >= REQUIREMENTS_MIN_MET): ?>
|
||||
<ol>
|
||||
<li><em>Your environment meets the minimum requirements for using the <strong>AWS SDK for PHP</strong>!</em></li>
|
||||
|
||||
<?php if (version_compare(PHP_VERSION, '5.3.0') < 0): ?>
|
||||
<li>You're still running <strong>PHP <?php echo PHP_VERSION; ?></strong>. The PHP 5.2 family is no longer supported by the PHP team, and future versions of the AWS SDK for PHP will <i>require</i> PHP 5.3 or newer.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($openssl_ok): ?>
|
||||
<li>The <a href="http://php.net/openssl">OpenSSL</a> extension is installed. This will allow you to use <a href="http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html">CloudFront Private URLs</a> and decrypt Microsoft® Windows® instance passwords.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($zlib_ok): ?>
|
||||
<li>The <a href="http://php.net/zlib">Zlib</a> extension is installed. The SDK will request gzipped data whenever possible.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!$int64_ok): ?>
|
||||
<li>You're running on a <strong>32-bit</strong> system. This means that PHP does not correctly handle files larger than 2GB (this is a <a href="http://www.google.com/search?q=php+2gb+32-bit">well-known PHP issue</a>). For more information, please see: <a href="http://docs.php.net/manual/en/function.filesize.php#refsect1-function.filesize-returnvalues">PHP filesize: Return values</a>.</li>
|
||||
<?php if (is_windows()): ?>
|
||||
<li id="win64"><em>Note that PHP on Microsoft® Windows® <a href="http://j.mp/php64win">does not support 64-bit integers at all</a>, even if both the hardware and PHP are 64-bit.</em></li>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($ini_open_basedir || $ini_safe_mode): ?>
|
||||
<li>You have <a href="http://php.net/open_basedir">open_basedir</a> or <a href="http://php.net/safe_mode">safe_mode</a> enabled in your <code>php.ini</code> file. Sometimes PHP behaves strangely when these settings are enabled. Disable them if you can.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!$ini_zend_enable_gc): ?>
|
||||
<li>The PHP garbage collector (available in PHP 5.3+) is not enabled in your <code>php.ini</code> file. Enabling <a href="http://php.net/zend.enable_gc">zend.enable_gc</a> will provide better memory management in the PHP core.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php
|
||||
$storage_types = array();
|
||||
if ($file_ok) { $storage_types[] = '<a href="http://php.net/file_put_contents">The file system</a>'; }
|
||||
if ($apc_ok) { $storage_types[] = '<a href="http://php.net/apc">APC</a>'; }
|
||||
if ($xcache_ok) { $storage_types[] = '<a href="http://xcache.lighttpd.net">XCache</a>'; }
|
||||
if ($sqlite_ok && $sqlite3_ok) { $storage_types[] = '<a href="http://php.net/sqlite3">SQLite 3</a>'; }
|
||||
elseif ($sqlite_ok && $sqlite2_ok) { $storage_types[] = '<a href="http://php.net/sqlite">SQLite 2</a>'; }
|
||||
if ($memcached_ok) { $storage_types[] = '<a href="http://php.net/memcached">Memcached</a>'; }
|
||||
elseif ($memcache_ok) { $storage_types[] = '<a href="http://php.net/memcache">Memcache</a>'; }
|
||||
?>
|
||||
<li>Storage types available for response caching: <?php echo implode(', ', $storage_types); ?></li>
|
||||
</ol>
|
||||
|
||||
<?php if (!$openssl_ok && !$zlib_ok): ?>
|
||||
<p class="footnote"><strong>NOTE:</strong> You're missing the <a href="http://php.net/openssl">OpenSSL</a> extension, which means that you won't be able to take advantage of <a href="http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html">CloudFront Private URLs</a> or decrypt Microsoft® Windows® instance passwords. You're also missing the <a href="http://php.net/zlib">Zlib</a> extension, which means that the SDK will be unable to request gzipped data from Amazon and you won't be able to take advantage of compression with the <i>response caching</i> feature.</p>
|
||||
<?php elseif (!$zlib_ok): ?>
|
||||
<p class="footnote"><strong>NOTE:</strong> You're missing the <a href="http://php.net/zlib">Zlib</a> extension, which means that the SDK will be unable to request gzipped data from Amazon and you won't be able to take advantage of compression with the <i>response caching</i> feature.</p>
|
||||
<?php elseif (!$openssl_ok): ?>
|
||||
<p class="footnote"><strong>NOTE:</strong> You're missing the <a href="http://php.net/openssl">OpenSSL</a> extension, which means that you won't be able to take advantage of <a href="http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html">CloudFront Private URLs</a> or decrypt Microsoft® Windows® instance passwords.</p>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php else: ?>
|
||||
<ol>
|
||||
<?php if (!$php_ok): ?>
|
||||
<li><strong>PHP:</strong> You are running an unsupported version of PHP.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!$curl_ok): ?>
|
||||
<li><strong>cURL:</strong> The <a href="http://php.net/curl">cURL</a> extension is not available. Without cURL, the SDK cannot connect to — or authenticate with — Amazon's services.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!$simplexml_ok): ?>
|
||||
<li><strong>SimpleXML:</strong> The <a href="http://php.net/simplexml">SimpleXML</a> extension is not available. Without SimpleXML, the SDK cannot parse the XML responses from Amazon's services.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!$dom_ok): ?>
|
||||
<li><strong>DOM:</strong> The <a href="http://php.net/dom">DOM</a> extension is not available. Without DOM, the SDK cannot transliterate JSON responses from Amazon's services into the common SimpleXML-based pattern used throughout the SDK.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!$spl_ok): ?>
|
||||
<li><strong>SPL:</strong> <a href="http://php.net/spl">Standard PHP Library</a> support is not available. Without SPL support, the SDK cannot autoload the required PHP classes.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!$json_ok): ?>
|
||||
<li><strong>JSON:</strong> <a href="http://php.net/json">JSON</a> support is not available. AWS leverages JSON heavily in many of its services.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!$pcre_ok): ?>
|
||||
<li><strong>PCRE:</strong> Your PHP installation doesn't support Perl-Compatible Regular Expressions (PCRE). Without PCRE, the SDK cannot do any filtering via regular expressions.</li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!$file_ok): ?>
|
||||
<li><strong>File System Read/Write:</strong> The <a href="http://php.net/file_get_contents">file_get_contents()</a> and/or <a href="http://php.net/file_put_contents">file_put_contents()</a> functions have been disabled. Without them, the SDK cannot read from, or write to, the file system.</li>
|
||||
<?php endif; ?>
|
||||
</ol>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="chunk">
|
||||
<p class="footnote"><strong>NOTE</strong>: Passing this test does not guarantee that the AWS SDK for PHP will run on your web server — it only ensures that the requirements have been addressed.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<?php if (!is_windows()): ?>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
reqwest('<?php echo pathinfo(__FILE__, PATHINFO_BASENAME); ?>?ssl_check', function(resp) {
|
||||
$sslCheck = document.getElementById('ssl_check');
|
||||
$sslCheck.innerHTML = '';
|
||||
$sslCheck.innerHTML = '<code>' + resp + '</code>';
|
||||
});
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,186 +0,0 @@
|
||||
#! /usr/bin/env php
|
||||
<?php
|
||||
|
||||
//Prevent script from being called via browser
|
||||
if (PHP_SAPI !== 'cli')
|
||||
{
|
||||
die('ERROR: You may only run the compatibility test from the command line.');
|
||||
}
|
||||
|
||||
// Include the compatibility test logic
|
||||
require dirname(__FILE__) . DIRECTORY_SEPARATOR . 'sdk_compatibility.inc.php';
|
||||
|
||||
// CLI display
|
||||
function success($s = 'Yes')
|
||||
{
|
||||
return is_windows() ? $s : "\033[1;37m\033[42m " . $s . " \033[0m";
|
||||
}
|
||||
|
||||
function info($s = 'Info')
|
||||
{
|
||||
return is_windows() ? $s : "\033[1;37m\033[44m " . $s . " \033[0m";
|
||||
}
|
||||
|
||||
function failure($s = 'No ')
|
||||
{
|
||||
return is_windows() ? $s : "\033[1;37m\033[41m " . $s . " \033[0m";
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
echo PHP_EOL;
|
||||
|
||||
echo info('AWS SDK for PHP') . PHP_EOL;
|
||||
echo 'PHP Environment Compatibility Test (CLI)' . PHP_EOL;
|
||||
echo '----------------------------------------' . PHP_EOL;
|
||||
echo PHP_EOL;
|
||||
|
||||
echo 'PHP 5.2 or newer............ ' . ($php_ok ? (success() . ' ' . phpversion()) : failure()) . PHP_EOL;
|
||||
echo '64-bit architecture......... ' . ($int64_ok ? success() : failure()) . (is_windows() ? ' (see note below)' : '') . PHP_EOL;
|
||||
echo 'cURL with SSL............... ' . ($curl_ok ? (success() . ' ' . $curl_version['version'] . ' (' . $curl_version['ssl_version'] . ')') : failure($curl_version['version'] . (in_array('https', $curl_version['protocols'], true) ? ' (with ' . $curl_version['ssl_version'] . ')' : ' (without SSL)'))) . PHP_EOL;
|
||||
echo 'Standard PHP Library........ ' . ($spl_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'SimpleXML................... ' . ($simplexml_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'DOM......................... ' . ($dom_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'JSON........................ ' . ($json_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'PCRE........................ ' . ($pcre_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'File system read/write...... ' . ($file_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'OpenSSL extension........... ' . ($openssl_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'Zlib........................ ' . ($zlib_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'APC......................... ' . ($apc_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'XCache...................... ' . ($xcache_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'Memcache.................... ' . ($memcache_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'Memcached................... ' . ($memcached_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'PDO......................... ' . ($pdo_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'SQLite 2.................... ' . ($sqlite2_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'SQLite 3.................... ' . ($sqlite3_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'PDO-SQLite driver........... ' . ($pdo_sqlite_ok ? success() : failure()) . PHP_EOL;
|
||||
echo 'open_basedir disabled....... ' . (!$ini_open_basedir ? success() : failure()) . PHP_EOL;
|
||||
echo 'safe_mode disabled.......... ' . (!$ini_safe_mode ? success() : failure()) . PHP_EOL;
|
||||
echo 'Garbage Collector enabled... ' . ($ini_zend_enable_gc ? success() : failure()) . PHP_EOL;
|
||||
|
||||
// Test SSL cert
|
||||
if (!is_windows())
|
||||
{
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, 'https://email.us-east-1.amazonaws.com');
|
||||
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
|
||||
curl_setopt($ch, CURLOPT_HEADER, false);
|
||||
curl_setopt($ch, CURLOPT_NOBODY, true);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 5184000);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
|
||||
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
|
||||
curl_setopt($ch, CURLOPT_USERAGENT, 'aws-sdk-php/compat-cli');
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
|
||||
curl_setopt($ch, CURLOPT_VERBOSE, false);
|
||||
curl_exec($ch);
|
||||
$ssl_result = !(curl_getinfo($ch, CURLINFO_SSL_VERIFYRESULT) === 0);
|
||||
curl_close($ch);
|
||||
|
||||
echo 'Valid SSL certificate....... ' . ($ssl_result ? failure() : success()) . PHP_EOL;
|
||||
}
|
||||
else
|
||||
{
|
||||
$ssl_result = false;
|
||||
echo 'Valid SSL certificate....... ' . failure() . ' (will use the bundled certificate instead)' . PHP_EOL;
|
||||
}
|
||||
|
||||
echo PHP_EOL;
|
||||
|
||||
echo '----------------------------------------' . PHP_EOL;
|
||||
echo PHP_EOL;
|
||||
|
||||
if ($compatiblity >= REQUIREMENTS_MIN_MET)
|
||||
{
|
||||
echo success('Your environment meets the minimum requirements for using the AWS SDK for PHP!') . PHP_EOL . PHP_EOL;
|
||||
if (version_compare(PHP_VERSION, '5.3.0') < 0) { echo '* You\'re still running PHP ' . PHP_VERSION . '. The PHP 5.2 family is no longer supported' . PHP_EOL . ' by the PHP team, and future versions of the AWS SDK for PHP will *require*' . PHP_EOL . ' PHP 5.3 or newer.' . PHP_EOL . PHP_EOL; }
|
||||
if ($openssl_ok) { echo '* The OpenSSL extension is installed. This will allow you to use CloudFront' . PHP_EOL . ' Private URLs and decrypt Windows instance passwords.' . PHP_EOL . PHP_EOL; }
|
||||
if ($zlib_ok) { echo '* The Zlib extension is installed. The SDK will request gzipped data' . PHP_EOL . ' whenever possible.' . PHP_EOL . PHP_EOL; }
|
||||
if (!$int64_ok) { echo '* You\'re running on a 32-bit system. This means that PHP does not correctly' . PHP_EOL . ' handle files larger than 2GB (this is a well-known PHP issue).' . PHP_EOL . PHP_EOL; }
|
||||
if (!$int64_ok && is_windows()) { echo '* Note that PHP on Microsoft(R) Windows(R) does not support 64-bit integers' . PHP_EOL . ' at all, even if both the hardware and PHP are 64-bit. http://j.mp/php64win' . PHP_EOL . PHP_EOL; }
|
||||
|
||||
if ($ini_open_basedir || $ini_safe_mode) { echo '* You have open_basedir or safe_mode enabled in your php.ini file. Sometimes' . PHP_EOL . ' PHP behaves strangely when these settings are enabled. Disable them if you can.' . PHP_EOL . PHP_EOL; }
|
||||
if (!$ini_zend_enable_gc) { echo '* The PHP garbage collector (available in PHP 5.3+) is not enabled in your' . PHP_EOL . ' php.ini file. Enabling zend.enable_gc will provide better memory management' . PHP_EOL . ' in the PHP core.' . PHP_EOL . PHP_EOL; }
|
||||
|
||||
$storage_types = array();
|
||||
if ($file_ok) { $storage_types[] = 'The file system'; }
|
||||
if ($apc_ok) { $storage_types[] = 'APC'; }
|
||||
if ($xcache_ok) { $storage_types[] = 'XCache'; }
|
||||
if ($sqlite_ok && $sqlite3_ok) { $storage_types[] = 'SQLite 3'; }
|
||||
elseif ($sqlite_ok && $sqlite2_ok) { $storage_types[] = 'SQLite 2'; }
|
||||
if ($memcached_ok) { $storage_types[] = 'Memcached'; }
|
||||
elseif ($memcache_ok) { $storage_types[] = 'Memcache'; }
|
||||
echo '* Storage types available for response caching:' . PHP_EOL . ' ' . implode(', ', $storage_types) . PHP_EOL . PHP_EOL;
|
||||
|
||||
if (!$openssl_ok) { echo '* You\'re missing the OpenSSL extension, which means that you won\'t be able' . PHP_EOL . ' to take advantage of CloudFront Private URLs or Windows password decryption.' . PHP_EOL . PHP_EOL; }
|
||||
if (!$zlib_ok) { echo '* You\'re missing the Zlib extension, which means that the SDK will be unable' . PHP_EOL . ' to request gzipped data from Amazon and you won\'t be able to take advantage' . PHP_EOL . ' of compression with the response caching feature.' . PHP_EOL . PHP_EOL; }
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!$php_ok) { echo '* ' . failure('PHP:') . ' You are running an unsupported version of PHP.' . PHP_EOL . PHP_EOL; }
|
||||
if (!$curl_ok) { echo '* ' . failure('cURL:') . ' The cURL extension is not available. Without cURL, the SDK cannot' . PHP_EOL . ' connect to -- or authenticate with -- Amazon\'s services.' . PHP_EOL . PHP_EOL; }
|
||||
if (!$simplexml_ok) { echo '* ' . failure('SimpleXML:') . ': The SimpleXML extension is not available. Without SimpleXML,' . PHP_EOL . ' the SDK cannot parse the XML responses from Amazon\'s services.' . PHP_EOL . PHP_EOL; }
|
||||
if (!$dom_ok) { echo '* ' . failure('DOM:') . ': The DOM extension is not available. Without DOM, the SDK' . PHP_EOL . ' Without DOM, the SDK cannot transliterate JSON responses from Amazon\'s' . PHP_EOL . ' services into the common SimpleXML-based pattern used throughout the SDK.' . PHP_EOL . PHP_EOL; }
|
||||
if (!$spl_ok) { echo '* ' . failure('SPL:') . ' Standard PHP Library support is not available. Without SPL support,' . PHP_EOL . ' the SDK cannot autoload the required PHP classes.' . PHP_EOL . PHP_EOL; }
|
||||
if (!$json_ok) { echo '* ' . failure('JSON:') . ' JSON support is not available. AWS leverages JSON heavily in many' . PHP_EOL . ' of its services.' . PHP_EOL . PHP_EOL; }
|
||||
if (!$pcre_ok) { echo '* ' . failure('PCRE:') . ' Your PHP installation doesn\'t support Perl-Compatible Regular' . PHP_EOL . ' Expressions (PCRE). Without PCRE, the SDK cannot do any filtering via' . PHP_EOL . ' regular expressions.' . PHP_EOL . PHP_EOL; }
|
||||
if (!$file_ok) { echo '* ' . failure('File System Read/Write:') . ' The file_get_contents() and/or file_put_contents()' . PHP_EOL . ' functions have been disabled. Without them, the SDK cannot read from,' . PHP_EOL . ' or write to, the file system.' . PHP_EOL . PHP_EOL; }
|
||||
}
|
||||
|
||||
echo '----------------------------------------' . PHP_EOL;
|
||||
echo PHP_EOL;
|
||||
|
||||
if ($compatiblity === REQUIREMENTS_ALL_MET)
|
||||
{
|
||||
echo success('Bottom Line: Yes, you can!') . PHP_EOL;
|
||||
echo PHP_EOL;
|
||||
echo 'Your PHP environment is ready to go, and can take advantage of all possible features!' . PHP_EOL;
|
||||
|
||||
echo PHP_EOL;
|
||||
echo info('Recommended settings for config.inc.php') . PHP_EOL;
|
||||
echo PHP_EOL;
|
||||
|
||||
echo "CFCredentials::set(array(" . PHP_EOL;
|
||||
echo " '@default' => array(" . PHP_EOL;
|
||||
echo " 'key' => 'aws-key'," . PHP_EOL;
|
||||
echo " 'secret' => 'aws-secret'," . PHP_EOL;
|
||||
echo " 'default_cache_config' => ";
|
||||
if ($apc_ok) echo success('\'apc\'');
|
||||
elseif ($xcache_ok) echo success('\'xcache\'');
|
||||
elseif ($file_ok) echo success('\'/path/to/cache/folder\'');
|
||||
echo "," . PHP_EOL;
|
||||
echo " 'certificate_authority' => " . success($ssl_result ? 'true' : 'false') . PHP_EOL;
|
||||
echo " )" . PHP_EOL;
|
||||
echo "));" . PHP_EOL;
|
||||
}
|
||||
elseif ($compatiblity === REQUIREMENTS_MIN_MET)
|
||||
{
|
||||
echo success('Bottom Line: Yes, you can!') . PHP_EOL;
|
||||
echo PHP_EOL;
|
||||
echo 'Your PHP environment is ready to go! There are a couple of minor features that' . PHP_EOL . 'you won\'t be able to take advantage of, but nothing that\'s a show-stopper.' . PHP_EOL;
|
||||
|
||||
echo PHP_EOL;
|
||||
echo info('Recommended settings for config.inc.php') . PHP_EOL;
|
||||
echo PHP_EOL;
|
||||
|
||||
echo "CFCredentials::set(array(" . PHP_EOL;
|
||||
echo " '@default' => array(" . PHP_EOL;
|
||||
echo " 'key' => 'aws-key'," . PHP_EOL;
|
||||
echo " 'secret' => 'aws-secret'," . PHP_EOL;
|
||||
echo " 'default_cache_config' => ";
|
||||
if ($apc_ok) echo success('\'apc\'');
|
||||
elseif ($xcache_ok) echo success('\'xcache\'');
|
||||
elseif ($file_ok) echo success('\'/path/to/cache/folder\'');
|
||||
echo "," . PHP_EOL;
|
||||
echo " 'certificate_authority' => " . ($ssl_result ? 'false' : 'true') . PHP_EOL;
|
||||
echo " )" . PHP_EOL;
|
||||
echo "));" . PHP_EOL;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo failure('Bottom Line: We\'re sorry...') . PHP_EOL;
|
||||
echo 'Your PHP environment does not support the minimum requirements for the ' . PHP_EOL . 'AWS SDK for PHP.' . PHP_EOL;
|
||||
}
|
||||
|
||||
echo PHP_EOL;
|
||||
4
3rdparty/fullcalendar/css/fullcalendar.css
vendored
4
3rdparty/fullcalendar/css/fullcalendar.css
vendored
@@ -1,11 +1,11 @@
|
||||
/*
|
||||
* FullCalendar v1.5.3 Stylesheet
|
||||
* FullCalendar v1.5.4 Stylesheet
|
||||
*
|
||||
* Copyright (c) 2011 Adam Shaw
|
||||
* Dual licensed under the MIT and GPL licenses, located in
|
||||
* MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
|
||||
*
|
||||
* Date: Mon Feb 6 22:40:40 2012 -0800
|
||||
* Date: Tue Sep 4 23:38:33 2012 -0700
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* FullCalendar v1.5.3 Print Stylesheet
|
||||
* FullCalendar v1.5.4 Print Stylesheet
|
||||
*
|
||||
* Include this stylesheet on your page to get a more printer-friendly calendar.
|
||||
* When including this stylesheet, use the media='print' attribute of the <link> tag.
|
||||
@@ -9,7 +9,7 @@
|
||||
* Dual licensed under the MIT and GPL licenses, located in
|
||||
* MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
|
||||
*
|
||||
* Date: Mon Feb 6 22:40:40 2012 -0800
|
||||
* Date: Tue Sep 4 23:38:33 2012 -0700
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
38
3rdparty/fullcalendar/js/fullcalendar.js
vendored
38
3rdparty/fullcalendar/js/fullcalendar.js
vendored
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* @preserve
|
||||
* FullCalendar v1.5.3
|
||||
* FullCalendar v1.5.4
|
||||
* http://arshaw.com/fullcalendar/
|
||||
*
|
||||
* Use fullcalendar.css for basic styling.
|
||||
@@ -11,7 +11,7 @@
|
||||
* Dual licensed under the MIT and GPL licenses, located in
|
||||
* MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
|
||||
*
|
||||
* Date: Mon Feb 6 22:40:40 2012 -0800
|
||||
* Date: Tue Sep 4 23:38:33 2012 -0700
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -111,7 +111,7 @@ var rtlDefaults = {
|
||||
|
||||
|
||||
|
||||
var fc = $.fullCalendar = { version: "1.5.3" };
|
||||
var fc = $.fullCalendar = { version: "1.5.4" };
|
||||
var fcViews = fc.views = {};
|
||||
|
||||
|
||||
@@ -1658,7 +1658,7 @@ function sliceSegs(events, visEventEnds, start, end) {
|
||||
msLength: segEnd - segStart
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
return segs.sort(segCmp);
|
||||
}
|
||||
|
||||
@@ -1742,29 +1742,26 @@ function setOuterHeight(element, height, includeMargins) {
|
||||
}
|
||||
|
||||
|
||||
// TODO: curCSS has been deprecated (jQuery 1.4.3 - 10/16/2010)
|
||||
|
||||
|
||||
function hsides(element, includeMargins) {
|
||||
return hpadding(element) + hborders(element) + (includeMargins ? hmargins(element) : 0);
|
||||
}
|
||||
|
||||
|
||||
function hpadding(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'paddingLeft', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'paddingRight', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'paddingLeft', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'paddingRight', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
function hmargins(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'marginLeft', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'marginRight', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'marginLeft', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'marginRight', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
function hborders(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'borderLeftWidth', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'borderRightWidth', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'borderLeftWidth', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'borderRightWidth', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1774,20 +1771,20 @@ function vsides(element, includeMargins) {
|
||||
|
||||
|
||||
function vpadding(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'paddingTop', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'paddingBottom', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'paddingTop', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'paddingBottom', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
function vmargins(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'marginTop', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'marginBottom', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'marginTop', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'marginBottom', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
function vborders(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'borderTopWidth', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'borderBottomWidth', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'borderTopWidth', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'borderBottomWidth', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1956,7 +1953,6 @@ function firstDefined() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
fcViews.month = MonthView;
|
||||
|
||||
function MonthView(element, calendar) {
|
||||
@@ -4662,7 +4658,7 @@ function DayEventRenderer() {
|
||||
"</span>";
|
||||
}
|
||||
html +=
|
||||
"<span class='fc-event-title'>" + event.title + "</span>" +
|
||||
"<span class='fc-event-title'>" + htmlEscape(event.title) + "</span>" +
|
||||
"</div>";
|
||||
if (seg.isEnd && isEventResizable(event)) {
|
||||
html +=
|
||||
|
||||
14
3rdparty/fullcalendar/js/fullcalendar.min.js
vendored
14
3rdparty/fullcalendar/js/fullcalendar.min.js
vendored
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
|
||||
FullCalendar v1.5.3
|
||||
FullCalendar v1.5.4
|
||||
http://arshaw.com/fullcalendar/
|
||||
|
||||
Use fullcalendar.css for basic styling.
|
||||
@@ -11,7 +11,7 @@
|
||||
Dual licensed under the MIT and GPL licenses, located in
|
||||
MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
|
||||
|
||||
Date: Mon Feb 6 22:40:40 2012 -0800
|
||||
Date: Tue Sep 4 23:38:33 2012 -0700
|
||||
|
||||
*/
|
||||
(function(m,ma){function wb(a){m.extend(true,Ya,a)}function Yb(a,b,e){function d(k){if(E){u();q();na();S(k)}else f()}function f(){B=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");E=m("<div class='fc-content' style='position:relative'/>").prependTo(a);C=new Zb(X,b);(P=C.render())&&a.prepend(P);y(b.defaultView);m(window).resize(oa);t()||g()}function g(){setTimeout(function(){!n.start&&t()&&S()},0)}function l(){m(window).unbind("resize",oa);C.destroy();
|
||||
@@ -39,10 +39,10 @@ a[12])*1E3);lb(e,b)}else{e.setUTCFullYear(a[1],a[3]?a[3]-1:0,a[5]||1);e.setUTCHo
|
||||
10):0)}}function Oa(a,b,e){return ib(a,null,b,e)}function ib(a,b,e,d){d=d||Ya;var f=a,g=b,l,j=e.length,t,y,S,Q="";for(l=0;l<j;l++){t=e.charAt(l);if(t=="'")for(y=l+1;y<j;y++){if(e.charAt(y)=="'"){if(f){Q+=y==l+1?"'":e.substring(l+1,y);l=y}break}}else if(t=="(")for(y=l+1;y<j;y++){if(e.charAt(y)==")"){l=Oa(f,e.substring(l+1,y),d);if(parseInt(l.replace(/\D/,""),10))Q+=l;l=y;break}}else if(t=="[")for(y=l+1;y<j;y++){if(e.charAt(y)=="]"){t=e.substring(l+1,y);l=Oa(f,t,d);if(l!=Oa(g,t,d))Q+=l;l=y;break}}else if(t==
|
||||
"{"){f=b;g=a}else if(t=="}"){f=a;g=b}else{for(y=j;y>l;y--)if(S=dc[e.substring(l,y)]){if(f)Q+=S(f,d);l=y-1;break}if(y==l)if(f)Q+=t}}return Q}function Ua(a){return a.end?ec(a.end,a.allDay):ba(N(a.start),1)}function ec(a,b){a=N(a);return b||a.getHours()||a.getMinutes()?ba(a,1):Ka(a)}function fc(a,b){return(b.msLength-a.msLength)*100+(a.event.start-b.event.start)}function Cb(a,b){return a.end>b.start&&a.start<b.end}function nb(a,b,e,d){var f=[],g,l=a.length,j,t,y,S,Q;for(g=0;g<l;g++){j=a[g];t=j.start;
|
||||
y=b[g];if(y>e&&t<d){if(t<e){t=N(e);S=false}else{t=t;S=true}if(y>d){y=N(d);Q=false}else{y=y;Q=true}f.push({event:j,start:t,end:y,isStart:S,isEnd:Q,msLength:y-t})}}return f.sort(fc)}function ob(a){var b=[],e,d=a.length,f,g,l,j;for(e=0;e<d;e++){f=a[e];for(g=0;;){l=false;if(b[g])for(j=0;j<b[g].length;j++)if(Cb(b[g][j],f)){l=true;break}if(l)g++;else break}if(b[g])b[g].push(f);else b[g]=[f]}return b}function Db(a,b,e){a.unbind("mouseover").mouseover(function(d){for(var f=d.target,g;f!=this;){g=f;f=f.parentNode}if((f=
|
||||
g._fci)!==ma){g._fci=ma;g=b[f];e(g.event,g.element,g);m(d.target).trigger(d)}d.stopPropagation()})}function Va(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.width(Math.max(0,b-pb(f,e)))}}function Eb(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.height(Math.max(0,b-Sa(f,e)))}}function pb(a,b){return gc(a)+hc(a)+(b?ic(a):0)}function gc(a){return(parseFloat(m.curCSS(a[0],"paddingLeft",true))||0)+(parseFloat(m.curCSS(a[0],"paddingRight",true))||0)}function ic(a){return(parseFloat(m.curCSS(a[0],
|
||||
"marginLeft",true))||0)+(parseFloat(m.curCSS(a[0],"marginRight",true))||0)}function hc(a){return(parseFloat(m.curCSS(a[0],"borderLeftWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderRightWidth",true))||0)}function Sa(a,b){return jc(a)+kc(a)+(b?Fb(a):0)}function jc(a){return(parseFloat(m.curCSS(a[0],"paddingTop",true))||0)+(parseFloat(m.curCSS(a[0],"paddingBottom",true))||0)}function Fb(a){return(parseFloat(m.curCSS(a[0],"marginTop",true))||0)+(parseFloat(m.curCSS(a[0],"marginBottom",true))||0)}
|
||||
function kc(a){return(parseFloat(m.curCSS(a[0],"borderTopWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderBottomWidth",true))||0)}function Za(a,b){b=typeof b=="number"?b+"px":b;a.each(function(e,d){d.style.cssText+=";min-height:"+b+";_height:"+b})}function xb(){}function Gb(a,b){return a-b}function Hb(a){return Math.max.apply(Math,a)}function Pa(a){return(a<10?"0":"")+a}function jb(a,b){if(a[b]!==ma)return a[b];b=b.split(/(?=[A-Z])/);for(var e=b.length-1,d;e>=0;e--){d=a[b[e].toLowerCase()];if(d!==
|
||||
ma)return d}return a[""]}function Qa(a){return a.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"<br />")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}
|
||||
g._fci)!==ma){g._fci=ma;g=b[f];e(g.event,g.element,g);m(d.target).trigger(d)}d.stopPropagation()})}function Va(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.width(Math.max(0,b-pb(f,e)))}}function Eb(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.height(Math.max(0,b-Sa(f,e)))}}function pb(a,b){return gc(a)+hc(a)+(b?ic(a):0)}function gc(a){return(parseFloat(m.css(a[0],"paddingLeft",true))||0)+(parseFloat(m.css(a[0],"paddingRight",true))||0)}function ic(a){return(parseFloat(m.css(a[0],"marginLeft",
|
||||
true))||0)+(parseFloat(m.css(a[0],"marginRight",true))||0)}function hc(a){return(parseFloat(m.css(a[0],"borderLeftWidth",true))||0)+(parseFloat(m.css(a[0],"borderRightWidth",true))||0)}function Sa(a,b){return jc(a)+kc(a)+(b?Fb(a):0)}function jc(a){return(parseFloat(m.css(a[0],"paddingTop",true))||0)+(parseFloat(m.css(a[0],"paddingBottom",true))||0)}function Fb(a){return(parseFloat(m.css(a[0],"marginTop",true))||0)+(parseFloat(m.css(a[0],"marginBottom",true))||0)}function kc(a){return(parseFloat(m.css(a[0],
|
||||
"borderTopWidth",true))||0)+(parseFloat(m.css(a[0],"borderBottomWidth",true))||0)}function Za(a,b){b=typeof b=="number"?b+"px":b;a.each(function(e,d){d.style.cssText+=";min-height:"+b+";_height:"+b})}function xb(){}function Gb(a,b){return a-b}function Hb(a){return Math.max.apply(Math,a)}function Pa(a){return(a<10?"0":"")+a}function jb(a,b){if(a[b]!==ma)return a[b];b=b.split(/(?=[A-Z])/);for(var e=b.length-1,d;e>=0;e--){d=a[b[e].toLowerCase()];if(d!==ma)return d}return a[""]}function Qa(a){return a.replace(/&/g,
|
||||
"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"<br />")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}
|
||||
function rb(a,b){a.each(function(e,d){d.className=d.className.replace(/^fc-\w*/,"fc-"+lc[b.getDay()])})}function Jb(a,b){var e=a.source||{},d=a.color,f=e.color,g=b("eventColor"),l=a.backgroundColor||d||e.backgroundColor||f||b("eventBackgroundColor")||g;d=a.borderColor||d||e.borderColor||f||b("eventBorderColor")||g;a=a.textColor||e.textColor||b("eventTextColor");b=[];l&&b.push("background-color:"+l);d&&b.push("border-color:"+d);a&&b.push("color:"+a);return b.join(";")}function $a(a,b,e){if(m.isFunction(a))a=
|
||||
[a];if(a){var d,f;for(d=0;d<a.length;d++)f=a[d].apply(b,e)||f;return f}}function Ta(){for(var a=0;a<arguments.length;a++)if(arguments[a]!==ma)return arguments[a]}function mc(a,b){function e(j,t){if(t){hb(j,t);j.setDate(1)}j=N(j,true);j.setDate(1);t=hb(N(j),1);var y=N(j),S=N(t),Q=f("firstDay"),q=f("weekends")?0:1;if(q){Fa(y);Fa(S,-1,true)}ba(y,-((y.getDay()-Math.max(Q,q)+7)%7));ba(S,(7-S.getDay()+Math.max(Q,q))%7);Q=Math.round((S-y)/(Ab*7));if(f("weekMode")=="fixed"){ba(S,(6-Q)*7);Q=6}d.title=l(j,
|
||||
f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(6,Q,q?5:7,true)}var d=this;d.render=e;sb.call(d,a,b,"month");var f=d.opt,g=d.renderBasic,l=b.formatDate}function nc(a,b){function e(j,t){t&&ba(j,t*7);j=ba(N(j),-((j.getDay()-f("firstDay")+7)%7));t=ba(N(j),7);var y=N(j),S=N(t),Q=f("weekends");if(!Q){Fa(y);Fa(S,-1,true)}d.title=l(y,ba(N(S),-1),f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(1,1,Q?7:5,false)}var d=this;d.render=e;sb.call(d,a,b,"basicWeek");var f=d.opt,g=d.renderBasic,
|
||||
@@ -106,7 +106,7 @@ t,y=-1,S=-1;for(t=0;t<l;t++)if(g>=e[t][0]&&g<e[t][1]){y=t;break}for(t=0;t<j;t++)
|
||||
g=l=null;a.build();b(t);d=y||"mousemove";m(document).bind(d,b)};e.stop=function(){m(document).unbind(d,b);return l}}function xc(a){if(a.pageX===ma){a.pageX=a.originalEvent.pageX;a.pageY=a.originalEvent.pageY}}function Pb(a){function b(l){return d[l]=d[l]||a(l)}var e=this,d={},f={},g={};e.left=function(l){return f[l]=f[l]===ma?b(l).position().left:f[l]};e.right=function(l){return g[l]=g[l]===ma?e.left(l)+b(l).width():g[l]};e.clear=function(){d={};f={};g={}}}var Ya={defaultView:"month",aspectRatio:1.35,
|
||||
header:{left:"title",center:"",right:"today prev,next"},weekends:true,allDayDefault:true,ignoreTimezone:true,lazyFetching:true,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '—'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d"},timeFormat:{"":"h(:mm)t"},isRTL:false,firstDay:0,monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan",
|
||||
"Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],buttonText:{prev:" ◄ ",next:" ► ",prevYear:" << ",nextYear:" >> ",today:"today",month:"month",week:"week",day:"day"},theme:false,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:true,dropAccept:"*"},yc=
|
||||
{header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:" ► ",next:" ◄ ",prevYear:" >> ",nextYear:" << "},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Aa=m.fullCalendar={version:"1.5.3"},Ja=Aa.views={};m.fn.fullCalendar=function(a){if(typeof a=="string"){var b=Array.prototype.slice.call(arguments,1),e;this.each(function(){var f=m.data(this,"fullCalendar");if(f&&m.isFunction(f[a])){f=f[a].apply(f,
|
||||
{header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:" ► ",next:" ◄ ",prevYear:" >> ",nextYear:" << "},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Aa=m.fullCalendar={version:"1.5.4"},Ja=Aa.views={};m.fn.fullCalendar=function(a){if(typeof a=="string"){var b=Array.prototype.slice.call(arguments,1),e;this.each(function(){var f=m.data(this,"fullCalendar");if(f&&m.isFunction(f[a])){f=f[a].apply(f,
|
||||
b);if(e===ma)e=f;a=="destroy"&&m.removeData(this,"fullCalendar")}});if(e!==ma)return e;return this}var d=a.eventSources||[];delete a.eventSources;if(a.events){d.push(a.events);delete a.events}a=m.extend(true,{},Ya,a.isRTL||a.isRTL===ma&&Ya.isRTL?yc:{},a);this.each(function(f,g){f=m(g);g=new Yb(f,a,d);f.data("fullCalendar",g);g.render()});return this};Aa.sourceNormalizers=[];Aa.sourceFetchers=[];var ac={dataType:"json",cache:false},bc=1;Aa.addDays=ba;Aa.cloneDate=N;Aa.parseDate=kb;Aa.parseISO8601=
|
||||
Bb;Aa.parseTime=mb;Aa.formatDate=Oa;Aa.formatDates=ib;var lc=["sun","mon","tue","wed","thu","fri","sat"],Ab=864E5,cc=36E5,wc=6E4,dc={s:function(a){return a.getSeconds()},ss:function(a){return Pa(a.getSeconds())},m:function(a){return a.getMinutes()},mm:function(a){return Pa(a.getMinutes())},h:function(a){return a.getHours()%12||12},hh:function(a){return Pa(a.getHours()%12||12)},H:function(a){return a.getHours()},HH:function(a){return Pa(a.getHours())},d:function(a){return a.getDate()},dd:function(a){return Pa(a.getDate())},
|
||||
ddd:function(a,b){return b.dayNamesShort[a.getDay()]},dddd:function(a,b){return b.dayNames[a.getDay()]},M:function(a){return a.getMonth()+1},MM:function(a){return Pa(a.getMonth()+1)},MMM:function(a,b){return b.monthNamesShort[a.getMonth()]},MMMM:function(a,b){return b.monthNames[a.getMonth()]},yy:function(a){return(a.getFullYear()+"").substring(2)},yyyy:function(a){return a.getFullYear()},t:function(a){return a.getHours()<12?"a":"p"},tt:function(a){return a.getHours()<12?"am":"pm"},T:function(a){return a.getHours()<
|
||||
|
||||
4
3rdparty/fullcalendar/js/gcal.js
vendored
4
3rdparty/fullcalendar/js/gcal.js
vendored
@@ -1,11 +1,11 @@
|
||||
/*
|
||||
* FullCalendar v1.5.3 Google Calendar Plugin
|
||||
* FullCalendar v1.5.4 Google Calendar Plugin
|
||||
*
|
||||
* Copyright (c) 2011 Adam Shaw
|
||||
* Dual licensed under the MIT and GPL licenses, located in
|
||||
* MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
|
||||
*
|
||||
* Date: Mon Feb 6 22:40:40 2012 -0800
|
||||
* Date: Tue Sep 4 23:38:33 2012 -0700
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
4
3rdparty/php-cloudfiles/cloudfiles.php
vendored
4
3rdparty/php-cloudfiles/cloudfiles.php
vendored
@@ -2000,7 +2000,7 @@ class CF_Object
|
||||
// }
|
||||
|
||||
//use OC's mimetype detection for files
|
||||
if(is_file($handle)){
|
||||
if(@is_file($handle)){
|
||||
$this->content_type=OC_Helper::getMimeType($handle);
|
||||
}else{
|
||||
$this->content_type=OC_Helper::getStringMimeType($handle);
|
||||
@@ -2537,7 +2537,7 @@ class CF_Object
|
||||
}
|
||||
$md5 = hash_final($ctx, false);
|
||||
rewind($data);
|
||||
} elseif ((string)is_file($data)) {
|
||||
} elseif ((string)@is_file($data)) {
|
||||
$md5 = md5_file($data);
|
||||
} else {
|
||||
$md5 = md5($data);
|
||||
|
||||
148
3rdparty/smb4php/smb.php
vendored
148
3rdparty/smb4php/smb.php
vendored
@@ -29,7 +29,7 @@ define ('SMB4PHP_VERSION', '0.8');
|
||||
|
||||
define ('SMB4PHP_SMBCLIENT', 'smbclient');
|
||||
define ('SMB4PHP_SMBOPTIONS', 'TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=8192 SO_SNDBUF=8192');
|
||||
define ('SMB4PHP_AUTHMODE', 'arg'); # set to 'env' to use USER enviroment variable
|
||||
define ('SMB4PHP_AUTHMODE', 'arg'); # set to 'env' to use USER environment variable
|
||||
|
||||
###################################################################
|
||||
# SMB - commands that does not need an instance
|
||||
@@ -41,16 +41,26 @@ class smb {
|
||||
|
||||
function parse_url ($url) {
|
||||
$pu = parse_url (trim($url));
|
||||
foreach (array ('domain', 'user', 'pass', 'host', 'port', 'path') as $i)
|
||||
if (! isset($pu[$i])) $pu[$i] = '';
|
||||
if (count ($userdomain = explode (';', urldecode ($pu['user']))) > 1)
|
||||
foreach (array ('domain', 'user', 'pass', 'host', 'port', 'path') as $i) {
|
||||
if (! isset($pu[$i])) {
|
||||
$pu[$i] = '';
|
||||
}
|
||||
}
|
||||
if (count ($userdomain = explode (';', urldecode ($pu['user']))) > 1) {
|
||||
@list ($pu['domain'], $pu['user']) = $userdomain;
|
||||
}
|
||||
$path = preg_replace (array ('/^\//', '/\/$/'), '', urldecode ($pu['path']));
|
||||
list ($pu['share'], $pu['path']) = (preg_match ('/^([^\/]+)\/(.*)/', $path, $regs))
|
||||
? array ($regs[1], preg_replace ('/\//', '\\', $regs[2]))
|
||||
: array ($path, '');
|
||||
? array ($regs[1], preg_replace ('/\//', '\\', $regs[2]))
|
||||
: array ($path, '');
|
||||
$pu['type'] = $pu['path'] ? 'path' : ($pu['share'] ? 'share' : ($pu['host'] ? 'host' : '**error**'));
|
||||
if (! ($pu['port'] = intval(@$pu['port']))) $pu['port'] = 139;
|
||||
if (! ($pu['port'] = intval(@$pu['port']))) {
|
||||
$pu['port'] = 139;
|
||||
}
|
||||
|
||||
// decode user and password
|
||||
$pu['user'] = urldecode($pu['user']);
|
||||
$pu['pass'] = urldecode($pu['pass']);
|
||||
return $pu;
|
||||
}
|
||||
|
||||
@@ -62,43 +72,43 @@ class smb {
|
||||
|
||||
function execute ($command, $purl) {
|
||||
return smb::client ('-d 0 '
|
||||
. escapeshellarg ('//' . $purl['host'] . '/' . $purl['share'])
|
||||
. ' -c ' . escapeshellarg ($command), $purl
|
||||
. escapeshellarg ('//' . $purl['host'] . '/' . $purl['share'])
|
||||
. ' -c ' . escapeshellarg ($command), $purl
|
||||
);
|
||||
}
|
||||
|
||||
function client ($params, $purl) {
|
||||
|
||||
static $regexp = array (
|
||||
'^added interface ip=(.*) bcast=(.*) nmask=(.*)$' => 'skip',
|
||||
'Anonymous login successful' => 'skip',
|
||||
'^Domain=\[(.*)\] OS=\[(.*)\] Server=\[(.*)\]$' => 'skip',
|
||||
'^\tSharename[ ]+Type[ ]+Comment$' => 'shares',
|
||||
'^\t---------[ ]+----[ ]+-------$' => 'skip',
|
||||
'^\tServer [ ]+Comment$' => 'servers',
|
||||
'^\t---------[ ]+-------$' => 'skip',
|
||||
'^\tWorkgroup[ ]+Master$' => 'workg',
|
||||
'^\t(.*)[ ]+(Disk|IPC)[ ]+IPC.*$' => 'skip',
|
||||
'^\tIPC\\\$(.*)[ ]+IPC' => 'skip',
|
||||
'^\t(.*)[ ]+(Disk)[ ]+(.*)$' => 'share',
|
||||
'^\t(.*)[ ]+(Printer)[ ]+(.*)$' => 'skip',
|
||||
'([0-9]+) blocks of size ([0-9]+)\. ([0-9]+) blocks available' => 'skip',
|
||||
'Got a positive name query response from ' => 'skip',
|
||||
'^(session setup failed): (.*)$' => 'error',
|
||||
'^(.*): ERRSRV - ERRbadpw' => 'error',
|
||||
'^Error returning browse list: (.*)$' => 'error',
|
||||
'^tree connect failed: (.*)$' => 'error',
|
||||
'^(Connection to .* failed)$' => 'error',
|
||||
'^NT_STATUS_(.*) ' => 'error',
|
||||
'^NT_STATUS_(.*)\$' => 'error',
|
||||
'ERRDOS - ERRbadpath \((.*).\)' => 'error',
|
||||
'cd (.*): (.*)$' => 'error',
|
||||
'^cd (.*): NT_STATUS_(.*)' => 'error',
|
||||
'^\t(.*)$' => 'srvorwg',
|
||||
'^([0-9]+)[ ]+([0-9]+)[ ]+(.*)$' => 'skip',
|
||||
'^Job ([0-9]+) cancelled' => 'skip',
|
||||
'^[ ]+(.*)[ ]+([0-9]+)[ ]+(Mon|Tue|Wed|Thu|Fri|Sat|Sun)[ ](Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[ ]+([0-9]+)[ ]+([0-9]{2}:[0-9]{2}:[0-9]{2})[ ]([0-9]{4})$' => 'files',
|
||||
'^message start: ERRSRV - (ERRmsgoff)' => 'error'
|
||||
'^added interface ip=(.*) bcast=(.*) nmask=(.*)$' => 'skip',
|
||||
'Anonymous login successful' => 'skip',
|
||||
'^Domain=\[(.*)\] OS=\[(.*)\] Server=\[(.*)\]$' => 'skip',
|
||||
'^\tSharename[ ]+Type[ ]+Comment$' => 'shares',
|
||||
'^\t---------[ ]+----[ ]+-------$' => 'skip',
|
||||
'^\tServer [ ]+Comment$' => 'servers',
|
||||
'^\t---------[ ]+-------$' => 'skip',
|
||||
'^\tWorkgroup[ ]+Master$' => 'workg',
|
||||
'^\t(.*)[ ]+(Disk|IPC)[ ]+IPC.*$' => 'skip',
|
||||
'^\tIPC\\\$(.*)[ ]+IPC' => 'skip',
|
||||
'^\t(.*)[ ]+(Disk)[ ]+(.*)$' => 'share',
|
||||
'^\t(.*)[ ]+(Printer)[ ]+(.*)$' => 'skip',
|
||||
'([0-9]+) blocks of size ([0-9]+)\. ([0-9]+) blocks available' => 'skip',
|
||||
'Got a positive name query response from ' => 'skip',
|
||||
'^(session setup failed): (.*)$' => 'error',
|
||||
'^(.*): ERRSRV - ERRbadpw' => 'error',
|
||||
'^Error returning browse list: (.*)$' => 'error',
|
||||
'^tree connect failed: (.*)$' => 'error',
|
||||
'^(Connection to .* failed)$' => 'error',
|
||||
'^NT_STATUS_(.*) ' => 'error',
|
||||
'^NT_STATUS_(.*)\$' => 'error',
|
||||
'ERRDOS - ERRbadpath \((.*).\)' => 'error',
|
||||
'cd (.*): (.*)$' => 'error',
|
||||
'^cd (.*): NT_STATUS_(.*)' => 'error',
|
||||
'^\t(.*)$' => 'srvorwg',
|
||||
'^([0-9]+)[ ]+([0-9]+)[ ]+(.*)$' => 'skip',
|
||||
'^Job ([0-9]+) cancelled' => 'skip',
|
||||
'^[ ]+(.*)[ ]+([0-9]+)[ ]+(Mon|Tue|Wed|Thu|Fri|Sat|Sun)[ ](Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[ ]+([0-9]+)[ ]+([0-9]{2}:[0-9]{2}:[0-9]{2})[ ]([0-9]{4})$' => 'files',
|
||||
'^message start: ERRSRV - (ERRmsgoff)' => 'error'
|
||||
);
|
||||
|
||||
if (SMB4PHP_AUTHMODE == 'env') {
|
||||
@@ -112,9 +122,14 @@ class smb {
|
||||
}
|
||||
$port = ($purl['port'] <> 139 ? ' -p ' . escapeshellarg ($purl['port']) : '');
|
||||
$options = '-O ' . escapeshellarg(SMB4PHP_SMBOPTIONS);
|
||||
|
||||
// this put env is necessary to read the output of smbclient correctly
|
||||
$old_locale = getenv('LC_ALL');
|
||||
putenv('LC_ALL=en_US.UTF-8');
|
||||
$output = popen (SMB4PHP_SMBCLIENT." -N {$auth} {$options} {$port} {$options} {$params} 2>/dev/null", 'r');
|
||||
$info = array ();
|
||||
$info['info']= array ();
|
||||
$mode = '';
|
||||
while ($line = fgets ($output, 4096)) {
|
||||
list ($tag, $regs, $i) = array ('skip', array (), array ());
|
||||
reset ($regexp);
|
||||
@@ -148,7 +163,7 @@ class smb {
|
||||
? array (trim ($regs2[2]), trim ($regs2[1]))
|
||||
: array ('', trim ($regs[1]));
|
||||
list ($his, $im) = array (
|
||||
explode(':', $regs[6]), 1 + strpos("JanFebMarAprMayJunJulAugSepOctNovDec", $regs[4]) / 3);
|
||||
explode(':', $regs[6]), 1 + strpos("JanFebMarAprMayJunJulAugSepOctNovDec", $regs[4]) / 3);
|
||||
$i = ($name <> '.' && $name <> '..')
|
||||
? array (
|
||||
$name,
|
||||
@@ -180,6 +195,15 @@ class smb {
|
||||
}
|
||||
}
|
||||
pclose($output);
|
||||
|
||||
|
||||
// restore previous locale
|
||||
if ($old_locale===false) {
|
||||
putenv('LC_ALL');
|
||||
} else {
|
||||
putenv('LC_ALL='.$old_locale);
|
||||
}
|
||||
|
||||
return $info;
|
||||
}
|
||||
|
||||
@@ -187,26 +211,28 @@ class smb {
|
||||
# stats
|
||||
|
||||
function url_stat ($url, $flags = STREAM_URL_STAT_LINK) {
|
||||
if ($s = smb::getstatcache($url)) { return $s; }
|
||||
if ($s = smb::getstatcache($url)) {
|
||||
return $s;
|
||||
}
|
||||
list ($stat, $pu) = array (array (), smb::parse_url ($url));
|
||||
switch ($pu['type']) {
|
||||
case 'host':
|
||||
if ($o = smb::look ($pu))
|
||||
$stat = stat ("/tmp");
|
||||
$stat = stat ("/tmp");
|
||||
else
|
||||
trigger_error ("url_stat(): list failed for host '{$host}'", E_USER_WARNING);
|
||||
trigger_error ("url_stat(): list failed for host '{$pu['host']}'", E_USER_WARNING);
|
||||
break;
|
||||
case 'share':
|
||||
if ($o = smb::look ($pu)) {
|
||||
$found = FALSE;
|
||||
$lshare = strtolower ($pu['share']); # fix by Eric Leung
|
||||
foreach ($o['disk'] as $s) if ($lshare == strtolower($s)) {
|
||||
$found = TRUE;
|
||||
$stat = stat ("/tmp");
|
||||
break;
|
||||
}
|
||||
if (! $found)
|
||||
trigger_error ("url_stat(): disk resource '{$share}' not found in '{$host}'", E_USER_WARNING);
|
||||
$found = FALSE;
|
||||
$lshare = strtolower ($pu['share']); # fix by Eric Leung
|
||||
foreach ($o['disk'] as $s) if ($lshare == strtolower($s)) {
|
||||
$found = TRUE;
|
||||
$stat = stat ("/tmp");
|
||||
break;
|
||||
}
|
||||
if (! $found)
|
||||
trigger_error ("url_stat(): disk resource '{$lshare}' not found in '{$pu['host']}'", E_USER_WARNING);
|
||||
}
|
||||
break;
|
||||
case 'path':
|
||||
@@ -229,6 +255,8 @@ class smb {
|
||||
}
|
||||
|
||||
function addstatcache ($url, $info) {
|
||||
$url = str_replace('//', '/', $url);
|
||||
$url = rtrim($url, '/');
|
||||
global $__smb_cache;
|
||||
$is_file = (strpos ($info['attr'],'D') === FALSE);
|
||||
$s = ($is_file) ? stat ('/etc/passwd') : stat ('/tmp');
|
||||
@@ -238,11 +266,15 @@ class smb {
|
||||
}
|
||||
|
||||
function getstatcache ($url) {
|
||||
$url = str_replace('//', '/', $url);
|
||||
$url = rtrim($url, '/');
|
||||
global $__smb_cache;
|
||||
return isset ($__smb_cache['stat'][$url]) ? $__smb_cache['stat'][$url] : FALSE;
|
||||
}
|
||||
|
||||
function clearstatcache ($url='') {
|
||||
$url = str_replace('//', '/', $url);
|
||||
$url = rtrim($url, '/');
|
||||
global $__smb_cache;
|
||||
if ($url == '') $__smb_cache['stat'] = array (); else unset ($__smb_cache['stat'][$url]);
|
||||
}
|
||||
@@ -358,16 +390,22 @@ class smb_stream_wrapper extends smb {
|
||||
# cache
|
||||
|
||||
function adddircache ($url, $content) {
|
||||
$url = str_replace('//', '/', $url);
|
||||
$url = rtrim($url, '/');
|
||||
global $__smb_cache;
|
||||
return $__smb_cache['dir'][$url] = $content;
|
||||
}
|
||||
|
||||
function getdircache ($url) {
|
||||
$url = str_replace('//', '/', $url);
|
||||
$url = rtrim($url, '/');
|
||||
global $__smb_cache;
|
||||
return isset ($__smb_cache['dir'][$url]) ? $__smb_cache['dir'][$url] : FALSE;
|
||||
}
|
||||
|
||||
function cleardircache ($url='') {
|
||||
$url = str_replace('//', '/', $url);
|
||||
$url = rtrim($url, '/');
|
||||
global $__smb_cache;
|
||||
if ($url == ''){
|
||||
$__smb_cache['dir'] = array ();
|
||||
@@ -390,15 +428,15 @@ class smb_stream_wrapper extends smb {
|
||||
case 'rb':
|
||||
case 'a':
|
||||
case 'a+': $this->tmpfile = tempnam('/tmp', 'smb.down.');
|
||||
smb::execute ('get "'.$pu['path'].'" "'.$this->tmpfile.'"', $pu);
|
||||
break;
|
||||
smb::execute ('get "'.$pu['path'].'" "'.$this->tmpfile.'"', $pu);
|
||||
break;
|
||||
case 'w':
|
||||
case 'w+':
|
||||
case 'wb':
|
||||
case 'x':
|
||||
case 'x+': $this->cleardircache();
|
||||
$this->tmpfile = tempnam('/tmp', 'smb.up.');
|
||||
$this->need_flush=true;
|
||||
$this->tmpfile = tempnam('/tmp', 'smb.up.');
|
||||
$this->need_flush=true;
|
||||
}
|
||||
$this->stream = fopen ($this->tmpfile, $mode);
|
||||
return TRUE;
|
||||
|
||||
@@ -32,7 +32,7 @@ $htaccessWorking=(getenv('htaccessWorking')=='true');
|
||||
$upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize'));
|
||||
$post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size'));
|
||||
$maxUploadFilesize = OCP\Util::humanFileSize(min($upload_max_filesize, $post_max_size));
|
||||
if($_POST) {
|
||||
if($_POST && OC_Util::isCallRegistered()) {
|
||||
if(isset($_POST['maxUploadSize'])) {
|
||||
if(($setMaxSize = OC_Files::setUploadLimit(OCP\Util::computerFileSize($_POST['maxUploadSize']))) !== false) {
|
||||
$maxUploadFilesize = OCP\Util::humanFileSize($setMaxSize);
|
||||
@@ -56,6 +56,8 @@ $htaccessWritable=is_writable(OC::$SERVERROOT.'/.htaccess');
|
||||
$tmpl = new OCP\Template( 'files', 'admin' );
|
||||
$tmpl->assign( 'uploadChangable', $htaccessWorking and $htaccessWritable );
|
||||
$tmpl->assign( 'uploadMaxFilesize', $maxUploadFilesize);
|
||||
// max possible makes only sense on a 32 bit system
|
||||
$tmpl->assign( 'displayMaxPossibleUploadSize', PHP_INT_SIZE===4);
|
||||
$tmpl->assign( 'maxPossibleUploadSize', OCP\Util::humanFileSize(PHP_INT_MAX));
|
||||
$tmpl->assign( 'allowZipDownload', $allowZipDownload);
|
||||
$tmpl->assign( 'maxZipInputSize', $maxZipInputSize);
|
||||
|
||||
@@ -10,7 +10,7 @@ OCP\JSON::callCheck();
|
||||
$dir = stripslashes($_POST["dir"]);
|
||||
$files = isset($_POST["file"]) ? stripslashes($_POST["file"]) : stripslashes($_POST["files"]);
|
||||
|
||||
$files = explode(';', $files);
|
||||
$files = json_decode($files);
|
||||
$filesWithError = '';
|
||||
$success = true;
|
||||
//Now delete
|
||||
|
||||
@@ -33,4 +33,10 @@ OCP\User::checkLoggedIn();
|
||||
$files = $_GET["files"];
|
||||
$dir = $_GET["dir"];
|
||||
|
||||
OC_Files::get($dir, $files, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
$files_list = json_decode($files);
|
||||
// in case we get only a single file
|
||||
if ($files_list === NULL ) {
|
||||
$files_list = array($files);
|
||||
}
|
||||
|
||||
OC_Files::get($dir, $files_list, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
|
||||
@@ -25,7 +25,7 @@ if($doBreadcrumb) {
|
||||
}
|
||||
|
||||
$breadcrumbNav = new OCP\Template( "files", "part.breadcrumb", "" );
|
||||
$breadcrumbNav->assign( "breadcrumb", $breadcrumb );
|
||||
$breadcrumbNav->assign( "breadcrumb", $breadcrumb, false );
|
||||
|
||||
$data['breadcrumb'] = $breadcrumbNav->fetchPage();
|
||||
}
|
||||
|
||||
@@ -9,11 +9,12 @@ OCP\JSON::callCheck();
|
||||
// Get data
|
||||
$dir = stripslashes($_GET["dir"]);
|
||||
$file = stripslashes($_GET["file"]);
|
||||
$target = stripslashes($_GET["target"]);
|
||||
$target = stripslashes(rawurldecode($_GET["target"]));
|
||||
|
||||
|
||||
if(OC_Files::move($dir, $file, $target, $file)) {
|
||||
OCP\JSON::success(array("data" => array( "dir" => $dir, "files" => $file )));
|
||||
} else {
|
||||
OCP\JSON::error(array("data" => array( "message" => "Could not move $file" )));
|
||||
$l=OC_L10N::get('files');
|
||||
OCP\JSON::error(array("data" => array( "message" => $l->t("Could not move %s", array($file)) )));
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@ if($source) {
|
||||
$target=$dir.'/'.$filename;
|
||||
$result=OC_Filesystem::file_put_contents($target, $sourceStream);
|
||||
if($result) {
|
||||
$target = OC_Filesystem::normalizePath($target);
|
||||
$meta = OC_FileCache::get($target);
|
||||
$mime=$meta['mimetype'];
|
||||
$id = OC_FileCache::getId($target);
|
||||
|
||||
@@ -12,9 +12,9 @@ $file = stripslashes($_GET["file"]);
|
||||
$newname = stripslashes($_GET["newname"]);
|
||||
|
||||
// Delete
|
||||
if( OC_Files::move( $dir, $file, $dir, $newname )) {
|
||||
if( $newname !== '.' and OC_Files::move( $dir, $file, $dir, $newname )) {
|
||||
OCP\JSON::success(array("data" => array( "dir" => $dir, "file" => $file, "newname" => $newname )));
|
||||
}
|
||||
else{
|
||||
OCP\JSON::error(array("data" => array( "message" => "Unable to rename file" )));
|
||||
} else {
|
||||
$l=OC_L10N::get('files');
|
||||
OCP\JSON::error(array("data" => array( "message" => $l->t("Unable to rename file"))));
|
||||
}
|
||||
|
||||
@@ -8,24 +8,26 @@ OCP\JSON::setContentTypeHeader('text/plain');
|
||||
|
||||
OCP\JSON::checkLoggedIn();
|
||||
OCP\JSON::callCheck();
|
||||
$l=OC_L10N::get('files');
|
||||
|
||||
if (!isset($_FILES['files'])) {
|
||||
OCP\JSON::error(array("data" => array( "message" => "No file was uploaded. Unknown error" )));
|
||||
OCP\JSON::error(array('data' => array( 'message' => $l->t( 'No file was uploaded. Unknown error' ))));
|
||||
exit();
|
||||
}
|
||||
foreach ($_FILES['files']['error'] as $error) {
|
||||
if ($error != 0) {
|
||||
$l=OC_L10N::get('files');
|
||||
$errors = array(
|
||||
UPLOAD_ERR_OK=>$l->t("There is no error, the file uploaded with success"),
|
||||
UPLOAD_ERR_INI_SIZE=>$l->t("The uploaded file exceeds the upload_max_filesize directive in php.ini").ini_get('upload_max_filesize'),
|
||||
UPLOAD_ERR_FORM_SIZE=>$l->t("The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"),
|
||||
UPLOAD_ERR_PARTIAL=>$l->t("The uploaded file was only partially uploaded"),
|
||||
UPLOAD_ERR_NO_FILE=>$l->t("No file was uploaded"),
|
||||
UPLOAD_ERR_NO_TMP_DIR=>$l->t("Missing a temporary folder"),
|
||||
UPLOAD_ERR_OK=>$l->t('There is no error, the file uploaded with success'),
|
||||
UPLOAD_ERR_INI_SIZE=>$l->t('The uploaded file exceeds the upload_max_filesize directive in php.ini: ')
|
||||
.ini_get('upload_max_filesize'),
|
||||
UPLOAD_ERR_FORM_SIZE=>$l->t('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified'
|
||||
.' in the HTML form'),
|
||||
UPLOAD_ERR_PARTIAL=>$l->t('The uploaded file was only partially uploaded'),
|
||||
UPLOAD_ERR_NO_FILE=>$l->t('No file was uploaded'),
|
||||
UPLOAD_ERR_NO_TMP_DIR=>$l->t('Missing a temporary folder'),
|
||||
UPLOAD_ERR_CANT_WRITE=>$l->t('Failed to write to disk'),
|
||||
);
|
||||
OCP\JSON::error(array("data" => array( "message" => $errors[$error] )));
|
||||
OCP\JSON::error(array('data' => array( 'message' => $errors[$error] )));
|
||||
exit();
|
||||
}
|
||||
}
|
||||
@@ -39,7 +41,7 @@ foreach($files['size'] as $size) {
|
||||
$totalSize+=$size;
|
||||
}
|
||||
if($totalSize>OC_Filesystem::free_space('/')) {
|
||||
OCP\JSON::error(array("data" => array( "message" => "Not enough space available" )));
|
||||
OCP\JSON::error(array('data' => array( 'message' => $l->t( 'Not enough space available' ))));
|
||||
exit();
|
||||
}
|
||||
|
||||
@@ -47,17 +49,19 @@ $result=array();
|
||||
if(strpos($dir, '..') === false) {
|
||||
$fileCount=count($files['name']);
|
||||
for($i=0;$i<$fileCount;$i++) {
|
||||
$target = OCP\Files::buildNotExistingFileName(stripslashes($dir), $files['name'][$i]);
|
||||
$target = OCP\Files::buildNotExistingFileName(stripslashes($dir), $files['name'][$i]);
|
||||
// $path needs to be normalized - this failed within drag'n'drop upload to a sub-folder
|
||||
$target = OC_Filesystem::normalizePath($target);
|
||||
if(is_uploaded_file($files['tmp_name'][$i]) and OC_Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) {
|
||||
$meta = OC_FileCache::get($target);
|
||||
$id = OC_FileCache::getId($target);
|
||||
$result[]=array( "status" => "success", 'mime'=>$meta['mimetype'],'size'=>$meta['size'], 'id'=>$id, 'name'=>basename($target));
|
||||
$result[]=array( 'status' => 'success', 'mime'=>$meta['mimetype'], 'size'=>$meta['size'], 'id'=>$id, 'name'=>basename($target));
|
||||
}
|
||||
}
|
||||
OCP\JSON::encodedPrint($result);
|
||||
exit();
|
||||
} else {
|
||||
$error='invalid dir';
|
||||
$error=$l->t( 'Invalid directory.' );
|
||||
}
|
||||
|
||||
OCP\JSON::error(array('data' => array('error' => $error, "file" => $fileName)));
|
||||
OCP\JSON::error(array('data' => array('message' => $error )));
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
* The final URL will look like http://.../remote.php/filesync/oc_chunked/path/to/file
|
||||
*/
|
||||
|
||||
// only need filesystem apps
|
||||
$RUNTIME_APPTYPES=array('filesystem','authentication');
|
||||
// load needed apps
|
||||
$RUNTIME_APPTYPES=array('filesystem','authentication','logging');
|
||||
OC_App::loadApps($RUNTIME_APPTYPES);
|
||||
if(!OC_User::isLoggedIn()) {
|
||||
if(!isset($_SERVER['PHP_AUTH_USER'])) {
|
||||
|
||||
@@ -22,10 +22,12 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
// only need filesystem apps
|
||||
$RUNTIME_APPTYPES=array('filesystem','authentication');
|
||||
// load needed apps
|
||||
$RUNTIME_APPTYPES=array('filesystem','authentication','logging');
|
||||
OC_App::loadApps($RUNTIME_APPTYPES);
|
||||
|
||||
OC_Util::obEnd();
|
||||
|
||||
// Backends
|
||||
$authBackend = new OC_Connector_Sabre_Auth();
|
||||
$lockBackend = new OC_Connector_Sabre_Locks();
|
||||
@@ -41,6 +43,7 @@ $server->setBaseUri($baseuri);
|
||||
$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud'));
|
||||
$server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend));
|
||||
$server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload
|
||||
$server->addPlugin(new OC_Connector_Sabre_QuotaPlugin());
|
||||
|
||||
// And off we go!
|
||||
$server->exec();
|
||||
|
||||
@@ -5,10 +5,10 @@ $installedVersion=OCP\Config::getAppValue('files', 'installed_version');
|
||||
if (version_compare($installedVersion, '1.1.6', '<')) {
|
||||
$query = OC_DB::prepare( "SELECT `propertyname`, `propertypath`, `userid` FROM `*PREFIX*properties`" );
|
||||
$result = $query->execute();
|
||||
$updateQuery = OC_DB::prepare('UPDATE `*PREFIX*properties` SET `propertyname` = ? WHERE `userid` = ? AND `propertypath` = ?');
|
||||
while( $row = $result->fetchRow()){
|
||||
if ( $row["propertyname"][0] != '{' ) {
|
||||
$query = OC_DB::prepare( 'UPDATE `*PREFIX*properties` SET `propertyname` = ? WHERE `userid` = ? AND `propertypath` = ?' );
|
||||
$query->execute( array( '{DAV:}' + $row["propertyname"], $row["userid"], $row["propertypath"] ));
|
||||
$updateQuery->execute(array('{DAV:}' + $row["propertyname"], $row["userid"], $row["propertypath"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#new>ul { display:none; position:fixed; text-align:left; padding:.5em; background:#f8f8f8; margin-top:0.075em; border:1px solid #ddd; min-width:7em; margin-left:-.5em; z-index:-1; }
|
||||
#new>ul>li { margin:.3em; padding-left:2em; background-repeat:no-repeat; cursor:pointer; padding-bottom:0.1em }
|
||||
#new>ul>li>p { cursor:pointer; }
|
||||
#new>ul>li>input { padding:0.3em; margin:-0.3em; }
|
||||
#new>ul>li>form>input { padding:0.3em; margin:-0.3em; }
|
||||
#new, .file_upload_filename { border:1px solid; border-color:#51a351 #419341 #387038; -moz-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; -webkit-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; }
|
||||
#new .popup { border-top-left-radius:0; }
|
||||
|
||||
@@ -58,13 +58,13 @@ table th#headerDate, table td.date { width:11em; padding:0 .1em 0 1em; text-alig
|
||||
table td.selection, table th.selection, table td.fileaction { width:2em; text-align:center; }
|
||||
table td.filename a.name { display:block; height:1.5em; vertical-align:middle; margin-left:3em; }
|
||||
table tr[data-type="dir"] td.filename a.name span.nametext {font-weight:bold; }
|
||||
table td.filename a.name input, table td.filename a.name form { width:100%; cursor:text; }
|
||||
table td.filename input.filename { width:100%; cursor:text; }
|
||||
table td.filename a, table td.login, table td.logout, table td.download, table td.upload, table td.create, table td.delete { padding:.2em .5em .5em 0; }
|
||||
table td.filename .nametext, .uploadtext, .modified { float:left; padding:.3em 0; }
|
||||
// TODO fix usability bug (accidental file/folder selection)
|
||||
table td.filename .nametext { width:40em; overflow:hidden; text-overflow:ellipsis; }
|
||||
table td.filename .uploadtext { font-weight:normal; margin-left:.5em; }
|
||||
table td.filename form { float:left; font-size:.85em; }
|
||||
table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; }
|
||||
table thead.fixed tr{ position:fixed; top:6.5em; z-index:49; -moz-box-shadow:0 -3px 7px #ddd; -webkit-box-shadow:0 -3px 7px #ddd; box-shadow:0 -3px 7px #ddd; }
|
||||
table thead.fixed { height:2em; }
|
||||
#fileList tr td.filename>input[type=checkbox]:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; float:left; margin:.7em 0 0 1em; /* bigger clickable area doesn’t work in FF width:2.8em; height:2.4em;*/ -webkit-transition:opacity 200ms; -moz-transition:opacity 200ms; -o-transition:opacity 200ms; transition:opacity 200ms; }
|
||||
|
||||
@@ -40,9 +40,14 @@ if(!OC_Filesystem::file_exists($filename)) {
|
||||
$ftype=OC_Filesystem::getMimeType( $filename );
|
||||
|
||||
header('Content-Type:'.$ftype);
|
||||
header('Content-Disposition: attachment; filename="'.basename($filename).'"');
|
||||
if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) {
|
||||
header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' );
|
||||
} else {
|
||||
header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) )
|
||||
. '; filename="' . rawurlencode( basename($filename) ) . '"' );
|
||||
}
|
||||
OCP\Response::disableCaching();
|
||||
header('Content-Length: '.OC_Filesystem::filesize($filename));
|
||||
|
||||
@ob_end_clean();
|
||||
OC_Util::obEnd();
|
||||
OC_Filesystem::readfile( $filename );
|
||||
|
||||
@@ -67,7 +67,7 @@ $breadcrumb = array();
|
||||
$pathtohere = '';
|
||||
foreach( explode( '/', $dir ) as $i ) {
|
||||
if( $i != '' ) {
|
||||
$pathtohere .= '/'.str_replace('+','%20', urlencode($i));
|
||||
$pathtohere .= '/'.$i;
|
||||
$breadcrumb[] = array( 'dir' => $pathtohere, 'name' => $i );
|
||||
}
|
||||
}
|
||||
@@ -90,6 +90,9 @@ $freeSpace=max($freeSpace,0);
|
||||
$maxUploadFilesize = min($maxUploadFilesize ,$freeSpace);
|
||||
|
||||
$permissions = OCP\Share::PERMISSION_READ;
|
||||
if (OC_Filesystem::isCreatable($dir . '/')) {
|
||||
$permissions |= OCP\Share::PERMISSION_CREATE;
|
||||
}
|
||||
if (OC_Filesystem::isUpdatable($dir.'/')) {
|
||||
$permissions |= OCP\Share::PERMISSION_UPDATE;
|
||||
}
|
||||
|
||||
@@ -72,8 +72,9 @@ var FileActions={
|
||||
parent.children('a.name').append('<span class="fileactions" />');
|
||||
var defaultAction=FileActions.getDefault(FileActions.getCurrentMimeType(),FileActions.getCurrentType(), FileActions.getCurrentPermissions());
|
||||
for(name in actions){
|
||||
// NOTE: Temporary fix to prevent rename action in root of Shared directory
|
||||
if (name == 'Rename' && $('#dir').val() == '/Shared') {
|
||||
// NOTE: Temporary fix to prevent rename action in root of Shared directory and Shared action for Shared folder
|
||||
if (name == 'Rename' && $('#dir').val() == '/Shared' ||
|
||||
(name == 'Share' && $('#dir').val() == '/' && file == 'Shared')) {
|
||||
continue;
|
||||
}
|
||||
if((name=='Download' || actions[name]!=defaultAction) && name!='Delete'){
|
||||
|
||||
@@ -15,9 +15,9 @@ var FileList={
|
||||
extension=false;
|
||||
}
|
||||
html+='<td class="filename" style="background-image:url('+img+')"><input type="checkbox" />';
|
||||
html+='<a class="name" href="download.php?file='+$('#dir').val().replace(/</, '<').replace(/>/, '>')+'/'+name+'"><span class="nametext">'+basename;
|
||||
html+='<a class="name" href="download.php?file='+$('#dir').val().replace(/</, '<').replace(/>/, '>')+'/'+escapeHTML(name)+'"><span class="nametext">'+escapeHTML(basename);
|
||||
if(extension){
|
||||
html+='<span class="extension">'+extension+'</span>';
|
||||
html+='<span class="extension">'+escapeHTML(extension)+'</span>';
|
||||
}
|
||||
html+='</span></a></td>';
|
||||
if(size!='Pending'){
|
||||
@@ -137,16 +137,19 @@ var FileList={
|
||||
tr=$('tr').filterAttr('data-file',name);
|
||||
tr.data('renaming',true);
|
||||
td=tr.children('td.filename');
|
||||
input=$('<input class="filename"></input>').val(name);
|
||||
input=$('<input class="filename"/>').val(name);
|
||||
form=$('<form></form>');
|
||||
form.append(input);
|
||||
td.children('a.name').text('');
|
||||
td.children('a.name').append(form);
|
||||
td.children('a.name').hide();
|
||||
td.append(form);
|
||||
input.focus();
|
||||
form.submit(function(event){
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
var newname=input.val();
|
||||
if (!Files.isFileNameValid(newname)) {
|
||||
return false;
|
||||
}
|
||||
if (newname != name) {
|
||||
if (FileList.checkName(name, newname, false)) {
|
||||
newname = name;
|
||||
@@ -156,11 +159,11 @@ var FileList={
|
||||
OC.dialogs.alert(result.data.message, 'Error moving file');
|
||||
newname = name;
|
||||
}
|
||||
tr.data('renaming',false);
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
tr.data('renaming',false);
|
||||
tr.attr('data-file', newname);
|
||||
var path = td.children('a.name').attr('href');
|
||||
td.children('a.name').attr('href', path.replace(encodeURIComponent(name), encodeURIComponent(newname)));
|
||||
@@ -169,15 +172,24 @@ var FileList={
|
||||
} else {
|
||||
var basename=newname;
|
||||
}
|
||||
td.children('a.name').empty();
|
||||
var span=$('<span class="nametext"></span>');
|
||||
span.text(basename);
|
||||
td.children('a.name').append(span);
|
||||
td.find('a.name span.nametext').text(basename);
|
||||
if (newname.indexOf('.') > 0 && tr.data('type') != 'dir') {
|
||||
span.append($('<span class="extension">'+newname.substr(newname.lastIndexOf('.'))+'</span>'));
|
||||
if (td.find('a.name span.extension').length == 0 ) {
|
||||
td.find('a.name span.nametext').append('<span class="extension"></span>');
|
||||
}
|
||||
td.find('a.name span.extension').text(newname.substr(newname.lastIndexOf('.')));
|
||||
}
|
||||
form.remove();
|
||||
td.children('a.name').show();
|
||||
return false;
|
||||
});
|
||||
input.keyup(function(event){
|
||||
if (event.keyCode == 27) {
|
||||
tr.data('renaming',false);
|
||||
form.remove();
|
||||
td.children('a.name').show();
|
||||
}
|
||||
});
|
||||
input.click(function(event){
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
@@ -189,9 +201,9 @@ var FileList={
|
||||
checkName:function(oldName, newName, isNewFile) {
|
||||
if (isNewFile || $('tr').filterAttr('data-file', newName).length > 0) {
|
||||
if (isNewFile) {
|
||||
$('#notification').html(newName+' '+t('files', 'already exists')+'<span class="replace">'+t('files', 'replace')+'</span><span class="suggest">'+t('files', 'suggest name')+'</span><span class="cancel">'+t('files', 'cancel')+'</span>');
|
||||
$('#notification').html(escapeHTML(newName)+' '+t('files', 'already exists')+'<span class="replace">'+t('files', 'replace')+'</span><span class="suggest">'+t('files', 'suggest name')+'</span><span class="cancel">'+t('files', 'cancel')+'</span>');
|
||||
} else {
|
||||
$('#notification').html(newName+' '+t('files', 'already exists')+'<span class="replace">'+t('files', 'replace')+'</span><span class="cancel">'+t('files', 'cancel')+'</span>');
|
||||
$('#notification').html(escapeHTML(newName)+' '+t('files', 'already exists')+'<span class="replace">'+t('files', 'replace')+'</span><span class="cancel">'+t('files', 'cancel')+'</span>');
|
||||
}
|
||||
$('#notification').data('oldName', oldName);
|
||||
$('#notification').data('newName', newName);
|
||||
@@ -272,16 +284,16 @@ var FileList={
|
||||
} else {
|
||||
// NOTE: Temporary fix to change the text to unshared for files in root of Shared folder
|
||||
if ($('#dir').val() == '/Shared') {
|
||||
$('#notification').html(t('files', 'unshared')+' '+files+'<span class="undo">'+t('files', 'undo')+'</span>');
|
||||
$('#notification').html(t('files', 'unshared')+' '+ escapeHTML(files) +'<span class="undo">'+t('files', 'undo')+'</span>');
|
||||
} else {
|
||||
$('#notification').html(t('files', 'deleted')+' '+files+'<span class="undo">'+t('files', 'undo')+'</span>');
|
||||
$('#notification').html(t('files', 'deleted')+' '+ escapeHTML(files)+'<span class="undo">'+t('files', 'undo')+'</span>');
|
||||
}
|
||||
$('#notification').fadeIn();
|
||||
}
|
||||
},
|
||||
finishDelete:function(ready,sync){
|
||||
if(!FileList.deleteCanceled && FileList.deleteFiles){
|
||||
var fileNames=FileList.deleteFiles.join(';');
|
||||
var fileNames=JSON.stringify(FileList.deleteFiles);
|
||||
$.ajax({
|
||||
url: OC.filePath('files', 'ajax', 'delete.php'),
|
||||
async:!sync,
|
||||
@@ -373,4 +385,7 @@ $(document).ready(function(){
|
||||
FileList.lastAction();
|
||||
}
|
||||
});
|
||||
$(window).unload(function (){
|
||||
$(window).trigger('beforeunload');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -25,6 +25,30 @@ Files={
|
||||
delete uploadingFiles[index];
|
||||
});
|
||||
procesSelection();
|
||||
},
|
||||
isFileNameValid:function (name) {
|
||||
if (name === '.') {
|
||||
$('#notification').text(t('files', '\'.\' is an invalid file name.'));
|
||||
$('#notification').fadeIn();
|
||||
return false;
|
||||
}
|
||||
if (name.length == 0) {
|
||||
$('#notification').text(t('files', 'File name cannot be empty.'));
|
||||
$('#notification').fadeIn();
|
||||
return false;
|
||||
}
|
||||
|
||||
// check for invalid characters
|
||||
var invalid_characters = ['\\', '/', '<', '>', ':', '"', '|', '?', '*'];
|
||||
for (var i = 0; i < invalid_characters.length; i++) {
|
||||
if (name.indexOf(invalid_characters[i]) != -1) {
|
||||
$('#notification').text(t('files', "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed."));
|
||||
$('#notification').fadeIn();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
$('#notification').fadeOut();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
$(document).ready(function() {
|
||||
@@ -174,15 +198,16 @@ $(document).ready(function() {
|
||||
});
|
||||
|
||||
$('.download').click('click',function(event) {
|
||||
var files=getSelectedFiles('name').join(';');
|
||||
var files=getSelectedFiles('name');
|
||||
var fileslist = JSON.stringify(files);
|
||||
var dir=$('#dir').val()||'/';
|
||||
$('#notification').text(t('files','generating ZIP-file, it may take some time.'));
|
||||
$('#notification').fadeIn();
|
||||
// use special download URL if provided, e.g. for public shared files
|
||||
if ( (downloadURL = document.getElementById("downloadURL")) ) {
|
||||
window.location=downloadURL.value+"&download&files="+files;
|
||||
window.location=downloadURL.value+"&download&files="+encodeURIComponent(fileslist);
|
||||
} else {
|
||||
window.location=OC.filePath('files', 'ajax', 'download.php') + '?'+ $.param({ dir: dir, files: files });
|
||||
window.location=OC.filePath('files', 'ajax', 'download.php') + '?'+ $.param({ dir: dir, files: fileslist });
|
||||
}
|
||||
return false;
|
||||
});
|
||||
@@ -199,7 +224,7 @@ $(document).ready(function() {
|
||||
$(document).bind('drop dragover', function (e) {
|
||||
e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone
|
||||
});
|
||||
|
||||
|
||||
if ( document.getElementById("data-upload-form") ) {
|
||||
$(function() {
|
||||
$('.file_upload_start').fileupload({
|
||||
@@ -233,6 +258,11 @@ $(document).ready(function() {
|
||||
}
|
||||
});
|
||||
}else{
|
||||
var dropTarget = $(e.originalEvent.target).closest('tr');
|
||||
if(dropTarget && dropTarget.attr('data-type') === 'dir') { // drag&drop upload to folder
|
||||
var dirName = dropTarget.attr('data-file')
|
||||
}
|
||||
|
||||
var date=new Date();
|
||||
if(files){
|
||||
for(var i=0;i<files.length;i++){
|
||||
@@ -286,7 +316,10 @@ $(document).ready(function() {
|
||||
var jqXHR = $('.file_upload_start').fileupload('send', {files: files[i],
|
||||
formData: function(form) {
|
||||
var formArray = form.serializeArray();
|
||||
formArray[1]['value'] = dirName;
|
||||
// array index 0 contains the max files size
|
||||
// array index 1 contains the request token
|
||||
// array index 2 contains the directory
|
||||
formArray[2]['value'] = dirName;
|
||||
return formArray;
|
||||
}}).success(function(result, textStatus, jqXHR) {
|
||||
var response;
|
||||
@@ -296,7 +329,13 @@ $(document).ready(function() {
|
||||
$('#notification').fadeIn();
|
||||
}
|
||||
var file=response[0];
|
||||
// TODO: this doesn't work if the file name has been changed server side
|
||||
delete uploadingFiles[dirName][file.name];
|
||||
if ($.assocArraySize(uploadingFiles[dirName]) == 0) {
|
||||
delete uploadingFiles[dirName];
|
||||
}
|
||||
|
||||
var uploadtext = $('tr').filterAttr('data-type', 'dir').filterAttr('data-file', dirName).find('.uploadtext')
|
||||
var currentUploads = parseInt(uploadtext.attr('currentUploads'));
|
||||
currentUploads -= 1;
|
||||
uploadtext.attr('currentUploads', currentUploads);
|
||||
@@ -419,7 +458,7 @@ $(document).ready(function() {
|
||||
// http://stackoverflow.com/a/6700/11236
|
||||
var size = 0, key;
|
||||
for (key in obj) {
|
||||
if (obj.hasOwnProperty(key)) size++;
|
||||
if (obj.hasOwnProperty(key)) size++;
|
||||
}
|
||||
return size;
|
||||
};
|
||||
@@ -463,7 +502,7 @@ $(document).ready(function() {
|
||||
$('button.file_upload_filename').removeClass('active');
|
||||
$('#new li').each(function(i,element){
|
||||
if($(element).children('p').length==0){
|
||||
$(element).children('input').remove();
|
||||
$(element).children('form').remove();
|
||||
$(element).append('<p>'+$(element).data('text')+'</p>');
|
||||
}
|
||||
});
|
||||
@@ -483,7 +522,7 @@ $(document).ready(function() {
|
||||
|
||||
$('#new li').each(function(i,element){
|
||||
if($(element).children('p').length==0){
|
||||
$(element).children('input').remove();
|
||||
$(element).children('form').remove();
|
||||
$(element).append('<p>'+$(element).data('text')+'</p>');
|
||||
}
|
||||
});
|
||||
@@ -492,18 +531,29 @@ $(document).ready(function() {
|
||||
var text=$(this).children('p').text();
|
||||
$(this).data('text',text);
|
||||
$(this).children('p').remove();
|
||||
var form=$('<form></form>');
|
||||
var input=$('<input>');
|
||||
$(this).append(input);
|
||||
form.append(input);
|
||||
$(this).append(form);
|
||||
input.focus();
|
||||
input.change(function(){
|
||||
if(type != 'web' && $(this).val().indexOf('/')!=-1){
|
||||
$('#notification').text(t('files','Invalid name, \'/\' is not allowed.'));
|
||||
form.submit(function(event){
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
var newname=input.val();
|
||||
if(type == 'web' && newname.length == 0){
|
||||
$('#notification').text(t('files', "URL cannot be empty."));
|
||||
$('#notification').fadeIn();
|
||||
return;
|
||||
return false;
|
||||
} else if (type != 'web' && !Files.isFileNameValid(newname)) {
|
||||
return false;
|
||||
} else if( type == 'folder' && $('#dir').val() == '/' && newname == 'Shared') {
|
||||
$('#notification').text(t('files','Invalid folder name. Usage of "Shared" is reserved by Owncloud'));
|
||||
$('#notification').fadeIn();
|
||||
return false;
|
||||
}
|
||||
var name = getUniqueName($(this).val());
|
||||
if (name != $(this).val()) {
|
||||
FileList.checkName(name, $(this).val(), true);
|
||||
var name = getUniqueName(newname);
|
||||
if (newname != name) {
|
||||
FileList.checkName(name, newname, true);
|
||||
var hidden = true;
|
||||
} else {
|
||||
var hidden = false;
|
||||
@@ -547,7 +597,7 @@ $(document).ready(function() {
|
||||
break;
|
||||
case 'web':
|
||||
if(name.substr(0,8)!='https://' && name.substr(0,7)!='http://'){
|
||||
name='http://'.name;
|
||||
name='http://'+name;
|
||||
}
|
||||
var localName=name;
|
||||
if(localName.substr(localName.length-1,1)=='/'){//strip /
|
||||
@@ -586,8 +636,8 @@ $(document).ready(function() {
|
||||
});
|
||||
break;
|
||||
}
|
||||
var li=$(this).parent();
|
||||
$(this).remove();
|
||||
var li=form.parent();
|
||||
form.remove();
|
||||
li.append('<p>'+li.data('text')+'</p>');
|
||||
$('#new>a').click();
|
||||
});
|
||||
@@ -707,7 +757,7 @@ function updateBreadcrumb(breadcrumbHtml) {
|
||||
|
||||
//options for file drag/dropp
|
||||
var dragOptions={
|
||||
distance: 20, revert: 'invalid', opacity: 0.7,
|
||||
distance: 20, revert: 'invalid', opacity: 0.7, helper: 'clone',
|
||||
stop: function(event, ui) {
|
||||
$('#fileList tr td.filename').addClass('ui-draggable');
|
||||
}
|
||||
@@ -826,7 +876,7 @@ function getSelectedFiles(property){
|
||||
name:$(element).attr('data-file'),
|
||||
mime:$(element).data('mime'),
|
||||
type:$(element).data('type'),
|
||||
size:$(element).data('size'),
|
||||
size:$(element).data('size')
|
||||
};
|
||||
if(property){
|
||||
files.push(file[property]);
|
||||
@@ -842,28 +892,27 @@ function relative_modified_date(timestamp) {
|
||||
var diffminutes = Math.round(timediff/60);
|
||||
var diffhours = Math.round(diffminutes/60);
|
||||
var diffdays = Math.round(diffhours/24);
|
||||
var diffmonths = Math.round(diffdays/31);
|
||||
var diffyears = Math.round(diffdays/365);
|
||||
if(timediff < 60) { return t('files','seconds ago'); }
|
||||
else if(timediff < 120) { return '1 '+t('files','minute ago'); }
|
||||
else if(timediff < 3600) { return diffminutes+' '+t('files','minutes ago'); }
|
||||
//var diffmonths = Math.round(diffdays/31);
|
||||
//var diffyears = Math.round(diffdays/365);
|
||||
if(timediff < 60) { return t('lib','seconds ago'); }
|
||||
else if(timediff < 120) { return t('lib','1 minute ago'); }
|
||||
else if(timediff < 3600) { return t('lib','%d minutes ago',diffminutes); }
|
||||
//else if($timediff < 7200) { return '1 hour ago'; }
|
||||
//else if($timediff < 86400) { return $diffhours.' hours ago'; }
|
||||
else if(timediff < 86400) { return t('files','today'); }
|
||||
else if(timediff < 172800) { return t('files','yesterday'); }
|
||||
else if(timediff < 2678400) { return diffdays+' '+t('files','days ago'); }
|
||||
else if(timediff < 5184000) { return t('files','last month'); }
|
||||
//else if($timediff < 31556926) { return $diffmonths.' months ago'; }
|
||||
else if(timediff < 31556926) { return t('files','months ago'); }
|
||||
else if(timediff < 63113852) { return t('files','last year'); }
|
||||
else { return diffyears+' '+t('files','years ago'); }
|
||||
else if(timediff < 86400) { return t('lib','today'); }
|
||||
else if(timediff < 172800) { return t('lib','yesterday'); }
|
||||
else if(timediff < 2678400) { return t('lib','%d days ago',diffdays); }
|
||||
else if(timediff < 5184000) { return t('lib','last month'); }
|
||||
else if(timediff < 31556926) { return t('lib','months ago'); }
|
||||
else if(timediff < 63113852) { return t('lib','last year'); }
|
||||
else { return t('lib','years ago'); }
|
||||
}
|
||||
|
||||
function getMimeIcon(mime, ready){
|
||||
if(getMimeIcon.cache[mime]){
|
||||
ready(getMimeIcon.cache[mime]);
|
||||
}else{
|
||||
$.get( OC.filePath('files','ajax','mimeicon.php')+'?mime='+mime, function(path){
|
||||
$.get( OC.filePath('files','ajax','mimeicon.php'), {mime: mime}, function(path){
|
||||
getMimeIcon.cache[mime]=path;
|
||||
ready(getMimeIcon.cache[mime]);
|
||||
});
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
"folders" => "Ordner",
|
||||
"file" => "Datei",
|
||||
"files" => "Dateien",
|
||||
"seconds ago" => "Sekunden her",
|
||||
"seconds ago" => "Gerade eben",
|
||||
"minute ago" => "Minute her",
|
||||
"minutes ago" => "Minuten her",
|
||||
"today" => "Heute",
|
||||
|
||||
@@ -4,13 +4,18 @@
|
||||
<fieldset class="personalblock">
|
||||
<legend><strong><?php echo $l->t('File handling');?></strong></legend>
|
||||
<?php if($_['uploadChangable']):?>
|
||||
<label for="maxUploadSize"><?php echo $l->t( 'Maximum upload size' ); ?> </label><input name='maxUploadSize' id="maxUploadSize" value='<?php echo $_['uploadMaxFilesize'] ?>'/>(<?php echo $l->t('max. possible: '); echo $_['maxPossibleUploadSize'] ?>)<br/>
|
||||
<label for="maxUploadSize"><?php echo $l->t( 'Maximum upload size' ); ?> </label><input name='maxUploadSize' id="maxUploadSize" value='<?php echo $_['uploadMaxFilesize'] ?>'/>
|
||||
<?php if($_['displayMaxPossibleUploadSize']):?>
|
||||
(<?php echo $l->t('max. possible: '); echo $_['maxPossibleUploadSize'] ?>)
|
||||
<?php endif;?>
|
||||
<br/>
|
||||
<?php endif;?>
|
||||
<input type="checkbox" name="allowZipDownload" id="allowZipDownload" value="1" title="<?php echo $l->t( 'Needed for multi-file and folder downloads.' ); ?>"<?php if ($_['allowZipDownload']) echo ' checked="checked"'; ?> /> <label for="allowZipDownload"><?php echo $l->t( 'Enable ZIP-download' ); ?></label> <br/>
|
||||
|
||||
<input name="maxZipInputSize" id="maxZipInputSize" style="width:180px;" value='<?php echo $_['maxZipInputSize'] ?>' title="<?php echo $l->t( '0 is unlimited' ); ?>"<?php if (!$_['allowZipDownload']) echo ' disabled="disabled"'; ?> />
|
||||
<label for="maxZipInputSize"><?php echo $l->t( 'Maximum input size for ZIP files' ); ?> </label><br />
|
||||
|
||||
<input type="hidden" value="<?php echo $_['requesttoken']; ?>" name="requesttoken" />
|
||||
<input type="submit" name="submitFilesAdminSettings" id="submitFilesAdminSettings" value="<?php echo $l->t( 'Save' ); ?>"/>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
<div class="file_upload_wrapper svg">
|
||||
<form data-upload-id='1' id="data-upload-form" class="file_upload_form" action="<?php echo OCP\Util::linkTo('files', 'ajax/upload.php'); ?>" method="post" enctype="multipart/form-data" target="file_upload_target_1">
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $_['uploadMaxFilesize'] ?>" id="max_upload">
|
||||
<!-- Send the requesttoken, this is needed for older IE versions because they don't send the CSRF token via HTTP header in this case -->
|
||||
<input type="hidden" name="requesttoken" value="<?php echo $_['requesttoken'] ?>" id="requesttoken">
|
||||
<input type="hidden" class="max_human_file_size" value="(max <?php echo $_['uploadMaxHumanFilesize']; ?>)">
|
||||
<input type="hidden" name="dir" value="<?php echo $_['dir'] ?>" id="dir">
|
||||
<input class="file_upload_start" type="file" name='files[]'/>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php for($i=0; $i<count($_["breadcrumb"]); $i++):
|
||||
$crumb = $_["breadcrumb"][$i]; ?>
|
||||
<div class="crumb <?php if($i == count($_["breadcrumb"])-1) echo 'last';?> svg" data-dir='<?php echo urlencode($crumb["dir"]);?>' style='background-image:url("<?php echo OCP\image_path('core','breadcrumb.png');?>")'>
|
||||
<a href="<?php echo $_['baseURL'].urlencode($crumb["dir"]); ?>"><?php echo OCP\Util::sanitizeHTML($crumb["name"]); ?></a>
|
||||
$crumb = $_["breadcrumb"][$i];
|
||||
$dir = str_replace('+','%20', urlencode($crumb["dir"])); ?>
|
||||
<div class="crumb <?php if($i == count($_["breadcrumb"])-1) echo 'last';?> svg" data-dir='<?php echo $dir;?>' style='background-image:url("<?php echo OCP\image_path('core', 'breadcrumb.png');?>")'>
|
||||
<a href="<?php echo $_['baseURL'].$dir; ?>"><?php echo OCP\Util::sanitizeHTML($crumb["name"]); ?></a>
|
||||
</div>
|
||||
<?php endfor;?>
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
<script type="text/javascript">
|
||||
<?php if ( array_key_exists('publicListView', $_) && $_['publicListView'] == true ) {
|
||||
echo "var publicListView = true;";
|
||||
} else {
|
||||
echo "var publicListView = false;";
|
||||
}
|
||||
?>
|
||||
</script>
|
||||
|
||||
<?php foreach($_['files'] as $file):
|
||||
$simple_file_size = OCP\simple_file_size($file['size']);
|
||||
$simple_size_color = intval(200-$file['size']/(1024*1024)*2); // the bigger the file, the darker the shade of grey; megabytes*2
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
OC_Util::checkAdminUser();
|
||||
|
||||
$tmpl = new OCP\Template( 'files_encryption', 'settings');
|
||||
$blackList=explode(',',OCP\Config::getAppValue('files_encryption','type_blacklist','jpg,png,jpeg,avi,mpg,mpeg,mkv,mp3,oga,ogv,ogg'));
|
||||
$enabled=(OCP\Config::getAppValue('files_encryption','enable_encryption','true')=='true');
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
OCP\JSON::checkAppEnabled('files_external');
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
if ( !($filename = $_FILES['rootcert_import']['name']) ) {
|
||||
header("Location: settings/personal.php");
|
||||
|
||||
@@ -4,6 +4,8 @@ require_once 'Dropbox/autoload.php';
|
||||
|
||||
OCP\JSON::checkAppEnabled('files_external');
|
||||
OCP\JSON::checkLoggedIn();
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
if (isset($_POST['app_key']) && isset($_POST['app_secret'])) {
|
||||
$oauth = new Dropbox_OAuth_Curl($_POST['app_key'], $_POST['app_secret']);
|
||||
if (isset($_POST['step'])) {
|
||||
|
||||
@@ -4,6 +4,8 @@ require_once 'Google/common.inc.php';
|
||||
|
||||
OCP\JSON::checkAppEnabled('files_external');
|
||||
OCP\JSON::checkLoggedIn();
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
$consumer = new OAuthConsumer('anonymous', 'anonymous');
|
||||
$sigMethod = new OAuthSignatureMethod_HMAC_SHA1();
|
||||
if (isset($_POST['step'])) {
|
||||
|
||||
@@ -3,6 +3,15 @@
|
||||
OCP\JSON::checkAppEnabled('files_external');
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
if (!isset($_POST['isPersonal']))
|
||||
return;
|
||||
if (!isset($_POST['mountPoint']))
|
||||
return;
|
||||
if (!isset($_POST['mountType']))
|
||||
return;
|
||||
if (!isset($_POST['applicable']))
|
||||
return;
|
||||
|
||||
if ($_POST['isPersonal'] == 'true') {
|
||||
OCP\JSON::checkLoggedIn();
|
||||
$isPersonal = true;
|
||||
@@ -10,4 +19,5 @@ if ($_POST['isPersonal'] == 'true') {
|
||||
OCP\JSON::checkAdminUser();
|
||||
$isPersonal = false;
|
||||
}
|
||||
|
||||
OC_Mount_Config::removeMountPoint($_POST['mountPoint'], $_POST['mountType'], $_POST['applicable'], $isPersonal);
|
||||
|
||||
@@ -109,10 +109,10 @@ class OC_Mount_Config {
|
||||
return $personal;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add directory for mount point to the filesystem
|
||||
* @param OC_Fileview instance $view
|
||||
* @param string path to mount point
|
||||
/**
|
||||
* Add directory for mount point to the filesystem
|
||||
* @param OC_Fileview instance $view
|
||||
* @param string path to mount point
|
||||
*/
|
||||
private static function addMountPointDirectory($view, $path) {
|
||||
$dir = '';
|
||||
@@ -256,7 +256,7 @@ class OC_Mount_Config {
|
||||
foreach ($data[self::MOUNT_TYPE_GROUP] as $group => $mounts) {
|
||||
$content .= "\t\t'".$group."' => array (\n";
|
||||
foreach ($mounts as $mountPoint => $mount) {
|
||||
$content .= "\t\t\t'".$mountPoint."' => ".str_replace("\n", '', var_export($mount, true)).",\n";
|
||||
$content .= "\t\t\t'".addslashes($mountPoint)."' => ".str_replace("\n", '', var_export($mount, true)).",\n";
|
||||
|
||||
}
|
||||
$content .= "\t\t),\n";
|
||||
@@ -268,7 +268,7 @@ class OC_Mount_Config {
|
||||
foreach ($data[self::MOUNT_TYPE_USER] as $user => $mounts) {
|
||||
$content .= "\t\t'".$user."' => array (\n";
|
||||
foreach ($mounts as $mountPoint => $mount) {
|
||||
$content .= "\t\t\t'".$mountPoint."' => ".str_replace("\n", '', var_export($mount, true)).",\n";
|
||||
$content .= "\t\t\t'".addslashes($mountPoint)."' => ".str_replace("\n", '', var_export($mount, true)).",\n";
|
||||
}
|
||||
$content .= "\t\t),\n";
|
||||
}
|
||||
@@ -285,9 +285,17 @@ class OC_Mount_Config {
|
||||
public static function getCertificates() {
|
||||
$view = \OCP\Files::getStorage('files_external');
|
||||
$path=\OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath("").'uploads/';
|
||||
if (!is_dir($path)) mkdir($path);
|
||||
\OCP\Util::writeLog('files_external', 'checking path '.$path, \OCP\Util::INFO);
|
||||
if(!is_dir($path)) {
|
||||
//path might not exist (e.g. non-standard OC_User::getHome() value)
|
||||
//in this case create full path using 3rd (recursive=true) parameter.
|
||||
mkdir($path, 0777, true);
|
||||
}
|
||||
$result = array();
|
||||
$handle = opendir($path);
|
||||
if (!$handle) {
|
||||
return array();
|
||||
}
|
||||
while (false !== ($file = readdir($handle))) {
|
||||
if($file != '.' && $file != '..') $result[] = $file;
|
||||
}
|
||||
@@ -319,4 +327,39 @@ class OC_Mount_Config {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* check if smbclient is installed
|
||||
*/
|
||||
public static function checksmbclient() {
|
||||
if(function_exists('shell_exec')) {
|
||||
$output=shell_exec('which smbclient');
|
||||
return (empty($output)?false:true);
|
||||
}else{
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* check if php-ftp is installed
|
||||
*/
|
||||
public static function checkphpftp() {
|
||||
if(function_exists('ftp_login')) {
|
||||
return(true);
|
||||
}else{
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* check dependencies
|
||||
*/
|
||||
public static function checkDependencies() {
|
||||
$l= new OC_L10N('files_external');
|
||||
$txt='';
|
||||
if(!OC_Mount_Config::checksmbclient()) $txt.=$l->t('<b>Warning:</b> "smbclient" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it.').'<br />';
|
||||
if(!OC_Mount_Config::checkphpftp()) $txt.=$l->t('<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it.').'<br />';
|
||||
|
||||
return($txt);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -19,7 +19,15 @@ class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{
|
||||
$this->host=$params['host'];
|
||||
$this->user=$params['user'];
|
||||
$this->password=$params['password'];
|
||||
$this->secure=isset($params['secure'])?(bool)$params['secure']:false;
|
||||
if(isset($params['secure'])){
|
||||
if(is_string($params['secure'])){
|
||||
$this->secure = ($params['secure'] === 'true');
|
||||
}else{
|
||||
$this->secure = (bool)$params['secure'];
|
||||
}
|
||||
}else{
|
||||
$this->secure = false;
|
||||
}
|
||||
$this->root=isset($params['root'])?$params['root']:'/';
|
||||
if(!$this->root || $this->root[0]!='/') {
|
||||
$this->root='/'.$this->root;
|
||||
|
||||
@@ -34,7 +34,7 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{
|
||||
$this->share=substr($this->share,0,-1);
|
||||
}
|
||||
|
||||
//create the root folder if necesary
|
||||
//create the root folder if necessary
|
||||
if(!$this->is_dir('')) {
|
||||
$this->mkdir('');
|
||||
}
|
||||
@@ -44,7 +44,10 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{
|
||||
if(substr($path,-1)=='/') {
|
||||
$path=substr($path,0,-1);
|
||||
}
|
||||
return 'smb://'.$this->user.':'.$this->password.'@'.$this->host.$this->share.$this->root.$path;
|
||||
$user = urlencode($this->user);
|
||||
$password = urlencode($this->password);
|
||||
$path = urlencode($path);
|
||||
return 'smb://'.$user.':'.$password.'@'.$this->host.$this->share.$this->root.$path;
|
||||
}
|
||||
|
||||
public function stat($path) {
|
||||
@@ -58,10 +61,6 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{
|
||||
}
|
||||
}
|
||||
|
||||
public function filetype($path) {
|
||||
return (bool)@$this->opendir($path);//using opendir causes the same amount of requests and caches the content of the folder in one go
|
||||
}
|
||||
|
||||
/**
|
||||
* check if a file or folder has been updated since $time
|
||||
* @param int $time
|
||||
|
||||
@@ -39,7 +39,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
* @return string
|
||||
*/
|
||||
private function getContainerName($path) {
|
||||
$path=trim($this->root.$path,'/');
|
||||
$path=trim(trim($this->root,'/')."/".$path,'/.');
|
||||
return str_replace('/','\\',$path);
|
||||
}
|
||||
|
||||
@@ -70,11 +70,11 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
* @return CF_Container
|
||||
*/
|
||||
private function createContainer($path) {
|
||||
if($path=='' or $path=='/') {
|
||||
if($path=='' or $path=='/' or $path=='.') {
|
||||
return $this->conn->create_container($this->getContainerName($path));
|
||||
}
|
||||
$parent=dirname($path);
|
||||
if($parent=='' or $parent=='/') {
|
||||
if($parent=='' or $parent=='/' or $parent=='.') {
|
||||
$parentContainer=$this->rootContainer;
|
||||
}else{
|
||||
if(!$this->containerExists($parent)) {
|
||||
@@ -100,6 +100,9 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
if(is_null($container)) {
|
||||
return null;
|
||||
}else{
|
||||
if ($path=="/" or $path=='') {
|
||||
return null;
|
||||
}
|
||||
try{
|
||||
$obj=$container->get_object(basename($path));
|
||||
$this->objects[$path]=$obj;
|
||||
@@ -135,7 +138,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
private function createObject($path) {
|
||||
$container=$this->getContainer(dirname($path));
|
||||
if(!is_null($container)) {
|
||||
$container=$this->createContainer($path);
|
||||
$container=$this->createContainer(dirname($path));
|
||||
}
|
||||
return $container->create_object(basename($path));
|
||||
}
|
||||
@@ -268,7 +271,15 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
$this->host=$params['host'];
|
||||
$this->user=$params['user'];
|
||||
$this->root=isset($params['root'])?$params['root']:'/';
|
||||
$this->secure=isset($params['secure'])?(bool)$params['secure']:true;
|
||||
if(isset($params['secure'])){
|
||||
if(is_string($params['secure'])){
|
||||
$this->secure = ($params['secure'] === 'true');
|
||||
}else{
|
||||
$this->secure = (bool)$params['secure'];
|
||||
}
|
||||
}else{
|
||||
$this->secure = false;
|
||||
}
|
||||
if(!$this->root || $this->root[0]!='/') {
|
||||
$this->root='/'.$this->root;
|
||||
}
|
||||
@@ -277,7 +288,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
|
||||
$this->conn = new CF_Connection($this->auth);
|
||||
|
||||
if(!$this->containerExists($this->root)) {
|
||||
if(!$this->containerExists('/')) {
|
||||
$this->rootContainer=$this->createContainer('/');
|
||||
}else{
|
||||
$this->rootContainer=$this->getContainer('/');
|
||||
@@ -391,6 +402,9 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
}
|
||||
|
||||
public function unlink($path) {
|
||||
if($this->containerExists($path)) {
|
||||
return $this->rmdir($path);
|
||||
}
|
||||
if($this->objectExists($path)) {
|
||||
$container=$this->getContainer(dirname($path));
|
||||
$container->delete_object(basename($path));
|
||||
@@ -401,13 +415,13 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
}
|
||||
|
||||
public function fopen($path,$mode) {
|
||||
$obj=$this->getObject($path);
|
||||
if(is_null($obj)) {
|
||||
return false;
|
||||
}
|
||||
switch($mode) {
|
||||
case 'r':
|
||||
case 'rb':
|
||||
$obj=$this->getObject($path);
|
||||
if (is_null($obj)) {
|
||||
return false;
|
||||
}
|
||||
$fp = fopen('php://temp', 'r+');
|
||||
$obj->stream($fp);
|
||||
|
||||
@@ -440,7 +454,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
}
|
||||
|
||||
public function free_space($path) {
|
||||
return 0;
|
||||
return 1024*1024*1024*8;
|
||||
}
|
||||
|
||||
public function touch($path,$mtime=null) {
|
||||
@@ -481,7 +495,17 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
}
|
||||
|
||||
public function stat($path) {
|
||||
$container=$this->getContainer($path);
|
||||
if (!is_null($container)) {
|
||||
return array(
|
||||
'mtime'=>-1,
|
||||
'size'=>$container->bytes_used,
|
||||
'ctime'=>-1
|
||||
);
|
||||
}
|
||||
|
||||
$obj=$this->getObject($path);
|
||||
|
||||
if(is_null($obj)) {
|
||||
return false;
|
||||
}
|
||||
@@ -505,7 +529,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
$obj->save_to_filename($tmpFile);
|
||||
return $tmpFile;
|
||||
}else{
|
||||
return false;
|
||||
return OCP\Files::tmpFile();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,15 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{
|
||||
$this->host=$host;
|
||||
$this->user=$params['user'];
|
||||
$this->password=$params['password'];
|
||||
$this->secure=(isset($params['secure']) && $params['secure'] == 'true')?true:false;
|
||||
if(isset($params['secure'])){
|
||||
if(is_string($params['secure'])){
|
||||
$this->secure = ($params['secure'] === 'true');
|
||||
}else{
|
||||
$this->secure = (bool)$params['secure'];
|
||||
}
|
||||
}else{
|
||||
$this->secure = false;
|
||||
}
|
||||
$this->root=isset($params['root'])?$params['root']:'/';
|
||||
if(!$this->root || $this->root[0]!='/') {
|
||||
$this->root='/'.$this->root;
|
||||
@@ -131,6 +139,9 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{
|
||||
switch($mode) {
|
||||
case 'r':
|
||||
case 'rb':
|
||||
if(!$this->file_exists($path)) {
|
||||
return false;
|
||||
}
|
||||
//straight up curl instead of sabredav here, sabredav put's the entire get result in memory
|
||||
$curl = curl_init();
|
||||
$fp = fopen('php://temp', 'r+');
|
||||
|
||||
@@ -29,5 +29,6 @@ $tmpl = new OCP\Template('files_external', 'settings');
|
||||
$tmpl->assign('isAdminPage', false, false);
|
||||
$tmpl->assign('mounts', OC_Mount_Config::getPersonalMountPoints());
|
||||
$tmpl->assign('certs', OC_Mount_Config::getCertificates());
|
||||
$tmpl->assign('dependencies', OC_Mount_Config::checkDependencies(),false);
|
||||
$tmpl->assign('backends', $backends);
|
||||
return $tmpl->fetchPage();
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
OC_Util::checkAdminUser();
|
||||
|
||||
OCP\Util::addScript('files_external', 'settings');
|
||||
OCP\Util::addscript('3rdparty', 'chosen/chosen.jquery.min');
|
||||
OCP\Util::addStyle('files_external', 'settings');
|
||||
@@ -30,5 +32,6 @@ $tmpl->assign('mounts', OC_Mount_Config::getSystemMountPoints());
|
||||
$tmpl->assign('backends', OC_Mount_Config::getBackends());
|
||||
$tmpl->assign('groups', OC_Group::getGroups());
|
||||
$tmpl->assign('users', OCP\User::getUsers());
|
||||
$tmpl->assign('dependencies', OC_Mount_Config::checkDependencies(),false);
|
||||
$tmpl->assign('allowUserMounting', OCP\Config::getAppValue('files_external', 'allow_user_mounting', 'yes'));
|
||||
return $tmpl->fetchPage();
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<form id="files_external">
|
||||
<fieldset class="personalblock">
|
||||
<legend><strong><?php echo $l->t('External Storage'); ?></strong></legend>
|
||||
<?php if (isset($_['dependencies']) and ($_['dependencies']<>'')) echo($_['dependencies']); ?>
|
||||
<table id="externalStorage" data-admin='<?php echo json_encode($_['isAdminPage']); ?>'>
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -16,7 +17,7 @@
|
||||
<?php $_['mounts'] = array_merge($_['mounts'], array('' => array())); ?>
|
||||
<?php foreach ($_['mounts'] as $mountPoint => $mount): ?>
|
||||
<tr <?php echo ($mountPoint != '') ? 'class="'.$mount['class'].'"' : 'id="addMountPoint"'; ?>>
|
||||
<td class="mountPoint"><input type="text" name="mountPoint" value="<?php echo $mountPoint; ?>" placeholder="<?php echo $l->t('Mount point'); ?>" /></td>
|
||||
<td class="mountPoint"><input type="text" name="mountPoint" value="<?php echo OC_Util::sanitizeHTML($mountPoint); ?>" placeholder="<?php echo $l->t('Mount point'); ?>" /></td>
|
||||
<?php if ($mountPoint == ''): ?>
|
||||
<td class="backend">
|
||||
<select id="selectBackend" data-configurations='<?php echo json_encode($_['backends']); ?>'>
|
||||
@@ -60,7 +61,7 @@
|
||||
<?php if ($_['isAdminPage']): ?>
|
||||
<td class="applicable" align="right" data-applicable-groups='<?php if (isset($mount['applicable']['groups'])) echo json_encode($mount['applicable']['groups']); ?>' data-applicable-users='<?php if (isset($mount['applicable']['users'])) echo json_encode($mount['applicable']['users']); ?>'>
|
||||
<select class="chzn-select" multiple style="width:20em;" data-placeholder="<?php echo $l->t('None set'); ?>">
|
||||
<option value="all"><?php echo $l->t('All Users'); ?></option>
|
||||
<option value="all" <?php if (isset($mount['applicable']['users']) && in_array('all', $mount['applicable']['users'])) echo 'selected="selected"';?> ><?php echo $l->t('All Users'); ?></option>
|
||||
<optgroup label="<?php echo $l->t('Groups'); ?>">
|
||||
<?php foreach ($_['groups'] as $group): ?>
|
||||
<option value="<?php echo $group; ?>(group)" <?php if (isset($mount['applicable']['groups']) && in_array($group, $mount['applicable']['groups'])) echo 'selected="selected"'; ?>><?php echo $group; ?></option>
|
||||
@@ -109,8 +110,9 @@
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<input type="file" id="rootcert_import" name="rootcert_import" style="width:230px;">
|
||||
<input type="submit" name="cert_import" value="<?php echo $l->t('Import Root Certificate'); ?>" />
|
||||
<?php endif; ?>
|
||||
<input type="hidden" name="requesttoken" value="<?php echo $_['requesttoken']; ?>">
|
||||
<input type="file" id="rootcert_import" name="rootcert_import" style="width:230px;">
|
||||
<input type="submit" name="cert_import" value="<?php echo $l->t('Import Root Certificate'); ?>" />
|
||||
<?php endif; ?>
|
||||
</fieldset>
|
||||
</form>
|
||||
</form>
|
||||
|
||||
@@ -1,43 +1,42 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Michael Gapczynski
|
||||
* @copyright 2012 Michael Gapczynski mtgap@owncloud.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
* ownCloud
|
||||
*
|
||||
* @author Michael Gapczynski
|
||||
* @copyright 2012 Michael Gapczynski mtgap@owncloud.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
$config = include('apps/files_external/tests/config.php');
|
||||
if (!is_array($config) or !isset($config['amazons3']) or !$config['amazons3']['run']) {
|
||||
abstract class Test_Filestorage_AmazonS3 extends Test_FileStorage{}
|
||||
return;
|
||||
} else {
|
||||
class Test_Filestorage_AmazonS3 extends Test_FileStorage {
|
||||
class Test_Filestorage_AmazonS3 extends Test_FileStorage {
|
||||
|
||||
private $config;
|
||||
private $id;
|
||||
private $config;
|
||||
private $id;
|
||||
|
||||
public function setUp() {
|
||||
$id = uniqid();
|
||||
$this->config = include('apps/files_external/tests/config.php');
|
||||
$this->config['amazons3']['bucket'] = $id; // Make sure we have a new empty bucket to work in
|
||||
$this->instance = new OC_Filestorage_AmazonS3($this->config['amazons3']);
|
||||
public function setUp() {
|
||||
$id = uniqid();
|
||||
$this->config = include('files_external/tests/config.php');
|
||||
if (!is_array($this->config) or !isset($this->config['amazons3']) or !$this->config['amazons3']['run']) {
|
||||
$this->markTestSkipped('AmazonS3 backend not configured');
|
||||
}
|
||||
$this->config['amazons3']['bucket'] = $id; // Make sure we have a new empty bucket to work in
|
||||
$this->instance = new OC_Filestorage_AmazonS3($this->config['amazons3']);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown() {
|
||||
if ($this->instance) {
|
||||
$s3 = new AmazonS3(array('key' => $this->config['amazons3']['key'], 'secret' => $this->config['amazons3']['secret']));
|
||||
if ($s3->delete_all_objects($this->id)) {
|
||||
$s3->delete_bucket($this->id);
|
||||
|
||||
@@ -26,7 +26,7 @@ return array(
|
||||
'run'=>false,
|
||||
'user'=>'test:tester',
|
||||
'token'=>'testing',
|
||||
'host'=>'localhost:8080/auth',
|
||||
'host'=>'localhost.local:8080/auth',
|
||||
'root'=>'/',
|
||||
),
|
||||
'smb'=>array(
|
||||
|
||||
@@ -6,22 +6,21 @@
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
$config=include('files_external/tests/config.php');
|
||||
if(!is_array($config) or !isset($config['dropbox']) or !$config['dropbox']['run']) {
|
||||
abstract class Test_Filestorage_Dropbox extends Test_FileStorage{}
|
||||
return;
|
||||
}else{
|
||||
class Test_Filestorage_Dropbox extends Test_FileStorage {
|
||||
private $config;
|
||||
class Test_Filestorage_Dropbox extends Test_FileStorage {
|
||||
private $config;
|
||||
|
||||
public function setUp() {
|
||||
$id=uniqid();
|
||||
$this->config=include('files_external/tests/config.php');
|
||||
$this->config['dropbox']['root'].='/'.$id;//make sure we have an new empty folder to work in
|
||||
$this->instance=new OC_Filestorage_Dropbox($this->config['dropbox']);
|
||||
public function setUp() {
|
||||
$id = uniqid();
|
||||
$this->config = include('files_external/tests/config.php');
|
||||
if (!is_array($this->config) or !isset($this->config['dropbox']) or !$this->config['dropbox']['run']) {
|
||||
$this->markTestSkipped('Dropbox backend not configured');
|
||||
}
|
||||
$this->config['dropbox']['root'] .= '/' . $id; //make sure we have an new empty folder to work in
|
||||
$this->instance = new OC_Filestorage_Dropbox($this->config['dropbox']);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown() {
|
||||
if ($this->instance) {
|
||||
$this->instance->unlink('/');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,23 +6,40 @@
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
$config=include('apps/files_external/tests/config.php');
|
||||
if(!is_array($config) or !isset($config['ftp']) or !$config['ftp']['run']) {
|
||||
abstract class Test_Filestorage_FTP extends Test_FileStorage{}
|
||||
return;
|
||||
}else{
|
||||
class Test_Filestorage_FTP extends Test_FileStorage {
|
||||
private $config;
|
||||
class Test_Filestorage_FTP extends Test_FileStorage {
|
||||
private $config;
|
||||
|
||||
public function setUp() {
|
||||
$id=uniqid();
|
||||
$this->config=include('apps/files_external/tests/config.php');
|
||||
$this->config['ftp']['root'].='/'.$id;//make sure we have an new empty folder to work in
|
||||
$this->instance=new OC_Filestorage_FTP($this->config['ftp']);
|
||||
public function setUp() {
|
||||
$id = uniqid();
|
||||
$this->config = include('files_external/tests/config.php');
|
||||
if (!is_array($this->config) or !isset($this->config['ftp']) or !$this->config['ftp']['run']) {
|
||||
$this->markTestSkipped('FTP backend not configured');
|
||||
}
|
||||
$this->config['ftp']['root'] .= '/' . $id; //make sure we have an new empty folder to work in
|
||||
$this->instance = new OC_Filestorage_FTP($this->config['ftp']);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown() {
|
||||
if ($this->instance) {
|
||||
OCP\Files::rmdirr($this->instance->constructUrl(''));
|
||||
}
|
||||
}
|
||||
|
||||
public function testConstructUrl(){
|
||||
$config = array ( 'host' => 'localhost', 'user' => 'ftp', 'password' => 'ftp', 'root' => '/', 'secure' => false );
|
||||
$instance = new OC_Filestorage_FTP($config);
|
||||
$this->assertEqual('ftp://ftp:ftp@localhost/', $instance->constructUrl(''));
|
||||
|
||||
$config['secure'] = true;
|
||||
$instance = new OC_Filestorage_FTP($config);
|
||||
$this->assertEqual('ftps://ftp:ftp@localhost/', $instance->constructUrl(''));
|
||||
|
||||
$config['secure'] = 'false';
|
||||
$instance = new OC_Filestorage_FTP($config);
|
||||
$this->assertEqual('ftp://ftp:ftp@localhost/', $instance->constructUrl(''));
|
||||
|
||||
$config['secure'] = 'true';
|
||||
$instance = new OC_Filestorage_FTP($config);
|
||||
$this->assertEqual('ftps://ftp:ftp@localhost/', $instance->constructUrl(''));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,42 +1,41 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Michael Gapczynski
|
||||
* @copyright 2012 Michael Gapczynski mtgap@owncloud.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
* ownCloud
|
||||
*
|
||||
* @author Michael Gapczynski
|
||||
* @copyright 2012 Michael Gapczynski mtgap@owncloud.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
$config=include('apps/files_external/tests/config.php');
|
||||
if(!is_array($config) or !isset($config['google']) or !$config['google']['run']) {
|
||||
abstract class Test_Filestorage_Google extends Test_FileStorage{}
|
||||
return;
|
||||
}else{
|
||||
class Test_Filestorage_Google extends Test_FileStorage {
|
||||
class Test_Filestorage_Google extends Test_FileStorage {
|
||||
|
||||
private $config;
|
||||
private $config;
|
||||
|
||||
public function setUp() {
|
||||
$id=uniqid();
|
||||
$this->config=include('apps/files_external/tests/config.php');
|
||||
$this->config['google']['root'].='/'.$id;//make sure we have an new empty folder to work in
|
||||
$this->instance=new OC_Filestorage_Google($this->config['google']);
|
||||
public function setUp() {
|
||||
$id = uniqid();
|
||||
$this->config = include('files_external/tests/config.php');
|
||||
if (!is_array($this->config) or !isset($this->config['google']) or !$this->config['google']['run']) {
|
||||
$this->markTestSkipped('Google backend not configured');
|
||||
}
|
||||
$this->config['google']['root'] .= '/' . $id; //make sure we have an new empty folder to work in
|
||||
$this->instance = new OC_Filestorage_Google($this->config['google']);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown() {
|
||||
if ($this->instance) {
|
||||
$this->instance->rmdir('/');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,23 +6,21 @@
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
$config=include('apps/files_external/tests/config.php');
|
||||
class Test_Filestorage_SMB extends Test_FileStorage {
|
||||
private $config;
|
||||
|
||||
if(!is_array($config) or !isset($config['smb']) or !$config['smb']['run']) {
|
||||
abstract class Test_Filestorage_SMB extends Test_FileStorage{}
|
||||
return;
|
||||
}else{
|
||||
class Test_Filestorage_SMB extends Test_FileStorage {
|
||||
private $config;
|
||||
|
||||
public function setUp() {
|
||||
$id=uniqid();
|
||||
$this->config=include('apps/files_external/tests/config.php');
|
||||
$this->config['smb']['root'].=$id;//make sure we have an new empty folder to work in
|
||||
$this->instance=new OC_Filestorage_SMB($this->config['smb']);
|
||||
public function setUp() {
|
||||
$id = uniqid();
|
||||
$this->config = include('files_external/tests/config.php');
|
||||
if (!is_array($this->config) or !isset($this->config['smb']) or !$this->config['smb']['run']) {
|
||||
$this->markTestSkipped('Samba backend not configured');
|
||||
}
|
||||
$this->config['smb']['root'] .= $id; //make sure we have an new empty folder to work in
|
||||
$this->instance = new OC_Filestorage_SMB($this->config['smb']);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown() {
|
||||
if ($this->instance) {
|
||||
OCP\Files::rmdirr($this->instance->constructUrl(''));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,25 +6,23 @@
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
$config=include('apps/files_external/tests/config.php');
|
||||
if(!is_array($config) or !isset($config['swift']) or !$config['swift']['run']) {
|
||||
abstract class Test_Filestorage_SWIFT extends Test_FileStorage{}
|
||||
return;
|
||||
}else{
|
||||
class Test_Filestorage_SWIFT extends Test_FileStorage {
|
||||
private $config;
|
||||
class Test_Filestorage_SWIFT extends Test_FileStorage {
|
||||
private $config;
|
||||
|
||||
public function setUp() {
|
||||
$id=uniqid();
|
||||
$this->config=include('apps/files_external/tests/config.php');
|
||||
$this->config['swift']['root'].='/'.$id;//make sure we have an new empty folder to work in
|
||||
$this->instance=new OC_Filestorage_SWIFT($this->config['swift']);
|
||||
public function setUp() {
|
||||
$id = uniqid();
|
||||
$this->config = include('files_external/tests/config.php');
|
||||
if (!is_array($this->config) or !isset($this->config['swift']) or !$this->config['swift']['run']) {
|
||||
$this->markTestSkipped('OpenStack SWIFT backend not configured');
|
||||
}
|
||||
$this->config['swift']['root'] .= '/' . $id; //make sure we have an new empty folder to work in
|
||||
$this->instance = new OC_Filestorage_SWIFT($this->config['swift']);
|
||||
}
|
||||
|
||||
|
||||
public function tearDown() {
|
||||
$this->instance->rmdir('');
|
||||
public function tearDown() {
|
||||
if ($this->instance) {
|
||||
$this->instance->rmdir('');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,22 +6,21 @@
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
$config=include('apps/files_external/tests/config.php');
|
||||
if(!is_array($config) or !isset($config['webdav']) or !$config['webdav']['run']) {
|
||||
abstract class Test_Filestorage_DAV extends Test_FileStorage{}
|
||||
return;
|
||||
}else{
|
||||
class Test_Filestorage_DAV extends Test_FileStorage {
|
||||
private $config;
|
||||
class Test_Filestorage_DAV extends Test_FileStorage {
|
||||
private $config;
|
||||
|
||||
public function setUp() {
|
||||
$id=uniqid();
|
||||
$this->config=include('apps/files_external/tests/config.php');
|
||||
$this->config['webdav']['root'].='/'.$id;//make sure we have an new empty folder to work in
|
||||
$this->instance=new OC_Filestorage_DAV($this->config['webdav']);
|
||||
public function setUp() {
|
||||
$id = uniqid();
|
||||
$this->config = include('files_external/tests/config.php');
|
||||
if (!is_array($this->config) or !isset($this->config['webdav']) or !$this->config['webdav']['run']) {
|
||||
$this->markTestSkipped('WebDAV backend not configured');
|
||||
}
|
||||
$this->config['webdav']['root'] .= '/' . $id; //make sure we have an new empty folder to work in
|
||||
$this->instance = new OC_Filestorage_DAV($this->config['webdav']);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
public function tearDown() {
|
||||
if ($this->instance) {
|
||||
$this->instance->rmdir('/');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
OC::$CLASSPATH['OC_Share_Backend_File'] = "apps/files_sharing/lib/share/file.php";
|
||||
OC::$CLASSPATH['OC_Share_Backend_Folder'] = 'apps/files_sharing/lib/share/folder.php';
|
||||
OC::$CLASSPATH['OC_Filestorage_Shared'] = "apps/files_sharing/lib/sharedstorage.php";
|
||||
OC::$CLASSPATH['OC_Files_Sharing_Util'] = "apps/files_sharing/lib/util.php";
|
||||
OCP\Util::connectHook('OC_Filesystem', 'setup', 'OC_Filestorage_Shared', 'setup');
|
||||
OCP\Share::registerBackend('file', 'OC_Share_Backend_File');
|
||||
OCP\Share::registerBackend('folder', 'OC_Share_Backend_Folder', 'file');
|
||||
|
||||
@@ -55,6 +55,7 @@ if (version_compare($installedVersion, '0.3', '<')) {
|
||||
OC_Util::tearDownFS();
|
||||
}
|
||||
}
|
||||
OC_User::setUserId(null);
|
||||
if ($update_error) {
|
||||
OCP\Util::writeLog('files_sharing', 'There were some problems upgrading the sharing of files', OCP\Util::ERROR);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
$(document).ready(function() {
|
||||
|
||||
if (typeof OC.Share !== 'undefined' && typeof FileActions !== 'undefined') {
|
||||
if (typeof OC.Share !== 'undefined' && typeof FileActions !== 'undefined' && !publicListView) {
|
||||
OC.Share.loadIcons('file');
|
||||
FileActions.register('all', 'Share', OC.PERMISSION_READ, function(filename) {
|
||||
// Return the correct sharing icon
|
||||
@@ -46,7 +46,7 @@ $(document).ready(function() {
|
||||
var appendTo = $(tr).find('td.filename');
|
||||
// Check if drop down is already visible for a different file
|
||||
if (OC.Share.droppedDown) {
|
||||
if (item != $('#dropdown').data('item')) {
|
||||
if ($(tr).data('id') != $('#dropdown').attr('data-item-source')) {
|
||||
OC.Share.hideDropDown(function () {
|
||||
$(tr).addClass('mouseOver');
|
||||
OC.Share.showDropDown(itemType, $(tr).data('id'), appendTo, true, possiblePermissions);
|
||||
|
||||
@@ -113,7 +113,10 @@ class OC_Filestorage_Shared extends OC_Filestorage_Common {
|
||||
return false;
|
||||
} else if ($source = $this->getSourcePath($path)) {
|
||||
$storage = OC_Filesystem::getStorage($source);
|
||||
return $storage->mkdir($this->getInternalPath($source));
|
||||
if( ($storage->mkdir($this->getInternalPath($source))) ) {
|
||||
$this->updateFSCache($path);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -296,10 +299,15 @@ class OC_Filestorage_Shared extends OC_Filestorage_Common {
|
||||
'target' => $this->sharedFolder.$path,
|
||||
'source' => $source,
|
||||
);
|
||||
OCP\Util::emitHook('OC_Filestorage_Shared', 'file_put_contents', $info);
|
||||
OCP\Util::emitHook('OC_Filestorage_Shared', 'file_put_contents', $info);
|
||||
$parts = explode('/', $source, 4);
|
||||
$user = $parts[1];
|
||||
$intPath = '/'.$parts[3];
|
||||
$storage = OC_Filesystem::getStorage($source);
|
||||
$result = $storage->file_put_contents($this->getInternalPath($source), $data);
|
||||
return $result;
|
||||
if( ( $result = $storage->file_put_contents($this->getInternalPath($source), $data) ) ) {
|
||||
$this->updateFSCache($path);
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -368,17 +376,18 @@ class OC_Filestorage_Shared extends OC_Filestorage_Common {
|
||||
|
||||
public function fopen($path, $mode) {
|
||||
if ($source = $this->getSourcePath($path)) {
|
||||
$write = false;
|
||||
switch ($mode) {
|
||||
case 'w':
|
||||
case 'wb':
|
||||
case 'w+':
|
||||
case 'wb+': $write = true;
|
||||
case 'r+':
|
||||
case 'rb+':
|
||||
case 'w+':
|
||||
case 'wb+':
|
||||
case 'x+':
|
||||
case 'xb+':
|
||||
case 'a+':
|
||||
case 'ab+':
|
||||
case 'w':
|
||||
case 'wb':
|
||||
case 'x':
|
||||
case 'xb':
|
||||
case 'a':
|
||||
@@ -394,6 +403,14 @@ class OC_Filestorage_Shared extends OC_Filestorage_Common {
|
||||
);
|
||||
OCP\Util::emitHook('OC_Filestorage_Shared', 'fopen', $info);
|
||||
$storage = OC_Filesystem::getStorage($source);
|
||||
|
||||
$parts = explode('/', $source, 4);
|
||||
$user = $parts[1];
|
||||
$intPath = '/'.$parts[3];
|
||||
|
||||
if ( $write && $storage->touch($this->getInternalPath($source)) ) {
|
||||
$this->updateFSCache($path);
|
||||
}
|
||||
return $storage->fopen($this->getInternalPath($source), $mode);
|
||||
}
|
||||
return false;
|
||||
@@ -447,4 +464,16 @@ class OC_Filestorage_Shared extends OC_Filestorage_Common {
|
||||
//TODO
|
||||
return false;
|
||||
}
|
||||
|
||||
private function updateFSCache($path) {
|
||||
$source = $this->getSourcePath($path);
|
||||
$parts = explode('/', $source, 4);
|
||||
$user = $parts[1];
|
||||
$intPath = '/'.$parts[3];
|
||||
|
||||
$mtime = $this->filemtime($path);
|
||||
$size = $this->filesize($path);
|
||||
$mime = $this->getMimeType($path);
|
||||
OC_FileCache::put($intPath ,array('user'=>$user, 'size'=>$size, 'mtime'=>$mtime, 'mimetype'=>$mime, 'writable'=>true),'/'.$user.'/files');
|
||||
}
|
||||
}
|
||||
|
||||
83
apps/files_sharing/lib/util.php
Normal file
83
apps/files_sharing/lib/util.php
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Bjoern Schiessle
|
||||
* @copyright 2012 Bjoern Schiessle schiessle@owncloud.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
class OC_Files_Sharing_Util {
|
||||
|
||||
private static $files = array();
|
||||
|
||||
/**
|
||||
* @brief Get the source file path and the permissions granted for a shared file
|
||||
* @param string Shared target file path
|
||||
* @return Returns array with the keys path and permissions or false if not found
|
||||
*/
|
||||
private static function getFile($target) {
|
||||
$target = '/'.$target;
|
||||
$target = rtrim($target, '/');
|
||||
if ($target == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isset(self::$files[$target])) {
|
||||
return self::$files[$target];
|
||||
} else {
|
||||
$pos = strpos($target, '/', 1);
|
||||
// Get shared folder name
|
||||
if ($pos !== false) {
|
||||
$folder = substr($target, 0, $pos);
|
||||
if (isset(self::$files[$folder])) {
|
||||
$file = self::$files[$folder];
|
||||
} else {
|
||||
$file = OCP\Share::getItemSharedWith('folder', $folder, OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
|
||||
}
|
||||
if ($file) {
|
||||
self::$files[$target]['path'] = $file['path'].substr($target, strlen($folder));
|
||||
self::$files[$target]['permissions'] = $file['permissions'];
|
||||
return self::$files[$target];
|
||||
}
|
||||
} else {
|
||||
$file = OCP\Share::getItemSharedWith('file', $target, OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
|
||||
if ($file) {
|
||||
self::$files[$target] = $file;
|
||||
return self::$files[$target];
|
||||
}
|
||||
}
|
||||
OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the source file path for a shared file
|
||||
* @param string Shared target file path
|
||||
* @return Returns source file path or false if not found
|
||||
*/
|
||||
public static function getSourcePath($target) {
|
||||
$file = self::getFile($target);
|
||||
if (isset($file['path'])) {
|
||||
$uid = substr($file['path'], 1, strpos($file['path'], '/', 1) - 1);
|
||||
OC_Filesystem::mount('OC_Filestorage_Local', array('datadir' => OC_User::getHome($uid)), $uid);
|
||||
return $file['path'];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ OC_App::loadApps();
|
||||
// support will be removed in OC 5.0,a
|
||||
if (isset($_GET['token'])) {
|
||||
unset($_GET['file']);
|
||||
$qry = \OC_DB::prepare('SELECT `source` FROM `*PREFIX*sharing` WHERE `target` = ? LIMIT 1');
|
||||
$qry = \OC_DB::prepare('SELECT `source` FROM `*PREFIX*sharing` WHERE `target` = ?', 1);
|
||||
$filepath = $qry->execute(array($_GET['token']))->fetchOne();
|
||||
if(isset($filepath)) {
|
||||
$info = OC_FileCache_Cached::get($filepath, '');
|
||||
@@ -19,174 +19,271 @@ if (isset($_GET['token'])) {
|
||||
\OCP\Util::writeLog('files_sharing', 'You have files that are shared by link originating from ownCloud 4.0. Redistribute the new links, because backwards compatibility will be removed in ownCloud 5.', \OCP\Util::WARN);
|
||||
}
|
||||
}
|
||||
// Enf of backward compatibility
|
||||
|
||||
if (isset($_GET['file']) || isset($_GET['dir'])) {
|
||||
function getID($path) {
|
||||
// use the share table from the db to find the item source if the file was reshared because shared files
|
||||
// are not stored in the file cache.
|
||||
if (substr(OC_Filesystem::getMountPoint($path), -7, 6) == "Shared") {
|
||||
$path_parts = explode('/', $path, 5);
|
||||
$user = $path_parts[1];
|
||||
$intPath = '/'.$path_parts[4];
|
||||
$query = \OC_DB::prepare('SELECT `item_source` FROM `*PREFIX*share` WHERE `uid_owner` = ? AND `file_target` = ? ');
|
||||
$result = $query->execute(array($user, $intPath));
|
||||
$row = $result->fetchRow();
|
||||
$fileSource = $row['item_source'];
|
||||
} else {
|
||||
$fileSource = OC_Filecache::getId($path, '');
|
||||
}
|
||||
|
||||
return $fileSource;
|
||||
}
|
||||
// End of backward compatibility
|
||||
|
||||
/**
|
||||
* lookup file path and owner by fetching it from the fscache
|
||||
* needed becaus OC_FileCache::getPath($id, $user) already requires the user
|
||||
* @param int $id
|
||||
* @return array
|
||||
*/
|
||||
function getPathAndUser($id) {
|
||||
$query = \OC_DB::prepare('SELECT `user`, `path` FROM `*PREFIX*fscache` WHERE `id` = ?');
|
||||
$result = $query->execute(array($id));
|
||||
$row = $result->fetchRow();
|
||||
return $row;
|
||||
}
|
||||
|
||||
|
||||
if (isset($_GET['t'])) {
|
||||
$token = $_GET['t'];
|
||||
$linkItem = OCP\Share::getShareByToken($token);
|
||||
if (is_array($linkItem) && isset($linkItem['uid_owner'])) {
|
||||
// seems to be a valid share
|
||||
$type = $linkItem['item_type'];
|
||||
$fileSource = $linkItem['file_source'];
|
||||
$shareOwner = $linkItem['uid_owner'];
|
||||
|
||||
if (OCP\User::userExists($shareOwner) && $fileSource != -1 ) {
|
||||
|
||||
$pathAndUser = getPathAndUser($linkItem['file_source']);
|
||||
$fileOwner = $pathAndUser['user'];
|
||||
|
||||
//if this is a reshare check the file owner also exists
|
||||
if ($shareOwner != $fileOwner && ! OCP\User::userExists($fileOwner)) {
|
||||
OCP\Util::writeLog('share', 'original file owner '.$fileOwner.' does not exist for share '.$linkItem['id'], \OCP\Util::ERROR);
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
$tmpl = new OCP\Template('', '404', 'guest');
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
}
|
||||
|
||||
//mount filesystem of file owner
|
||||
OC_Util::setupFS($fileOwner);
|
||||
}
|
||||
}
|
||||
} else if (isset($_GET['file']) || isset($_GET['dir'])) {
|
||||
OCP\Util::writeLog('share', 'Missing token, trying fallback file/dir links', \OCP\Util::DEBUG);
|
||||
if (isset($_GET['dir'])) {
|
||||
$type = 'folder';
|
||||
$path = $_GET['dir'];
|
||||
if(strlen($path)>1 and substr($path, -1, 1)==='/') {
|
||||
$path=substr($path, 0, -1);
|
||||
}
|
||||
$baseDir = $path;
|
||||
$dir = $baseDir;
|
||||
} else {
|
||||
$type = 'file';
|
||||
$path = $_GET['file'];
|
||||
if(strlen($path)>1 and substr($path, -1, 1)==='/') {
|
||||
$path=substr($path, 0, -1);
|
||||
}
|
||||
}
|
||||
$uidOwner = substr($path, 1, strpos($path, '/', 1) - 1);
|
||||
if (OCP\User::userExists($uidOwner)) {
|
||||
OC_Util::setupFS($uidOwner);
|
||||
$fileSource = OC_Filecache::getId($path, '');
|
||||
if ($fileSource != -1 && ($linkItem = OCP\Share::getItemSharedWithByLink($type, $fileSource, $uidOwner))) {
|
||||
// TODO Fix in the getItems
|
||||
if (!isset($linkItem['item_type']) || $linkItem['item_type'] != $type) {
|
||||
$shareOwner = substr($path, 1, strpos($path, '/', 1) - 1);
|
||||
|
||||
if (OCP\User::userExists($shareOwner)) {
|
||||
OC_Util::setupFS($shareOwner);
|
||||
$fileSource = getID($path);
|
||||
if ($fileSource != -1 ) {
|
||||
$linkItem = OCP\Share::getItemSharedWithByLink($type, $fileSource, $shareOwner);
|
||||
$pathAndUser['path'] = $path;
|
||||
$path_parts = explode('/', $path, 5);
|
||||
$pathAndUser['user'] = $path_parts[1];
|
||||
$fileOwner = $path_parts[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($linkItem) {
|
||||
if (!isset($linkItem['item_type'])) {
|
||||
OCP\Util::writeLog('share', 'No item type set for share id: '.$linkItem['id'], \OCP\Util::ERROR);
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
$tmpl = new OCP\Template('', '404', 'guest');
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
}
|
||||
if (isset($linkItem['share_with'])) {
|
||||
// Authenticate share_with
|
||||
$url = OCP\Util::linkToPublic('files').'&t='.$token;
|
||||
if (isset($_GET['file'])) {
|
||||
$url .= '&file='.urlencode($_GET['file']);
|
||||
} else if (isset($_GET['dir'])) {
|
||||
$url .= '&dir='.urlencode($_GET['dir']);
|
||||
}
|
||||
if (isset($_POST['password'])) {
|
||||
$password = $_POST['password'];
|
||||
if ($linkItem['share_type'] == OCP\Share::SHARE_TYPE_LINK) {
|
||||
// Check Password
|
||||
$forcePortable = (CRYPT_BLOWFISH != 1);
|
||||
$hasher = new PasswordHash(8, $forcePortable);
|
||||
if (!($hasher->CheckPassword($password.OC_Config::getValue('passwordsalt', ''), $linkItem['share_with']))) {
|
||||
$tmpl = new OCP\Template('files_sharing', 'authenticate', 'guest');
|
||||
$tmpl->assign('URL', $url);
|
||||
$tmpl->assign('error', true);
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
} else {
|
||||
// Save item id in session for future requests
|
||||
$_SESSION['public_link_authenticated'] = $linkItem['id'];
|
||||
}
|
||||
} else {
|
||||
OCP\Util::writeLog('share', 'Unknown share type '.$linkItem['share_type'].' for share id '.$linkItem['id'], \OCP\Util::ERROR);
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
$tmpl = new OCP\Template('', '404', 'guest');
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
}
|
||||
if (isset($linkItem['share_with'])) {
|
||||
// Check password
|
||||
if (isset($_POST['password'])) {
|
||||
$password = $_POST['password'];
|
||||
$storedHash = $linkItem['share_with'];
|
||||
$forcePortable = (CRYPT_BLOWFISH != 1);
|
||||
$hasher = new PasswordHash(8, $forcePortable);
|
||||
if (!($hasher->CheckPassword($password.OC_Config::getValue('passwordsalt', ''), $storedHash))) {
|
||||
$tmpl = new OCP\Template('files_sharing', 'authenticate', 'guest');
|
||||
$tmpl->assign('URL', OCP\Util::linkToPublic('files').'&file='.$_GET['file']);
|
||||
$tmpl->assign('error', true);
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
} else {
|
||||
// Save item id in session for future requests
|
||||
$_SESSION['public_link_authenticated'] = $linkItem['id'];
|
||||
}
|
||||
// Check if item id is set in session
|
||||
} else if (!isset($_SESSION['public_link_authenticated']) || $_SESSION['public_link_authenticated'] !== $linkItem['id']) {
|
||||
// Prompt for password
|
||||
$tmpl = new OCP\Template('files_sharing', 'authenticate', 'guest');
|
||||
$tmpl->assign('URL', OCP\Util::linkToPublic('files').'&file='.$_GET['file']);
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
}
|
||||
}
|
||||
$path = $linkItem['path'];
|
||||
if (isset($_GET['path'])) {
|
||||
$path .= $_GET['path'];
|
||||
$dir .= $_GET['path'];
|
||||
if (!OC_Filesystem::file_exists($path)) {
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
$tmpl = new OCP\Template('', '404', 'guest');
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
}
|
||||
}
|
||||
// Download the file
|
||||
if (isset($_GET['download'])) {
|
||||
if (isset($_GET['dir'])) {
|
||||
if ( isset($_GET['files']) ) { // download selected files
|
||||
OC_Files::get($path, $_GET['files'], $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
} else if (isset($_GET['path']) && $_GET['path'] != '' ) { // download a file from a shared directory
|
||||
OC_Files::get('', $path, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
} else { // download the whole shared directory
|
||||
OC_Files::get($path, '', $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
}
|
||||
} else { // download a single shared file
|
||||
OC_Files::get("", $path, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
}
|
||||
|
||||
} else {
|
||||
OCP\Util::addStyle('files_sharing', 'public');
|
||||
OCP\Util::addScript('files_sharing', 'public');
|
||||
OCP\Util::addScript('files', 'fileactions');
|
||||
$tmpl = new OCP\Template('files_sharing', 'public', 'base');
|
||||
$tmpl->assign('owner', $uidOwner);
|
||||
// Show file list
|
||||
if (OC_Filesystem::is_dir($path)) {
|
||||
OCP\Util::addStyle('files', 'files');
|
||||
OCP\Util::addScript('files', 'files');
|
||||
OCP\Util::addScript('files', 'filelist');
|
||||
$files = array();
|
||||
$rootLength = strlen($baseDir) + 1;
|
||||
foreach (OC_Files::getDirectoryContent($path) as $i) {
|
||||
$i['date'] = OCP\Util::formatDate($i['mtime']);
|
||||
if ($i['type'] == 'file') {
|
||||
$fileinfo = pathinfo($i['name']);
|
||||
$i['basename'] = $fileinfo['filename'];
|
||||
$i['extension'] = isset($fileinfo['extension']) ? ('.'.$fileinfo['extension']) : '';
|
||||
}
|
||||
$i['directory'] = '/'.substr('/'.$uidOwner.'/files'.$i['directory'], $rootLength);
|
||||
if ($i['directory'] == '/') {
|
||||
$i['directory'] = '';
|
||||
}
|
||||
$i['permissions'] = OCP\Share::PERMISSION_READ;
|
||||
$files[] = $i;
|
||||
}
|
||||
// Make breadcrumb
|
||||
$breadcrumb = array();
|
||||
$pathtohere = '';
|
||||
$count = 1;
|
||||
foreach (explode('/', $dir) as $i) {
|
||||
if ($i != '') {
|
||||
if ($i != $baseDir) {
|
||||
$pathtohere .= '/'.$i;
|
||||
}
|
||||
if ( strlen($pathtohere) < strlen($_GET['dir'])) {
|
||||
continue;
|
||||
}
|
||||
$breadcrumb[] = array('dir' => str_replace($_GET['dir'], "", $pathtohere, $count), 'name' => $i);
|
||||
}
|
||||
}
|
||||
$list = new OCP\Template('files', 'part.list', '');
|
||||
$list->assign('files', $files, false);
|
||||
$list->assign('baseURL', OCP\Util::linkToPublic('files').'&dir='.$_GET['dir'].'&path=', false);
|
||||
$list->assign('downloadURL', OCP\Util::linkToPublic('files').'&download&dir='.$_GET['dir'].'&path=', false);
|
||||
$breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', '' );
|
||||
$breadcrumbNav->assign('breadcrumb', $breadcrumb, false);
|
||||
$breadcrumbNav->assign('baseURL', OCP\Util::linkToPublic('files').'&dir='.$_GET['dir'].'&path=', false);
|
||||
$folder = new OCP\Template('files', 'index', '');
|
||||
$folder->assign('fileList', $list->fetchPage(), false);
|
||||
$folder->assign('breadcrumb', $breadcrumbNav->fetchPage(), false);
|
||||
$folder->assign('dir', basename($dir));
|
||||
$folder->assign('isCreatable', false);
|
||||
$folder->assign('permissions', 0);
|
||||
$folder->assign('files', $files);
|
||||
$folder->assign('uploadMaxFilesize', 0);
|
||||
$folder->assign('uploadMaxHumanFilesize', 0);
|
||||
$folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
||||
$tmpl->assign('folder', $folder->fetchPage(), false);
|
||||
$tmpl->assign('uidOwner', $uidOwner);
|
||||
$tmpl->assign('dir', basename($dir));
|
||||
$tmpl->assign('filename', basename($path));
|
||||
$tmpl->assign('mimetype', OC_Filesystem::getMimeType($path));
|
||||
$tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
||||
if (isset($_GET['path'])) {
|
||||
$getPath = $_GET['path'];
|
||||
} else {
|
||||
$getPath = '';
|
||||
}
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').'&download&dir='.$_GET['dir'].'&path='.$getPath);
|
||||
} else {
|
||||
// Show file preview if viewer is available
|
||||
$tmpl->assign('uidOwner', $uidOwner);
|
||||
$tmpl->assign('dir', dirname($path));
|
||||
$tmpl->assign('filename', basename($path));
|
||||
$tmpl->assign('mimetype', OC_Filesystem::getMimeType($path));
|
||||
if ($type == 'file') {
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').'&file='.$_GET['file'].'&download');
|
||||
} else {
|
||||
if (isset($_GET['path'])) {
|
||||
$getPath = $_GET['path'];
|
||||
} else {
|
||||
$getPath = '';
|
||||
}
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').'&download&dir='.$_GET['dir'].'&path='.$getPath);
|
||||
}
|
||||
}
|
||||
$tmpl->printPage();
|
||||
}
|
||||
// Check if item id is set in session
|
||||
} else if (!isset($_SESSION['public_link_authenticated']) || $_SESSION['public_link_authenticated'] !== $linkItem['id']) {
|
||||
// Prompt for password
|
||||
$tmpl = new OCP\Template('files_sharing', 'authenticate', 'guest');
|
||||
$tmpl->assign('URL', $url);
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
}
|
||||
}
|
||||
$basePath = substr($pathAndUser['path'] , strlen('/'.$fileOwner.'/files'));
|
||||
$path = $basePath;
|
||||
if (isset($_GET['path'])) {
|
||||
$path .= $_GET['path'];
|
||||
}
|
||||
if (!$path || !OC_Filesystem::isValidPath($path) || !OC_Filesystem::file_exists($path)) {
|
||||
OCP\Util::writeLog('share', 'Invalid path '.$path.' for share id '.$linkItem['id'], \OCP\Util::ERROR);
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
$tmpl = new OCP\Template('', '404', 'guest');
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
}
|
||||
$dir = dirname($path);
|
||||
$file = basename($path);
|
||||
// Download the file
|
||||
if (isset($_GET['download'])) {
|
||||
if (isset($_GET['path']) && $_GET['path'] !== '' ) {
|
||||
if ( isset($_GET['files']) ) { // download selected files
|
||||
$files = urldecode($_GET['files']);
|
||||
$files_list = json_decode($files);
|
||||
// in case we get only a single file
|
||||
if ($files_list === NULL ) {
|
||||
$files_list = array($files);
|
||||
}
|
||||
OC_Files::get($path, $files_list, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
} else if (isset($_GET['path']) && $_GET['path'] != '' ) { // download a file from a shared directory
|
||||
OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
} else { // download the whole shared directory
|
||||
OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
}
|
||||
} else { // download a single shared file
|
||||
OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
}
|
||||
|
||||
} else {
|
||||
OCP\Util::addStyle('files_sharing', 'public');
|
||||
OCP\Util::addScript('files_sharing', 'public');
|
||||
OCP\Util::addScript('files', 'fileactions');
|
||||
$tmpl = new OCP\Template('files_sharing', 'public', 'base');
|
||||
$tmpl->assign('uidOwner', $shareOwner);
|
||||
$tmpl->assign('dir', $dir);
|
||||
$tmpl->assign('filename', $file);
|
||||
$tmpl->assign('mimetype', OC_Filesystem::getMimeType($path));
|
||||
if (isset($_GET['path'])) {
|
||||
$getPath = $_GET['path'];
|
||||
} else {
|
||||
$getPath = '';
|
||||
}
|
||||
//
|
||||
$urlLinkIdentifiers= (isset($token)?'&t='.$token:'').(isset($_GET['dir'])?'&dir='.$_GET['dir']:'').(isset($_GET['file'])?'&file='.$_GET['file']:'');
|
||||
// Show file list
|
||||
if (OC_Filesystem::is_dir($path)) {
|
||||
OCP\Util::addStyle('files', 'files');
|
||||
OCP\Util::addScript('files', 'files');
|
||||
OCP\Util::addScript('files', 'filelist');
|
||||
$files = array();
|
||||
$rootLength = strlen($basePath) + 1;
|
||||
$totalSize = 0;
|
||||
foreach (OC_Files::getDirectoryContent($path) as $i) {
|
||||
$totalSize += $i['size'];
|
||||
$i['date'] = OCP\Util::formatDate($i['mtime']);
|
||||
if ($i['type'] == 'file') {
|
||||
$fileinfo = pathinfo($i['name']);
|
||||
$i['basename'] = $fileinfo['filename'];
|
||||
$i['extension'] = isset($fileinfo['extension']) ? ('.'.$fileinfo['extension']) : '';
|
||||
}
|
||||
$i['directory'] = '/'.substr($i['directory'], $rootLength);
|
||||
if ($i['directory'] == '/') {
|
||||
$i['directory'] = '';
|
||||
}
|
||||
$i['permissions'] = OCP\Share::PERMISSION_READ;
|
||||
$files[] = $i;
|
||||
}
|
||||
// Make breadcrumb
|
||||
$breadcrumb = array();
|
||||
$pathtohere = '';
|
||||
|
||||
//add base breadcrumb
|
||||
$breadcrumb[] = array('dir' => '/', 'name' => basename($basePath));
|
||||
|
||||
//add subdir breadcrumbs
|
||||
foreach (explode('/', urldecode($getPath)) as $i) {
|
||||
if ($i != '') {
|
||||
$pathtohere .= '/'.$i;
|
||||
$breadcrumb[] = array('dir' => $pathtohere, 'name' => $i);
|
||||
}
|
||||
}
|
||||
|
||||
$list = new OCP\Template('files', 'part.list', '');
|
||||
$list->assign('files', $files, false);
|
||||
$list->assign('publicListView', true);
|
||||
$list->assign('baseURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&path=', false);
|
||||
$list->assign('downloadURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&download&path=', false);
|
||||
$breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', '' );
|
||||
$breadcrumbNav->assign('breadcrumb', $breadcrumb, false);
|
||||
$breadcrumbNav->assign('baseURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&path=', false);
|
||||
$folder = new OCP\Template('files', 'index', '');
|
||||
$folder->assign('fileList', $list->fetchPage(), false);
|
||||
$folder->assign('breadcrumb', $breadcrumbNav->fetchPage(), false);
|
||||
$folder->assign('dir', basename($dir));
|
||||
$folder->assign('isCreatable', false);
|
||||
$folder->assign('permissions', 0);
|
||||
$folder->assign('files', $files);
|
||||
$folder->assign('uploadMaxFilesize', 0);
|
||||
$folder->assign('uploadMaxHumanFilesize', 0);
|
||||
$folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
||||
$tmpl->assign('folder', $folder->fetchPage(), false);
|
||||
$allowZip = OCP\Config::getSystemValue('allowZipDownload', true)
|
||||
&& $totalSize <= OCP\Config::getSystemValue('maxZipInputSize', OCP\Util::computerFileSize('800 MB'));
|
||||
$tmpl->assign('allowZipDownload', intval($allowZip));
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&download&path='.urlencode($getPath));
|
||||
} else {
|
||||
// Show file preview if viewer is available
|
||||
if ($type == 'file') {
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&download');
|
||||
} else {
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&download&path='.urlencode($getPath));
|
||||
}
|
||||
}
|
||||
$tmpl->printPage();
|
||||
}
|
||||
exit();
|
||||
} else {
|
||||
OCP\Util::writeLog('share', 'could not resolve linkItem', \OCP\Util::DEBUG);
|
||||
}
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
$tmpl = new OCP\Template('', '404', 'guest');
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
<script type="text/javascript">
|
||||
<?php if ( array_key_exists('publicListView', $_) && $_['publicListView'] == true ) {
|
||||
echo "var publicListView = true;";
|
||||
} else {
|
||||
echo "var publicListView = false;";
|
||||
}
|
||||
?>
|
||||
</script>
|
||||
<input type="hidden" name="dir" value="<?php echo $_['dir'] ?>" id="dir">
|
||||
<input type="hidden" name="downloadURL" value="<?php echo $_['downloadURL'] ?>" id="downloadURL">
|
||||
<input type="hidden" name="filename" value="<?php echo $_['filename'] ?>" id="filename">
|
||||
|
||||
@@ -21,11 +21,11 @@ $(document).ready(function(){
|
||||
}
|
||||
,function(filename){
|
||||
// Action to perform when clicked
|
||||
if (scanFiles.scanning || !$('#dropdown').hasClass('drop-versions')){return;}//workaround to prevent additional http request block scanning feedback
|
||||
if (scanFiles.scanning){return;}//workaround to prevent additional http request block scanning feedback
|
||||
|
||||
var file = $('#dir').val()+'/'+filename;
|
||||
// Check if drop down is already visible for a different file
|
||||
if (($('#dropdown').length > 0)) {
|
||||
if (($('#dropdown').length > 0) && $('#dropdown').hasClass('drop-versions') ) {
|
||||
if (file != $('#dropdown').data('file')) {
|
||||
$('#dropdown').hide('blind', function() {
|
||||
$('#dropdown').remove();
|
||||
@@ -45,7 +45,7 @@ function createVersionsDropdown(filename, files) {
|
||||
|
||||
var historyUrl = OC.linkTo('files_versions', 'history.php') + '?path='+encodeURIComponent( $( '#dir' ).val() ).replace( /%2F/g, '/' )+'/'+encodeURIComponent( filename );
|
||||
|
||||
var html = '<div id="dropdown" class="drop drop-versions" data-file="'+files+'">';
|
||||
var html = '<div id="dropdown" class="drop drop-versions" data-file="'+escapeHTML(files)+'">';
|
||||
html += '<div id="private">';
|
||||
html += '<select data-placeholder="Saved versions" id="found_versions" class="chzen-select" style="width:16em;">';
|
||||
html += '<option value=""></option>';
|
||||
@@ -73,7 +73,6 @@ function createVersionsDropdown(filename, files) {
|
||||
$.each( versions, function(index, row ) {
|
||||
addVersion( row );
|
||||
});
|
||||
$('#found_versions').chosen();
|
||||
} else {
|
||||
$('#found_versions').hide();
|
||||
$('#makelink').hide();
|
||||
|
||||
@@ -20,7 +20,7 @@ class Hooks {
|
||||
public static function write_hook( $params ) {
|
||||
|
||||
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
|
||||
|
||||
|
||||
$versions = new Storage( new \OC_FilesystemView('') );
|
||||
|
||||
$path = $params[\OC_Filesystem::signal_param_path];
|
||||
@@ -58,14 +58,16 @@ class Hooks {
|
||||
* of the stored versions along the actual file
|
||||
*/
|
||||
public static function rename_hook($params) {
|
||||
$versions_fileview = \OCP\Files::getStorage('files_versions');
|
||||
$rel_oldpath = $params['oldpath'];
|
||||
$abs_oldpath = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath('').$rel_oldpath.'.v';
|
||||
$abs_newpath = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath('').$params['newpath'].'.v';
|
||||
if(Storage::isversioned($rel_oldpath)) {
|
||||
$versions_fileview = new \OC_FilesystemView('/'.\OCP\User::getUser().'files_versions');
|
||||
list($oldpath_uid, $oldpath) = Storage::getUidAndFilename($params['oldpath']);
|
||||
list($newpath_uid, $newpath) = Storage::getUidAndFilename($params['newpath']);
|
||||
|
||||
$abs_oldpath = \OC_Filesystem::normalizePath(\OC_User::getHome($oldpath_uid).'/files_versions/'.$oldpath.'.v');
|
||||
$abs_newpath = \OC_Filesystem::normalizePath(\OC_User::getHome($newpath_uid).'/files_versions/'.$newpath.'.v');
|
||||
if(Storage::isversioned($oldpath)) {
|
||||
$info=pathinfo($abs_newpath);
|
||||
if(!file_exists($info['dirname'])) mkdir($info['dirname'],0700,true);
|
||||
$versions = Storage::getVersions($rel_oldpath);
|
||||
if(!file_exists($info['dirname'])) mkdir($info['dirname'],0750,true);
|
||||
$versions = Storage::getVersions($oldpath);
|
||||
foreach ($versions as $v) {
|
||||
rename($abs_oldpath.$v['version'], $abs_newpath.$v['version']);
|
||||
}
|
||||
|
||||
@@ -1,279 +1,275 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Frank Karlitschek <frank@owncloud.org>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Versions
|
||||
*
|
||||
* A class to handle the versioning of files.
|
||||
*/
|
||||
|
||||
namespace OCA_Versions;
|
||||
|
||||
class Storage {
|
||||
|
||||
|
||||
// config.php configuration:
|
||||
// - files_versions
|
||||
// - files_versionsfolder
|
||||
// - files_versionsblacklist
|
||||
// - files_versionsmaxfilesize
|
||||
// - files_versionsinterval
|
||||
// - files_versionmaxversions
|
||||
//
|
||||
// todo:
|
||||
// - finish porting to OC_FilesystemView to enable network transparency
|
||||
// - add transparent compression. first test if it´s worth it.
|
||||
|
||||
const DEFAULTENABLED=true;
|
||||
const DEFAULTBLACKLIST='avi mp3 mpg mp4 ctmp';
|
||||
const DEFAULTMAXFILESIZE=1048576; // 10MB
|
||||
const DEFAULTMININTERVAL=60; // 1 min
|
||||
const DEFAULTMAXVERSIONS=50;
|
||||
|
||||
private static function getUidAndFilename($filename)
|
||||
{
|
||||
if (\OCP\App::isEnabled('files_sharing')
|
||||
&& substr($filename, 0, 7) == '/Shared'
|
||||
&& $source = \OCP\Share::getItemSharedWith('file',
|
||||
substr($filename, 7),
|
||||
\OC_Share_Backend_File::FORMAT_SHARED_STORAGE)) {
|
||||
$filename = $source['path'];
|
||||
$pos = strpos($filename, '/files', 1);
|
||||
$uid = substr($filename, 1, $pos - 1);
|
||||
$filename = substr($filename, $pos + 6);
|
||||
} else {
|
||||
$uid = \OCP\User::getUser();
|
||||
}
|
||||
return array($uid, $filename);
|
||||
}
|
||||
|
||||
/**
|
||||
* store a new version of a file.
|
||||
*/
|
||||
public function store($filename) {
|
||||
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
|
||||
list($uid, $filename) = self::getUidAndFilename($filename);
|
||||
$files_view = new \OC_FilesystemView('/'.$uid.'/files');
|
||||
$users_view = new \OC_FilesystemView('/'.$uid);
|
||||
|
||||
//check if source file already exist as version to avoid recursions.
|
||||
// todo does this check work?
|
||||
if ($users_view->file_exists($filename)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// check if filename is a directory
|
||||
if($files_view->is_dir($filename)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// check filetype blacklist
|
||||
$blacklist=explode(' ',\OCP\Config::getSystemValue('files_versionsblacklist', Storage::DEFAULTBLACKLIST));
|
||||
foreach($blacklist as $bl) {
|
||||
$parts=explode('.', $filename);
|
||||
$ext=end($parts);
|
||||
if(strtolower($ext)==$bl) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// we should have a source file to work with
|
||||
if (!$files_view->file_exists($filename)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// check filesize
|
||||
if($files_view->filesize($filename)>\OCP\Config::getSystemValue('files_versionsmaxfilesize', Storage::DEFAULTMAXFILESIZE)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// check mininterval if the file is being modified by the owner (all shared files should be versioned despite mininterval)
|
||||
if ($uid == \OCP\User::getUser()) {
|
||||
$versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions');
|
||||
$versionsFolderName=\OCP\Config::getSystemValue('datadirectory'). $versions_fileview->getAbsolutePath('');
|
||||
$matches=glob($versionsFolderName.'/'.$filename.'.v*');
|
||||
sort($matches);
|
||||
$parts=explode('.v',end($matches));
|
||||
if((end($parts)+Storage::DEFAULTMININTERVAL)>time()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// create all parent folders
|
||||
$dirname = dirname($filename);
|
||||
if(!$users_view->file_exists('/files_versions/'.$dirname)) {
|
||||
$users_view->mkdir('/files_versions/'.$dirname,0700,true);
|
||||
}
|
||||
|
||||
// store a new version of a file
|
||||
$users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.time());
|
||||
|
||||
// expire old revisions if necessary
|
||||
Storage::expire($filename);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* rollback to an old version of a file.
|
||||
*/
|
||||
public static function rollback($filename,$revision) {
|
||||
|
||||
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
|
||||
list($uid, $filename) = self::getUidAndFilename($filename);
|
||||
$users_view = new \OC_FilesystemView('/'.$uid);
|
||||
|
||||
// rollback
|
||||
if( @$users_view->copy('files_versions'.$filename.'.v'.$revision, 'files'.$filename) ) {
|
||||
|
||||
return true;
|
||||
|
||||
}else{
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* check if old versions of a file exist.
|
||||
*/
|
||||
public static function isversioned($filename) {
|
||||
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
|
||||
list($uid, $filename) = self::getUidAndFilename($filename);
|
||||
$versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions');
|
||||
|
||||
$versionsFolderName=\OCP\Config::getSystemValue('datadirectory'). $versions_fileview->getAbsolutePath('');
|
||||
|
||||
// check for old versions
|
||||
$matches=glob($versionsFolderName.$filename.'.v*');
|
||||
if(count($matches)>0) {
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief get a list of all available versions of a file in descending chronological order
|
||||
* @param $filename file to find versions of, relative to the user files dir
|
||||
* @param $count number of versions to return
|
||||
* @returns array
|
||||
*/
|
||||
public static function getVersions( $filename, $count = 0 ) {
|
||||
|
||||
if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) {
|
||||
list($uid, $filename) = self::getUidAndFilename($filename);
|
||||
$versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions');
|
||||
|
||||
$versionsFolderName = \OCP\Config::getSystemValue('datadirectory'). $versions_fileview->getAbsolutePath('');
|
||||
$versions = array();
|
||||
|
||||
// fetch for old versions
|
||||
$matches = glob( $versionsFolderName.'/'.$filename.'.v*' );
|
||||
|
||||
sort( $matches );
|
||||
|
||||
$i = 0;
|
||||
|
||||
$files_view = new \OC_FilesystemView('/'.$uid.'/files');
|
||||
$local_file = $files_view->getLocalFile($filename);
|
||||
foreach( $matches as $ma ) {
|
||||
|
||||
$i++;
|
||||
$versions[$i]['cur'] = 0;
|
||||
$parts = explode( '.v', $ma );
|
||||
$versions[$i]['version'] = ( end( $parts ) );
|
||||
|
||||
// if file with modified date exists, flag it in array as currently enabled version
|
||||
( \md5_file( $ma ) == \md5_file( $local_file ) ? $versions[$i]['fileMatch'] = 1 : $versions[$i]['fileMatch'] = 0 );
|
||||
|
||||
}
|
||||
|
||||
$versions = array_reverse( $versions );
|
||||
|
||||
foreach( $versions as $key => $value ) {
|
||||
|
||||
// flag the first matched file in array (which will have latest modification date) as current version
|
||||
if ( $value['fileMatch'] ) {
|
||||
|
||||
$value['cur'] = 1;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$versions = array_reverse( $versions );
|
||||
|
||||
// only show the newest commits
|
||||
if( $count != 0 and ( count( $versions )>$count ) ) {
|
||||
|
||||
$versions = array_slice( $versions, count( $versions ) - $count );
|
||||
|
||||
}
|
||||
|
||||
return( $versions );
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
// if versioning isn't enabled then return an empty array
|
||||
return( array() );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Erase a file's versions which exceed the set quota
|
||||
*/
|
||||
public static function expire($filename) {
|
||||
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
|
||||
list($uid, $filename) = self::getUidAndFilename($filename);
|
||||
$versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions');
|
||||
|
||||
$versionsFolderName=\OCP\Config::getSystemValue('datadirectory'). $versions_fileview->getAbsolutePath('');
|
||||
|
||||
// check for old versions
|
||||
$matches = glob( $versionsFolderName.'/'.$filename.'.v*' );
|
||||
|
||||
if( count( $matches ) > \OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ) ) {
|
||||
|
||||
$numberToDelete = count($matches) - \OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS );
|
||||
|
||||
// delete old versions of a file
|
||||
$deleteItems = array_slice( $matches, 0, $numberToDelete );
|
||||
|
||||
foreach( $deleteItems as $de ) {
|
||||
|
||||
unlink( $versionsFolderName.'/'.$filename.'.v'.$de );
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Erase all old versions of all user files
|
||||
* @return true/false
|
||||
*/
|
||||
public function expireAll() {
|
||||
$view = \OCP\Files::getStorage('files_versions');
|
||||
return $view->deleteAll('', true);
|
||||
}
|
||||
}
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Frank Karlitschek <frank@owncloud.org>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Versions
|
||||
*
|
||||
* A class to handle the versioning of files.
|
||||
*/
|
||||
|
||||
namespace OCA_Versions;
|
||||
|
||||
class Storage {
|
||||
|
||||
|
||||
// config.php configuration:
|
||||
// - files_versions
|
||||
// - files_versionsfolder
|
||||
// - files_versionsblacklist
|
||||
// - files_versionsmaxfilesize
|
||||
// - files_versionsinterval
|
||||
// - files_versionmaxversions
|
||||
//
|
||||
// todo:
|
||||
// - finish porting to OC_FilesystemView to enable network transparency
|
||||
// - add transparent compression. first test if it´s worth it.
|
||||
|
||||
const DEFAULTENABLED=true;
|
||||
const DEFAULTBLACKLIST='avi mp3 mpg mp4 ctmp';
|
||||
const DEFAULTMAXFILESIZE=1048576; // 10MB
|
||||
const DEFAULTMININTERVAL=60; // 1 min
|
||||
const DEFAULTMAXVERSIONS=50;
|
||||
|
||||
public static function getUidAndFilename($filename)
|
||||
{
|
||||
if (\OCP\App::isEnabled('files_sharing')
|
||||
&& substr($filename, 0, 7) == '/Shared'
|
||||
&& $source = \OC_Files_Sharing_Util::getSourcePath(substr($filename, 8))) {
|
||||
$pos = strpos($source, '/files', 1);
|
||||
$uid = substr($source, 1, $pos - 1);
|
||||
$filename = substr($source, $pos + 6);
|
||||
} else {
|
||||
$uid = \OCP\User::getUser();
|
||||
}
|
||||
\OC_Filesystem::mount('OC_Filestorage_Local', array('datadir' => \OC_User::getHome($uid)), $uid);
|
||||
return array($uid, $filename);
|
||||
}
|
||||
|
||||
/**
|
||||
* store a new version of a file.
|
||||
*/
|
||||
public function store($filename) {
|
||||
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
|
||||
list($uid, $filename) = self::getUidAndFilename($filename);
|
||||
$files_view = new \OC_FilesystemView('/'. $uid .'/files');
|
||||
$users_view = new \OC_FilesystemView('/'.$uid);
|
||||
//check if source file already exist as version to avoid recursions.
|
||||
// todo does this check work?
|
||||
if ($users_view->file_exists($filename)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// check if filename is a directory
|
||||
if($files_view->is_dir($filename)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// check filetype blacklist
|
||||
$blacklist=explode(' ',\OCP\Config::getSystemValue('files_versionsblacklist', Storage::DEFAULTBLACKLIST));
|
||||
foreach($blacklist as $bl) {
|
||||
$parts=explode('.', $filename);
|
||||
$ext=end($parts);
|
||||
if(strtolower($ext)==$bl) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// we should have a source file to work with
|
||||
if (!$files_view->file_exists($filename)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// check filesize
|
||||
if($files_view->filesize($filename)>\OCP\Config::getSystemValue('files_versionsmaxfilesize', Storage::DEFAULTMAXFILESIZE)) {
|
||||
return false;
|
||||
}
|
||||
$versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions');
|
||||
$versionsFolderName=\OC_User::getHome($uid).'/files_versions';
|
||||
|
||||
// check mininterval if the file is being modified by the owner (all shared files should be versioned despite mininterval)
|
||||
if ($uid == \OCP\User::getUser()) {
|
||||
$versionsName=\OC_user::getHome($uid).'/'.$versions_fileview->getInternalPath($filename);
|
||||
$matches=glob(preg_quote($versionsName).'.v*');
|
||||
if ( $matches ) {
|
||||
sort($matches);
|
||||
$parts=explode('.v',end($matches));
|
||||
if((end($parts)+Storage::DEFAULTMININTERVAL)>time()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// create all parent folders
|
||||
$info=pathinfo($filename);
|
||||
if(!file_exists($versionsFolderName.'/'.$info['dirname'])) {
|
||||
mkdir($versionsFolderName.'/'.$info['dirname'],0750,true);
|
||||
}
|
||||
|
||||
// store a new version of a file
|
||||
$users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.time());
|
||||
|
||||
// expire old revisions if necessary
|
||||
Storage::expire($filename);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* rollback to an old version of a file.
|
||||
*/
|
||||
public static function rollback($filename,$revision) {
|
||||
|
||||
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
|
||||
list($uid, $filename) = self::getUidAndFilename($filename);
|
||||
$users_view = new \OC_FilesystemView('/'.$uid);
|
||||
|
||||
// rollback
|
||||
if( @$users_view->copy('files_versions'.$filename.'.v'.$revision, 'files'.$filename) ) {
|
||||
|
||||
return true;
|
||||
|
||||
}else{
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* check if old versions of a file exist.
|
||||
*/
|
||||
public static function isversioned($filename) {
|
||||
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
|
||||
list($uid, $filename) = self::getUidAndFilename($filename);
|
||||
|
||||
$versionsName=\OC_user::getHome($uid).'/files_versions/'.$filename;
|
||||
|
||||
// check for old versions
|
||||
$matches=glob(preg_quote($versionsName).'.v*');
|
||||
if(count($matches)>0) {
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief get a list of all available versions of a file in descending chronological order
|
||||
* @param $filename file to find versions of, relative to the user files dir
|
||||
* @param $count number of versions to return
|
||||
* @returns array
|
||||
*/
|
||||
public static function getVersions( $filename, $count = 0 ) {
|
||||
if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) {
|
||||
list($uid, $filename) = self::getUidAndFilename($filename);
|
||||
$versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions');
|
||||
|
||||
$versionsName = \OC_User::getHome($uid).'/'.$versions_fileview->getInternalPath($filename);
|
||||
$versions = array();
|
||||
// fetch for old versions
|
||||
$matches = glob( preg_quote($versionsName).'.v*' );
|
||||
|
||||
sort( $matches );
|
||||
|
||||
$i = 0;
|
||||
|
||||
$files_view = new \OC_FilesystemView('/'.$uid.'/files');
|
||||
$local_file = $files_view->getLocalFile($filename);
|
||||
foreach( $matches as $ma ) {
|
||||
|
||||
$i++;
|
||||
$versions[$i]['cur'] = 0;
|
||||
$parts = explode( '.v', $ma );
|
||||
$versions[$i]['version'] = ( end( $parts ) );
|
||||
|
||||
// if file with modified date exists, flag it in array as currently enabled version
|
||||
( \md5_file( $ma ) == \md5_file( $local_file ) ? $versions[$i]['fileMatch'] = 1 : $versions[$i]['fileMatch'] = 0 );
|
||||
|
||||
}
|
||||
|
||||
$versions = array_reverse( $versions );
|
||||
|
||||
foreach( $versions as $key => $value ) {
|
||||
|
||||
// flag the first matched file in array (which will have latest modification date) as current version
|
||||
if ( $value['fileMatch'] ) {
|
||||
|
||||
$value['cur'] = 1;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$versions = array_reverse( $versions );
|
||||
|
||||
// only show the newest commits
|
||||
if( $count != 0 and ( count( $versions )>$count ) ) {
|
||||
|
||||
$versions = array_slice( $versions, count( $versions ) - $count );
|
||||
|
||||
}
|
||||
|
||||
return( $versions );
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
// if versioning isn't enabled then return an empty array
|
||||
return( array() );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Erase a file's versions which exceed the set quota
|
||||
*/
|
||||
public static function expire($filename) {
|
||||
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {
|
||||
list($uid, $filename) = self::getUidAndFilename($filename);
|
||||
$versions_fileview = new \OC_FilesystemView('/'.$uid.'/files_versions');
|
||||
|
||||
$versionsName=\OC_User::getHome($uid).'/'.$versions_fileview->getInternalPath($filename);
|
||||
|
||||
// check for old versions
|
||||
$matches = glob( preg_quote($versionsName).'.v*' );
|
||||
|
||||
if( count( $matches ) > \OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ) ) {
|
||||
|
||||
$numberToDelete = count($matches) - \OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS );
|
||||
|
||||
// delete old versions of a file
|
||||
$deleteItems = array_slice( $matches, 0, $numberToDelete );
|
||||
|
||||
foreach( $deleteItems as $de ) {
|
||||
|
||||
unlink( $versionsName.'.v'.$de );
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Erase all old versions of all user files
|
||||
* @return true/false
|
||||
*/
|
||||
public function expireAll() {
|
||||
$view = new \OC_FilesystemView('/'.\OCP\User::getUser().'/files_versions');
|
||||
return $view->deleteAll('', true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,3 +42,6 @@ $entry = array(
|
||||
);
|
||||
|
||||
OCP\Backgroundjob::addRegularTask('OCA\user_ldap\lib\Jobs', 'updateGroups');
|
||||
if(OCP\App::isEnabled('user_webdavauth')) {
|
||||
OCP\Util::writeLog('user_ldap', 'user_ldap and user_webdavauth are incompatible. You may experience unexpected behaviour', OCP\Util::WARN);
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
</field>
|
||||
|
||||
<index>
|
||||
<name>ldap_group_members</name>
|
||||
<name>ldap_group_members_index</name>
|
||||
<unique>true</unique>
|
||||
<field>
|
||||
<name>owncloudname</name>
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
<info>
|
||||
<id>user_ldap</id>
|
||||
<name>LDAP user and group backend</name>
|
||||
<description>Authenticate Users by LDAP</description>
|
||||
<description>Authenticate users and groups by LDAP resp. Active Directoy.
|
||||
|
||||
This app is not compatible to the WebDAV user backend.</description>
|
||||
<licence>AGPL</licence>
|
||||
<author>Dominik Schmidt and Arthur Schiwon</author>
|
||||
<require>4.9</require>
|
||||
|
||||
@@ -34,22 +34,49 @@ $groupBE = new \OCA\user_ldap\GROUP_LDAP();
|
||||
$groupBE->setConnector($connector);
|
||||
|
||||
foreach($objects as $object) {
|
||||
$fetchDNSql = 'SELECT `ldap_dn`, `owncloud_name` FROM `*PREFIX*ldap_'.$object.'_mapping` WHERE `directory_uuid` = ""';
|
||||
$updateSql = 'UPDATE `*PREFIX*ldap_'.$object.'_mapping` SET `ldap_DN` = ?, `directory_uuid` = ? WHERE `ldap_dn` = ?';
|
||||
$fetchDNSql = '
|
||||
SELECT `ldap_dn`, `owncloud_name`, `directory_uuid`
|
||||
FROM `*PREFIX*ldap_'.$object.'_mapping`';
|
||||
$updateSql = '
|
||||
UPDATE `*PREFIX*ldap_'.$object.'_mapping`
|
||||
SET `ldap_DN` = ?, `directory_uuid` = ?
|
||||
WHERE `ldap_dn` = ?';
|
||||
|
||||
$query = OCP\DB::prepare($fetchDNSql);
|
||||
$res = $query->execute();
|
||||
$DNs = $res->fetchAll();
|
||||
$updateQuery = OCP\DB::prepare($updateSql);
|
||||
foreach($DNs as $dn) {
|
||||
$newDN = mb_strtolower($dn['ldap_dn'], 'UTF-8');
|
||||
if($object == 'user') {
|
||||
$newDN = escapeDN(mb_strtolower($dn['ldap_dn'], 'UTF-8'));
|
||||
if(!empty($dn['directory_uuid'])) {
|
||||
$uuid = $dn['directory_uuid'];
|
||||
} elseif($object == 'user') {
|
||||
$uuid = $userBE->getUUID($newDN);
|
||||
//fix home folder to avoid new ones depending on the configuration
|
||||
$userBE->getHome($dn['owncloud_name']);
|
||||
} else {
|
||||
$uuid = $groupBE->getUUID($newDN);
|
||||
}
|
||||
$updateQuery->execute(array($newDN, $uuid, $dn['ldap_dn']));
|
||||
try {
|
||||
$updateQuery->execute(array($newDN, $uuid, $dn['ldap_dn']));
|
||||
} catch(Exception $e) {
|
||||
\OCP\Util::writeLog('user_ldap', 'Could not update '.$object.' '.$dn['ldap_dn'].' in the mappings table. ', \OCP\Util::WARN);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
function escapeDN($dn) {
|
||||
$aDN = ldap_explode_dn($dn, false);
|
||||
unset($aDN['count']);
|
||||
foreach($aDN as $key => $part) {
|
||||
$value = substr($part, strpos($part, '=')+1);
|
||||
$escapedValue = strtr($value, Array(','=>'\2c', '='=>'\3d', '+'=>'\2b',
|
||||
'<'=>'\3c', '>'=>'\3e', ';'=>'\3b', '\\'=>'\5c',
|
||||
'"'=>'\22', '#'=>'\23'));
|
||||
$part = str_replace($part, $value, $escapedValue);
|
||||
}
|
||||
$dn = implode(',', $aDN);
|
||||
|
||||
return $dn;
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
0.3.0.0
|
||||
0.3.0.1
|
||||
@@ -7,4 +7,9 @@
|
||||
#ldap fieldset input {
|
||||
width: 70%;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.ldapwarning {
|
||||
margin-left: 1.4em;
|
||||
color: #FF3B3B;
|
||||
}
|
||||
@@ -28,10 +28,11 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
|
||||
|
||||
public function setConnector(lib\Connection &$connection) {
|
||||
parent::setConnector($connection);
|
||||
if(empty($this->connection->ldapGroupFilter) || empty($this->connection->ldapGroupMemberAssocAttr)) {
|
||||
$this->enabled = false;
|
||||
$filter = $this->connection->ldapGroupFilter;
|
||||
$gassoc = $this->connection->ldapGroupMemberAssocAttr;
|
||||
if(!empty($filter) && !empty($gassoc)) {
|
||||
$this->enabled = true;
|
||||
}
|
||||
$this->enabled = true;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -96,12 +97,13 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
|
||||
if(!$this->enabled) {
|
||||
return array();
|
||||
}
|
||||
if($this->connection->isCached('getUserGroups'.$uid)) {
|
||||
return $this->connection->getFromCache('getUserGroups'.$uid);
|
||||
$cacheKey = 'getUserGroups'.$uid;
|
||||
if($this->connection->isCached($cacheKey)) {
|
||||
return $this->connection->getFromCache($cacheKey);
|
||||
}
|
||||
$userDN = $this->username2dn($uid);
|
||||
if(!$userDN) {
|
||||
$this->connection->writeToCache('getUserGroups'.$uid, array());
|
||||
$this->connection->writeToCache($cacheKey, array());
|
||||
return array();
|
||||
}
|
||||
|
||||
@@ -124,7 +126,7 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
|
||||
));
|
||||
$groups = $this->fetchListOfGroups($filter, array($this->connection->ldapGroupDisplayName,'dn'));
|
||||
$groups = array_unique($this->ownCloudGroupNames($groups), SORT_LOCALE_STRING);
|
||||
$this->connection->writeToCache('getUserGroups'.$uid, $groups);
|
||||
$this->connection->writeToCache($cacheKey, $groups);
|
||||
|
||||
return $groups;
|
||||
}
|
||||
|
||||
@@ -38,9 +38,11 @@ abstract class Access {
|
||||
* @brief reads a given attribute for an LDAP record identified by a DN
|
||||
* @param $dn the record in question
|
||||
* @param $attr the attribute that shall be retrieved
|
||||
* @returns the values in an array on success, false otherwise
|
||||
* if empty, just check the record's existence
|
||||
* @returns an array of values on success or an empty
|
||||
* array if $attr is empty, false otherwise
|
||||
*
|
||||
* Reads an attribute from an LDAP entry
|
||||
* Reads an attribute from an LDAP entry or check if entry exists
|
||||
*/
|
||||
public function readAttribute($dn, $attr) {
|
||||
if(!$this->checkConnection()) {
|
||||
@@ -53,12 +55,21 @@ abstract class Access {
|
||||
\OCP\Util::writeLog('user_ldap', 'LDAP resource not available.', \OCP\Util::DEBUG);
|
||||
return false;
|
||||
}
|
||||
//Slashes should only be escaped in filters, not bases.
|
||||
$dn = $this->DNasBaseParameter($dn);
|
||||
$rr = @ldap_read($cr, $dn, 'objectClass=*', array($attr));
|
||||
if(!is_resource($rr)) {
|
||||
\OCP\Util::writeLog('user_ldap', 'readAttribute '.$attr.' failed for DN '.$dn, \OCP\Util::DEBUG);
|
||||
if(!empty($attr)) {
|
||||
//do not throw this message on userExists check, irritates
|
||||
\OCP\Util::writeLog('user_ldap', 'readAttribute failed for DN '.$dn, \OCP\Util::DEBUG);
|
||||
}
|
||||
//in case an error occurs , e.g. object does not exist
|
||||
return false;
|
||||
}
|
||||
if (empty($attr)) {
|
||||
\OCP\Util::writeLog('user_ldap', 'readAttribute: '.$dn.' found', \OCP\Util::DEBUG);
|
||||
return array();
|
||||
}
|
||||
$er = ldap_first_entry($cr, $rr);
|
||||
//LDAP attributes are not case sensitive
|
||||
$result = \OCP\Util::mb_array_change_key_case(ldap_get_attributes($cr, $er), MB_CASE_LOWER, 'UTF-8');
|
||||
@@ -67,7 +78,13 @@ abstract class Access {
|
||||
if(isset($result[$attr]) && $result[$attr]['count'] > 0) {
|
||||
$values = array();
|
||||
for($i=0;$i<$result[$attr]['count'];$i++) {
|
||||
$values[] = $this->resemblesDN($attr) ? $this->sanitizeDN($result[$attr][$i]) : $result[$attr][$i];
|
||||
if($this->resemblesDN($attr)) {
|
||||
$values[] = $this->sanitizeDN($result[$attr][$i]);
|
||||
} elseif(strtolower($attr) == 'objectguid') {
|
||||
$values[] = $this->convertObjectGUID2Str($result[$attr][$i]);
|
||||
} else {
|
||||
$values[] = $result[$attr][$i];
|
||||
}
|
||||
}
|
||||
return $values;
|
||||
}
|
||||
@@ -101,6 +118,24 @@ abstract class Access {
|
||||
//make comparisons and everything work
|
||||
$dn = mb_strtolower($dn, 'UTF-8');
|
||||
|
||||
//escape DN values according to RFC 2253 – this is already done by ldap_explode_dn
|
||||
//to use the DN in search filters, \ needs to be escaped to \5c additionally
|
||||
//to use them in bases, we convert them back to simple backslashes in readAttribute()
|
||||
$replacements = array(
|
||||
'\,' => '\5c2C',
|
||||
'\=' => '\5c3D',
|
||||
'\+' => '\5c2B',
|
||||
'\<' => '\5c3C',
|
||||
'\>' => '\5c3E',
|
||||
'\;' => '\5c3B',
|
||||
'\"' => '\5c22',
|
||||
'\#' => '\5c23',
|
||||
'(' => '\28',
|
||||
')' => '\29',
|
||||
'*' => '\2A',
|
||||
);
|
||||
$dn = str_replace(array_keys($replacements),array_values($replacements), $dn);
|
||||
|
||||
return $dn;
|
||||
}
|
||||
|
||||
@@ -209,7 +244,6 @@ abstract class Access {
|
||||
* returns the internal ownCloud name for the given LDAP DN of the user, false on DN outside of search DN
|
||||
*/
|
||||
public function dn2ocname($dn, $ldapname = null, $isUser = true) {
|
||||
$dn = $this->sanitizeDN($dn);
|
||||
$table = $this->getMapTable($isUser);
|
||||
if($isUser) {
|
||||
$fncFindMappedName = 'findMappedUser';
|
||||
@@ -255,8 +289,8 @@ abstract class Access {
|
||||
}
|
||||
$ldapname = $this->sanitizeUsername($ldapname);
|
||||
|
||||
//a new user/group! Then let's try to add it. We're shooting into the blue with the user/group name, assuming that in most cases there will not be a conflict. Otherwise an error will occur and we will continue with our second shot.
|
||||
if(($isUser && !\OCP\User::userExists($ldapname)) || (!$isUser && !\OC_Group::groupExists($ldapname))) {
|
||||
//a new user/group! Add it only if it doesn't conflict with other backend's users or existing groups
|
||||
if(($isUser && !\OCP\User::userExists($ldapname, 'OCA\\user_ldap\\USER_LDAP')) || (!$isUser && !\OC_Group::groupExists($ldapname))) {
|
||||
if($this->mapComponent($dn, $ldapname, $isUser)) {
|
||||
return $ldapname;
|
||||
}
|
||||
@@ -339,7 +373,8 @@ abstract class Access {
|
||||
$ownCloudNames = array();
|
||||
|
||||
foreach($ldapObjects as $ldapObject) {
|
||||
$ocname = $this->dn2ocname($ldapObject['dn'], $ldapObject[$nameAttribute], $isUsers);
|
||||
$nameByLDAP = isset($ldapObject[$nameAttribute]) ? $ldapObject[$nameAttribute] : null;
|
||||
$ocname = $this->dn2ocname($ldapObject['dn'], $nameByLDAP, $isUsers);
|
||||
if($ocname) {
|
||||
$ownCloudNames[] = $ocname;
|
||||
}
|
||||
@@ -405,7 +440,6 @@ abstract class Access {
|
||||
*/
|
||||
private function mapComponent($dn, $ocname, $isUser = true) {
|
||||
$table = $this->getMapTable($isUser);
|
||||
$dn = $this->sanitizeDN($dn);
|
||||
|
||||
$sqlAdjustment = '';
|
||||
$dbtype = \OCP\Config::getSystemValue('dbtype');
|
||||
@@ -503,6 +537,12 @@ abstract class Access {
|
||||
$link_resource = $this->connection->getConnectionResource();
|
||||
if(is_resource($link_resource)) {
|
||||
$sr = ldap_search($link_resource, $base, $filter, $attr);
|
||||
if(!is_resource($sr)) {
|
||||
$errmsg = '('.ldap_errno($link_resource).') ' . ldap_error($link_resource);
|
||||
$errmsg .= ', search filter: ' . $filter;
|
||||
\OCP\Util::writeLog('user_ldap', 'Search: no result resource, LDAP error message: ' . $errmsg, \OCP\Util::ERROR);
|
||||
return array();
|
||||
}
|
||||
$findings = ldap_get_entries($link_resource, $sr );
|
||||
|
||||
// if we're here, probably no connection resource is returned.
|
||||
@@ -622,6 +662,7 @@ abstract class Access {
|
||||
}
|
||||
|
||||
public function areCredentialsValid($name, $password) {
|
||||
$name = $this->DNasBaseParameter($name);
|
||||
$testConnection = clone $this->connection;
|
||||
$credentials = array(
|
||||
'ldapAgentName' => $name,
|
||||
@@ -664,6 +705,7 @@ abstract class Access {
|
||||
|
||||
public function getUUID($dn) {
|
||||
if($this->detectUuidAttribute($dn)) {
|
||||
\OCP\Util::writeLog('user_ldap', 'UUID Checking \ UUID for '.$dn.' using '. $this->connection->ldapUuidAttribute, \OCP\Util::DEBUG);
|
||||
$uuid = $this->readAttribute($dn, $this->connection->ldapUuidAttribute);
|
||||
if(!is_array($uuid) && $this->connection->ldapOverrideUuidAttribute) {
|
||||
$this->detectUuidAttribute($dn, true);
|
||||
@@ -679,4 +721,44 @@ abstract class Access {
|
||||
}
|
||||
return $uuid;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief converts a binary ObjectGUID into a string representation
|
||||
* @param $oguid the ObjectGUID in it's binary form as retrieved from AD
|
||||
* @returns String
|
||||
*
|
||||
* converts a binary ObjectGUID into a string representation
|
||||
* http://www.php.net/manual/en/function.ldap-get-values-len.php#73198
|
||||
*/
|
||||
private function convertObjectGUID2Str($oguid) {
|
||||
$hex_guid = bin2hex($oguid);
|
||||
$hex_guid_to_guid_str = '';
|
||||
for($k = 1; $k <= 4; ++$k) {
|
||||
$hex_guid_to_guid_str .= substr($hex_guid, 8 - 2 * $k, 2);
|
||||
}
|
||||
$hex_guid_to_guid_str .= '-';
|
||||
for($k = 1; $k <= 2; ++$k) {
|
||||
$hex_guid_to_guid_str .= substr($hex_guid, 12 - 2 * $k, 2);
|
||||
}
|
||||
$hex_guid_to_guid_str .= '-';
|
||||
for($k = 1; $k <= 2; ++$k) {
|
||||
$hex_guid_to_guid_str .= substr($hex_guid, 16 - 2 * $k, 2);
|
||||
}
|
||||
$hex_guid_to_guid_str .= '-' . substr($hex_guid, 16, 4);
|
||||
$hex_guid_to_guid_str .= '-' . substr($hex_guid, 20);
|
||||
|
||||
return strtoupper($hex_guid_to_guid_str);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief converts a stored DN so it can be used as base parameter for LDAP queries
|
||||
* @param $dn the DN
|
||||
* @returns String
|
||||
*
|
||||
* converts a stored DN so it can be used as base parameter for LDAP queries
|
||||
* internally we store them for usage in LDAP filters
|
||||
*/
|
||||
private function DNasBaseParameter($dn) {
|
||||
return str_replace('\\5c', '\\', $dn);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ class Connection {
|
||||
\OCP\Util::writeLog('user_ldap', 'Set config ldapUuidAttribute to '.$value, \OCP\Util::DEBUG);
|
||||
$this->config[$name] = $value;
|
||||
if(!empty($this->configID)) {
|
||||
\OCP\Config::getAppValue($this->configID, 'ldap_uuid_attribute', $value);
|
||||
\OCP\Config::setAppValue($this->configID, 'ldap_uuid_attribute', $value);
|
||||
}
|
||||
$changed = true;
|
||||
}
|
||||
@@ -262,6 +262,11 @@ class Connection {
|
||||
\OCP\Config::setAppValue($this->configID, 'ldap_uuid_attribute', 'auto');
|
||||
\OCP\Util::writeLog('user_ldap', 'Illegal value for the UUID Attribute, reset to autodetect.', \OCP\Util::INFO);
|
||||
}
|
||||
if((strpos($this->config['ldapHost'], 'ldaps') === 0)
|
||||
&& $this->config['ldapTLS']) {
|
||||
$this->config['ldapTLS'] = false;
|
||||
\OCP\Util::writeLog('user_ldap', 'LDAPS (already using secure connection) and TLS do not work together. Switched off TLS.', \OCP\Util::INFO);
|
||||
}
|
||||
|
||||
|
||||
//second step: critical checks. If left empty or filled wrong, set as unconfigured and give a warning.
|
||||
|
||||
@@ -20,22 +20,24 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
OC_Util::checkAdminUser();
|
||||
|
||||
$params = array('ldap_host', 'ldap_port', 'ldap_dn', 'ldap_agent_password', 'ldap_base', 'ldap_base_users', 'ldap_base_groups', 'ldap_userlist_filter', 'ldap_login_filter', 'ldap_group_filter', 'ldap_display_name', 'ldap_group_display_name', 'ldap_tls', 'ldap_turn_off_cert_check', 'ldap_nocase', 'ldap_quota_def', 'ldap_quota_attr', 'ldap_email_attr', 'ldap_group_member_assoc_attribute', 'ldap_cache_ttl', 'home_folder_naming_rule');
|
||||
|
||||
OCP\Util::addscript('user_ldap', 'settings');
|
||||
OCP\Util::addstyle('user_ldap', 'settings');
|
||||
|
||||
if ($_POST) {
|
||||
// CSRF check
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
$clearCache = false;
|
||||
foreach($params as $param) {
|
||||
if(isset($_POST[$param])) {
|
||||
$clearCache = true;
|
||||
if('ldap_agent_password' == $param) {
|
||||
OCP\Config::setAppValue('user_ldap', $param, base64_encode($_POST[$param]));
|
||||
} elseif('ldap_cache_ttl' == $param) {
|
||||
if(OCP\Config::getAppValue('user_ldap', $param,'') != $_POST[$param]) {
|
||||
$ldap = new \OCA\user_ldap\lib\Connection('user_ldap');
|
||||
$ldap->clearCache();
|
||||
OCP\Config::setAppValue('user_ldap', $param, $_POST[$param]);
|
||||
}
|
||||
} elseif('home_folder_naming_rule' == $param) {
|
||||
$value = empty($_POST[$param]) ? 'opt:username' : 'attr:'.$_POST[$param];
|
||||
OCP\Config::setAppValue('user_ldap', $param, $value);
|
||||
@@ -54,6 +56,10 @@ if ($_POST) {
|
||||
OCP\Config::setAppValue('user_ldap', $param, 0);
|
||||
}
|
||||
}
|
||||
if($clearCache) {
|
||||
$ldap = new \OCA\user_ldap\lib\Connection('user_ldap');
|
||||
$ldap->clearCache();
|
||||
}
|
||||
}
|
||||
|
||||
// fill template
|
||||
|
||||
@@ -4,6 +4,13 @@
|
||||
<li><a href="#ldapSettings-1">LDAP Basic</a></li>
|
||||
<li><a href="#ldapSettings-2">Advanced</a></li>
|
||||
</ul>
|
||||
<?php if(OCP\App::isEnabled('user_webdavauth')) {
|
||||
echo '<p class="ldapwarning">'.$l->t('<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behaviour. Please ask your system administrator to disable one of them.').'</p>';
|
||||
}
|
||||
if(!function_exists('ldap_connect')) {
|
||||
echo '<p class="ldapwarning">'.$l->t('<b>Warning:</b> The PHP LDAP module needs is not installed, the backend will not work. Please ask your system administrator to install it.').'</p>';
|
||||
}
|
||||
?>
|
||||
<fieldset id="ldapSettings-1">
|
||||
<p><label for="ldap_host"><?php echo $l->t('Host');?></label><input type="text" id="ldap_host" name="ldap_host" value="<?php echo $_['ldap_host']; ?>" title="<?php echo $l->t('You can omit the protocol, except you require SSL. Then start with ldaps://');?>"></p>
|
||||
<p><label for="ldap_base"><?php echo $l->t('Base DN');?></label><input type="text" id="ldap_base" name="ldap_base" value="<?php echo $_['ldap_base']; ?>" title="<?php echo $l->t('You can specify Base DN for users and groups in the Advanced tab');?>" /></p>
|
||||
@@ -29,6 +36,7 @@
|
||||
<p><label for="ldap_cache_ttl">Cache Time-To-Live</label><input type="text" id="ldap_cache_ttl" name="ldap_cache_ttl" value="<?php echo $_['ldap_cache_ttl']; ?>" title="<?php echo $l->t('in seconds. A change empties the cache.');?>" /></p>
|
||||
<p><label for="home_folder_naming_rule">User Home Folder Naming Rule</label><input type="text" id="home_folder_naming_rule" name="home_folder_naming_rule" value="<?php echo $_['home_folder_naming_rule']; ?>" title="<?php echo $l->t('Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute.');?>" /></p>
|
||||
</fieldset>
|
||||
<input type="hidden" name="requesttoken" value="<?php echo $_['requesttoken'] ?>" id="requesttoken">
|
||||
<input type="submit" value="Save" /> <button id="ldap_action_test_connection" name="ldap_action_test_connection">Test Configuration</button> <a href="http://owncloud.org/support/ldap-backend/" target="_blank"><img src="<?php echo OCP\Util::imagePath('','actions/info.png'); ?>" style="height:1.75ex" /> <?php echo $l->t('Help');?></a>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -29,11 +29,13 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
||||
|
||||
private function updateQuota($dn) {
|
||||
$quota = null;
|
||||
if(!empty($this->connection->ldapQuotaDefault)) {
|
||||
$quota = $this->connection->ldapQuotaDefault;
|
||||
$quotaDefault = $this->connection->ldapQuotaDefault;
|
||||
$quotaAttribute = $this->connection->ldapQuotaAttribute;
|
||||
if(!empty($quotaDefault)) {
|
||||
$quota = $quotaDefault;
|
||||
}
|
||||
if(!empty($this->connection->ldapQuotaAttribute)) {
|
||||
$aQuota = $this->readAttribute($dn, $this->connection->ldapQuotaAttribute);
|
||||
if(!empty($quotaAttribute)) {
|
||||
$aQuota = $this->readAttribute($dn, $quotaAttribute);
|
||||
|
||||
if($aQuota && (count($aQuota) > 0)) {
|
||||
$quota = $aQuota[0];
|
||||
@@ -46,8 +48,9 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
||||
|
||||
private function updateEmail($dn) {
|
||||
$email = null;
|
||||
if(!empty($this->connection->ldapEmailAttribute)) {
|
||||
$aEmail = $this->readAttribute($dn, $this->connection->ldapEmailAttribute);
|
||||
$emailAttribute = $this->connection->ldapEmailAttribute;
|
||||
if(!empty($emailAttribute)) {
|
||||
$aEmail = $this->readAttribute($dn, $emailAttribute);
|
||||
if($aEmail && (count($aEmail) > 0)) {
|
||||
$email = $aEmail[0];
|
||||
}
|
||||
@@ -138,14 +141,14 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
||||
return false;
|
||||
}
|
||||
|
||||
//if user really still exists, we will be able to read his objectclass
|
||||
$objcs = $this->readAttribute($dn, 'objectclass');
|
||||
if(!$objcs || empty($objcs)) {
|
||||
//check if user really still exists by reading its entry
|
||||
if(!is_array($this->readAttribute($dn, ''))) {
|
||||
$this->connection->writeToCache('userExists'.$uid, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->connection->writeToCache('userExists'.$uid, true);
|
||||
$this->updateQuota($dn);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -166,20 +169,34 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
||||
* @return boolean
|
||||
*/
|
||||
private function determineHomeDir($uid) {
|
||||
$cacheKey = 'getHome'.$uid;
|
||||
if($this->connection->isCached($cacheKey)) {
|
||||
return $this->connection->getFromCache($cacheKey);
|
||||
}
|
||||
if(strpos($this->connection->homeFolderNamingRule, 'attr:') === 0) {
|
||||
$attr = substr($this->connection->homeFolderNamingRule, strlen('attr:'));
|
||||
$homedir = $this->readAttribute($this->username2dn($uid), $attr);
|
||||
if($homedir) {
|
||||
$homedir = \OCP\Config::getSystemValue( "datadirectory", \OC::$SERVERROOT."/data" ) . '/' . $homedir[0];
|
||||
\OCP\Config::setUserValue($uid, 'user_ldap', 'homedir', $homedir);
|
||||
if($homedir && isset($homedir[0])) {
|
||||
$path = $homedir[0];
|
||||
//if attribute's value is an absolute path take this, otherwise append it to data dir
|
||||
//check for / at the beginning or pattern c:\ resp. c:/
|
||||
if(
|
||||
'/' == $path[0]
|
||||
|| (3 < strlen($path) && ctype_alpha($path[0]) && $path[1] == ':' && ('\\' == $path[2] || '/' == $path[2]))
|
||||
) {
|
||||
$homedir = $path;
|
||||
} else {
|
||||
$homedir = \OCP\Config::getSystemValue( "datadirectory", \OC::$SERVERROOT."/data" ) . '/' . $homedir[0];
|
||||
}
|
||||
|
||||
$this->connection->writeToCache($cacheKey, $homedir);
|
||||
return $homedir;
|
||||
}
|
||||
}
|
||||
|
||||
//fallback and default: username
|
||||
$homedir = \OCP\Config::getSystemValue( "datadirectory", \OC::$SERVERROOT."/data" ) . '/' . $uid;
|
||||
\OCP\Config::setUserValue($uid, 'user_ldap', 'homedir', $homedir);
|
||||
return $homedir;
|
||||
$this->connection->writeToCache($cacheKey, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -189,11 +206,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
||||
*/
|
||||
public function getHome($uid) {
|
||||
if($this->userExists($uid)) {
|
||||
$homedir = \OCP\Config::getUserValue($uid, 'user_ldap', 'homedir', false);
|
||||
if(!$homedir) {
|
||||
$homedir = $this->determineHomeDir($uid);
|
||||
}
|
||||
return $homedir;
|
||||
return $this->determineHomeDir($uid);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
require_once 'apps/user_webdavauth/user_webdavauth.php';
|
||||
|
||||
OC_APP::registerAdmin('user_webdavauth','settings');
|
||||
OC_APP::registerAdmin('user_webdavauth', 'settings');
|
||||
|
||||
OC_User::registerBackend("WEBDAVAUTH");
|
||||
OC_User::useBackend( "WEBDAVAUTH" );
|
||||
|
||||
@@ -2,10 +2,14 @@
|
||||
<info>
|
||||
<id>user_webdavauth</id>
|
||||
<name>WebDAV user backend</name>
|
||||
<description>Authenticate Users by a WebDAV call</description>
|
||||
<version>1.0</version>
|
||||
<description>Authenticate users by a WebDAV call. You can use any WebDAV server, ownCloud server or other webserver to authenticate. It should return http 200 for right credentials and http 401 for wrong ones.
|
||||
|
||||
This app is not compatible to the LDAP user and group backend.</description>
|
||||
<licence>AGPL</licence>
|
||||
<author>Frank Karlitschek</author>
|
||||
<require>4.9</require>
|
||||
<shipped>true</shipped>
|
||||
<types>
|
||||
<authentication/>
|
||||
</types>
|
||||
</info>
|
||||
|
||||
1
apps/user_webdavauth/appinfo/version
Normal file
1
apps/user_webdavauth/appinfo/version
Normal file
@@ -0,0 +1 @@
|
||||
1.1.0.0
|
||||
@@ -21,12 +21,15 @@
|
||||
*
|
||||
*/
|
||||
|
||||
print_r($_POST);
|
||||
if($_POST) {
|
||||
OC_Util::checkAdminUser();
|
||||
|
||||
if(isset($_POST['webdav_url'])) {
|
||||
OC_CONFIG::setValue('user_webdavauth_url', strip_tags($_POST['webdav_url']));
|
||||
}
|
||||
if($_POST) {
|
||||
// CSRF check
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
if(isset($_POST['webdav_url'])) {
|
||||
OC_CONFIG::setValue('user_webdavauth_url', strip_tags($_POST['webdav_url']));
|
||||
}
|
||||
}
|
||||
|
||||
// fill template
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<form id="webdavauth" action="#" method="post">
|
||||
<fieldset class="personalblock">
|
||||
<legend><strong>WebDAV Authentication</strong></legend>
|
||||
<p><label for="webdav_url"><?php echo $l->t('webdav_url');?><input type="text" id="webdav_url" name="webdav_url" value="<?php echo $_['webdav_url']; ?>"></label>
|
||||
<p><label for="webdav_url"><?php echo $l->t('WebDAV URL: http://');?><input type="text" id="webdav_url" name="webdav_url" value="<?php echo $_['webdav_url']; ?>"></label>
|
||||
<input type="hidden" name="requesttoken" value="<?php echo $_['requesttoken'] ?>" id="requesttoken">
|
||||
<input type="submit" value="Save" />
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
@@ -30,37 +30,36 @@ class OC_USER_WEBDAVAUTH extends OC_User_Backend {
|
||||
|
||||
public function createUser() {
|
||||
// Can't create user
|
||||
OC_Log::write('OC_USER_WEBDAVAUTH', 'Not possible to create users from web frontend using WebDAV user backend',3);
|
||||
OC_Log::write('OC_USER_WEBDAVAUTH', 'Not possible to create users from web frontend using WebDAV user backend', 3);
|
||||
return false;
|
||||
}
|
||||
|
||||
public function deleteUser() {
|
||||
public function deleteUser($uid) {
|
||||
// Can't delete user
|
||||
OC_Log::write('OC_USER_WEBDAVAUTH', 'Not possible to delete users from web frontend using WebDAV user backend',3);
|
||||
OC_Log::write('OC_USER_WEBDAVAUTH', 'Not possible to delete users from web frontend using WebDAV user backend', 3);
|
||||
return false;
|
||||
}
|
||||
|
||||
public function setPassword ( $uid, $password ) {
|
||||
// We can't change user password
|
||||
OC_Log::write('OC_USER_WEBDAVAUTH', 'Not possible to change password for users from web frontend using WebDAV user backend',3);
|
||||
OC_Log::write('OC_USER_WEBDAVAUTH', 'Not possible to change password for users from web frontend using WebDAV user backend', 3);
|
||||
return false;
|
||||
}
|
||||
|
||||
public function checkPassword( $uid, $password ) {
|
||||
|
||||
$url= 'http://'.urlencode($uid).':'.urlencode($password).'@'.$this->webdavauth_url;
|
||||
$headers = get_headers($url);
|
||||
if($headers==false) {
|
||||
OC_Log::write('OC_USER_WEBDAVAUTH', 'Not possible to connect to WebDAV Url: "'.$this->webdavauth_url.'" ' ,3);
|
||||
OC_Log::write('OC_USER_WEBDAVAUTH', 'Not possible to connect to WebDAV Url: "'.$this->webdavauth_url.'" ', 3);
|
||||
return false;
|
||||
|
||||
}
|
||||
$returncode= substr($headers[0], 9, 3);
|
||||
|
||||
if($returncode=='401') {
|
||||
return false;
|
||||
if(($returncode=='401') or ($returncode=='403')) {
|
||||
return(false);
|
||||
}else{
|
||||
return true;
|
||||
return($uid);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -68,14 +67,15 @@ class OC_USER_WEBDAVAUTH extends OC_User_Backend {
|
||||
/*
|
||||
* we don´t know if a user exists without the password. so we have to return false all the time
|
||||
*/
|
||||
public function userExists( $uid ) {
|
||||
return false;
|
||||
public function userExists( $uid ){
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* we don´t know the users so all we can do it return an empty array here
|
||||
*/
|
||||
public function getUsers() {
|
||||
public function getUsers($search = '', $limit = 10, $offset = 0) {
|
||||
$returnArray = array();
|
||||
|
||||
return $returnArray;
|
||||
|
||||
@@ -30,6 +30,12 @@ $CONFIG = array(
|
||||
/* Force use of HTTPS connection (true = use HTTPS) */
|
||||
"forcessl" => false,
|
||||
|
||||
/* The automatic hostname detection of ownCloud can fail in certain reverse proxy situations. This option allows to manually override the automatic detection. You can also add a port. For example "www.example.com:88" */
|
||||
"overwritehost" => "",
|
||||
|
||||
/* The automatic protocol detection of ownCloud can fail in certain reverse proxy situations. This option allows to manually override the protocol detection. For example "https" */
|
||||
"overwriteprotocol" => "",
|
||||
|
||||
/* Theme to use for ownCloud */
|
||||
"theme" => "",
|
||||
|
||||
@@ -60,6 +66,9 @@ $CONFIG = array(
|
||||
/* Host to use for sending mail, depends on mail_smtpmode if this is used */
|
||||
"mail_smtphost" => "127.0.0.1",
|
||||
|
||||
/* Port to use for sending mail, depends on mail_smtpmode if this is used */
|
||||
"mail_smtpport" => 25,
|
||||
|
||||
/* authentication needed to send mail, depends on mail_smtpmode if this is used
|
||||
* (false = disable authentication)
|
||||
*/
|
||||
@@ -104,4 +113,4 @@ $CONFIG = array(
|
||||
'writable' => true,
|
||||
),
|
||||
),
|
||||
);
|
||||
);
|
||||
|
||||
@@ -28,13 +28,19 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
|
||||
case 'share':
|
||||
if (isset($_POST['shareType']) && isset($_POST['shareWith']) && isset($_POST['permissions'])) {
|
||||
try {
|
||||
if ((int)$_POST['shareType'] === OCP\Share::SHARE_TYPE_LINK && $_POST['shareWith'] == '') {
|
||||
$shareType = (int)$_POST['shareType'];
|
||||
$shareWith = $_POST['shareWith'];
|
||||
if ($shareType === OCP\Share::SHARE_TYPE_LINK && $shareWith == '') {
|
||||
$shareWith = null;
|
||||
} else {
|
||||
$shareWith = $_POST['shareWith'];
|
||||
}
|
||||
OCP\Share::shareItem($_POST['itemType'], $_POST['itemSource'], (int)$_POST['shareType'], $shareWith, $_POST['permissions']);
|
||||
OC_JSON::success();
|
||||
|
||||
$token = OCP\Share::shareItem($_POST['itemType'], $_POST['itemSource'], $shareType, $shareWith, $_POST['permissions']);
|
||||
|
||||
if (is_string($token)) {
|
||||
OC_JSON::success(array('data' => array('token' => $token)));
|
||||
} else {
|
||||
OC_JSON::success();
|
||||
}
|
||||
} catch (Exception $exception) {
|
||||
OC_JSON::error(array('data' => array('message' => $exception->getMessage())));
|
||||
}
|
||||
@@ -63,6 +69,39 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
|
||||
($return) ? OC_JSON::success() : OC_JSON::error();
|
||||
}
|
||||
break;
|
||||
case 'email':
|
||||
// read post variables
|
||||
$user = OCP\USER::getUser();
|
||||
$type = $_POST['itemType'];
|
||||
$link = $_POST['link'];
|
||||
$file = $_POST['file'];
|
||||
$to_address = $_POST['toaddress'];
|
||||
|
||||
// enable l10n support
|
||||
$l = OC_L10N::get('core');
|
||||
|
||||
// setup the email
|
||||
$subject = (string)$l->t('User %s shared a file with you', $user);
|
||||
if ($type === 'dir') {
|
||||
$subject = (string)$l->t('User %s shared a folder with you', $user);
|
||||
}
|
||||
|
||||
$text = (string)$l->t('User %s shared the file "%s" with you. It is available for download here: %s', array($user, $file, $link));
|
||||
if ($type === 'dir') {
|
||||
$text = (string)$l->t('User %s shared the folder "%s" with you. It is available for download here: %s', array($user, $file, $link));
|
||||
}
|
||||
|
||||
$default_from = OCP\Util::getDefaultEmailAddress('sharing-noreply');
|
||||
$from_address = OCP\Config::getUserValue($user, 'settings', 'email', $default_from);
|
||||
|
||||
// send it out now
|
||||
try {
|
||||
OCP\Util::sendMail($to_address, $to_address, $subject, $text, $from_address, $user);
|
||||
OCP\JSON::success();
|
||||
} catch (Exception $exception) {
|
||||
OCP\JSON::error(array('data' => array('message' => OC_Util::sanitizeHTML($exception->getMessage()))));
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if (isset($_GET['fetch'])) {
|
||||
switch ($_GET['fetch']) {
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
require_once '../../lib/base.php';
|
||||
|
||||
$app = $_POST["app"];
|
||||
$app = OC_App::cleanAppId($app);
|
||||
|
||||
$l = OC_L10N::get( $app );
|
||||
|
||||
|
||||
@@ -17,6 +17,11 @@ a.unshare { float:right; display:inline; padding:.3em 0 0 .3em !important; opaci
|
||||
a.unshare:hover { opacity:1; }
|
||||
#link { border-top:1px solid #ddd; padding-top:0.5em; }
|
||||
#dropdown input[type="text"], #dropdown input[type="password"] { width:90%; }
|
||||
#dropdown form {
|
||||
font-size: 100%;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
#linkText, #linkPass, #expiration { display:none; }
|
||||
#link #showPassword img { width:12px; padding-left: 0.3em; }
|
||||
#link label, #expiration label{ padding-left: 0.5em; }
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user