root/events/phpframework/zend_framework/trunk/app/modules/index/services/Users.php @ 29496

Revision 29496, 12.1 kB (checked in by heavenshell, 6 years ago)

Add setCredentialTreatment()

Line 
1<?php
2/**
3 * Logic code for users model
4 *
5 * PHP version 5.2
6 *
7 * LICENSE
8 *
9 * This source file is subject to the new BSD license.
10 * It is also available through the world-wide-web at this URL:
11 * http://framework.zend.com/license/new-bsd
12 *
13 * @category Phwittr
14 * @package modules_index_services
15 * @version $id$
16 * @copyright 2008 Heavens hell
17 * @author Heavens hell <heavenshell.jp@gmail.com>
18 * @license New BSD License
19 */
20
21/**
22 * Users
23 *
24 * @category Phwittr
25 * @package modules_index_services
26 * @version $id$
27 * @copyright 2008 Heavens hell
28 * @author Heavens hell <heavenshell.jp@gmail.com>
29 * @license New BSD License
30 */
31class Index_Services_Users extends Phwittr_Service_Abstract
32{
33    /**
34     * Data access object
35     *
36     * @var mixed
37     * @access private
38     */
39    private $_dao = null;
40
41    /**
42     * Init
43     *
44     * @access public
45     * @return void
46     */
47    public function init()
48    {
49        $this->_dao = $this->getDao('Users');
50    }
51
52    /**
53     * Check user name available
54     *
55     * @param mixed $name user name
56     * @access public
57     * @return bool true:Available, false:Not available
58     */
59    public function isUserNameAvailable($name)
60    {
61        $row = $this->getUserInfoByName($name);
62        if ($row === null) {
63            return true;
64        }
65
66        return false;
67    }
68
69    /**
70     * Check email available
71     *
72     * @param mixed $email Email address
73     * @access public
74     * @return bool true:Available, false:Not available
75     */
76    public function isEmailAvailable($email)
77    {
78        $row = $this->_dao->fetchRow($this->_dao->select()
79                        ->where('email = ?', $email)
80                        ->where('delete_flag = ?', 0));
81
82        if ($row === null) {
83            return true;
84        }
85
86        return false;
87    }
88
89    /**
90     * Insert value to user table
91     *
92     * @param array $params Insert values
93     * @access public
94     * @return bool true:Success to insert, false:Fail to insert
95     */
96    public function register(array $params)
97    {
98        $data = array(
99            'registration_flag' => 1,
100            'updated_at'        => strftime('%Y-%m-%d %H:%M:%S', time())
101        );
102
103        $where = $this->_dbAdapter->quoteInto('id = ?', $params['id']);
104        $this->_dbAdapter->beginTransaction();
105        try {
106            $id = $this->_dao->update($data, $where);
107        } catch(Exception $e) {
108            $this->_dbAdapter->rollBack();
109            $this->_message = $e->getMessage();
110            return false;
111        }
112        $this->_dbAdapter->commit();
113
114        // Add to authenticate storage
115        $data['id']           = $id;
116        $data['user_name']    = $params['user_name'];
117        $data['email']        = $params['email'];
118        $data['private_flag'] = $params['private_flag'];
119        $data['userLevel']    = 'owner';
120        $class = new stdClass;
121        foreach ($data as $key => $val) {
122            if ($key === 'password') {
123                continue;
124            }
125            $class->{$key} = $val;
126        }
127
128        $auth = Zend_Auth::getInstance();
129        $auth->getStorage()->write($class);
130
131        return true;
132    }
133
134
135    /**
136     * Pre register
137     *
138     * @param array $params
139     * @access public
140     * @return void
141     */
142    public function preRegister(array $params)
143    {
144        $registerKey = sha1(uniqid(mt_rand(), true));
145        $data = array(
146            'user_name'         => $params['name'],
147            'email'             => $params['email'],
148            'password'          => $this->_createPassword($params['password']),
149            'private_flag'      => 0,
150            'registration_key'  => $registerKey,
151            'registration_flag' => 0,
152            'created_at'        => strftime('%Y-%m-%d %H:%M:%S', time()),
153            'delete_flag'       => 0
154        );
155
156        $this->_dbAdapter->beginTransaction();
157        try {
158            $id = $this->_dao->insert($data);
159        } catch(Exception $e) {
160            $this->_dbAdapter->rollBack();
161            $this->_message = $e->getMessage();
162            return null;
163        }
164        $this->_dbAdapter->commit();
165
166        return $registerKey;
167    }
168
169    /**
170     * Get user data by registration key
171     *
172     * @param mixed $key
173     * @access public
174     * @return Zend_Db_Table_Rows
175     */
176    public function getUserInfoByRegisterKey($key)
177    {
178        $row = $this->_dao->fetchRow($this->_dao->select()
179                        ->where('registration_key = ?', $key)
180                        ->where('registration_flag =?', 0)
181                        ->where('delete_flag = ?', 0));
182
183        if (is_null($row)) {
184            return null;
185        }
186
187        return $row;
188    }
189
190    /**
191     * Update users table
192     *
193     * @param array $params Update params
194     * @param mixed $id User id
195     * @access public
196     * @return bool true:Update success, false:Update fail
197     */
198    public function update(array $params, $id)
199    {
200        $update = strftime('%Y-%m-%d %H:%M:%S', time());
201        $data = array(
202            'user_name'    => $params['name'],
203            'email'        => $params['email'],
204            'private_flag' => $params['private_flag'],
205            'updated_at'   => $update
206        );
207
208        $id = (is_numeric($id) ? (int)$id : $id);
209        $where = $this->_dbAdapter->quoteInto('id = ?', $id);
210
211        $this->_dbAdapter->beginTransaction();
212        try {
213            $this->_dao->update($data, $where);
214        } catch(Exception $e) {
215            $this->_dbAdapter->rollBack();
216            $this->_message = $e->getMessage();
217            return false;
218        }
219
220        $this->_dbAdapter->commit();
221
222        // Update login user infomations
223        $auth = Zend_Auth::getInstance()->getIdentity();
224        $auth->user_name    = $params['name'];
225        $auth->email        = $params['email'];
226        $auth->private_flag = $params['private_flag'];
227        $auth->updated_at   = $update;
228        Zend_Auth::getInstance()->getStorage()->write($auth);
229
230        return true;
231    }
232
233    /**
234     * Update password
235     *
236     * @param string $password Password
237     * @param mixed $id User id
238     * @access public
239     * @return bool true:update success, false:update fail
240     */
241    public function updatePassword($password, $id)
242    {
243        if ($password === null) {
244            return false;
245        }
246        $update = strftime('%Y-%m-%d %H:%M:%S', time());
247        $data = array(
248            'password'   => $this->_createPassword($password),
249            'updated_at' => $update
250        );
251
252        $id = (is_numeric($id) ? (int)$id : $id);
253        $where = $this->_dbAdapter->quoteInto('id = ?', $id);
254
255        $this->_dbAdapter->beginTransaction();
256        try {
257            $this->_dao->update($data, $where);
258        } catch(Exception $e) {
259            $this->_dbAdapter->rollBack();
260            $this->_message = $e->getMessage();
261            return false;
262        }
263
264        $this->_dbAdapter->commit();
265
266        return true;
267    }
268
269    /**
270     * Update image
271     *
272     * @param mixed $path
273     * @param mixed $id
274     * @access public
275     * @return bool true:Success to update image, false:Fail to update image
276     */
277    public function updateImage($path, $id)
278    {
279        if ($path === null || $path === '') {
280            return false;
281        }
282
283        $update = strftime('%Y-%m-%d %H:%M:%S', time());
284        $data = array(
285            'image'      => $path,
286            'updated_at' => $update
287        );
288
289        $id    = (is_numeric($id) ? (int)$id : $id);
290        $where = $this->_dbAdapter->quoteInto('id = ?', $id);
291
292        $this->_dbAdapter->beginTransaction();
293        try {
294            $this->_dao->update($data, $where);
295        } catch(Exception $e) {
296            $this->_dbAdapter->rollBack();
297            $this->_message = $e->getMessage();
298            return false;
299        }
300        $this->_dbAdapter->commit();
301
302        return true;
303    }
304
305    /**
306     * Update image column null
307     *
308     * @param mixed $id
309     * @access public
310     * @return bool true:Success to delete image, false:Fail to update image
311     */
312    public function deleteImage($id)
313    {
314        if (!is_numeric($id)) {
315            return false;
316        }
317
318        $update = strftime('%Y-%m-%d %H:%M:%S', time());
319        $data = array(
320            'image'      => null,
321            'updated_at' => $update
322        );
323        $where = $this->_dbAdapter->quoteInto('id = ?', $id);
324
325        $this->_dbAdapter->beginTransaction();
326        try {
327            $this->_dao->update($data, $where);
328        } catch(Exception $e) {
329            $this->_dbAdapter->rollBack();
330            $this->_message = $e->getMessage();
331            return false;
332        }
333        $this->_dbAdapter->commit();
334
335        return true;
336    }
337
338    /**
339     * Create password
340     *
341     * @param sitrin $plain Plain password string
342     * @access private
343     * @return string Encrypted password
344     */
345    private function _createPassword($plain)
346    {
347        $salt     = substr(sha1(uniqid(mt_rand(), true)), 0, 16);
348        $password = sha1($salt . $plain) . ':' . $salt;
349
350        return $password;
351    }
352
353    /**
354     * Get password from database
355     *
356     * @param mixed $value User's name or urser's email address
357     * @access public
358     * @return string salt or null
359     */
360    public function getSalt($value)
361    {
362        if ($this->_isEmailAddress($value)) {
363            $column = 'email = ?';
364        } else {
365            $column = 'user_name = ?';
366        }
367
368        $row = $this->_dao->fetchRow($this->_dao->select()
369                        ->where($column, $value)
370                        ->where('delete_flag = ?', 0));
371
372        if ($row === null) {
373            return null;
374        }
375
376        $passwords = explode(':', $row->password);
377        if (!is_array($passwords)) {
378            return null;
379        }
380        $salt = $passwords[1];
381
382        return $salt;
383    }
384
385    /**
386     * Is value email address?
387     *
388     * @param mixed $value User's email address
389     * @access private
390     * @return bool true:Email address, false:Not Email address
391     */
392    private function _isEmailAddress($value)
393    {
394        $validator = new Zend_Validate_EmailAddress();
395        if ($validator->isValid($value) === false) {
396            return false;
397        }
398
399        return true;
400    }
401
402    /**
403     * Authenticate
404     *
405     * @param mixed $name User name or Email address
406     * @param mixed $password Password
407     * @access public
408     * @return bool true:Success to login, false:Fail to login
409     */
410    public function authenticate($value, $password)
411    {
412        if ($this->_isEmailAddress($value)) {
413            $column = 'email';
414        } else {
415            $column = 'user_name';
416        }
417        $authAdapter = new Zend_Auth_Adapter_DbTable($this->_dbAdapter, 'users' , $column, 'password');
418        $authAdapter->setCredentialTreatment('? AND delete_flag = "0"')
419                    ->setIdentity($value)
420                    ->setCredential($password);
421
422        $ret = $authAdapter->authenticate();
423        if ($ret->isValid() === false) {
424            return false;
425        }
426
427        $data = $authAdapter->getResultRowObject(null, 'password');
428        $data->userLevel = 'owner';
429        $auth = Zend_Auth::getInstance();
430        $auth->getStorage()->write($data);
431
432        return true;
433    }
434
435    /**
436     * Get users table data by user name
437     *
438     * @param mixed $name User name
439     * @access public
440     * @return Zend_Db_Table_Rows or null
441     */
442    public function getUserInfoByName($name)
443    {
444        // Todo:Cache!!
445        $row = $this->_dao->fetchRow($this->_dao->select()
446                        ->where('user_name = ?', $name)
447                        ->where('delete_flag = ?', 0));
448
449        if (is_null($row)) {
450            return null;
451        }
452
453        return $row;
454    }
455
456    /**
457     * Get users table data by id
458     *
459     * @param mixed $id
460     * @access public
461     * @return Zend_Db_Table_Rows or null
462     */
463    public function getUserInfoById($id)
464    {
465        if (!is_numeric($id)) {
466            return null;
467        }
468        $row = $this->_dao->fetchRow($this->_dao->select()
469                        ->where('id = ?', $id)
470                        ->where('delete_flag = ?', 0));
471
472        if (is_null($row)) {
473            return null;
474        }
475
476        return $row;
477    }
478}
Note: See TracBrowser for help on using the browser.