r972: Rebranding from Iris Studios to Blue Static
[bugdar.git] / includes / api_user.php
1 <?php
2 /*=====================================================================*\
3 || ###################################################################
4 || # Bugdar [#]version[#]
5 || # Copyright ©2002-[#]year[#] Blue Static
6 || #
7 || # This program is free software; you can redistribute it and/or modify
8 || # it under the terms of the GNU General Public License as published by
9 || # the Free Software Foundation; version [#]gpl[#] of the License.
10 || #
11 || # This program is distributed in the hope that it will be useful, but
12 || # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 || # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 || # more details.
15 || #
16 || # You should have received a copy of the GNU General Public License along
17 || # with this program; if not, write to the Free Software Foundation, Inc.,
18 || # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
19 || ###################################################################
20 \*=====================================================================*/
21
22 $GLOBALS['isso:callback']->load('api', null);
23
24 require_once('./includes/functions_datastore.php');
25 require_once('./includes/class_sort.php');
26
27 /**
28 * API: User
29 *
30 * @author Blue Static
31 * @copyright Copyright ©2002 - [#]year[#], Blue Static
32 * @version $Revision$
33 * @package Bugdar
34 *
35 */
36 class UserAPI extends API
37 {
38 /**
39 * Database fields
40 * @var array
41 * @access private
42 */
43 var $fields = array(
44 'userid' => array(TYPE_UINT, REQ_AUTO, 'verify_nozero'),
45 'email' => array(TYPE_STR, REQ_YES, ':self'),
46 'displayname' => array(TYPE_STR, REQ_YES, ':self'),
47 'usergroupid' => array(TYPE_UINT, REQ_YES, ':self'),
48 'password' => array(TYPE_STR, REQ_YES),
49 'salt' => array(TYPE_STR, REQ_SET),
50 'authkey' => array(TYPE_STR, REQ_SET),
51 'showemail' => array(TYPE_BOOL, REQ_NO),
52 'showcolours' => array(TYPE_BOOL, REQ_NO),
53 'languageid' => array(TYPE_UINT, REQ_NO),
54 'timezone' => array(TYPE_INT, REQ_NO),
55 'usedst' => array(TYPE_BOOL, REQ_NO),
56 'hidestatuses' => array(TYPE_STR, REQ_NO, ':self'),
57 'defaultsortkey' => array(TYPE_STR, REQ_NO, ':self'),
58 'defaultsortas' => array(TYPE_STR, REQ_NO, ':self')
59 );
60
61 /**
62 * Database table
63 * @var string
64 * @access private
65 */
66 var $table = 'user';
67
68 /**
69 * Table prefix
70 * @var string
71 * @access private
72 */
73 var $prefix = TABLE_PREFIX;
74
75 // ###################################################################
76 /**
77 * Set field: salt
78 *
79 * @access private
80 */
81 function set_salt()
82 {
83 $this->set('salt', $this->registry->funct->rand(array(1, 15)));
84 }
85
86 // ###################################################################
87 /**
88 * Set field: authkey
89 *
90 * @access private
91 */
92 function set_authkey()
93 {
94 $this->set('authkey', $this->registry->funct->rand());
95 }
96
97 // ###################################################################
98 /**
99 * Pre-insert
100 *
101 * @access private
102 */
103 function pre_insert()
104 {
105 $this->set('password', md5(md5($this->values['password']) . md5($this->values['salt'])));
106 }
107
108 // ###################################################################
109 /**
110 * Post-insert
111 *
112 * @access protected
113 */
114 function post_insert()
115 {
116 build_assignedto();
117 }
118
119 // ###################################################################
120 /**
121 * Verify: email
122 *
123 * @access private
124 */
125 function verify_email()
126 {
127 if (!is_bool($ne = $this->verify_noempty('email')))
128 {
129 return $ne;
130 }
131
132 if (!$this->registry->funct->is_valid_email($this->values['email']))
133 {
134 return $this->registry->lang->string('The specified email is invalid.');
135 }
136 if ($this->registry->db->query_first("SELECT * FROM " . TABLE_PREFIX . "user WHERE email = '" . $this->registry->db->escape_string($this->values['email']) . "' AND userid <> " . $this->values['userid']))
137 {
138 return $this->registry->lang->string('The specified email is already in use.');
139 }
140 return true;
141 }
142
143 // ###################################################################
144 /**
145 * Verify: displayname
146 *
147 * @access private
148 */
149 function verify_displayname()
150 {
151 if (!is_bool($ne = $this->verify_noempty('displayname')))
152 {
153 return $ne;
154 }
155
156 if ($this->registry->db->query_first("SELECT * FROM " . TABLE_PREFIX . "user WHERE displayname = '" . $this->registry->db->escape_string($this->values['displayname']) . "' AND userid <> " . $this->values['userid']))
157 {
158 return $this->registry->lang->string('That display name is already in use by another user.');
159 }
160 return true;
161 }
162
163 // ###################################################################
164 /**
165 * Verify: usergroupid
166 *
167 * @access private
168 */
169 function verify_usergroupid()
170 {
171 if (!isset($this->registry->datastore['usergroup'][ $this->values['usergroupid'] ]))
172 {
173 return false;
174 }
175 return true;
176 }
177
178 // ###################################################################
179 /**
180 * Pre-update
181 *
182 * @access private
183 */
184 function pre_update()
185 {
186 $this->set_condition();
187 $this->fetch();
188
189 if ($this->values['password'] == '')
190 {
191 $this->set('password', $this->objdata['password']);
192 }
193 else
194 {
195 $this->registry->debug("updating password = true");
196 $this->set('password', md5(md5($this->values['password']) . md5($this->objdata['salt'])));
197 }
198 }
199
200 // ###################################################################
201 /**
202 * Post-update
203 *
204 * @access protected
205 */
206 function post_update()
207 {
208 build_assignedto();
209 }
210
211 // ###################################################################
212 /**
213 * Pre-delete
214 *
215 * @access protected
216 */
217 function pre_delete()
218 {
219 if ($this->values['userid'] == $this->registry->userinfo['userid'])
220 {
221 $this->error($lang->string('You cannot delete your own account!'));
222 }
223
224 if ($this->values['usergroupid'] == 6)
225 {
226 $count = $this->registry->db->query_first("SELECT COUNT(*) AS count FROM " . TABLE_PREFIX . "user WHERE usergroupid = 6 AND userid <> " . $this->values['userid']);
227 if ($count['count'] < 1)
228 {
229 $this->error($lang->string('At least one other administrator needs to be present before you can delete this user'));
230 }
231 }
232 }
233
234 // ###################################################################
235 /**
236 * Post-delete
237 *
238 * @todo Finish post-delete user data cleanup
239 *
240 * @access protected
241 */
242 function post_delete()
243 {
244 $this->registry->db->query("DELETE FROM " . TABLE_PREFIX . "user WHERE userid = " . $this->values['userid']);
245 $this->registry->db->query("DELETE FROM " . TABLE_PREFIX . "favourite WHERE userid = " . $this->values['userid']);
246 $this->registry->db->query("DELETE FROM " . TABLE_PREFIX . "useractivation WHERE userid = " . $this->values['userid']);
247
248 build_assignedto();
249 }
250
251 // ###################################################################
252 /**
253 * Verify: hidestatuses
254 *
255 * @access private
256 */
257 function verify_hidestatuses()
258 {
259 if (is_array($this->values['hidestatuses']))
260 {
261 $this->set('hidestatuses', implode(',', $this->values['hidestatuses']));
262 }
263
264 return true;
265 }
266
267 // ###################################################################
268 /**
269 * Verify: defaultsortkey
270 *
271 * @access private
272 */
273 function verify_defaultsortkey()
274 {
275 if (!ListSorter::fetch_by_text($this->values['defaultsortkey']))
276 {
277 return false;
278 }
279
280 return true;
281 }
282
283 // ###################################################################
284 /**
285 * Verify: defaultsortas
286 *
287 * @access private
288 */
289 function verify_defaultsortas()
290 {
291 if (!ListSorter::fetch_as_text($this->values['defaultsortas']))
292 {
293 return false;
294 }
295
296 return true;
297 }
298 }
299
300 /*=====================================================================*\
301 || ###################################################################
302 || # $HeadURL$
303 || # $Id$
304 || ###################################################################
305 \*=====================================================================*/
306 ?>