update sabre/vobject
This commit is contained in:
272
vendor/sabre/vobject/lib/Property.php
vendored
272
vendor/sabre/vobject/lib/Property.php
vendored
@@ -14,8 +14,8 @@ use Sabre\Xml;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
abstract class Property extends Node {
|
||||
|
||||
abstract class Property extends Node
|
||||
{
|
||||
/**
|
||||
* Property name.
|
||||
*
|
||||
@@ -61,16 +61,14 @@ abstract class Property extends Node {
|
||||
*
|
||||
* Parameters must be specified in key=>value syntax.
|
||||
*
|
||||
* @param Component $root The root document
|
||||
* @param string $name
|
||||
* @param Component $root The root document
|
||||
* @param string $name
|
||||
* @param string|array|null $value
|
||||
* @param array $parameters List of parameters
|
||||
* @param string $group The vcard property group
|
||||
*
|
||||
* @return void
|
||||
* @param array $parameters List of parameters
|
||||
* @param string $group The vcard property group
|
||||
*/
|
||||
function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null) {
|
||||
|
||||
public function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->group = $group;
|
||||
|
||||
@@ -83,7 +81,6 @@ abstract class Property extends Node {
|
||||
if (!is_null($value)) {
|
||||
$this->setValue($value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -92,13 +89,10 @@ abstract class Property extends Node {
|
||||
* This may be either a single, or multiple strings in an array.
|
||||
*
|
||||
* @param string|array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setValue($value) {
|
||||
|
||||
public function setValue($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -112,12 +106,12 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValue() {
|
||||
|
||||
public function getValue()
|
||||
{
|
||||
if (is_array($this->value)) {
|
||||
if (count($this->value) == 0) {
|
||||
if (0 == count($this->value)) {
|
||||
return;
|
||||
} elseif (count($this->value) === 1) {
|
||||
} elseif (1 === count($this->value)) {
|
||||
return $this->value[0];
|
||||
} else {
|
||||
return $this->getRawMimeDirValue();
|
||||
@@ -125,20 +119,16 @@ abstract class Property extends Node {
|
||||
} else {
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a multi-valued property.
|
||||
*
|
||||
* @param array $parts
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setParts(array $parts) {
|
||||
|
||||
public function setParts(array $parts)
|
||||
{
|
||||
$this->value = $parts;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -149,8 +139,8 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getParts() {
|
||||
|
||||
public function getParts()
|
||||
{
|
||||
if (is_null($this->value)) {
|
||||
return [];
|
||||
} elseif (is_array($this->value)) {
|
||||
@@ -158,7 +148,6 @@ abstract class Property extends Node {
|
||||
} else {
|
||||
return [$this->value];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -166,22 +155,22 @@ abstract class Property extends Node {
|
||||
*
|
||||
* If a parameter with same name already existed, the values will be
|
||||
* combined.
|
||||
* If nameless parameter is added, we try to guess it's name.
|
||||
* If nameless parameter is added, we try to guess its name.
|
||||
*
|
||||
* @param string $name
|
||||
* @param string|null|array $value
|
||||
* @param string $name
|
||||
* @param string|array|null $value
|
||||
*/
|
||||
function add($name, $value = null) {
|
||||
public function add($name, $value = null)
|
||||
{
|
||||
$noName = false;
|
||||
if ($name === null) {
|
||||
if (null === $name) {
|
||||
$name = Parameter::guessParameterNameByValue($value);
|
||||
$noName = true;
|
||||
}
|
||||
|
||||
if (isset($this->parameters[strtoupper($name)])) {
|
||||
$this->parameters[strtoupper($name)]->addValue($value);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$param = new Parameter($this->root, $name, $value);
|
||||
$param->noName = $noName;
|
||||
$this->parameters[$param->name] = $param;
|
||||
@@ -193,10 +182,9 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function parameters() {
|
||||
|
||||
public function parameters()
|
||||
{
|
||||
return $this->parameters;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -207,7 +195,7 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract function getValueType();
|
||||
abstract public function getValueType();
|
||||
|
||||
/**
|
||||
* Sets a raw value coming from a mimedir (iCalendar/vCard) file.
|
||||
@@ -216,35 +204,33 @@ abstract class Property extends Node {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
abstract function setRawMimeDirValue($val);
|
||||
abstract public function setRawMimeDirValue($val);
|
||||
|
||||
/**
|
||||
* Returns a raw mime-dir representation of the value.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract function getRawMimeDirValue();
|
||||
abstract public function getRawMimeDirValue();
|
||||
|
||||
/**
|
||||
* Turns the object back into a serialized blob.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function serialize() {
|
||||
|
||||
public function serialize()
|
||||
{
|
||||
$str = $this->name;
|
||||
if ($this->group) $str = $this->group . '.' . $this->name;
|
||||
|
||||
foreach ($this->parameters() as $param) {
|
||||
|
||||
$str .= ';' . $param->serialize();
|
||||
|
||||
if ($this->group) {
|
||||
$str = $this->group.'.'.$this->name;
|
||||
}
|
||||
|
||||
$str .= ':' . $this->getRawMimeDirValue();
|
||||
foreach ($this->parameters() as $param) {
|
||||
$str .= ';'.$param->serialize();
|
||||
}
|
||||
|
||||
$str .= ':'.$this->getRawMimeDirValue();
|
||||
|
||||
$str = \preg_replace(
|
||||
'/(
|
||||
@@ -258,7 +244,6 @@ abstract class Property extends Node {
|
||||
|
||||
// remove single space after last CRLF
|
||||
return \substr($str, 0, -1);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -268,10 +253,9 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
return $this->getParts();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -280,17 +264,14 @@ abstract class Property extends Node {
|
||||
* The value must always be an array.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setJsonValue(array $value) {
|
||||
|
||||
if (count($value) === 1) {
|
||||
public function setJsonValue(array $value)
|
||||
{
|
||||
if (1 === count($value)) {
|
||||
$this->setValue(reset($value));
|
||||
} else {
|
||||
$this->setValue($value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -299,12 +280,12 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function jsonSerialize() {
|
||||
|
||||
public function jsonSerialize()
|
||||
{
|
||||
$parameters = [];
|
||||
|
||||
foreach ($this->parameters as $parameter) {
|
||||
if ($parameter->name === 'VALUE') {
|
||||
if ('VALUE' === $parameter->name) {
|
||||
continue;
|
||||
}
|
||||
$parameters[strtolower($parameter->name)] = $parameter->jsonSerialize();
|
||||
@@ -318,7 +299,7 @@ abstract class Property extends Node {
|
||||
return array_merge(
|
||||
[
|
||||
strtolower($this->name),
|
||||
(object)$parameters,
|
||||
(object) $parameters,
|
||||
strtolower($this->getValueType()),
|
||||
],
|
||||
$this->getJsonValue()
|
||||
@@ -330,78 +311,63 @@ abstract class Property extends Node {
|
||||
* object.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setXmlValue(array $value) {
|
||||
|
||||
public function setXmlValue(array $value)
|
||||
{
|
||||
$this->setJsonValue($value);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes the data into XML. This is used to create xCard or
|
||||
* xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
function xmlSerialize(Xml\Writer $writer) {
|
||||
|
||||
public function xmlSerialize(Xml\Writer $writer)
|
||||
{
|
||||
$parameters = [];
|
||||
|
||||
foreach ($this->parameters as $parameter) {
|
||||
|
||||
if ($parameter->name === 'VALUE') {
|
||||
if ('VALUE' === $parameter->name) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$parameters[] = $parameter;
|
||||
|
||||
}
|
||||
|
||||
$writer->startElement(strtolower($this->name));
|
||||
|
||||
if (!empty($parameters)) {
|
||||
|
||||
$writer->startElement('parameters');
|
||||
|
||||
foreach ($parameters as $parameter) {
|
||||
|
||||
$writer->startElement(strtolower($parameter->name));
|
||||
$writer->write($parameter);
|
||||
$writer->endElement();
|
||||
|
||||
}
|
||||
|
||||
$writer->endElement();
|
||||
|
||||
}
|
||||
|
||||
$this->xmlSerializeValue($writer);
|
||||
$writer->endElement();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes only the value of a property. This is used to
|
||||
* create xCard or xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
protected function xmlSerializeValue(Xml\Writer $writer) {
|
||||
|
||||
protected function xmlSerializeValue(Xml\Writer $writer)
|
||||
{
|
||||
$valueType = strtolower($this->getValueType());
|
||||
|
||||
foreach ($this->getJsonValue() as $values) {
|
||||
foreach ((array)$values as $value) {
|
||||
foreach ((array) $values as $value) {
|
||||
$writer->writeElement($valueType, $value);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -413,10 +379,9 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function __toString() {
|
||||
|
||||
return (string)$this->getValue();
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
return (string) $this->getValue();
|
||||
}
|
||||
|
||||
/* ArrayAccess interface {{{ */
|
||||
@@ -428,17 +393,21 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function offsetExists($name) {
|
||||
|
||||
if (is_int($name)) return parent::offsetExists($name);
|
||||
public function offsetExists($name)
|
||||
{
|
||||
if (is_int($name)) {
|
||||
return parent::offsetExists($name);
|
||||
}
|
||||
|
||||
$name = strtoupper($name);
|
||||
|
||||
foreach ($this->parameters as $parameter) {
|
||||
if ($parameter->name == $name) return true;
|
||||
if ($parameter->name == $name) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -450,9 +419,11 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return Node
|
||||
*/
|
||||
function offsetGet($name) {
|
||||
|
||||
if (is_int($name)) return parent::offsetGet($name);
|
||||
public function offsetGet($name)
|
||||
{
|
||||
if (is_int($name)) {
|
||||
return parent::offsetGet($name);
|
||||
}
|
||||
$name = strtoupper($name);
|
||||
|
||||
if (!isset($this->parameters[$name])) {
|
||||
@@ -460,19 +431,16 @@ abstract class Property extends Node {
|
||||
}
|
||||
|
||||
return $this->parameters[$name];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new parameter.
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return void
|
||||
* @param mixed $value
|
||||
*/
|
||||
function offsetSet($name, $value) {
|
||||
|
||||
public function offsetSet($name, $value)
|
||||
{
|
||||
if (is_int($name)) {
|
||||
parent::offsetSet($name, $value);
|
||||
// @codeCoverageIgnoreStart
|
||||
@@ -484,18 +452,15 @@ abstract class Property extends Node {
|
||||
|
||||
$param = new Parameter($this->root, $name, $value);
|
||||
$this->parameters[$param->name] = $param;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes one or more parameters with the specified name.
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function offsetUnset($name) {
|
||||
|
||||
public function offsetUnset($name)
|
||||
{
|
||||
if (is_int($name)) {
|
||||
parent::offsetUnset($name);
|
||||
// @codeCoverageIgnoreStart
|
||||
@@ -506,23 +471,20 @@ abstract class Property extends Node {
|
||||
}
|
||||
|
||||
unset($this->parameters[strtoupper($name)]);
|
||||
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
||||
/**
|
||||
* This method is automatically called when the object is cloned.
|
||||
* Specifically, this will ensure all child elements are also cloned.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __clone() {
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
foreach ($this->parameters as $key => $child) {
|
||||
$this->parameters[$key] = clone $child;
|
||||
$this->parameters[$key]->parent = $this;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -543,13 +505,12 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$warnings = [];
|
||||
|
||||
// Checking if our value is UTF-8
|
||||
if (!StringUtil::isUTF8($this->getRawMimeDirValue())) {
|
||||
|
||||
$oldValue = $this->getRawMimeDirValue();
|
||||
$level = 3;
|
||||
if ($options & self::REPAIR) {
|
||||
@@ -558,29 +519,27 @@ abstract class Property extends Node {
|
||||
$this->setRawMimeDirValue($newValue);
|
||||
$level = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (preg_match('%([\x00-\x08\x0B-\x0C\x0E-\x1F\x7F])%', $oldValue, $matches)) {
|
||||
$message = 'Property contained a control character (0x' . bin2hex($matches[1]) . ')';
|
||||
$message = 'Property contained a control character (0x'.bin2hex($matches[1]).')';
|
||||
} else {
|
||||
$message = 'Property is not valid UTF-8! ' . $oldValue;
|
||||
$message = 'Property is not valid UTF-8! '.$oldValue;
|
||||
}
|
||||
|
||||
$warnings[] = [
|
||||
'level' => $level,
|
||||
'level' => $level,
|
||||
'message' => $message,
|
||||
'node' => $this,
|
||||
'node' => $this,
|
||||
];
|
||||
}
|
||||
|
||||
// Checking if the propertyname does not contain any invalid bytes.
|
||||
if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) {
|
||||
$warnings[] = [
|
||||
'level' => $options & self::REPAIR ? 1 : 3,
|
||||
'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed',
|
||||
'node' => $this,
|
||||
'level' => $options & self::REPAIR ? 1 : 3,
|
||||
'message' => 'The propertyname: '.$this->name.' contains invalid characters. Only A-Z, 0-9 and - are allowed',
|
||||
'node' => $this,
|
||||
];
|
||||
if ($options & self::REPAIR) {
|
||||
// Uppercasing and converting underscores to dashes.
|
||||
@@ -589,46 +548,52 @@ abstract class Property extends Node {
|
||||
);
|
||||
// Removing every other invalid character
|
||||
$this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ($encoding = $this->offsetGet('ENCODING')) {
|
||||
|
||||
if ($this->root->getDocumentType() === Document::VCARD40) {
|
||||
if (Document::VCARD40 === $this->root->getDocumentType()) {
|
||||
$warnings[] = [
|
||||
'level' => 3,
|
||||
'level' => 3,
|
||||
'message' => 'ENCODING parameter is not valid in vCard 4.',
|
||||
'node' => $this
|
||||
'node' => $this,
|
||||
];
|
||||
} else {
|
||||
|
||||
$encoding = (string)$encoding;
|
||||
$encoding = (string) $encoding;
|
||||
|
||||
$allowedEncoding = [];
|
||||
|
||||
switch ($this->root->getDocumentType()) {
|
||||
case Document::ICALENDAR20 :
|
||||
case Document::ICALENDAR20:
|
||||
$allowedEncoding = ['8BIT', 'BASE64'];
|
||||
break;
|
||||
case Document::VCARD21 :
|
||||
case Document::VCARD21:
|
||||
$allowedEncoding = ['QUOTED-PRINTABLE', 'BASE64', '8BIT'];
|
||||
break;
|
||||
case Document::VCARD30 :
|
||||
case Document::VCARD30:
|
||||
$allowedEncoding = ['B'];
|
||||
//Repair vCard30 that use BASE64 encoding
|
||||
if ($options & self::REPAIR) {
|
||||
if ('BASE64' === strtoupper($encoding)) {
|
||||
$encoding = 'B';
|
||||
$this['ENCODING'] = $encoding;
|
||||
$warnings[] = [
|
||||
'level' => 1,
|
||||
'message' => 'ENCODING=BASE64 has been transformed to ENCODING=B.',
|
||||
'node' => $this,
|
||||
];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
if ($allowedEncoding && !in_array(strtoupper($encoding), $allowedEncoding)) {
|
||||
$warnings[] = [
|
||||
'level' => 3,
|
||||
'message' => 'ENCODING=' . strtoupper($encoding) . ' is not valid for this document type.',
|
||||
'node' => $this
|
||||
'level' => 3,
|
||||
'message' => 'ENCODING='.strtoupper($encoding).' is not valid for this document type.',
|
||||
'node' => $this,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Validating inner parameters
|
||||
@@ -637,7 +602,6 @@ abstract class Property extends Node {
|
||||
}
|
||||
|
||||
return $warnings;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -645,17 +609,13 @@ abstract class Property extends Node {
|
||||
*
|
||||
* It's intended to remove all circular references, so PHP can easily clean
|
||||
* it up.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function destroy() {
|
||||
|
||||
public function destroy()
|
||||
{
|
||||
parent::destroy();
|
||||
foreach ($this->parameters as $param) {
|
||||
$param->destroy();
|
||||
}
|
||||
$this->parameters = [];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user