1<?php
2/**
3 * A person (objectclass 2.5.6.6).
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 methods for the person objectclass.
16 *
17 * Copyright 2009-2016 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 */
28class Horde_Kolab_Server_Object_Person extends Horde_Kolab_Server_Object_Top
29{
30    /** The specific object class of this object type */
31    const OBJECTCLASS_PERSON = 'person';
32
33    /**
34     * A structure to initialize the attribute structure for this class.
35     *
36     * @var array
37     */
38    public static $init_attributes = array(
39        'Cn', 'Sn', 'Userpassword', 'Userpasswordraw',
40/*         'Telephonenumber' */
41
42/*         'defined' => array( */
43/*             self::ATTRIBUTE_CN, */
44/*             self::ATTRIBUTE_SN, */
45/*             self::ATTRIBUTE_USERPASSWORD, */
46/*             self::ATTRIBUTE_TELNO, */
47/*         ), */
48/*         'derived' => array( */
49/*             self::ATTRIBUTE_USERPASSWORD => array( */
50/*                 'base' => array( */
51/*                     self::ATTRIBUTE_USERPASSWORD */
52/*                 ), */
53/*                 'method' => 'getEmpty', */
54/*             ), */
55/*             self::ATTRIBUTE_USERPASSWORDRAW => array( */
56/*                 'base' => array( */
57/*                     self::ATTRIBUTE_USERPASSWORD */
58/*                 ), */
59/*                 'method' => '_get', */
60/*                 'args' => array( */
61/*                     self::ATTRIBUTE_USERPASSWORD, */
62/*                 ), */
63/*             ), */
64/*         ), */
65/*         'required' => array( */
66/*             self::ATTRIBUTE_CN, */
67/*             self::ATTRIBUTE_SN, */
68/*         ), */
69/*         'object_classes' => array( */
70/*             self::OBJECTCLASS_PERSON */
71/*         ), */
72    );
73
74    /**
75     * Salt and hash the password.
76     *
77     * @param string $password The password.
78     *
79     * @return string The salted hashed password.
80     */
81    protected function hashPassword($password)
82    {
83        $type = isset($this->server->params['hashtype'])
84            ? $this->server->params['hashtype'] : 'ssha';
85        return Horde_Auth::getCryptedPassword($password, '', $type, true);
86    }
87
88    /**
89     * Return the filter string to retrieve this object type.
90     *
91     * @static
92     *
93     * @return string The filter to retrieve this object type from the server
94     *                database.
95     */
96    public static function getFilter()
97    {
98        return new Horde_Kolab_Server_Query_Element_Equals(
99            Horde_Kolab_Server_Object_Attribute_Objectclass::NAME,
100            self::OBJECTCLASS_PERSON
101        );
102    }
103
104    /**
105     * Generates an ID for the given information.
106     *
107     * @param array $info The data of the object.
108     *
109     * @static
110     *
111     * @return string The ID.
112     */
113    public function generateId(array &$info)
114    {
115        $cn = Horde_Kolab_Server_Object_Attribute_Cn::NAME;
116        $sn = Horde_Kolab_Server_Object_Attribute_Sn::NAME;
117        if ($this->exists()) {
118            if (!isset($info[$cn])
119                && !isset($info[$sn])) {
120                return $this->getGuid();
121            }
122            if (!isset($info[$cn])) {
123                $old = $this->getInternal($cn);
124                if (!empty($old)) {
125                    return $this->getGuid();
126                }
127            }
128        }
129
130        if (!empty($info[$cn])) {
131            $id = $info[$cn];
132        } else {
133            $id = $info[$sn];
134        }
135        if (is_array($id)) {
136            $id = $id[0];
137        }
138        return $cn . '=' . $this->server->structure->quoteForUid($id);
139    }
140
141    /**
142     * Distill the server side object information to save.
143     *
144     * @param array $info The information about the object.
145     *
146     * @return array The set of information.
147     *
148     * @throws Horde_Kolab_Server_Exception If the given information contains errors.
149     */
150    public function prepareObjectInformation(array &$info)
151    {
152        $cn = Horde_Kolab_Server_Object_Attribute_Cn::NAME;
153        $sn = Horde_Kolab_Server_Object_Attribute_Sn::NAME;
154        if (!$this->exists() && empty($info[$cn]) && !empty($info[$sn])) {
155            $info[$cn] = $info[$sn];
156        }
157
158        if (!empty($info[self::ATTRIBUTE_USERPASSWORD])) {
159            $info[self::ATTRIBUTE_USERPASSWORD] = $this->hashPassword($info[self::ATTRIBUTE_USERPASSWORD]);
160        } else if (isset($info[self::ATTRIBUTE_USERPASSWORD])) {
161            unset($info[self::ATTRIBUTE_USERPASSWORD]);
162        }
163    }
164}