1: <?php
2: /**
3: * A bsaic object representation.
4: *
5: * PHP version 5
6: *
7: * @category Kolab
8: * @package Kolab_Server
9: * @author Gunnar Wrobel <wrobel@pardus.de>
10: * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
11: * @link http://pear.horde.org/index.php?package=Kolab_Server
12: */
13:
14: /**
15: * This class provides basic methods common to all Kolab server objects.
16: *
17: * Copyright 2008-2012 Horde LLC (http://www.horde.org/)
18: *
19: * See the enclosed file COPYING for license information (LGPL). If you
20: * did not receive this file, see http://www.horde.org/licenses/lgpl21.
21: *
22: * @category Kolab
23: * @package Kolab_Server
24: * @author Gunnar Wrobel <wrobel@pardus.de>
25: * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
26: * @link http://pear.horde.org/index.php?package=Kolab_Server
27: */
28: class Horde_Kolab_Server_Object_Inetorgperson extends Horde_Kolab_Server_Object_Organizationalperson
29: {
30: /** The specific object class of this object type */
31: const OBJECTCLASS_INETORGPERSON = 'inetOrgPerson';
32:
33: /**
34: * The attributes defined for this class.
35: *
36: * @var array
37: */
38: static public $attributes = array(
39: 'uid', 'mail','Firstnamelastname',
40: /* 'Organization', 'Businesscategory', 'Homephone', 'Mobile', */
41: /* 'Photo', 'Jpegphoto', 'Givenname', 'Middlenames', */
42: /* 'Homepostaladdress', 'Labeleduri', 'Lastnamefirstname', */
43: /* 'Usersmimecertificate' */
44: );
45:
46: /**
47: * A structure to initialize the attribute structure for this class.
48: *
49: * @var array
50: */
51: /* static public $init_attributes = array( */
52: /* 'defined' => array( */
53: /* self::ATTRIBUTE_SID, */
54: /* self::ATTRIBUTE_GIVENNAME, */
55: /* self::ATTRIBUTE_LABELEDURI, */
56: /* self::ATTRIBUTE_HOMEPOSTALADDRESS, */
57: /* self::ATTRIBUTE_ORGANIZATION, */
58: /* self::ATTRIBUTE_BUSINESSCATEGORY, */
59: /* self::ATTRIBUTE_HOMEPHONE, */
60: /* self::ATTRIBUTE_MOBILE, */
61: /* self::ATTRIBUTE_PHOTO, */
62: /* self::ATTRIBUTE_JPEGPHOTO, */
63: /* self::ATTRIBUTE_SMIMECERTIFICATE, */
64: /* ), */
65: /* 'derived' => array( */
66: /* self::ATTRARRAY_HOMEPOSTALADDRESS => array( */
67: /* 'base' => array( */
68: /* self::ATTRIBUTE_HOMEPOSTALADDRESS, */
69: /* self::ATTRIBUTE_GIVENNAME, */
70: /* self::ATTRIBUTE_SN */
71: /* ), */
72: /* 'method' => 'getHomePostalAddressHash', */
73: /* ), */
74: /* self::ATTRARRAY_LABELEDURI => array( */
75: /* 'base' => array( */
76: /* self::ATTRIBUTE_LABELEDURI, */
77: /* ), */
78: /* 'method' => 'getLabeledUriHash', */
79: /* ), */
80: /* self::ATTRIBUTE_GIVENNAME => array( */
81: /* 'base' => array( */
82: /* self::ATTRIBUTE_GIVENNAME, */
83: /* ), */
84: /* 'method' => 'getField', */
85: /* 'args' => array( */
86: /* self::ATTRIBUTE_GIVENNAME, */
87: /* 0, */
88: /* ' ' */
89: /* ), */
90: /* ), */
91: /* self::ATTRIBUTE_MIDDLENAMES => array( */
92: /* 'base' => array( */
93: /* self::ATTRIBUTE_GIVENNAME, */
94: /* ), */
95: /* 'method' => 'getField', */
96: /* 'args' => array( */
97: /* self::ATTRIBUTE_GIVENNAME, */
98: /* 1, */
99: /* ' ', */
100: /* 2 */
101: /* ), */
102: /* ), */
103: /* self::ATTRIBUTE_FNLN => array( */
104: /* 'base' => array( */
105: /* self::ATTRIBUTE_GIVENNAME, */
106: /* self::ATTRIBUTE_SN */
107: /* ), */
108: /* 'method' => 'getFnLn', */
109: /* ), */
110: /* self::ATTRIBUTE_LNFN => array( */
111: /* 'base' => array( */
112: /* self::ATTRIBUTE_GIVENNAME, */
113: /* self::ATTRIBUTE_SN */
114: /* ), */
115: /* 'method' => 'getLnFn', */
116: /* ), */
117: /* ), */
118: /* 'collapsed' => array( */
119: /* self::ATTRIBUTE_GIVENNAME => array( */
120: /* 'base' => array( */
121: /* self::ATTRIBUTE_GIVENNAME, */
122: /* self::ATTRIBUTE_MIDDLENAMES, */
123: /* ), */
124: /* 'method' => 'setField', */
125: /* 'args' => array( */
126: /* ' ', */
127: /* ), */
128: /* ), */
129: /* self::ATTRIBUTE_LABELEDURI => array( */
130: /* 'base' => array( */
131: /* self::ATTRARRAY_LABELEDURI, */
132: /* ), */
133: /* 'method' => 'setLabeledUriHash', */
134: /* ), */
135: /* self::ATTRIBUTE_HOMEPOSTALADDRESS => array( */
136: /* 'base' => array( */
137: /* self::ATTRARRAY_HOMEPOSTALADDRESS, */
138: /* ), */
139: /* 'method' => 'setHomePostalAddressHash', */
140: /* ), */
141: /* ), */
142: /* 'locked' => array( */
143: /* self::ATTRIBUTE_MAIL, */
144: /* ), */
145: /* 'object_classes' => array( */
146: /* self::OBJECTCLASS_INETORGPERSON, */
147: /* ), */
148: /* ); */
149:
150: /**
151: * Return the filter string to retrieve this object type.
152: *
153: * @static
154: *
155: * @return string The filter to retrieve this object type from the server
156: * database.
157: */
158: public static function getFilter()
159: {
160: $criteria = array('AND' => array(array('field' => self::ATTRIBUTE_OC,
161: 'op' => '=',
162: 'test' => self::OBJECTCLASS_INETORGPERSON),
163: ),
164: );
165: return $criteria;
166: }
167:
168: /**
169: * Get the name of this Object as "Firstname Lastname".
170: *
171: * @return string The name.
172: */
173: protected function getFnLn()
174: {
175: $gn = $this->get(self::ATTRIBUTE_GIVENNAME, true);
176: $sn = $this->get(self::ATTRIBUTE_SN, true);
177: return sprintf('%s %s', $gn, $sn);
178: }
179:
180: /**
181: * Get the name of this Object as "Lastname, Firstname".
182: *
183: * @return string The name.
184: */
185: protected function getLnFn()
186: {
187: $gn = $this->get(self::ATTRIBUTE_GIVENNAME, true);
188: $sn = $this->get(self::ATTRIBUTE_SN, true);
189: return sprintf('%s, %s', $sn, $gn);
190: }
191:
192: /**
193: * Return a hash of URIs. The keys of the hash are the labels.
194: *
195: * @return array The URIs.
196: */
197: protected function getLabeledUriHash()
198: {
199: $result = array();
200: $uris = $this->get(self::ATTRIBUTE_LABELEDURI, false);
201: if (empty($uris)) {
202: return array();
203: }
204: if (!is_array($uris)) {
205: $uris = array($uris);
206: }
207: foreach ($uris as $uri) {
208: list($address, $label) = explode(' ', $uri, 2);
209: if (!isset($result[$label])) {
210: $result[$label] = array($address);
211: } else {
212: $result[$label][] = $address;
213: }
214: }
215: return $result;
216: }
217:
218: /**
219: * Store a hash of URIs. The keys of the hash are the labels.
220: *
221: * @param string $key The attribute to collapse into.
222: * @param array $attributes The attributes to collapse.
223: * @param array &$info The information currently working on.
224: *
225: * @return NULL
226: */
227: protected function setLabeledUriHash($key, $attributes, &$info)
228: {
229: $result = array();
230: $uris = $info[self::ATTRARRAY_LABELEDURI];
231: foreach ($uris as $label => $addresses) {
232: if (!is_array($addresses)) {
233: $addresses = array($addresses);
234: }
235: foreach ($addresses as $address) {
236: $result[] = $address . ' ' . $label;
237: }
238: }
239: $info[self::ATTRIBUTE_LABELEDURI] = $result;
240: unset($info[self::ATTRARRAY_LABELEDURI]);
241: }
242:
243: /**
244: * Get home postal addresses as an array.
245: *
246: * @return array The home addressses.
247: */
248: protected function getHomePostalAddressHash()
249: {
250: $result = array();
251: $addresses = $this->get(self::ATTRIBUTE_HOMEPOSTALADDRESS);
252: if (empty($addresses)) {
253: return $addresses;
254: }
255: if (!is_array($addresses)) {
256: $addresses = array($addresses);
257: }
258: foreach ($addresses as $address) {
259: list($name_segment, $street_segment,
260: $postal_address, $postal_code, $city) = sscanf('%s$%s$%s$%s %s', $address);
261: if ($name_segment == "Post office box") {
262: $result[] = array(
263: self::ATTRIBUTE_POSTOFFICEBOX => $street_segment,
264: self::ATTRIBUTE_POSTALADDRESS => $postal_address,
265: self::ATTRIBUTE_POSTALCODE => $postal_code,
266: self::ATTRIBUTE_CITY => $city
267: );
268: } else {
269: $result[] = array(
270: self::ATTRIBUTE_STREET => $street_segment,
271: self::ATTRIBUTE_POSTALADDRESS => $postal_address,
272: self::ATTRIBUTE_POSTALCODE => $postal_code,
273: self::ATTRIBUTE_CITY => $city
274: );
275: }
276: }
277: return $result;
278: }
279:
280: /**
281: * Store home postal addresses provided as array.
282: *
283: * @param string $key The attribute to collapse into.
284: * @param array $attributes The attributes to collapse.
285: * @param array &$info The information currently working on.
286: *
287: * @return NULL
288: */
289: protected function setHomePostalAddressHash($key, $attributes, &$info)
290: {
291: $result = array();
292: $db_postal_data = array();
293: $db_elements = array(self::ATTRIBUTE_GIVENNAME,
294: self::ATTRIBUTE_SN);
295: foreach ($db_elements as $attribute) {
296: if (!empty($info[$attribute])) {
297: if (is_array($info[$attribute])) {
298: $new = $info[$attribute][0];
299: } else {
300: $new = $info[$attribute];
301: }
302: $db_postal_data[$attribute] = $this->quote($new);
303: } else {
304: $old = $this->_get($attribute, true);
305: if (!empty($old)) {
306: $db_postal_data[$attribute] = $this->quote($old);
307: } else {
308: $db_postal_data[$attribute] = '';
309: }
310: }
311: }
312: $elements = array(self::ATTRIBUTE_STREET,
313: self::ATTRIBUTE_POSTOFFICEBOX,
314: self::ATTRIBUTE_POSTALADDRESS,
315: self::ATTRIBUTE_POSTALCODE,
316: self::ATTRIBUTE_CITY);
317: if (!empty($info[self::ATTRARRAY_HOMEPOSTALADDRESS])) {
318: $addresses = $info[self::ATTRARRAY_HOMEPOSTALADDRESS];
319: } else {
320: $addresses = $this->get(self::ATTRARRAY_HOMEPOSTALADDRESS);
321: }
322: foreach ($addresses as $address) {
323: $postal_data = array();
324: foreach ($elements as $element) {
325: if (isset($address[$element])) {
326: $postal_data[$element] = $this->quote($address[$element]);
327: } else {
328: $postal_data[$element] = '';
329: }
330: }
331: if (!empty($postal_data[self::ATTRIBUTE_STREET])) {
332: $postal_data['street_segment'] = $postal_data[self::ATTRIBUTE_STREET];
333: $postal_data['name_segment'] = $db_postal_data[self::ATTRIBUTE_GIVENNAME] . ' ' . $db_postal_data[self::ATTRIBUTE_SN];
334: } else {
335: $postal_data['street_segment'] = $postal_data[self::ATTRIBUTE_POSTOFFICEBOX];
336: $postal_data['name_segment'] = "Post office box";
337: }
338: $result[] = sprintf('%s$%s$%s$%s %s',
339: $postal_data['name_segment'],
340: $postal_data['street_segment'],
341: $postal_data[self::ATTRIBUTE_POSTALADDRESS],
342: $postal_data[self::ATTRIBUTE_POSTALCODE],
343: $postal_data[self::ATTRIBUTE_CITY]);
344: }
345: $info[self::ATTRIBUTE_HOMEPOSTALADDRESS] = $result;
346: unset($info[self::ATTRARRAY_HOMEPOSTALADDRESS]);
347: }
348:
349: /**
350: * Generates an ID for the given information.
351: *
352: * @param array $info The data of the object.
353: *
354: * @static
355: *
356: * @return string|PEAR_Error The ID.
357: */
358: public function generateId(array &$info)
359: {
360: if ($this->exists()) {
361: if (!isset($info[self::ATTRIBUTE_GIVENNAME])
362: && !isset($info[self::ATTRIBUTE_SN])) {
363: return false;
364: }
365: if (!isset($info[self::ATTRIBUTE_GIVENNAME])) {
366: $info[self::ATTRIBUTE_GIVENNAME] = $this->get(self::ATTRIBUTE_GIVENNAME);
367: }
368: if (!isset($info[self::ATTRIBUTE_SN])) {
369: $info[self::ATTRIBUTE_SN] = $this->get(self::ATTRIBUTE_SN);
370: }
371: }
372:
373: $id_mapfields = array(self::ATTRIBUTE_GIVENNAME,
374: self::ATTRIBUTE_SN);
375: $id_format = self::ATTRIBUTE_CN . '=' . '%s %s';
376:
377: $fieldarray = array();
378: foreach ($id_mapfields as $mapfield) {
379: if (isset($info[$mapfield])) {
380: $id = $info[$mapfield];
381: if (is_array($id)) {
382: $id = $id[0];
383: }
384: $fieldarray[] = $this->server->structure->quoteForUid($id);
385: } else {
386: $fieldarray[] = '';
387: }
388: }
389:
390: return trim(vsprintf($id_format, $fieldarray), " \t\n\r\0\x0B,");
391: }
392:
393: }