source: OWR/Model/Users.php @ 47c42d

Revision 47c42d, 17.2 KB checked in by pierre-alain <pierre-alain@…>, 3 years ago (diff)

adding support for plugin calls

  • Property mode set to 100644
Line 
1<?php
2/**
3 * Model for 'users' object
4 *
5 * PHP 5
6 *
7 * OWR - OpenWebReader
8 *
9 * Copyright (c) 2009, Pierre-Alain Mignot
10 *
11 * Home page: http://openwebreader.org
12 *
13 * E-Mail: contact@openwebreader.org
14 *
15 * All Rights Reserved
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 2 of the License, or
20 * (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with this program; if not, write to the Free Software
29 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
30 *
31 * @author Pierre-Alain Mignot <contact@openwebreader.org>
32 * @copyright Copyright (c) 2009, Pierre-Alain Mignot
33 * @license http://www.gnu.org/copyleft/gpl.html
34 * @package OWR
35 * @subpackage Model
36 */
37namespace OWR\Model;
38use OWR\Model,
39    OWR\Request,
40    OWR\Exception,
41    OWR\DAO,
42    OWR\User,
43    OWR\DB\Request as DBRequest,
44    OWR\Object,
45    OWR\Plugins;
46/**
47 * This class is used to add/edit/delete users and his related tables ()
48 * @package OWR
49 * @uses OWR\Model extends the base class
50 * @uses OWR\Request the request
51 * @uses OWR\Exception the exception handler
52 * @uses OWR\DAO the DAO
53 * @uses OWR\User the user
54 * @uses OWR\DB\Request a request sent to DB
55 * @uses OWR\Object transforms an object to an array
56 * @uses OWR\Plugins Plugins manager
57 * @subpackage Model
58 */
59class Users extends Model
60{
61    /**
62     * Adds/Edits a user
63     *
64     * @access public
65     * @param mixed $request the Request instance
66     * @return $this
67     */
68    public function edit(Request $request)
69    {
70        Plugins::pretrigger($request);
71        $query = '
72    SELECT COUNT(id) AS nb
73        FROM users';
74        $exists = $this->_db->getOne($query);
75
76        if($exists->next() && $exists->nb && ($request->id !== User::iGet()->getUid() && !User::iGet()->isAdmin()))
77        {
78            $request->setResponse(new Response(array(
79                'do'        => 'redirect',
80                'location'  => 'login',
81                'status'    => Exception::E_OWR_UNAUTHORIZED
82            )));
83            return $this;
84        }
85
86        $nb = $exists->nb;
87
88        $datas = array('id'=>$request->id);
89
90        if(empty($_POST))
91        {
92            $request->setResponse(new Response(array(
93                'tpl'       => 'user',
94                'datas'     => $datas
95            )));
96            return $this;
97        }
98
99        if(!User::iGet()->checkToken())
100        {
101            $request->setResponse(new Response(array(
102                'do'        => 'redirect',
103                'location'  => 'logout',
104                'status'    => Exception::E_OWR_UNAUTHORIZED
105            )));
106            return $this;
107        }
108
109        if(empty($request->login) || (!$request->id && empty($request->passwd)) || empty($request->email))
110        {
111            $request->setResponse(new Response(array(
112                'do'        => 'error',
113                'tpl'       => 'user',
114                'error'     => 'Please fill all the fields.',
115                'datas'     => $datas,
116                'status'    => Exception::E_OWR_BAD_REQUEST
117            )));
118            return $this;
119        }
120
121        if(mb_strlen($request->login, 'UTF-8') > 55)
122        {
123            $request->setResponse(new Response(array(
124                'do'        => 'error',
125                'tpl'       => 'user',
126                'error'     => 'Login too long, please limit it to 55 chars.',
127                'datas'     => $datas,
128                'status'    => Exception::E_OWR_BAD_REQUEST
129            )));
130            return $this;
131        }
132
133        if((empty($request->id) && (empty($request->passwd) ||
134            empty($request->confirmpasswd) || $request->passwd !== $request->confirmpasswd))
135            || (0 < $request->id && !empty($request->passwd) && !empty($request->confirmpasswd)
136                && $request->passwd !== $request->confirmpasswd))
137        {
138            $request->setResponse(new Response(array(
139                'do'        => 'error',
140                'tpl'       => 'user',
141                'error'     => 'Passwords are not identiquals.',
142                'datas'     => $datas,
143                'status'    => Exception::E_OWR_BAD_REQUEST
144            )));
145            return $this;
146        }
147
148        if(!empty($nb))
149        {
150            $args = array($request->login);
151            $query = '
152    SELECT id
153        FROM users
154        WHERE (login=?)';
155
156            if(!empty($request->id))
157            {
158                $query .= ' AND id != '. (int) $request->id;
159            }
160
161            $exists = $this->_db->getOneP($query, new DBRequest($args));
162            unset($args);
163            if($exists->count())
164            {
165                $request->setResponse(new Response(array(
166                    'do'        => 'error',
167                    'tpl'       => 'user',
168                    'datas'     => $datas,
169                    'error'     => 'Login already used. Please choose another.',
170                    'status'    => 409 // conflict
171                )));
172                return $this;
173            }
174
175            $request->rights = (int) $request->rights;
176
177            if($request->rights > User::iGet()->getRights() || $request->rights > User::LEVEL_ADMIN)
178            {
179                $request->setResponse(new Response(array(
180                    'do'        => 'error',
181                    'tpl'       => 'user',
182                    'datas'     => $datas,
183                    'error'     => 'You can\'t create user with rights higher than yours.',
184                    'status'    => Exception::E_OWR_BAD_REQUEST
185                )));
186                return $this;
187            }
188        }
189        else
190        { // first registered user = admin
191            $request->rights = User::LEVEL_ADMIN;
192        }
193
194        $request->timezone = User::iGet()->getTimeZones($request->timezone);
195        $request->ulang = User::iGet()->getLang($request->ulang);
196
197        // TODO : check this dynamicly
198        $cfg = Object::toArray($request->config);
199        $cfg['nbnews'] = (int) (isset($cfg['nbnews']) && $cfg['nbnews'] > 0 && $cfg['nbnews'] <= 50 && !($cfg['nbnews']%10) ? $cfg['nbnews'] : 10);
200        $cfg['blockimg'] = (bool) (isset($cfg['blockimg']) ? $cfg['blockimg'] : false);
201        $cfg['abstract'] = (bool) (isset($cfg['abstract']) ? $cfg['abstract'] : false);
202        $plugins = (array) $cfg['plugins'];
203        $cfg['plugins'] = array();
204        foreach($plugins as $plugin)
205            $cfg['plugins'][$plugin] = true;
206
207        if($request->id)
208        {
209            $user = $this->_dao->get($request->id);
210            if(!$user)
211            {
212                $request->setResponse(new Response(array(
213                    'do'        => 'error',
214                    'error'     => 'Invalid id',
215                    'status'    => Exception::E_OWR_BAD_REQUEST
216                )));
217                return $this;
218            }
219            $request->new = false;
220
221            if($user->login !== $request->login && ((empty($request->passwd) && empty($request->confirmpasswd)) ||
222                 $request->passwd !== $request->confirmpasswd))
223            { // login change, we NEED password to make hash
224                $request->setResponse(new Response(array(
225                    'do'        => 'error',
226                    'tpl'       => 'user',
227                    'error'     => 'Please fill all the fields.',
228                    'datas'     => $datas,
229                    'status'    => Exception::E_OWR_BAD_REQUEST
230                )));
231                return $this; 
232            }
233        }
234        else
235        {
236            $user = $this->_dao;
237            $request->new = true;
238        }
239
240        if(!empty($request->passwd) && !empty($request->confirmpasswd))
241        {
242            $args = array(
243                'login'     => $request->login,
244                'passwd'    => md5($request->login.$request->passwd),
245                'rights'    => $request->rights,
246                'lang'      => $request->ulang,
247                'email'     => $request->email,
248                'timezone'  => $request->timezone,
249                'id'        => $request->id,
250                'config'    => $cfg
251            );
252        }
253        else
254        {
255            $args = array(
256                'rights'    => $request->rights,
257                'lang'      => $request->ulang,
258                'email'     => $request->email,
259                'timezone'  => $request->timezone,
260                'id'        => $request->id,
261                'config'    => $cfg
262            );
263        }
264
265        unset($request->passwd, $request->confirmpasswd, $cfg); // remove from memory !
266
267        $user->populate($args);
268        unset($args);
269
270        $this->_db->beginTransaction();
271        try
272        {
273            $request->id = $user->save($request->new);
274
275            if(empty($nb) || (!$request->new && (int)$request->id === (int)User::iGet()->getUid()))
276            {
277                if(!User::iGet()->auth($user->login, $user->passwd))
278                { // ???
279                    unset($user);
280                    $request->setResponse(new Response(array(
281                        'do'        => 'error',
282                        'error'     => 'Internal error',
283                        'status'    => Exception::E_OWR_DIE
284                    )));
285                    return $this;
286                }
287            }
288        }
289        catch(Exception $e)
290        {
291            $request->setResponse(new Response(array(
292                'do'        => 'error',
293                'tpl'       => 'user',
294                'datas'     => $datas,
295                'error'     => $e->getContent(),
296                'status'    => Exception::E_OWR_BAD_REQUEST
297            )));
298            return $this;
299        }
300        $this->_db->commit();
301
302        unset($user);
303        Plugins::trigger($request);
304        $request->setResponse(new Response(array(
305            'do'        => 'redirect',
306            'status'    => $request->new ? 201 : 200, // 201 on creation
307            'datas'     => array('id' => $request->id)
308        )));
309        Plugins::posttrigger($request);
310
311        return $this;
312    }
313
314    /**
315     * Deletes a user
316     *
317     * @access public
318     * @param mixed $request the Request instance
319     * @return $this
320     */
321    public function delete(Request $request)
322    {
323        Plugins::pretrigger($request);
324        if(empty($request->id))
325        {
326            $request->setResponse(new Response(array(
327                'do'        => 'error',
328                'error'     => 'Missing id',
329                'status'    => Exception::E_OWR_BAD_REQUEST
330            )));
331            return $this;
332        }
333
334        $type = DAO::getType($request->id);
335        if('users' !== $type)
336        {
337            $request->setResponse(new Response(array(
338                'do'        => 'error',
339                'error'     => 'Invalid id',
340                'status'    => Exception::E_OWR_BAD_REQUEST
341            )));
342            return $this;
343        }
344
345
346        $this->_db->beginTransaction();
347        try
348        {
349            DAO::getCachedDAO('objects')->delete($request->id);
350        }
351        catch(Exception $e)
352        {
353            $this->_db->rollback();
354            throw new Exception($e->getContent(), $e->getCode());
355        }
356        $this->_db->commit();
357
358        Plugins::trigger($request);
359        if($request->id === User::iGet()->getUid())
360        {
361            $request->setResponse(new Response(array(
362                'do'        => 'redirect',
363                'location'  => 'logout'
364            )));
365        }
366        else
367        {
368            $request->setResponse(new Response);
369        }
370        Plugins::posttrigger($request);
371        return $this;
372    }
373
374    /**
375     * Gets datas to render a user
376     *
377     * @access public
378     * @author Pierre-Alain Mignot <contact@openwebreader.org>
379     * @param mixed $request the Request instance
380     * @param array $args additional arguments, optionnal
381     * @param string $order the order clause
382     * @param string $groupby the groupby clause
383     * @param string $limit the limit clause
384     * @return $this
385     */
386    public function view(Request $request, array $args = array(), $order = '', $groupby = '', $limit = '')
387    {
388        Plugins::pretrigger($request);
389        $args['FETCH_TYPE'] = 'assoc';
390
391        if(!empty($request->ids))
392        {
393            $args['id'] = $request->ids;
394            $limit = count($request->ids);
395        }
396        elseif(!empty($request->id))
397        {
398            $args['id'] = $request->id;
399            $limit = 1;
400        }
401
402        $datas = $this->_dao->get($args, 'id,login,rights,lang,email,timezone,config', $order, $groupby, $limit);
403        if(empty($datas))
404        {
405            $request->setResponse(new Response(array(
406                'status'    => 204
407            )));
408            return $this;
409        }
410
411        $multiple = !isset($datas['id']);
412
413        if($multiple)
414        {
415            foreach($datas as $row)
416            {
417                $row['config'] = @unserialize($row['config']);
418            }
419        }
420        else $datas['config'] = @unserialize($datas['config']);
421        Plugins::trigger($request);
422        $request->setResponse(new Response(array(
423            'datas'        => $datas,
424            'multiple'     => $multiple
425        )));
426        Plugins::posttrigger($request);
427        return $this;
428    }
429
430    /**
431     * Deletes everything related to a user
432     *
433     * @access public
434     * @param mixed $request the Request instance
435     * @return $this
436     */
437    public function deleteRelated(Request $request)
438    {
439        Plugins::pretrigger($request);
440        $this->_db->beginTransaction();
441        try
442        {
443            DAO::getCachedDAO('streams_groups')->delete();
444            DAO::getCachedDAO('news_relations')->delete();
445            DAO::getCachedDAO('streams_relations')->delete();
446            DAO::getCachedDAO('streams_relations_name')->delete();
447        }
448        catch(Exception $e)
449        {
450            $this->_db->rollback();
451            throw new Exception($e->getContent(), $e->getCode());
452        }
453        $this->_db->commit();
454        Plugins::trigger($request);
455        $request->setResponse(new Response(array(
456            'status'    => 204 // OK, no content to return
457        )));
458        Plugins::posttrigger($request);
459        return $this;
460    }
461
462    /**
463     * Changes the user interface language
464     *
465     * @author Pierre-Alain Mignot <contact@openwebreader.org>
466     * @access public
467     * @param mixed $request the Request instance
468     * @return $this
469     */
470    public function changeLang(Request $request)
471    {
472        Plugins::pretrigger($request);
473        if(empty($request->newlang))
474        {
475            $request->setResponse(new Response(array(
476                'do'        => 'error',
477                'error'     => 'Empty lang',
478                'status'    => Exception::E_OWR_BAD_REQUEST
479            )));
480            return $this;
481        }
482
483        $newLang = (string) User::iGet()->setLang($request->newlang);
484
485        $user = $this->_dao->get(User::iGet()->getUid(), 'id,lang');
486        if(empty($user))
487        {
488            $request->setResponse(new Response(array(
489                'do'        => 'error',
490                'error'     => 'Invalid user id',
491                'status'    => Exception::E_OWR_BAD_REQUEST
492            )));
493        }
494
495        $user->lang = $newLang;
496        $user->save();
497        Plugins::trigger($request);
498        $request->setResponse(new Response);
499        Plugins::posttrigger($request);
500        return $this;
501    }
502
503    /**
504     * Return some few statistics about current user
505     *
506     * @author Pierre-Alain Mignot <contact@openwebreader.org>
507     * @access public
508     * @param mixed $request the Request instance
509     * @return $this
510     */
511    public function stat(Request $request)
512    {
513        Plugins::pretrigger($request);
514        $datas = array();
515        $datas['nbCategories'] = DAO::getCachedDAO('streams_groups')->count()->nb;
516        $datas['nbStreams'] = DAO::getCachedDAO('streams_relations')->count()->nb;
517        $datas['nbDeadStreams'] = $datas['nbStreams'] - DAO::getCachedDAO('streams_relations')->count(array('streams.status' => 0))->nb;
518        $datas['nbNews'] = DAO::getCachedDAO('news_relations')->count()->nb;
519        $datas['nbUnreads'] = DAO::getCachedDAO('news_relations')->count(array('status' => 1))->nb;
520        $datas['nbTags'] = DAO::getCachedDAO('news_tags')->count()->nb;
521
522        if(User::iGet()->isAdmin())
523        {
524            $datas['nbUsers'] = $this->_dao->count()->nb;
525            $datas['nbTotalStreams'] = DAO::getCachedDAO('streams')->count()->nb;
526            $datas['nbTotalNews'] = DAO::getCachedDAO('news')->count()->nb;
527            $datas['nbTotalDeadStreams'] = $datas['nbTotalStreams'] - DAO::getCachedDAO('streams')->count(array('status' => 0))->nb;
528        }
529        Plugins::trigger($request);
530        $request->setResponse(new Response(array(
531            'datas'     => $datas,
532            'tpl'       => 'stats'
533        )));
534        Plugins::posttrigger($request);
535        return $this;
536    }
537}
Note: See TracBrowser for help on using the repository browser.