/usr/share/php/Horde/Feed/Entry/Atom.php is in php-horde-feed 2.0.1-4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | <?php
/**
* Portions Copyright 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
* Copyright 2007-2012 Horde LLC (http://www.horde.org/)
*
* @category Horde
* @package Feed
*/
/**
* Concrete class for working with Atom entries.
*
* @category Horde
* @package Feed
*/
class Horde_Feed_Entry_Atom extends Horde_Feed_Entry_Base
{
/**
* The XML string for an "empty" Atom entry.
*
* @var string
*/
protected $_emptyXml = '<atom:entry/>';
/**
* Name of the XML element for Atom entries. Subclasses can
* override this to something other than "entry" if necessary.
*
* @var string
*/
protected $_entryElementName = 'entry';
/**
* Delete an atom entry.
*
* Delete tries to delete this entry from its feed. If the entry
* does not contain a link rel="edit", we throw an error (either
* the entry does not yet exist or this is not an editable
* feed). If we have a link rel="edit", we do the empty-body
* HTTP DELETE to that URI and check for a response of 2xx.
* Usually the response would be 204 No Content, but the Atom
* Publishing Protocol permits it to be 200 OK.
*
* @throws Horde_Feed_Exception If an error occurs, an Horde_Feed_Exception will
* be thrown.
*/
public function delete()
{
// Look for link rel="edit" in the entry object.
$deleteUri = $this->link('edit');
if (!$deleteUri) {
throw new Horde_Feed_Exception('Cannot delete entry; no link rel="edit" is present.');
}
// DELETE
do {
$response = $this->_httpClient->delete($deleteUri);
switch ((int)$response->code / 100) {
// Success
case 2:
return true;
// Redirect
case 3:
$deleteUri = $response->getHeader('Location');
continue;
// Error
default:
throw new Horde_Feed_Exception('Expected response code 2xx, got ' . $response->code);
}
} while (true);
}
/**
* Save a new or updated Atom entry.
*
* Save is used to either create new entries or to save changes to existing
* ones. If we have a link rel="edit", we are changing an existing entry. In
* this case we re-serialize the entry and PUT it to the edit URI, checking
* for a 200 OK result.
*
* For posting new entries, you must specify the $postUri parameter to
* save() to tell the object where to post itself. We use $postUri and POST
* the serialized entry there, checking for a 201 Created response. If the
* insert is successful, we then parse the response from the POST to get any
* values that the server has generated: an id, an updated time, and its new
* link rel="edit".
*
* @param string $postUri Location to POST for creating new entries.
* @param array $headers Additional headers to transmit while posting.
*
* @throws Horde_Feed_Exception If an error occurs, a Horde_Feed_Exception
* will be thrown.
*/
public function save($postUri = null, $headers = array())
{
$headers = array_merge(
array('Content-Type' => 'application/atom+xml'),
$headers
);
if ($this->id()) {
// If id is set, look for link rel="edit" in the
// entry object and PUT.
$editUri = $this->link('edit');
if (!$editUri) {
throw new Horde_Feed_Exception('Cannot edit entry; no link rel="edit" is present.');
}
$response = $this->_httpClient->put($editUri, $this->saveXml(), $headers);
if ($response->code !== 200) {
throw new Horde_Feed_Exception('Expected response code 200, got ' . $response->code);
}
} else {
if ($postUri === null) {
throw new Horde_Feed_Exception('PostURI must be specified to save new entries.');
}
$response = $this->_httpClient->post($postUri, $this->saveXml(), $headers);
if ($response->code !== 201) {
throw new Horde_Feed_Exception('Expected response code 201, got ' . $response->code);
}
}
// Update internal properties using the response body.
$body = $response->getBody();
$newEntry = new DOMDocument;
$parsed = @$newEntry->loadXML($body);
if (!$parsed) {
throw new Horde_Feed_Exception('DOMDocument cannot parse XML: ', error_get_last());
}
$newEntry = $newEntry->getElementsByTagName($this->_entryElementName)->item(0);
if (!$newEntry) {
throw new Horde_Feed_Exception('No root <feed> element found in server response:' . "\n\n" . $body);
}
if ($this->_element->parentNode) {
$oldElement = $this->_element;
$this->_element = $oldElement->ownerDocument->importNode($newEntry, true);
$oldElement->parentNode->replaceChild($this->_element, $oldElement);
} else {
$this->_element = $newEntry;
}
$this->_expireCachedChildren();
}
/**
* Easy access to <link> tags keyed by "rel" attributes.
* @TODO rationalize this with other __get/__call access
*
* If $elt->link() is called with no arguments, we will attempt to
* return the value of the <link> tag(s) like all other
* method-syntax attribute access. If an argument is passed to
* link(), however, then we will return the "href" value of the
* first <link> tag that has a "rel" attribute matching $rel:
*
* $elt->link(): returns the value of the link tag.
* $elt->link('self'): returns the href from the first <link rel="self"> in the entry.
*
* @param string $rel The "rel" attribute to look for.
* @return mixed
*/
public function link($rel = null)
{
if ($rel === null) {
return parent::__call('link', null);
}
// index link tags by their "rel" attribute.
$links = parent::__get('link');
if (!is_array($links)) {
if ($links instanceof Horde_Xml_Element) {
$links = array($links);
} else {
return $links;
}
}
foreach ($links as $link) {
if (empty($link['rel'])) {
continue;
}
if ($rel == $link['rel']) {
return $link['href'];
}
}
return null;
}
}
|