@@ -17,102 +17,102 @@ |
||
17 | 17 | */ |
18 | 18 | class HtmlOutputHelper |
19 | 19 | { |
20 | - /** |
|
21 | - * Link to the root of the application. |
|
22 | - * |
|
23 | - * @var string |
|
24 | - */ |
|
25 | - protected $baseUri; |
|
20 | + /** |
|
21 | + * Link to the root of the application. |
|
22 | + * |
|
23 | + * @var string |
|
24 | + */ |
|
25 | + protected $baseUri; |
|
26 | 26 | |
27 | - /** |
|
28 | - * List of xml namespaces. |
|
29 | - * |
|
30 | - * @var array |
|
31 | - */ |
|
32 | - protected $namespaceMap; |
|
27 | + /** |
|
28 | + * List of xml namespaces. |
|
29 | + * |
|
30 | + * @var array |
|
31 | + */ |
|
32 | + protected $namespaceMap; |
|
33 | 33 | |
34 | - /** |
|
35 | - * Creates the object. |
|
36 | - * |
|
37 | - * baseUri must point to the root of the application. This will be used to |
|
38 | - * easily generate links. |
|
39 | - * |
|
40 | - * The namespaceMap contains an array with the list of xml namespaces and |
|
41 | - * their prefixes. WebDAV uses a lot of XML with complex namespaces, so |
|
42 | - * that can be used to make output a lot shorter. |
|
43 | - * |
|
44 | - * @param string $baseUri |
|
45 | - */ |
|
46 | - public function __construct($baseUri, array $namespaceMap) |
|
47 | - { |
|
48 | - $this->baseUri = $baseUri; |
|
49 | - $this->namespaceMap = $namespaceMap; |
|
50 | - } |
|
34 | + /** |
|
35 | + * Creates the object. |
|
36 | + * |
|
37 | + * baseUri must point to the root of the application. This will be used to |
|
38 | + * easily generate links. |
|
39 | + * |
|
40 | + * The namespaceMap contains an array with the list of xml namespaces and |
|
41 | + * their prefixes. WebDAV uses a lot of XML with complex namespaces, so |
|
42 | + * that can be used to make output a lot shorter. |
|
43 | + * |
|
44 | + * @param string $baseUri |
|
45 | + */ |
|
46 | + public function __construct($baseUri, array $namespaceMap) |
|
47 | + { |
|
48 | + $this->baseUri = $baseUri; |
|
49 | + $this->namespaceMap = $namespaceMap; |
|
50 | + } |
|
51 | 51 | |
52 | - /** |
|
53 | - * Generates a 'full' url based on a relative one. |
|
54 | - * |
|
55 | - * For relative urls, the base of the application is taken as the reference |
|
56 | - * url, not the 'current url of the current request'. |
|
57 | - * |
|
58 | - * Absolute urls are left alone. |
|
59 | - * |
|
60 | - * @param string $path |
|
61 | - * |
|
62 | - * @return string |
|
63 | - */ |
|
64 | - public function fullUrl($path) |
|
65 | - { |
|
66 | - return Uri\resolve($this->baseUri, $path); |
|
67 | - } |
|
52 | + /** |
|
53 | + * Generates a 'full' url based on a relative one. |
|
54 | + * |
|
55 | + * For relative urls, the base of the application is taken as the reference |
|
56 | + * url, not the 'current url of the current request'. |
|
57 | + * |
|
58 | + * Absolute urls are left alone. |
|
59 | + * |
|
60 | + * @param string $path |
|
61 | + * |
|
62 | + * @return string |
|
63 | + */ |
|
64 | + public function fullUrl($path) |
|
65 | + { |
|
66 | + return Uri\resolve($this->baseUri, $path); |
|
67 | + } |
|
68 | 68 | |
69 | - /** |
|
70 | - * Escape string for HTML output. |
|
71 | - * |
|
72 | - * @param scalar $input |
|
73 | - * |
|
74 | - * @return string |
|
75 | - */ |
|
76 | - public function h($input) |
|
77 | - { |
|
78 | - return htmlspecialchars((string) $input, ENT_COMPAT, 'UTF-8'); |
|
79 | - } |
|
69 | + /** |
|
70 | + * Escape string for HTML output. |
|
71 | + * |
|
72 | + * @param scalar $input |
|
73 | + * |
|
74 | + * @return string |
|
75 | + */ |
|
76 | + public function h($input) |
|
77 | + { |
|
78 | + return htmlspecialchars((string) $input, ENT_COMPAT, 'UTF-8'); |
|
79 | + } |
|
80 | 80 | |
81 | - /** |
|
82 | - * Generates a full <a>-tag. |
|
83 | - * |
|
84 | - * Url is automatically expanded. If label is not specified, we re-use the |
|
85 | - * url. |
|
86 | - * |
|
87 | - * @param string $url |
|
88 | - * @param string $label |
|
89 | - * |
|
90 | - * @return string |
|
91 | - */ |
|
92 | - public function link($url, $label = null) |
|
93 | - { |
|
94 | - $url = $this->h($this->fullUrl($url)); |
|
81 | + /** |
|
82 | + * Generates a full <a>-tag. |
|
83 | + * |
|
84 | + * Url is automatically expanded. If label is not specified, we re-use the |
|
85 | + * url. |
|
86 | + * |
|
87 | + * @param string $url |
|
88 | + * @param string $label |
|
89 | + * |
|
90 | + * @return string |
|
91 | + */ |
|
92 | + public function link($url, $label = null) |
|
93 | + { |
|
94 | + $url = $this->h($this->fullUrl($url)); |
|
95 | 95 | |
96 | - return '<a href="'.$url.'">'.($label ? $this->h($label) : $url).'</a>'; |
|
97 | - } |
|
96 | + return '<a href="'.$url.'">'.($label ? $this->h($label) : $url).'</a>'; |
|
97 | + } |
|
98 | 98 | |
99 | - /** |
|
100 | - * This method takes an xml element in clark-notation, and turns it into a |
|
101 | - * shortened version with a prefix, if it was a known namespace. |
|
102 | - * |
|
103 | - * @param string $element |
|
104 | - * |
|
105 | - * @return string |
|
106 | - */ |
|
107 | - public function xmlName($element) |
|
108 | - { |
|
109 | - list($ns, $localName) = XmlService::parseClarkNotation($element); |
|
110 | - if (isset($this->namespaceMap[$ns])) { |
|
111 | - $propName = $this->namespaceMap[$ns].':'.$localName; |
|
112 | - } else { |
|
113 | - $propName = $element; |
|
114 | - } |
|
99 | + /** |
|
100 | + * This method takes an xml element in clark-notation, and turns it into a |
|
101 | + * shortened version with a prefix, if it was a known namespace. |
|
102 | + * |
|
103 | + * @param string $element |
|
104 | + * |
|
105 | + * @return string |
|
106 | + */ |
|
107 | + public function xmlName($element) |
|
108 | + { |
|
109 | + list($ns, $localName) = XmlService::parseClarkNotation($element); |
|
110 | + if (isset($this->namespaceMap[$ns])) { |
|
111 | + $propName = $this->namespaceMap[$ns].':'.$localName; |
|
112 | + } else { |
|
113 | + $propName = $element; |
|
114 | + } |
|
115 | 115 | |
116 | - return '<span title="'.$this->h($element).'">'.$this->h($propName).'</span>'; |
|
117 | - } |
|
116 | + return '<span title="'.$this->h($element).'">'.$this->h($propName).'</span>'; |
|
117 | + } |
|
118 | 118 | } |
@@ -16,113 +16,113 @@ |
||
16 | 16 | */ |
17 | 17 | class PropFindAll extends PropFind |
18 | 18 | { |
19 | - /** |
|
20 | - * Creates the PROPFIND object. |
|
21 | - * |
|
22 | - * @param string $path |
|
23 | - */ |
|
24 | - public function __construct($path) |
|
25 | - { |
|
26 | - parent::__construct($path, []); |
|
27 | - } |
|
19 | + /** |
|
20 | + * Creates the PROPFIND object. |
|
21 | + * |
|
22 | + * @param string $path |
|
23 | + */ |
|
24 | + public function __construct($path) |
|
25 | + { |
|
26 | + parent::__construct($path, []); |
|
27 | + } |
|
28 | 28 | |
29 | - /** |
|
30 | - * Handles a specific property. |
|
31 | - * |
|
32 | - * This method checks whether the specified property was requested in this |
|
33 | - * PROPFIND request, and if so, it will call the callback and use the |
|
34 | - * return value for it's value. |
|
35 | - * |
|
36 | - * Example: |
|
37 | - * |
|
38 | - * $propFind->handle('{DAV:}displayname', function() { |
|
39 | - * return 'hello'; |
|
40 | - * }); |
|
41 | - * |
|
42 | - * Note that handle will only work the first time. If null is returned, the |
|
43 | - * value is ignored. |
|
44 | - * |
|
45 | - * It's also possible to not pass a callback, but immediately pass a value |
|
46 | - * |
|
47 | - * @param string $propertyName |
|
48 | - * @param mixed $valueOrCallBack |
|
49 | - */ |
|
50 | - public function handle($propertyName, $valueOrCallBack) |
|
51 | - { |
|
52 | - if (is_callable($valueOrCallBack)) { |
|
53 | - $value = $valueOrCallBack(); |
|
54 | - } else { |
|
55 | - $value = $valueOrCallBack; |
|
56 | - } |
|
57 | - if (!is_null($value)) { |
|
58 | - $this->result[$propertyName] = [200, $value]; |
|
59 | - } |
|
60 | - } |
|
29 | + /** |
|
30 | + * Handles a specific property. |
|
31 | + * |
|
32 | + * This method checks whether the specified property was requested in this |
|
33 | + * PROPFIND request, and if so, it will call the callback and use the |
|
34 | + * return value for it's value. |
|
35 | + * |
|
36 | + * Example: |
|
37 | + * |
|
38 | + * $propFind->handle('{DAV:}displayname', function() { |
|
39 | + * return 'hello'; |
|
40 | + * }); |
|
41 | + * |
|
42 | + * Note that handle will only work the first time. If null is returned, the |
|
43 | + * value is ignored. |
|
44 | + * |
|
45 | + * It's also possible to not pass a callback, but immediately pass a value |
|
46 | + * |
|
47 | + * @param string $propertyName |
|
48 | + * @param mixed $valueOrCallBack |
|
49 | + */ |
|
50 | + public function handle($propertyName, $valueOrCallBack) |
|
51 | + { |
|
52 | + if (is_callable($valueOrCallBack)) { |
|
53 | + $value = $valueOrCallBack(); |
|
54 | + } else { |
|
55 | + $value = $valueOrCallBack; |
|
56 | + } |
|
57 | + if (!is_null($value)) { |
|
58 | + $this->result[$propertyName] = [200, $value]; |
|
59 | + } |
|
60 | + } |
|
61 | 61 | |
62 | - /** |
|
63 | - * Sets the value of the property. |
|
64 | - * |
|
65 | - * If status is not supplied, the status will default to 200 for non-null |
|
66 | - * properties, and 404 for null properties. |
|
67 | - * |
|
68 | - * @param string $propertyName |
|
69 | - * @param mixed $value |
|
70 | - * @param int $status |
|
71 | - */ |
|
72 | - public function set($propertyName, $value, $status = null) |
|
73 | - { |
|
74 | - if (is_null($status)) { |
|
75 | - $status = is_null($value) ? 404 : 200; |
|
76 | - } |
|
77 | - $this->result[$propertyName] = [$status, $value]; |
|
78 | - } |
|
62 | + /** |
|
63 | + * Sets the value of the property. |
|
64 | + * |
|
65 | + * If status is not supplied, the status will default to 200 for non-null |
|
66 | + * properties, and 404 for null properties. |
|
67 | + * |
|
68 | + * @param string $propertyName |
|
69 | + * @param mixed $value |
|
70 | + * @param int $status |
|
71 | + */ |
|
72 | + public function set($propertyName, $value, $status = null) |
|
73 | + { |
|
74 | + if (is_null($status)) { |
|
75 | + $status = is_null($value) ? 404 : 200; |
|
76 | + } |
|
77 | + $this->result[$propertyName] = [$status, $value]; |
|
78 | + } |
|
79 | 79 | |
80 | - /** |
|
81 | - * Returns the current value for a property. |
|
82 | - * |
|
83 | - * @param string $propertyName |
|
84 | - * |
|
85 | - * @return mixed |
|
86 | - */ |
|
87 | - public function get($propertyName) |
|
88 | - { |
|
89 | - return isset($this->result[$propertyName]) ? $this->result[$propertyName][1] : null; |
|
90 | - } |
|
80 | + /** |
|
81 | + * Returns the current value for a property. |
|
82 | + * |
|
83 | + * @param string $propertyName |
|
84 | + * |
|
85 | + * @return mixed |
|
86 | + */ |
|
87 | + public function get($propertyName) |
|
88 | + { |
|
89 | + return isset($this->result[$propertyName]) ? $this->result[$propertyName][1] : null; |
|
90 | + } |
|
91 | 91 | |
92 | - /** |
|
93 | - * Returns the current status code for a property name. |
|
94 | - * |
|
95 | - * If the property does not appear in the list of requested properties, |
|
96 | - * null will be returned. |
|
97 | - * |
|
98 | - * @param string $propertyName |
|
99 | - * |
|
100 | - * @return int|null |
|
101 | - */ |
|
102 | - public function getStatus($propertyName) |
|
103 | - { |
|
104 | - return isset($this->result[$propertyName]) ? $this->result[$propertyName][0] : 404; |
|
105 | - } |
|
92 | + /** |
|
93 | + * Returns the current status code for a property name. |
|
94 | + * |
|
95 | + * If the property does not appear in the list of requested properties, |
|
96 | + * null will be returned. |
|
97 | + * |
|
98 | + * @param string $propertyName |
|
99 | + * |
|
100 | + * @return int|null |
|
101 | + */ |
|
102 | + public function getStatus($propertyName) |
|
103 | + { |
|
104 | + return isset($this->result[$propertyName]) ? $this->result[$propertyName][0] : 404; |
|
105 | + } |
|
106 | 106 | |
107 | - /** |
|
108 | - * Returns all propertynames that have a 404 status, and thus don't have a |
|
109 | - * value yet. |
|
110 | - * |
|
111 | - * @return array |
|
112 | - */ |
|
113 | - public function get404Properties() |
|
114 | - { |
|
115 | - $result = []; |
|
116 | - foreach ($this->result as $propertyName => $stuff) { |
|
117 | - if (404 === $stuff[0]) { |
|
118 | - $result[] = $propertyName; |
|
119 | - } |
|
120 | - } |
|
121 | - // If there's nothing in this list, we're adding one fictional item. |
|
122 | - if (!$result) { |
|
123 | - $result[] = '{http://sabredav.org/ns}idk'; |
|
124 | - } |
|
107 | + /** |
|
108 | + * Returns all propertynames that have a 404 status, and thus don't have a |
|
109 | + * value yet. |
|
110 | + * |
|
111 | + * @return array |
|
112 | + */ |
|
113 | + public function get404Properties() |
|
114 | + { |
|
115 | + $result = []; |
|
116 | + foreach ($this->result as $propertyName => $stuff) { |
|
117 | + if (404 === $stuff[0]) { |
|
118 | + $result[] = $propertyName; |
|
119 | + } |
|
120 | + } |
|
121 | + // If there's nothing in this list, we're adding one fictional item. |
|
122 | + if (!$result) { |
|
123 | + $result[] = '{http://sabredav.org/ns}idk'; |
|
124 | + } |
|
125 | 125 | |
126 | - return $result; |
|
127 | - } |
|
126 | + return $result; |
|
127 | + } |
|
128 | 128 | } |
@@ -26,68 +26,68 @@ |
||
26 | 26 | */ |
27 | 27 | class GuessContentType extends DAV\ServerPlugin |
28 | 28 | { |
29 | - /** |
|
30 | - * List of recognized file extensions. |
|
31 | - * |
|
32 | - * Feel free to add more |
|
33 | - * |
|
34 | - * @var array |
|
35 | - */ |
|
36 | - public $extensionMap = [ |
|
37 | - // images |
|
38 | - 'jpg' => 'image/jpeg', |
|
39 | - 'gif' => 'image/gif', |
|
40 | - 'png' => 'image/png', |
|
29 | + /** |
|
30 | + * List of recognized file extensions. |
|
31 | + * |
|
32 | + * Feel free to add more |
|
33 | + * |
|
34 | + * @var array |
|
35 | + */ |
|
36 | + public $extensionMap = [ |
|
37 | + // images |
|
38 | + 'jpg' => 'image/jpeg', |
|
39 | + 'gif' => 'image/gif', |
|
40 | + 'png' => 'image/png', |
|
41 | 41 | |
42 | - // groupware |
|
43 | - 'ics' => 'text/calendar', |
|
44 | - 'vcf' => 'text/vcard', |
|
42 | + // groupware |
|
43 | + 'ics' => 'text/calendar', |
|
44 | + 'vcf' => 'text/vcard', |
|
45 | 45 | |
46 | - // text |
|
47 | - 'txt' => 'text/plain', |
|
48 | - ]; |
|
46 | + // text |
|
47 | + 'txt' => 'text/plain', |
|
48 | + ]; |
|
49 | 49 | |
50 | - /** |
|
51 | - * Initializes the plugin. |
|
52 | - */ |
|
53 | - public function initialize(DAV\Server $server) |
|
54 | - { |
|
55 | - // Using a relatively low priority (200) to allow other extensions |
|
56 | - // to set the content-type first. |
|
57 | - $server->on('propFind', [$this, 'propFind'], 200); |
|
58 | - } |
|
50 | + /** |
|
51 | + * Initializes the plugin. |
|
52 | + */ |
|
53 | + public function initialize(DAV\Server $server) |
|
54 | + { |
|
55 | + // Using a relatively low priority (200) to allow other extensions |
|
56 | + // to set the content-type first. |
|
57 | + $server->on('propFind', [$this, 'propFind'], 200); |
|
58 | + } |
|
59 | 59 | |
60 | - /** |
|
61 | - * Our PROPFIND handler. |
|
62 | - * |
|
63 | - * Here we set a contenttype, if the node didn't already have one. |
|
64 | - */ |
|
65 | - public function propFind(PropFind $propFind, INode $node) |
|
66 | - { |
|
67 | - $propFind->handle('{DAV:}getcontenttype', function () use ($propFind) { |
|
68 | - list(, $fileName) = Uri\split($propFind->getPath()); |
|
60 | + /** |
|
61 | + * Our PROPFIND handler. |
|
62 | + * |
|
63 | + * Here we set a contenttype, if the node didn't already have one. |
|
64 | + */ |
|
65 | + public function propFind(PropFind $propFind, INode $node) |
|
66 | + { |
|
67 | + $propFind->handle('{DAV:}getcontenttype', function () use ($propFind) { |
|
68 | + list(, $fileName) = Uri\split($propFind->getPath()); |
|
69 | 69 | |
70 | - return $this->getContentType($fileName); |
|
71 | - }); |
|
72 | - } |
|
70 | + return $this->getContentType($fileName); |
|
71 | + }); |
|
72 | + } |
|
73 | 73 | |
74 | - /** |
|
75 | - * Simple method to return the contenttype. |
|
76 | - * |
|
77 | - * @param string $fileName |
|
78 | - * |
|
79 | - * @return string |
|
80 | - */ |
|
81 | - protected function getContentType($fileName) |
|
82 | - { |
|
83 | - if (null !== $fileName) { |
|
84 | - // Just grabbing the extension |
|
85 | - $extension = strtolower(substr($fileName, strrpos($fileName, '.') + 1)); |
|
86 | - if (isset($this->extensionMap[$extension])) { |
|
87 | - return $this->extensionMap[$extension]; |
|
88 | - } |
|
89 | - } |
|
74 | + /** |
|
75 | + * Simple method to return the contenttype. |
|
76 | + * |
|
77 | + * @param string $fileName |
|
78 | + * |
|
79 | + * @return string |
|
80 | + */ |
|
81 | + protected function getContentType($fileName) |
|
82 | + { |
|
83 | + if (null !== $fileName) { |
|
84 | + // Just grabbing the extension |
|
85 | + $extension = strtolower(substr($fileName, strrpos($fileName, '.') + 1)); |
|
86 | + if (isset($this->extensionMap[$extension])) { |
|
87 | + return $this->extensionMap[$extension]; |
|
88 | + } |
|
89 | + } |
|
90 | 90 | |
91 | - return 'application/octet-stream'; |
|
92 | - } |
|
91 | + return 'application/octet-stream'; |
|
92 | + } |
|
93 | 93 | } |
@@ -64,7 +64,7 @@ |
||
64 | 64 | */ |
65 | 65 | public function propFind(PropFind $propFind, INode $node) |
66 | 66 | { |
67 | - $propFind->handle('{DAV:}getcontenttype', function () use ($propFind) { |
|
67 | + $propFind->handle('{DAV:}getcontenttype', function() use ($propFind) { |
|
68 | 68 | list(, $fileName) = Uri\split($propFind->getPath()); |
69 | 69 | |
70 | 70 | return $this->getContentType($fileName); |
@@ -15,65 +15,65 @@ |
||
15 | 15 | */ |
16 | 16 | interface ICollection extends INode |
17 | 17 | { |
18 | - /** |
|
19 | - * Creates a new file in the directory. |
|
20 | - * |
|
21 | - * Data will either be supplied as a stream resource, or in certain cases |
|
22 | - * as a string. Keep in mind that you may have to support either. |
|
23 | - * |
|
24 | - * After successful creation of the file, you may choose to return the ETag |
|
25 | - * of the new file here. |
|
26 | - * |
|
27 | - * The returned ETag must be surrounded by double-quotes (The quotes should |
|
28 | - * be part of the actual string). |
|
29 | - * |
|
30 | - * If you cannot accurately determine the ETag, you should not return it. |
|
31 | - * If you don't store the file exactly as-is (you're transforming it |
|
32 | - * somehow) you should also not return an ETag. |
|
33 | - * |
|
34 | - * This means that if a subsequent GET to this new file does not exactly |
|
35 | - * return the same contents of what was submitted here, you are strongly |
|
36 | - * recommended to omit the ETag. |
|
37 | - * |
|
38 | - * @param string $name Name of the file |
|
39 | - * @param resource|string $data Initial payload |
|
40 | - * |
|
41 | - * @return string|null |
|
42 | - */ |
|
43 | - public function createFile($name, $data = null); |
|
18 | + /** |
|
19 | + * Creates a new file in the directory. |
|
20 | + * |
|
21 | + * Data will either be supplied as a stream resource, or in certain cases |
|
22 | + * as a string. Keep in mind that you may have to support either. |
|
23 | + * |
|
24 | + * After successful creation of the file, you may choose to return the ETag |
|
25 | + * of the new file here. |
|
26 | + * |
|
27 | + * The returned ETag must be surrounded by double-quotes (The quotes should |
|
28 | + * be part of the actual string). |
|
29 | + * |
|
30 | + * If you cannot accurately determine the ETag, you should not return it. |
|
31 | + * If you don't store the file exactly as-is (you're transforming it |
|
32 | + * somehow) you should also not return an ETag. |
|
33 | + * |
|
34 | + * This means that if a subsequent GET to this new file does not exactly |
|
35 | + * return the same contents of what was submitted here, you are strongly |
|
36 | + * recommended to omit the ETag. |
|
37 | + * |
|
38 | + * @param string $name Name of the file |
|
39 | + * @param resource|string $data Initial payload |
|
40 | + * |
|
41 | + * @return string|null |
|
42 | + */ |
|
43 | + public function createFile($name, $data = null); |
|
44 | 44 | |
45 | - /** |
|
46 | - * Creates a new subdirectory. |
|
47 | - * |
|
48 | - * @param string $name |
|
49 | - */ |
|
50 | - public function createDirectory($name); |
|
45 | + /** |
|
46 | + * Creates a new subdirectory. |
|
47 | + * |
|
48 | + * @param string $name |
|
49 | + */ |
|
50 | + public function createDirectory($name); |
|
51 | 51 | |
52 | - /** |
|
53 | - * Returns a specific child node, referenced by its name. |
|
54 | - * |
|
55 | - * This method must throw Sabre\DAV\Exception\NotFound if the node does not |
|
56 | - * exist. |
|
57 | - * |
|
58 | - * @param string $name |
|
59 | - * |
|
60 | - * @return INode |
|
61 | - */ |
|
62 | - public function getChild($name); |
|
52 | + /** |
|
53 | + * Returns a specific child node, referenced by its name. |
|
54 | + * |
|
55 | + * This method must throw Sabre\DAV\Exception\NotFound if the node does not |
|
56 | + * exist. |
|
57 | + * |
|
58 | + * @param string $name |
|
59 | + * |
|
60 | + * @return INode |
|
61 | + */ |
|
62 | + public function getChild($name); |
|
63 | 63 | |
64 | - /** |
|
65 | - * Returns an array with all the child nodes. |
|
66 | - * |
|
67 | - * @return INode[] |
|
68 | - */ |
|
69 | - public function getChildren(); |
|
64 | + /** |
|
65 | + * Returns an array with all the child nodes. |
|
66 | + * |
|
67 | + * @return INode[] |
|
68 | + */ |
|
69 | + public function getChildren(); |
|
70 | 70 | |
71 | - /** |
|
72 | - * Checks if a child-node with the specified name exists. |
|
73 | - * |
|
74 | - * @param string $name |
|
75 | - * |
|
76 | - * @return bool |
|
77 | - */ |
|
78 | - public function childExists($name); |
|
71 | + /** |
|
72 | + * Checks if a child-node with the specified name exists. |
|
73 | + * |
|
74 | + * @param string $name |
|
75 | + * |
|
76 | + * @return bool |
|
77 | + */ |
|
78 | + public function childExists($name); |
|
79 | 79 | } |
@@ -17,50 +17,50 @@ |
||
17 | 17 | */ |
18 | 18 | class UUIDUtil |
19 | 19 | { |
20 | - /** |
|
21 | - * Returns a pseudo-random v4 UUID. |
|
22 | - * |
|
23 | - * This function is based on a comment by Andrew Moore on php.net |
|
24 | - * |
|
25 | - * @see http://www.php.net/manual/en/function.uniqid.php#94959 |
|
26 | - * |
|
27 | - * @return string |
|
28 | - */ |
|
29 | - public static function getUUID() |
|
30 | - { |
|
31 | - return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', |
|
32 | - // 32 bits for "time_low" |
|
33 | - mt_rand(0, 0xffff), mt_rand(0, 0xffff), |
|
20 | + /** |
|
21 | + * Returns a pseudo-random v4 UUID. |
|
22 | + * |
|
23 | + * This function is based on a comment by Andrew Moore on php.net |
|
24 | + * |
|
25 | + * @see http://www.php.net/manual/en/function.uniqid.php#94959 |
|
26 | + * |
|
27 | + * @return string |
|
28 | + */ |
|
29 | + public static function getUUID() |
|
30 | + { |
|
31 | + return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', |
|
32 | + // 32 bits for "time_low" |
|
33 | + mt_rand(0, 0xffff), mt_rand(0, 0xffff), |
|
34 | 34 | |
35 | - // 16 bits for "time_mid" |
|
36 | - mt_rand(0, 0xffff), |
|
35 | + // 16 bits for "time_mid" |
|
36 | + mt_rand(0, 0xffff), |
|
37 | 37 | |
38 | - // 16 bits for "time_hi_and_version", |
|
39 | - // four most significant bits holds version number 4 |
|
40 | - mt_rand(0, 0x0fff) | 0x4000, |
|
38 | + // 16 bits for "time_hi_and_version", |
|
39 | + // four most significant bits holds version number 4 |
|
40 | + mt_rand(0, 0x0fff) | 0x4000, |
|
41 | 41 | |
42 | - // 16 bits, 8 bits for "clk_seq_hi_res", |
|
43 | - // 8 bits for "clk_seq_low", |
|
44 | - // two most significant bits holds zero and one for variant DCE1.1 |
|
45 | - mt_rand(0, 0x3fff) | 0x8000, |
|
42 | + // 16 bits, 8 bits for "clk_seq_hi_res", |
|
43 | + // 8 bits for "clk_seq_low", |
|
44 | + // two most significant bits holds zero and one for variant DCE1.1 |
|
45 | + mt_rand(0, 0x3fff) | 0x8000, |
|
46 | 46 | |
47 | - // 48 bits for "node" |
|
48 | - mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) |
|
49 | - ); |
|
50 | - } |
|
47 | + // 48 bits for "node" |
|
48 | + mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) |
|
49 | + ); |
|
50 | + } |
|
51 | 51 | |
52 | - /** |
|
53 | - * Checks if a string is a valid UUID. |
|
54 | - * |
|
55 | - * @param string $uuid |
|
56 | - * |
|
57 | - * @return bool |
|
58 | - */ |
|
59 | - public static function validateUUID($uuid) |
|
60 | - { |
|
61 | - return 0 !== preg_match( |
|
62 | - '/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i', |
|
63 | - $uuid |
|
64 | - ); |
|
65 | - } |
|
52 | + /** |
|
53 | + * Checks if a string is a valid UUID. |
|
54 | + * |
|
55 | + * @param string $uuid |
|
56 | + * |
|
57 | + * @return bool |
|
58 | + */ |
|
59 | + public static function validateUUID($uuid) |
|
60 | + { |
|
61 | + return 0 !== preg_match( |
|
62 | + '/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i', |
|
63 | + $uuid |
|
64 | + ); |
|
65 | + } |
|
66 | 66 | } |
@@ -28,231 +28,231 @@ discard block |
||
28 | 28 | */ |
29 | 29 | class Plugin extends ServerPlugin |
30 | 30 | { |
31 | - const ACCESS_NOTSHARED = 0; |
|
32 | - const ACCESS_SHAREDOWNER = 1; |
|
33 | - const ACCESS_READ = 2; |
|
34 | - const ACCESS_READWRITE = 3; |
|
35 | - const ACCESS_NOACCESS = 4; |
|
36 | - |
|
37 | - const INVITE_NORESPONSE = 1; |
|
38 | - const INVITE_ACCEPTED = 2; |
|
39 | - const INVITE_DECLINED = 3; |
|
40 | - const INVITE_INVALID = 4; |
|
41 | - |
|
42 | - /** |
|
43 | - * Reference to SabreDAV server object. |
|
44 | - * |
|
45 | - * @var Server |
|
46 | - */ |
|
47 | - protected $server; |
|
48 | - |
|
49 | - /** |
|
50 | - * This method should return a list of server-features. |
|
51 | - * |
|
52 | - * This is for example 'versioning' and is added to the DAV: header |
|
53 | - * in an OPTIONS response. |
|
54 | - * |
|
55 | - * @return array |
|
56 | - */ |
|
57 | - public function getFeatures() |
|
58 | - { |
|
59 | - return ['resource-sharing']; |
|
60 | - } |
|
61 | - |
|
62 | - /** |
|
63 | - * Returns a plugin name. |
|
64 | - * |
|
65 | - * Using this name other plugins will be able to access other plugins |
|
66 | - * using \Sabre\DAV\Server::getPlugin |
|
67 | - * |
|
68 | - * @return string |
|
69 | - */ |
|
70 | - public function getPluginName() |
|
71 | - { |
|
72 | - return 'sharing'; |
|
73 | - } |
|
74 | - |
|
75 | - /** |
|
76 | - * This initializes the plugin. |
|
77 | - * |
|
78 | - * This function is called by Sabre\DAV\Server, after |
|
79 | - * addPlugin is called. |
|
80 | - * |
|
81 | - * This method should set up the required event subscriptions. |
|
82 | - */ |
|
83 | - public function initialize(Server $server) |
|
84 | - { |
|
85 | - $this->server = $server; |
|
86 | - |
|
87 | - $server->xml->elementMap['{DAV:}share-resource'] = 'Sabre\\DAV\\Xml\\Request\\ShareResource'; |
|
88 | - |
|
89 | - array_push( |
|
90 | - $server->protectedProperties, |
|
91 | - '{DAV:}share-mode' |
|
92 | - ); |
|
93 | - |
|
94 | - $server->on('method:POST', [$this, 'httpPost']); |
|
95 | - $server->on('propFind', [$this, 'propFind']); |
|
96 | - $server->on('getSupportedPrivilegeSet', [$this, 'getSupportedPrivilegeSet']); |
|
97 | - $server->on('onHTMLActionsPanel', [$this, 'htmlActionsPanel']); |
|
98 | - $server->on('onBrowserPostAction', [$this, 'browserPostAction']); |
|
99 | - } |
|
100 | - |
|
101 | - /** |
|
102 | - * Updates the list of sharees on a shared resource. |
|
103 | - * |
|
104 | - * The sharees array is a list of people that are to be added modified |
|
105 | - * or removed in the list of shares. |
|
106 | - * |
|
107 | - * @param string $path |
|
108 | - * @param Sharee[] $sharees |
|
109 | - */ |
|
110 | - public function shareResource($path, array $sharees) |
|
111 | - { |
|
112 | - $node = $this->server->tree->getNodeForPath($path); |
|
113 | - |
|
114 | - if (!$node instanceof ISharedNode) { |
|
115 | - throw new Forbidden('Sharing is not allowed on this node'); |
|
116 | - } |
|
117 | - |
|
118 | - // Getting ACL info |
|
119 | - $acl = $this->server->getPlugin('acl'); |
|
120 | - |
|
121 | - // If there's no ACL support, we allow everything |
|
122 | - if ($acl) { |
|
123 | - $acl->checkPrivileges($path, '{DAV:}share'); |
|
124 | - } |
|
125 | - |
|
126 | - foreach ($sharees as $sharee) { |
|
127 | - // We're going to attempt to get a local principal uri for a share |
|
128 | - // href by emitting the getPrincipalByUri event. |
|
129 | - $principal = null; |
|
130 | - $this->server->emit('getPrincipalByUri', [$sharee->href, &$principal]); |
|
131 | - $sharee->principal = $principal; |
|
132 | - } |
|
133 | - $node->updateInvites($sharees); |
|
134 | - } |
|
135 | - |
|
136 | - /** |
|
137 | - * This event is triggered when properties are requested for nodes. |
|
138 | - * |
|
139 | - * This allows us to inject any sharings-specific properties. |
|
140 | - */ |
|
141 | - public function propFind(PropFind $propFind, INode $node) |
|
142 | - { |
|
143 | - if ($node instanceof ISharedNode) { |
|
144 | - $propFind->handle('{DAV:}share-access', function () use ($node) { |
|
145 | - return new Property\ShareAccess($node->getShareAccess()); |
|
146 | - }); |
|
147 | - $propFind->handle('{DAV:}invite', function () use ($node) { |
|
148 | - return new Property\Invite($node->getInvites()); |
|
149 | - }); |
|
150 | - $propFind->handle('{DAV:}share-resource-uri', function () use ($node) { |
|
151 | - return new Property\Href($node->getShareResourceUri()); |
|
152 | - }); |
|
153 | - } |
|
154 | - } |
|
155 | - |
|
156 | - /** |
|
157 | - * We intercept this to handle POST requests on shared resources. |
|
158 | - * |
|
159 | - * @return bool|null |
|
160 | - */ |
|
161 | - public function httpPost(RequestInterface $request, ResponseInterface $response) |
|
162 | - { |
|
163 | - $path = $request->getPath(); |
|
164 | - $contentType = $request->getHeader('Content-Type'); |
|
165 | - if (null === $contentType) { |
|
166 | - return; |
|
167 | - } |
|
168 | - |
|
169 | - // We're only interested in the davsharing content type. |
|
170 | - if (false === strpos($contentType, 'application/davsharing+xml')) { |
|
171 | - return; |
|
172 | - } |
|
173 | - |
|
174 | - $message = $this->server->xml->parse( |
|
175 | - $request->getBody(), |
|
176 | - $request->getUrl(), |
|
177 | - $documentType |
|
178 | - ); |
|
179 | - |
|
180 | - switch ($documentType) { |
|
181 | - case '{DAV:}share-resource': |
|
182 | - $this->shareResource($path, $message->sharees); |
|
183 | - $response->setStatus(200); |
|
184 | - // Adding this because sending a response body may cause issues, |
|
185 | - // and I wanted some type of indicator the response was handled. |
|
186 | - $response->setHeader('X-Sabre-Status', 'everything-went-well'); |
|
187 | - |
|
188 | - // Breaking the event chain |
|
189 | - return false; |
|
190 | - |
|
191 | - default: |
|
192 | - throw new BadRequest('Unexpected document type: '.$documentType.' for this Content-Type'); |
|
193 | - } |
|
194 | - } |
|
195 | - |
|
196 | - /** |
|
197 | - * This method is triggered whenever a subsystem reqeuests the privileges |
|
198 | - * hat are supported on a particular node. |
|
199 | - * |
|
200 | - * We need to add a number of privileges for scheduling purposes. |
|
201 | - */ |
|
202 | - public function getSupportedPrivilegeSet(INode $node, array &$supportedPrivilegeSet) |
|
203 | - { |
|
204 | - if ($node instanceof ISharedNode) { |
|
205 | - $supportedPrivilegeSet['{DAV:}share'] = [ |
|
206 | - 'abstract' => false, |
|
207 | - 'aggregates' => [], |
|
208 | - ]; |
|
209 | - } |
|
210 | - } |
|
211 | - |
|
212 | - /** |
|
213 | - * Returns a bunch of meta-data about the plugin. |
|
214 | - * |
|
215 | - * Providing this information is optional, and is mainly displayed by the |
|
216 | - * Browser plugin. |
|
217 | - * |
|
218 | - * The description key in the returned array may contain html and will not |
|
219 | - * be sanitized. |
|
220 | - * |
|
221 | - * @return array |
|
222 | - */ |
|
223 | - public function getPluginInfo() |
|
224 | - { |
|
225 | - return [ |
|
226 | - 'name' => $this->getPluginName(), |
|
227 | - 'description' => 'This plugin implements WebDAV resource sharing', |
|
228 | - 'link' => 'https://github.com/evert/webdav-sharing', |
|
229 | - ]; |
|
230 | - } |
|
231 | - |
|
232 | - /** |
|
233 | - * This method is used to generate HTML output for the |
|
234 | - * DAV\Browser\Plugin. |
|
235 | - * |
|
236 | - * @param string $output |
|
237 | - * @param string $path |
|
238 | - * |
|
239 | - * @return bool|null |
|
240 | - */ |
|
241 | - public function htmlActionsPanel(INode $node, &$output, $path) |
|
242 | - { |
|
243 | - if (!$node instanceof ISharedNode) { |
|
244 | - return; |
|
245 | - } |
|
246 | - |
|
247 | - $aclPlugin = $this->server->getPlugin('acl'); |
|
248 | - if ($aclPlugin) { |
|
249 | - if (!$aclPlugin->checkPrivileges($path, '{DAV:}share', \Sabre\DAVACL\Plugin::R_PARENT, false)) { |
|
250 | - // Sharing is not permitted, we will not draw this interface. |
|
251 | - return; |
|
252 | - } |
|
253 | - } |
|
254 | - |
|
255 | - $output .= '<tr><td colspan="2"><form method="post" action=""> |
|
31 | + const ACCESS_NOTSHARED = 0; |
|
32 | + const ACCESS_SHAREDOWNER = 1; |
|
33 | + const ACCESS_READ = 2; |
|
34 | + const ACCESS_READWRITE = 3; |
|
35 | + const ACCESS_NOACCESS = 4; |
|
36 | + |
|
37 | + const INVITE_NORESPONSE = 1; |
|
38 | + const INVITE_ACCEPTED = 2; |
|
39 | + const INVITE_DECLINED = 3; |
|
40 | + const INVITE_INVALID = 4; |
|
41 | + |
|
42 | + /** |
|
43 | + * Reference to SabreDAV server object. |
|
44 | + * |
|
45 | + * @var Server |
|
46 | + */ |
|
47 | + protected $server; |
|
48 | + |
|
49 | + /** |
|
50 | + * This method should return a list of server-features. |
|
51 | + * |
|
52 | + * This is for example 'versioning' and is added to the DAV: header |
|
53 | + * in an OPTIONS response. |
|
54 | + * |
|
55 | + * @return array |
|
56 | + */ |
|
57 | + public function getFeatures() |
|
58 | + { |
|
59 | + return ['resource-sharing']; |
|
60 | + } |
|
61 | + |
|
62 | + /** |
|
63 | + * Returns a plugin name. |
|
64 | + * |
|
65 | + * Using this name other plugins will be able to access other plugins |
|
66 | + * using \Sabre\DAV\Server::getPlugin |
|
67 | + * |
|
68 | + * @return string |
|
69 | + */ |
|
70 | + public function getPluginName() |
|
71 | + { |
|
72 | + return 'sharing'; |
|
73 | + } |
|
74 | + |
|
75 | + /** |
|
76 | + * This initializes the plugin. |
|
77 | + * |
|
78 | + * This function is called by Sabre\DAV\Server, after |
|
79 | + * addPlugin is called. |
|
80 | + * |
|
81 | + * This method should set up the required event subscriptions. |
|
82 | + */ |
|
83 | + public function initialize(Server $server) |
|
84 | + { |
|
85 | + $this->server = $server; |
|
86 | + |
|
87 | + $server->xml->elementMap['{DAV:}share-resource'] = 'Sabre\\DAV\\Xml\\Request\\ShareResource'; |
|
88 | + |
|
89 | + array_push( |
|
90 | + $server->protectedProperties, |
|
91 | + '{DAV:}share-mode' |
|
92 | + ); |
|
93 | + |
|
94 | + $server->on('method:POST', [$this, 'httpPost']); |
|
95 | + $server->on('propFind', [$this, 'propFind']); |
|
96 | + $server->on('getSupportedPrivilegeSet', [$this, 'getSupportedPrivilegeSet']); |
|
97 | + $server->on('onHTMLActionsPanel', [$this, 'htmlActionsPanel']); |
|
98 | + $server->on('onBrowserPostAction', [$this, 'browserPostAction']); |
|
99 | + } |
|
100 | + |
|
101 | + /** |
|
102 | + * Updates the list of sharees on a shared resource. |
|
103 | + * |
|
104 | + * The sharees array is a list of people that are to be added modified |
|
105 | + * or removed in the list of shares. |
|
106 | + * |
|
107 | + * @param string $path |
|
108 | + * @param Sharee[] $sharees |
|
109 | + */ |
|
110 | + public function shareResource($path, array $sharees) |
|
111 | + { |
|
112 | + $node = $this->server->tree->getNodeForPath($path); |
|
113 | + |
|
114 | + if (!$node instanceof ISharedNode) { |
|
115 | + throw new Forbidden('Sharing is not allowed on this node'); |
|
116 | + } |
|
117 | + |
|
118 | + // Getting ACL info |
|
119 | + $acl = $this->server->getPlugin('acl'); |
|
120 | + |
|
121 | + // If there's no ACL support, we allow everything |
|
122 | + if ($acl) { |
|
123 | + $acl->checkPrivileges($path, '{DAV:}share'); |
|
124 | + } |
|
125 | + |
|
126 | + foreach ($sharees as $sharee) { |
|
127 | + // We're going to attempt to get a local principal uri for a share |
|
128 | + // href by emitting the getPrincipalByUri event. |
|
129 | + $principal = null; |
|
130 | + $this->server->emit('getPrincipalByUri', [$sharee->href, &$principal]); |
|
131 | + $sharee->principal = $principal; |
|
132 | + } |
|
133 | + $node->updateInvites($sharees); |
|
134 | + } |
|
135 | + |
|
136 | + /** |
|
137 | + * This event is triggered when properties are requested for nodes. |
|
138 | + * |
|
139 | + * This allows us to inject any sharings-specific properties. |
|
140 | + */ |
|
141 | + public function propFind(PropFind $propFind, INode $node) |
|
142 | + { |
|
143 | + if ($node instanceof ISharedNode) { |
|
144 | + $propFind->handle('{DAV:}share-access', function () use ($node) { |
|
145 | + return new Property\ShareAccess($node->getShareAccess()); |
|
146 | + }); |
|
147 | + $propFind->handle('{DAV:}invite', function () use ($node) { |
|
148 | + return new Property\Invite($node->getInvites()); |
|
149 | + }); |
|
150 | + $propFind->handle('{DAV:}share-resource-uri', function () use ($node) { |
|
151 | + return new Property\Href($node->getShareResourceUri()); |
|
152 | + }); |
|
153 | + } |
|
154 | + } |
|
155 | + |
|
156 | + /** |
|
157 | + * We intercept this to handle POST requests on shared resources. |
|
158 | + * |
|
159 | + * @return bool|null |
|
160 | + */ |
|
161 | + public function httpPost(RequestInterface $request, ResponseInterface $response) |
|
162 | + { |
|
163 | + $path = $request->getPath(); |
|
164 | + $contentType = $request->getHeader('Content-Type'); |
|
165 | + if (null === $contentType) { |
|
166 | + return; |
|
167 | + } |
|
168 | + |
|
169 | + // We're only interested in the davsharing content type. |
|
170 | + if (false === strpos($contentType, 'application/davsharing+xml')) { |
|
171 | + return; |
|
172 | + } |
|
173 | + |
|
174 | + $message = $this->server->xml->parse( |
|
175 | + $request->getBody(), |
|
176 | + $request->getUrl(), |
|
177 | + $documentType |
|
178 | + ); |
|
179 | + |
|
180 | + switch ($documentType) { |
|
181 | + case '{DAV:}share-resource': |
|
182 | + $this->shareResource($path, $message->sharees); |
|
183 | + $response->setStatus(200); |
|
184 | + // Adding this because sending a response body may cause issues, |
|
185 | + // and I wanted some type of indicator the response was handled. |
|
186 | + $response->setHeader('X-Sabre-Status', 'everything-went-well'); |
|
187 | + |
|
188 | + // Breaking the event chain |
|
189 | + return false; |
|
190 | + |
|
191 | + default: |
|
192 | + throw new BadRequest('Unexpected document type: '.$documentType.' for this Content-Type'); |
|
193 | + } |
|
194 | + } |
|
195 | + |
|
196 | + /** |
|
197 | + * This method is triggered whenever a subsystem reqeuests the privileges |
|
198 | + * hat are supported on a particular node. |
|
199 | + * |
|
200 | + * We need to add a number of privileges for scheduling purposes. |
|
201 | + */ |
|
202 | + public function getSupportedPrivilegeSet(INode $node, array &$supportedPrivilegeSet) |
|
203 | + { |
|
204 | + if ($node instanceof ISharedNode) { |
|
205 | + $supportedPrivilegeSet['{DAV:}share'] = [ |
|
206 | + 'abstract' => false, |
|
207 | + 'aggregates' => [], |
|
208 | + ]; |
|
209 | + } |
|
210 | + } |
|
211 | + |
|
212 | + /** |
|
213 | + * Returns a bunch of meta-data about the plugin. |
|
214 | + * |
|
215 | + * Providing this information is optional, and is mainly displayed by the |
|
216 | + * Browser plugin. |
|
217 | + * |
|
218 | + * The description key in the returned array may contain html and will not |
|
219 | + * be sanitized. |
|
220 | + * |
|
221 | + * @return array |
|
222 | + */ |
|
223 | + public function getPluginInfo() |
|
224 | + { |
|
225 | + return [ |
|
226 | + 'name' => $this->getPluginName(), |
|
227 | + 'description' => 'This plugin implements WebDAV resource sharing', |
|
228 | + 'link' => 'https://github.com/evert/webdav-sharing', |
|
229 | + ]; |
|
230 | + } |
|
231 | + |
|
232 | + /** |
|
233 | + * This method is used to generate HTML output for the |
|
234 | + * DAV\Browser\Plugin. |
|
235 | + * |
|
236 | + * @param string $output |
|
237 | + * @param string $path |
|
238 | + * |
|
239 | + * @return bool|null |
|
240 | + */ |
|
241 | + public function htmlActionsPanel(INode $node, &$output, $path) |
|
242 | + { |
|
243 | + if (!$node instanceof ISharedNode) { |
|
244 | + return; |
|
245 | + } |
|
246 | + |
|
247 | + $aclPlugin = $this->server->getPlugin('acl'); |
|
248 | + if ($aclPlugin) { |
|
249 | + if (!$aclPlugin->checkPrivileges($path, '{DAV:}share', \Sabre\DAVACL\Plugin::R_PARENT, false)) { |
|
250 | + // Sharing is not permitted, we will not draw this interface. |
|
251 | + return; |
|
252 | + } |
|
253 | + } |
|
254 | + |
|
255 | + $output .= '<tr><td colspan="2"><form method="post" action=""> |
|
256 | 256 | <h3>Share this resource</h3> |
257 | 257 | <input type="hidden" name="sabreAction" value="share" /> |
258 | 258 | <label>Share with (uri):</label> <input type="text" name="href" placeholder="mailto:[email protected]"/><br /> |
@@ -265,48 +265,48 @@ discard block |
||
265 | 265 | <input type="submit" value="share" /> |
266 | 266 | </form> |
267 | 267 | </td></tr>'; |
268 | - } |
|
269 | - |
|
270 | - /** |
|
271 | - * This method is triggered for POST actions generated by the browser |
|
272 | - * plugin. |
|
273 | - * |
|
274 | - * @param string $path |
|
275 | - * @param string $action |
|
276 | - * @param array $postVars |
|
277 | - */ |
|
278 | - public function browserPostAction($path, $action, $postVars) |
|
279 | - { |
|
280 | - if ('share' !== $action) { |
|
281 | - return; |
|
282 | - } |
|
283 | - |
|
284 | - if (empty($postVars['href'])) { |
|
285 | - throw new BadRequest('The "href" POST parameter is required'); |
|
286 | - } |
|
287 | - if (empty($postVars['access'])) { |
|
288 | - throw new BadRequest('The "access" POST parameter is required'); |
|
289 | - } |
|
290 | - |
|
291 | - $accessMap = [ |
|
292 | - 'readwrite' => self::ACCESS_READWRITE, |
|
293 | - 'read' => self::ACCESS_READ, |
|
294 | - 'no-access' => self::ACCESS_NOACCESS, |
|
295 | - ]; |
|
296 | - |
|
297 | - if (!isset($accessMap[$postVars['access']])) { |
|
298 | - throw new BadRequest('The "access" POST must be readwrite, read or no-access'); |
|
299 | - } |
|
300 | - $sharee = new Sharee([ |
|
301 | - 'href' => $postVars['href'], |
|
302 | - 'access' => $accessMap[$postVars['access']], |
|
303 | - ]); |
|
304 | - |
|
305 | - $this->shareResource( |
|
306 | - $path, |
|
307 | - [$sharee] |
|
308 | - ); |
|
309 | - |
|
310 | - return false; |
|
311 | - } |
|
268 | + } |
|
269 | + |
|
270 | + /** |
|
271 | + * This method is triggered for POST actions generated by the browser |
|
272 | + * plugin. |
|
273 | + * |
|
274 | + * @param string $path |
|
275 | + * @param string $action |
|
276 | + * @param array $postVars |
|
277 | + */ |
|
278 | + public function browserPostAction($path, $action, $postVars) |
|
279 | + { |
|
280 | + if ('share' !== $action) { |
|
281 | + return; |
|
282 | + } |
|
283 | + |
|
284 | + if (empty($postVars['href'])) { |
|
285 | + throw new BadRequest('The "href" POST parameter is required'); |
|
286 | + } |
|
287 | + if (empty($postVars['access'])) { |
|
288 | + throw new BadRequest('The "access" POST parameter is required'); |
|
289 | + } |
|
290 | + |
|
291 | + $accessMap = [ |
|
292 | + 'readwrite' => self::ACCESS_READWRITE, |
|
293 | + 'read' => self::ACCESS_READ, |
|
294 | + 'no-access' => self::ACCESS_NOACCESS, |
|
295 | + ]; |
|
296 | + |
|
297 | + if (!isset($accessMap[$postVars['access']])) { |
|
298 | + throw new BadRequest('The "access" POST must be readwrite, read or no-access'); |
|
299 | + } |
|
300 | + $sharee = new Sharee([ |
|
301 | + 'href' => $postVars['href'], |
|
302 | + 'access' => $accessMap[$postVars['access']], |
|
303 | + ]); |
|
304 | + |
|
305 | + $this->shareResource( |
|
306 | + $path, |
|
307 | + [$sharee] |
|
308 | + ); |
|
309 | + |
|
310 | + return false; |
|
311 | + } |
|
312 | 312 | } |
@@ -141,13 +141,13 @@ |
||
141 | 141 | public function propFind(PropFind $propFind, INode $node) |
142 | 142 | { |
143 | 143 | if ($node instanceof ISharedNode) { |
144 | - $propFind->handle('{DAV:}share-access', function () use ($node) { |
|
144 | + $propFind->handle('{DAV:}share-access', function() use ($node) { |
|
145 | 145 | return new Property\ShareAccess($node->getShareAccess()); |
146 | 146 | }); |
147 | - $propFind->handle('{DAV:}invite', function () use ($node) { |
|
147 | + $propFind->handle('{DAV:}invite', function() use ($node) { |
|
148 | 148 | return new Property\Invite($node->getInvites()); |
149 | 149 | }); |
150 | - $propFind->handle('{DAV:}share-resource-uri', function () use ($node) { |
|
150 | + $propFind->handle('{DAV:}share-resource-uri', function() use ($node) { |
|
151 | 151 | return new Property\Href($node->getShareResourceUri()); |
152 | 152 | }); |
153 | 153 | } |
@@ -17,53 +17,53 @@ |
||
17 | 17 | */ |
18 | 18 | interface ISharedNode extends INode |
19 | 19 | { |
20 | - /** |
|
21 | - * Returns the 'access level' for the instance of this shared resource. |
|
22 | - * |
|
23 | - * The value should be one of the Sabre\DAV\Sharing\Plugin::ACCESS_ |
|
24 | - * constants. |
|
25 | - * |
|
26 | - * @return int |
|
27 | - */ |
|
28 | - public function getShareAccess(); |
|
20 | + /** |
|
21 | + * Returns the 'access level' for the instance of this shared resource. |
|
22 | + * |
|
23 | + * The value should be one of the Sabre\DAV\Sharing\Plugin::ACCESS_ |
|
24 | + * constants. |
|
25 | + * |
|
26 | + * @return int |
|
27 | + */ |
|
28 | + public function getShareAccess(); |
|
29 | 29 | |
30 | - /** |
|
31 | - * This function must return a URI that uniquely identifies the shared |
|
32 | - * resource. This URI should be identical across instances, and is |
|
33 | - * also used in several other XML bodies to connect invites to |
|
34 | - * resources. |
|
35 | - * |
|
36 | - * This may simply be a relative reference to the original shared instance, |
|
37 | - * but it could also be a urn. As long as it's a valid URI and unique. |
|
38 | - * |
|
39 | - * @return string |
|
40 | - */ |
|
41 | - public function getShareResourceUri(); |
|
30 | + /** |
|
31 | + * This function must return a URI that uniquely identifies the shared |
|
32 | + * resource. This URI should be identical across instances, and is |
|
33 | + * also used in several other XML bodies to connect invites to |
|
34 | + * resources. |
|
35 | + * |
|
36 | + * This may simply be a relative reference to the original shared instance, |
|
37 | + * but it could also be a urn. As long as it's a valid URI and unique. |
|
38 | + * |
|
39 | + * @return string |
|
40 | + */ |
|
41 | + public function getShareResourceUri(); |
|
42 | 42 | |
43 | - /** |
|
44 | - * Updates the list of sharees. |
|
45 | - * |
|
46 | - * Every item must be a Sharee object. |
|
47 | - * |
|
48 | - * @param \Sabre\DAV\Xml\Element\Sharee[] $sharees |
|
49 | - */ |
|
50 | - public function updateInvites(array $sharees); |
|
43 | + /** |
|
44 | + * Updates the list of sharees. |
|
45 | + * |
|
46 | + * Every item must be a Sharee object. |
|
47 | + * |
|
48 | + * @param \Sabre\DAV\Xml\Element\Sharee[] $sharees |
|
49 | + */ |
|
50 | + public function updateInvites(array $sharees); |
|
51 | 51 | |
52 | - /** |
|
53 | - * Returns the list of people whom this resource is shared with. |
|
54 | - * |
|
55 | - * Every item in the returned array must be a Sharee object with |
|
56 | - * at least the following properties set: |
|
57 | - * |
|
58 | - * * $href |
|
59 | - * * $shareAccess |
|
60 | - * * $inviteStatus |
|
61 | - * |
|
62 | - * and optionally: |
|
63 | - * |
|
64 | - * * $properties |
|
65 | - * |
|
66 | - * @return \Sabre\DAV\Xml\Element\Sharee[] |
|
67 | - */ |
|
68 | - public function getInvites(); |
|
52 | + /** |
|
53 | + * Returns the list of people whom this resource is shared with. |
|
54 | + * |
|
55 | + * Every item in the returned array must be a Sharee object with |
|
56 | + * at least the following properties set: |
|
57 | + * |
|
58 | + * * $href |
|
59 | + * * $shareAccess |
|
60 | + * * $inviteStatus |
|
61 | + * |
|
62 | + * and optionally: |
|
63 | + * |
|
64 | + * * $properties |
|
65 | + * |
|
66 | + * @return \Sabre\DAV\Xml\Element\Sharee[] |
|
67 | + */ |
|
68 | + public function getInvites(); |
|
69 | 69 | } |
@@ -13,32 +13,32 @@ |
||
13 | 13 | */ |
14 | 14 | interface INode |
15 | 15 | { |
16 | - /** |
|
17 | - * Deleted the current node. |
|
18 | - */ |
|
19 | - public function delete(); |
|
16 | + /** |
|
17 | + * Deleted the current node. |
|
18 | + */ |
|
19 | + public function delete(); |
|
20 | 20 | |
21 | - /** |
|
22 | - * Returns the name of the node. |
|
23 | - * |
|
24 | - * This is used to generate the url. |
|
25 | - * |
|
26 | - * @return string |
|
27 | - */ |
|
28 | - public function getName(); |
|
21 | + /** |
|
22 | + * Returns the name of the node. |
|
23 | + * |
|
24 | + * This is used to generate the url. |
|
25 | + * |
|
26 | + * @return string |
|
27 | + */ |
|
28 | + public function getName(); |
|
29 | 29 | |
30 | - /** |
|
31 | - * Renames the node. |
|
32 | - * |
|
33 | - * @param string $name The new name |
|
34 | - */ |
|
35 | - public function setName($name); |
|
30 | + /** |
|
31 | + * Renames the node. |
|
32 | + * |
|
33 | + * @param string $name The new name |
|
34 | + */ |
|
35 | + public function setName($name); |
|
36 | 36 | |
37 | - /** |
|
38 | - * Returns the last modification time, as a unix timestamp. Return null |
|
39 | - * if the information is not available. |
|
40 | - * |
|
41 | - * @return int|null |
|
42 | - */ |
|
43 | - public function getLastModified(); |
|
37 | + /** |
|
38 | + * Returns the last modification time, as a unix timestamp. Return null |
|
39 | + * if the information is not available. |
|
40 | + * |
|
41 | + * @return int|null |
|
42 | + */ |
|
43 | + public function getLastModified(); |
|
44 | 44 | } |
@@ -24,249 +24,249 @@ |
||
24 | 24 | */ |
25 | 25 | class TimeZoneUtil |
26 | 26 | { |
27 | - /** @var self */ |
|
28 | - private static $instance = null; |
|
27 | + /** @var self */ |
|
28 | + private static $instance = null; |
|
29 | 29 | |
30 | - /** @var TimezoneGuesser[] */ |
|
31 | - private $timezoneGuessers = []; |
|
30 | + /** @var TimezoneGuesser[] */ |
|
31 | + private $timezoneGuessers = []; |
|
32 | 32 | |
33 | - /** @var TimezoneFinder[] */ |
|
34 | - private $timezoneFinders = []; |
|
33 | + /** @var TimezoneFinder[] */ |
|
34 | + private $timezoneFinders = []; |
|
35 | 35 | |
36 | - private function __construct() |
|
37 | - { |
|
38 | - $this->addGuesser('lic', new GuessFromLicEntry()); |
|
39 | - $this->addGuesser('msTzId', new GuessFromMsTzId()); |
|
40 | - $this->addFinder('tzid', new FindFromTimezoneIdentifier()); |
|
41 | - $this->addFinder('tzmap', new FindFromTimezoneMap()); |
|
42 | - $this->addFinder('offset', new FindFromOffset()); |
|
43 | - } |
|
36 | + private function __construct() |
|
37 | + { |
|
38 | + $this->addGuesser('lic', new GuessFromLicEntry()); |
|
39 | + $this->addGuesser('msTzId', new GuessFromMsTzId()); |
|
40 | + $this->addFinder('tzid', new FindFromTimezoneIdentifier()); |
|
41 | + $this->addFinder('tzmap', new FindFromTimezoneMap()); |
|
42 | + $this->addFinder('offset', new FindFromOffset()); |
|
43 | + } |
|
44 | 44 | |
45 | - private static function getInstance(): self |
|
46 | - { |
|
47 | - if (null === self::$instance) { |
|
48 | - self::$instance = new self(); |
|
49 | - } |
|
45 | + private static function getInstance(): self |
|
46 | + { |
|
47 | + if (null === self::$instance) { |
|
48 | + self::$instance = new self(); |
|
49 | + } |
|
50 | 50 | |
51 | - return self::$instance; |
|
52 | - } |
|
51 | + return self::$instance; |
|
52 | + } |
|
53 | 53 | |
54 | - private function addGuesser(string $key, TimezoneGuesser $guesser): void |
|
55 | - { |
|
56 | - $this->timezoneGuessers[$key] = $guesser; |
|
57 | - } |
|
54 | + private function addGuesser(string $key, TimezoneGuesser $guesser): void |
|
55 | + { |
|
56 | + $this->timezoneGuessers[$key] = $guesser; |
|
57 | + } |
|
58 | 58 | |
59 | - private function addFinder(string $key, TimezoneFinder $finder): void |
|
60 | - { |
|
61 | - $this->timezoneFinders[$key] = $finder; |
|
62 | - } |
|
59 | + private function addFinder(string $key, TimezoneFinder $finder): void |
|
60 | + { |
|
61 | + $this->timezoneFinders[$key] = $finder; |
|
62 | + } |
|
63 | 63 | |
64 | - /** |
|
65 | - * This method will try to find out the correct timezone for an iCalendar |
|
66 | - * date-time value. |
|
67 | - * |
|
68 | - * You must pass the contents of the TZID parameter, as well as the full |
|
69 | - * calendar. |
|
70 | - * |
|
71 | - * If the lookup fails, this method will return the default PHP timezone |
|
72 | - * (as configured using date_default_timezone_set, or the date.timezone ini |
|
73 | - * setting). |
|
74 | - * |
|
75 | - * Alternatively, if $failIfUncertain is set to true, it will throw an |
|
76 | - * exception if we cannot accurately determine the timezone. |
|
77 | - */ |
|
78 | - private function findTimeZone(string $tzid, Component $vcalendar = null, bool $failIfUncertain = false): DateTimeZone |
|
79 | - { |
|
80 | - foreach ($this->timezoneFinders as $timezoneFinder) { |
|
81 | - $timezone = $timezoneFinder->find($tzid, $failIfUncertain); |
|
82 | - if (!$timezone instanceof DateTimeZone) { |
|
83 | - continue; |
|
84 | - } |
|
64 | + /** |
|
65 | + * This method will try to find out the correct timezone for an iCalendar |
|
66 | + * date-time value. |
|
67 | + * |
|
68 | + * You must pass the contents of the TZID parameter, as well as the full |
|
69 | + * calendar. |
|
70 | + * |
|
71 | + * If the lookup fails, this method will return the default PHP timezone |
|
72 | + * (as configured using date_default_timezone_set, or the date.timezone ini |
|
73 | + * setting). |
|
74 | + * |
|
75 | + * Alternatively, if $failIfUncertain is set to true, it will throw an |
|
76 | + * exception if we cannot accurately determine the timezone. |
|
77 | + */ |
|
78 | + private function findTimeZone(string $tzid, Component $vcalendar = null, bool $failIfUncertain = false): DateTimeZone |
|
79 | + { |
|
80 | + foreach ($this->timezoneFinders as $timezoneFinder) { |
|
81 | + $timezone = $timezoneFinder->find($tzid, $failIfUncertain); |
|
82 | + if (!$timezone instanceof DateTimeZone) { |
|
83 | + continue; |
|
84 | + } |
|
85 | 85 | |
86 | - return $timezone; |
|
87 | - } |
|
86 | + return $timezone; |
|
87 | + } |
|
88 | 88 | |
89 | - if ($vcalendar) { |
|
90 | - // If that didn't work, we will scan VTIMEZONE objects |
|
91 | - foreach ($vcalendar->select('VTIMEZONE') as $vtimezone) { |
|
92 | - if ((string) $vtimezone->TZID === $tzid) { |
|
93 | - foreach ($this->timezoneGuessers as $timezoneGuesser) { |
|
94 | - $timezone = $timezoneGuesser->guess($vtimezone, $failIfUncertain); |
|
95 | - if (!$timezone instanceof DateTimeZone) { |
|
96 | - continue; |
|
97 | - } |
|
89 | + if ($vcalendar) { |
|
90 | + // If that didn't work, we will scan VTIMEZONE objects |
|
91 | + foreach ($vcalendar->select('VTIMEZONE') as $vtimezone) { |
|
92 | + if ((string) $vtimezone->TZID === $tzid) { |
|
93 | + foreach ($this->timezoneGuessers as $timezoneGuesser) { |
|
94 | + $timezone = $timezoneGuesser->guess($vtimezone, $failIfUncertain); |
|
95 | + if (!$timezone instanceof DateTimeZone) { |
|
96 | + continue; |
|
97 | + } |
|
98 | 98 | |
99 | - return $timezone; |
|
100 | - } |
|
101 | - } |
|
102 | - } |
|
103 | - } |
|
99 | + return $timezone; |
|
100 | + } |
|
101 | + } |
|
102 | + } |
|
103 | + } |
|
104 | 104 | |
105 | - if ($failIfUncertain) { |
|
106 | - throw new InvalidArgumentException('We were unable to determine the correct PHP timezone for tzid: '.$tzid); |
|
107 | - } |
|
105 | + if ($failIfUncertain) { |
|
106 | + throw new InvalidArgumentException('We were unable to determine the correct PHP timezone for tzid: '.$tzid); |
|
107 | + } |
|
108 | 108 | |
109 | - // If we got all the way here, we default to whatever has been set as the PHP default timezone. |
|
110 | - return new DateTimeZone(date_default_timezone_get()); |
|
111 | - } |
|
109 | + // If we got all the way here, we default to whatever has been set as the PHP default timezone. |
|
110 | + return new DateTimeZone(date_default_timezone_get()); |
|
111 | + } |
|
112 | 112 | |
113 | - public static function addTimezoneGuesser(string $key, TimezoneGuesser $guesser): void |
|
114 | - { |
|
115 | - self::getInstance()->addGuesser($key, $guesser); |
|
116 | - } |
|
113 | + public static function addTimezoneGuesser(string $key, TimezoneGuesser $guesser): void |
|
114 | + { |
|
115 | + self::getInstance()->addGuesser($key, $guesser); |
|
116 | + } |
|
117 | 117 | |
118 | - public static function addTimezoneFinder(string $key, TimezoneFinder $finder): void |
|
119 | - { |
|
120 | - self::getInstance()->addFinder($key, $finder); |
|
121 | - } |
|
118 | + public static function addTimezoneFinder(string $key, TimezoneFinder $finder): void |
|
119 | + { |
|
120 | + self::getInstance()->addFinder($key, $finder); |
|
121 | + } |
|
122 | 122 | |
123 | - /** |
|
124 | - * @param string $tzid |
|
125 | - * @param false $failIfUncertain |
|
126 | - * |
|
127 | - * @return DateTimeZone |
|
128 | - */ |
|
129 | - public static function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) |
|
130 | - { |
|
131 | - return self::getInstance()->findTimeZone($tzid, $vcalendar, $failIfUncertain); |
|
132 | - } |
|
123 | + /** |
|
124 | + * @param string $tzid |
|
125 | + * @param false $failIfUncertain |
|
126 | + * |
|
127 | + * @return DateTimeZone |
|
128 | + */ |
|
129 | + public static function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) |
|
130 | + { |
|
131 | + return self::getInstance()->findTimeZone($tzid, $vcalendar, $failIfUncertain); |
|
132 | + } |
|
133 | 133 | |
134 | - public static function clean(): void |
|
135 | - { |
|
136 | - self::$instance = null; |
|
137 | - } |
|
134 | + public static function clean(): void |
|
135 | + { |
|
136 | + self::$instance = null; |
|
137 | + } |
|
138 | 138 | |
139 | - // Keeping things for backwards compatibility |
|
140 | - /** |
|
141 | - * @var array|null |
|
142 | - * |
|
143 | - * @deprecated |
|
144 | - */ |
|
145 | - public static $map = null; |
|
139 | + // Keeping things for backwards compatibility |
|
140 | + /** |
|
141 | + * @var array|null |
|
142 | + * |
|
143 | + * @deprecated |
|
144 | + */ |
|
145 | + public static $map = null; |
|
146 | 146 | |
147 | - /** |
|
148 | - * List of microsoft exchange timezone ids. |
|
149 | - * |
|
150 | - * Source: http://msdn.microsoft.com/en-us/library/aa563018(loband).aspx |
|
151 | - * |
|
152 | - * @deprecated |
|
153 | - */ |
|
154 | - public static $microsoftExchangeMap = [ |
|
155 | - 0 => 'UTC', |
|
156 | - 31 => 'Africa/Casablanca', |
|
157 | - // Insanely, id #2 is used for both Europe/Lisbon, and Europe/Sarajevo. |
|
158 | - // I'm not even kidding.. We handle this special case in the |
|
159 | - // getTimeZone method. |
|
160 | - 2 => 'Europe/Lisbon', |
|
161 | - 1 => 'Europe/London', |
|
162 | - 4 => 'Europe/Berlin', |
|
163 | - 6 => 'Europe/Prague', |
|
164 | - 3 => 'Europe/Paris', |
|
165 | - 69 => 'Africa/Luanda', // This was a best guess |
|
166 | - 7 => 'Europe/Athens', |
|
167 | - 5 => 'Europe/Bucharest', |
|
168 | - 49 => 'Africa/Cairo', |
|
169 | - 50 => 'Africa/Harare', |
|
170 | - 59 => 'Europe/Helsinki', |
|
171 | - 27 => 'Asia/Jerusalem', |
|
172 | - 26 => 'Asia/Baghdad', |
|
173 | - 74 => 'Asia/Kuwait', |
|
174 | - 51 => 'Europe/Moscow', |
|
175 | - 56 => 'Africa/Nairobi', |
|
176 | - 25 => 'Asia/Tehran', |
|
177 | - 24 => 'Asia/Muscat', // Best guess |
|
178 | - 54 => 'Asia/Baku', |
|
179 | - 48 => 'Asia/Kabul', |
|
180 | - 58 => 'Asia/Yekaterinburg', |
|
181 | - 47 => 'Asia/Karachi', |
|
182 | - 23 => 'Asia/Calcutta', |
|
183 | - 62 => 'Asia/Kathmandu', |
|
184 | - 46 => 'Asia/Almaty', |
|
185 | - 71 => 'Asia/Dhaka', |
|
186 | - 66 => 'Asia/Colombo', |
|
187 | - 61 => 'Asia/Rangoon', |
|
188 | - 22 => 'Asia/Bangkok', |
|
189 | - 64 => 'Asia/Krasnoyarsk', |
|
190 | - 45 => 'Asia/Shanghai', |
|
191 | - 63 => 'Asia/Irkutsk', |
|
192 | - 21 => 'Asia/Singapore', |
|
193 | - 73 => 'Australia/Perth', |
|
194 | - 75 => 'Asia/Taipei', |
|
195 | - 20 => 'Asia/Tokyo', |
|
196 | - 72 => 'Asia/Seoul', |
|
197 | - 70 => 'Asia/Yakutsk', |
|
198 | - 19 => 'Australia/Adelaide', |
|
199 | - 44 => 'Australia/Darwin', |
|
200 | - 18 => 'Australia/Brisbane', |
|
201 | - 76 => 'Australia/Sydney', |
|
202 | - 43 => 'Pacific/Guam', |
|
203 | - 42 => 'Australia/Hobart', |
|
204 | - 68 => 'Asia/Vladivostok', |
|
205 | - 41 => 'Asia/Magadan', |
|
206 | - 17 => 'Pacific/Auckland', |
|
207 | - 40 => 'Pacific/Fiji', |
|
208 | - 67 => 'Pacific/Tongatapu', |
|
209 | - 29 => 'Atlantic/Azores', |
|
210 | - 53 => 'Atlantic/Cape_Verde', |
|
211 | - 30 => 'America/Noronha', |
|
212 | - 8 => 'America/Sao_Paulo', // Best guess |
|
213 | - 32 => 'America/Argentina/Buenos_Aires', |
|
214 | - 60 => 'America/Godthab', |
|
215 | - 28 => 'America/St_Johns', |
|
216 | - 9 => 'America/Halifax', |
|
217 | - 33 => 'America/Caracas', |
|
218 | - 65 => 'America/Santiago', |
|
219 | - 35 => 'America/Bogota', |
|
220 | - 10 => 'America/New_York', |
|
221 | - 34 => 'America/Indiana/Indianapolis', |
|
222 | - 55 => 'America/Guatemala', |
|
223 | - 11 => 'America/Chicago', |
|
224 | - 37 => 'America/Mexico_City', |
|
225 | - 36 => 'America/Edmonton', |
|
226 | - 38 => 'America/Phoenix', |
|
227 | - 12 => 'America/Denver', // Best guess |
|
228 | - 13 => 'America/Los_Angeles', // Best guess |
|
229 | - 14 => 'America/Anchorage', |
|
230 | - 15 => 'Pacific/Honolulu', |
|
231 | - 16 => 'Pacific/Midway', |
|
232 | - 39 => 'Pacific/Kwajalein', |
|
233 | - ]; |
|
147 | + /** |
|
148 | + * List of microsoft exchange timezone ids. |
|
149 | + * |
|
150 | + * Source: http://msdn.microsoft.com/en-us/library/aa563018(loband).aspx |
|
151 | + * |
|
152 | + * @deprecated |
|
153 | + */ |
|
154 | + public static $microsoftExchangeMap = [ |
|
155 | + 0 => 'UTC', |
|
156 | + 31 => 'Africa/Casablanca', |
|
157 | + // Insanely, id #2 is used for both Europe/Lisbon, and Europe/Sarajevo. |
|
158 | + // I'm not even kidding.. We handle this special case in the |
|
159 | + // getTimeZone method. |
|
160 | + 2 => 'Europe/Lisbon', |
|
161 | + 1 => 'Europe/London', |
|
162 | + 4 => 'Europe/Berlin', |
|
163 | + 6 => 'Europe/Prague', |
|
164 | + 3 => 'Europe/Paris', |
|
165 | + 69 => 'Africa/Luanda', // This was a best guess |
|
166 | + 7 => 'Europe/Athens', |
|
167 | + 5 => 'Europe/Bucharest', |
|
168 | + 49 => 'Africa/Cairo', |
|
169 | + 50 => 'Africa/Harare', |
|
170 | + 59 => 'Europe/Helsinki', |
|
171 | + 27 => 'Asia/Jerusalem', |
|
172 | + 26 => 'Asia/Baghdad', |
|
173 | + 74 => 'Asia/Kuwait', |
|
174 | + 51 => 'Europe/Moscow', |
|
175 | + 56 => 'Africa/Nairobi', |
|
176 | + 25 => 'Asia/Tehran', |
|
177 | + 24 => 'Asia/Muscat', // Best guess |
|
178 | + 54 => 'Asia/Baku', |
|
179 | + 48 => 'Asia/Kabul', |
|
180 | + 58 => 'Asia/Yekaterinburg', |
|
181 | + 47 => 'Asia/Karachi', |
|
182 | + 23 => 'Asia/Calcutta', |
|
183 | + 62 => 'Asia/Kathmandu', |
|
184 | + 46 => 'Asia/Almaty', |
|
185 | + 71 => 'Asia/Dhaka', |
|
186 | + 66 => 'Asia/Colombo', |
|
187 | + 61 => 'Asia/Rangoon', |
|
188 | + 22 => 'Asia/Bangkok', |
|
189 | + 64 => 'Asia/Krasnoyarsk', |
|
190 | + 45 => 'Asia/Shanghai', |
|
191 | + 63 => 'Asia/Irkutsk', |
|
192 | + 21 => 'Asia/Singapore', |
|
193 | + 73 => 'Australia/Perth', |
|
194 | + 75 => 'Asia/Taipei', |
|
195 | + 20 => 'Asia/Tokyo', |
|
196 | + 72 => 'Asia/Seoul', |
|
197 | + 70 => 'Asia/Yakutsk', |
|
198 | + 19 => 'Australia/Adelaide', |
|
199 | + 44 => 'Australia/Darwin', |
|
200 | + 18 => 'Australia/Brisbane', |
|
201 | + 76 => 'Australia/Sydney', |
|
202 | + 43 => 'Pacific/Guam', |
|
203 | + 42 => 'Australia/Hobart', |
|
204 | + 68 => 'Asia/Vladivostok', |
|
205 | + 41 => 'Asia/Magadan', |
|
206 | + 17 => 'Pacific/Auckland', |
|
207 | + 40 => 'Pacific/Fiji', |
|
208 | + 67 => 'Pacific/Tongatapu', |
|
209 | + 29 => 'Atlantic/Azores', |
|
210 | + 53 => 'Atlantic/Cape_Verde', |
|
211 | + 30 => 'America/Noronha', |
|
212 | + 8 => 'America/Sao_Paulo', // Best guess |
|
213 | + 32 => 'America/Argentina/Buenos_Aires', |
|
214 | + 60 => 'America/Godthab', |
|
215 | + 28 => 'America/St_Johns', |
|
216 | + 9 => 'America/Halifax', |
|
217 | + 33 => 'America/Caracas', |
|
218 | + 65 => 'America/Santiago', |
|
219 | + 35 => 'America/Bogota', |
|
220 | + 10 => 'America/New_York', |
|
221 | + 34 => 'America/Indiana/Indianapolis', |
|
222 | + 55 => 'America/Guatemala', |
|
223 | + 11 => 'America/Chicago', |
|
224 | + 37 => 'America/Mexico_City', |
|
225 | + 36 => 'America/Edmonton', |
|
226 | + 38 => 'America/Phoenix', |
|
227 | + 12 => 'America/Denver', // Best guess |
|
228 | + 13 => 'America/Los_Angeles', // Best guess |
|
229 | + 14 => 'America/Anchorage', |
|
230 | + 15 => 'Pacific/Honolulu', |
|
231 | + 16 => 'Pacific/Midway', |
|
232 | + 39 => 'Pacific/Kwajalein', |
|
233 | + ]; |
|
234 | 234 | |
235 | - /** |
|
236 | - * This method will load in all the tz mapping information, if it's not yet |
|
237 | - * done. |
|
238 | - * |
|
239 | - * @deprecated |
|
240 | - */ |
|
241 | - public static function loadTzMaps() |
|
242 | - { |
|
243 | - if (!is_null(self::$map)) { |
|
244 | - return; |
|
245 | - } |
|
235 | + /** |
|
236 | + * This method will load in all the tz mapping information, if it's not yet |
|
237 | + * done. |
|
238 | + * |
|
239 | + * @deprecated |
|
240 | + */ |
|
241 | + public static function loadTzMaps() |
|
242 | + { |
|
243 | + if (!is_null(self::$map)) { |
|
244 | + return; |
|
245 | + } |
|
246 | 246 | |
247 | - self::$map = array_merge( |
|
248 | - include __DIR__.'/timezonedata/windowszones.php', |
|
249 | - include __DIR__.'/timezonedata/lotuszones.php', |
|
250 | - include __DIR__.'/timezonedata/exchangezones.php', |
|
251 | - include __DIR__.'/timezonedata/php-workaround.php' |
|
252 | - ); |
|
253 | - } |
|
247 | + self::$map = array_merge( |
|
248 | + include __DIR__.'/timezonedata/windowszones.php', |
|
249 | + include __DIR__.'/timezonedata/lotuszones.php', |
|
250 | + include __DIR__.'/timezonedata/exchangezones.php', |
|
251 | + include __DIR__.'/timezonedata/php-workaround.php' |
|
252 | + ); |
|
253 | + } |
|
254 | 254 | |
255 | - /** |
|
256 | - * This method returns an array of timezone identifiers, that are supported |
|
257 | - * by DateTimeZone(), but not returned by DateTimeZone::listIdentifiers(). |
|
258 | - * |
|
259 | - * We're not using DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC) because: |
|
260 | - * - It's not supported by some PHP versions as well as HHVM. |
|
261 | - * - It also returns identifiers, that are invalid values for new DateTimeZone() on some PHP versions. |
|
262 | - * (See timezonedata/php-bc.php and timezonedata php-workaround.php) |
|
263 | - * |
|
264 | - * @return array |
|
265 | - * |
|
266 | - * @deprecated |
|
267 | - */ |
|
268 | - public static function getIdentifiersBC() |
|
269 | - { |
|
270 | - return include __DIR__.'/timezonedata/php-bc.php'; |
|
271 | - } |
|
255 | + /** |
|
256 | + * This method returns an array of timezone identifiers, that are supported |
|
257 | + * by DateTimeZone(), but not returned by DateTimeZone::listIdentifiers(). |
|
258 | + * |
|
259 | + * We're not using DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC) because: |
|
260 | + * - It's not supported by some PHP versions as well as HHVM. |
|
261 | + * - It also returns identifiers, that are invalid values for new DateTimeZone() on some PHP versions. |
|
262 | + * (See timezonedata/php-bc.php and timezonedata php-workaround.php) |
|
263 | + * |
|
264 | + * @return array |
|
265 | + * |
|
266 | + * @deprecated |
|
267 | + */ |
|
268 | + public static function getIdentifiersBC() |
|
269 | + { |
|
270 | + return include __DIR__.'/timezonedata/php-bc.php'; |
|
271 | + } |
|
272 | 272 | } |