source: OWR/Logic/Users.php @ 2ba423

Revision 2ba423, 15.0 KB checked in by pierre-alain <pierre-alain@…>, 9 years ago (diff)

closing task-30 : full text list items : display an abstract / css improvement

  • Property mode set to 100644
Line 
1<?php
2/**
3 * Logic 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 Logic
36 */
37namespace OWR\Logic;
38use OWR\Logic as Logic,
39    OWR\Request as Request,
40    OWR\Exception as Exception,
41    OWR\DAO as DAO,
42    OWR\User as User,
43    OWR\DB\Request as DBRequest,
44    OWR\Object as Object;
45/**
46 * This class is used to add/edit/delete users and his related tables ()
47 * @package OWR
48 * @uses OWR\Logic extends the base class
49 * @uses OWR\Request the request
50 * @uses OWR\Exception the exception handler
51 * @uses OWR\DAO the DAO
52 * @uses OWR\User the user
53 * @uses OWR\DB\Request a request sent to DB
54 * @uses OWR\Object transforms an object to an array
55 * @subpackage Logic
56 */
57class Users extends Logic
58{
59    /**
60     * Adds/Edits a user
61     *
62     * @access public
63     * @param mixed $request the Request instance
64     * @return $this
65     */
66    public function edit(Request $request)
67    {
68        $query = '
69    SELECT COUNT(id) AS nb
70        FROM users';
71        $exists = $this->_db->getOne($query);
72
73        if($exists->next() && $exists->nb && ($request->id !== User::iGet()->getUid() && !User::iGet()->isAdmin()))
74        {
75            $request->setResponse(new Response(array(
76                'do'        => 'redirect',
77                'location'  => 'login',
78                'status'    => Exception::E_OWR_UNAUTHORIZED
79            )));
80            return $this;
81        }
82
83        $nb = $exists->nb;
84
85        $datas = array('id'=>$request->id);
86
87        if(empty($_POST))
88        {
89            $request->setResponse(new Response(array(
90                'tpl'       => 'edituser',
91                'datas'     => $datas
92            )));
93            return $this;
94        }
95       
96        if(!User::iGet()->checkToken())
97        {
98            $request->setResponse(new Response(array(
99                'do'        => 'redirect',
100                'location'  => 'logout',
101                'status'    => Exception::E_OWR_UNAUTHORIZED
102            )));
103            return $this;
104        }
105       
106        if(empty($request->login) || (!$request->id && empty($request->passwd)) || empty($request->email))
107        {
108            $request->setResponse(new Response(array(
109                'do'        => 'error',
110                'tpl'       => 'edituser',
111                'error'     => 'Please fill all the fields.',
112                'datas'     => $datas,
113                'status'    => Exception::E_OWR_BAD_REQUEST
114            )));
115            return $this;
116        }
117
118        if(mb_strlen($request->login, 'UTF-8') > 55)
119        {
120            $request->setResponse(new Response(array(
121                'do'        => 'error',
122                'tpl'       => 'edituser',
123                'error'     => 'Login too long, please limit it to 55 chars.',
124                'datas'     => $datas,
125                'status'    => Exception::E_OWR_BAD_REQUEST
126            )));
127            return $this;
128        }
129
130        if((!$request->id && (empty($request->passwd) || 
131            empty($request->confirmpasswd) || $request->passwd !== $request->confirmpasswd))
132            || (0 < $request->id && !empty($request->passwd) && !empty($request->confirmpasswd)
133                && $request->passwd !== $request->confirmpasswd))
134        {
135            $request->setResponse(new Response(array(
136                'do'        => 'error',
137                'tpl'       => 'edituser',
138                'error'     => 'Passwords are not identiquals.',
139                'datas'     => $datas,
140                'status'    => Exception::E_OWR_BAD_REQUEST
141            )));
142            return $this;
143        }
144
145        if($nb)
146        {
147            $args = array($request->login);
148            $query = '
149    SELECT id
150        FROM users
151        WHERE (login=?';
152               
153            if(!empty($request->openid))
154            {
155                if(false === mb_strpos($request->openid, 'http://', 0, 'UTF-8'))
156                        $request->openid = 'http://'.$request->openid;
157                if('/' !== mb_substr($request->openid, -1, 1, 'UTF-8'))
158                        $request->openid .= '/';
159                $query .= ' OR openid=?)';
160                array_push($args, $request->openid);
161            }
162            else $query .= ')';
163           
164            if(0 < $request->id)
165            {
166                $query .= ' AND id != '.$request->id;
167            }
168           
169            $exists = $this->_db->getOneP($query, new DBRequest($args));
170            unset($args);
171            if($exists->count())
172            {
173                $request->setResponse(new Response(array(
174                    'do'        => 'error',
175                    'tpl'       => 'edituser',
176                    'datas'     => $datas,
177                    'error'     => 'Login or openid already used. Please choose another.',
178                    'status'    => 409 // conflict
179                )));
180                return $this;
181            }
182           
183            $request->rights = (int)$request->rights;
184           
185            if($request->rights > User::iGet()->getRights() || $request->rights > User::LEVEL_ADMIN)
186            {
187                $request->setResponse(new Response(array(
188                    'do'        => 'error',
189                    'tpl'       => 'edituser',
190                    'datas'     => $datas,
191                    'error'     => 'You can\'t create user with rights higher than yours.',
192                    'status'    => Exception::E_OWR_BAD_REQUEST
193                )));
194                return $this;
195            }
196        }
197        else
198        { // first registered user = admin
199            $request->rights = User::LEVEL_ADMIN;
200        }
201       
202        $request->timezone = User::iGet()->getTimeZones($request->timezone);
203        $request->ulang = User::iGet()->getLang($request->ulang);
204
205        // TODO : check this dynamicly
206        $cfg = Object::toArray($request->config);
207        $cfg['nbnews'] = (int) (isset($cfg['nbnews']) && $cfg['nbnews'] > 0 && $cfg['nbnews'] <= 50 && !($cfg['nbnews']%10) ? $cfg['nbnews'] : 10);
208        $cfg['blockimg'] = (bool) (isset($cfg['blockimg']) ? $cfg['blockimg'] : true);
209        $cfg['abstract'] = (bool) (isset($cfg['abstract']) ? $cfg['abstract'] : false);
210
211        if(!empty($request->passwd) && !empty($request->confirmpasswd))
212        {
213            $args = array(
214                'login'     => $request->login, 
215                'passwd'    => md5($request->login.$request->passwd), 
216                'rights'    => $request->rights, 
217                'lang'      => $request->ulang, 
218                'email'     => $request->email, 
219                'timezone'  => $request->timezone, 
220                'id'        => $request->id,
221                'openid'    => $request->openid,
222                'config'    => $cfg
223            );
224        }
225        else
226        {
227            $args = array(
228                'login'     => $request->login, 
229                'rights'    => $request->rights, 
230                'lang'      => $request->ulang, 
231                'email'     => $request->email, 
232                'timezone'  => $request->timezone, 
233                'id'        => $request->id,
234                'openid'    => $request->openid,
235                'config'    => $cfg
236            );
237        }
238
239        unset($request->passwd, $request->confirmpasswd, $cfg); // remove from memory !
240
241        if($request->id)
242        {
243            $user = $this->_dao->get($request->id);
244            if(!$user)
245            {
246                $request->setResponse(new Response(array(
247                    'do'        => 'error',
248                    'error'     => 'Invalid id',
249                    'status'    => Exception::E_OWR_BAD_REQUEST
250                )));
251                return $this;
252            }
253            $request->new = false;
254        }
255        else
256        {
257            $user = $this->_dao;
258            $request->new = true;
259        }
260
261        $user->populate($args);
262        unset($args);
263
264        $this->_db->beginTransaction();
265        try
266        {
267            $request->id = $user->save($request->new);
268   
269            if(!$nb || (!$request->new && (int)$request->id === (int)User::iGet()->getUid()))
270            {
271                if(!User::iGet()->auth($user->login, $user->passwd))
272                { // ???
273                    unset($user);
274                    $request->setResponse(new Response(array(
275                        'do'        => 'error',
276                        'error'     => 'Internal error',
277                        'status'    => Exception::E_OWR_DIE
278                    )));
279                    return $this;
280                }
281            }
282        }
283        catch(Exception $e)
284        {
285            $request->setResponse(new Response(array(
286                'do'        => 'error',
287                'tpl'       => 'edituser',
288                'datas'     => $datas,
289                'error'     => $e->getContent(),
290                'status'    => Exception::E_OWR_BAD_REQUEST
291            )));
292            return $this;
293        }
294        $this->_db->commit();
295
296        unset($user);
297
298        $request->setResponse(new Response(array(
299            'do'        => 'redirect',
300            'status'    => $request->new ? 201 : 200, // 201 on creation
301            'datas'     => array('id' => $request->id)
302        )));
303
304        return $this;
305    }
306
307    /**
308     * Deletes a user
309     *
310     * @access public
311     * @param mixed $request the Request instance
312     * @return $this
313     */
314    public function delete(Request $request)
315    {
316        if(!$request)
317        {
318            $request->setResponse(new Response(array(
319                'do'        => 'error',
320                'error'     => 'Missing id',
321                'status'    => Exception::E_OWR_BAD_REQUEST
322            )));
323            return $this;
324        }
325
326        $type = DAO::getType($request->id);
327        if('users' !== $type)
328        {
329            $request->setResponse(new Response(array(
330                'do'        => 'error',
331                'error'     => 'Invalid id',
332                'status'    => Exception::E_OWR_BAD_REQUEST
333            )));
334            return $this;
335        }
336
337
338        $this->_db->beginTransaction();
339        try
340        {
341            DAO::getCachedDAO('objects')->delete($request->id);
342        }
343        catch(Exception $e)
344        {
345            $this->_db->rollback();
346            throw new Exception($e->getContent(), $e->getCode());
347        }
348        $this->_db->commit();
349
350
351        if($request->id === User::iGet()->getUid())
352        {
353            $request->setResponse(new Response(array(
354                'do'        => 'redirect',
355                'location'  => 'logout'
356            )));
357        }
358        else
359        {
360            $request->setResponse(new Response);
361        }
362
363        return $this;
364    }
365
366    /**
367     * Gets datas to render a user
368     *
369     * @access public
370     * @author Pierre-Alain Mignot <contact@openwebreader.org>
371     * @param mixed $request the Request instance
372     * @param array $args additional arguments, optionnal
373     * @param string $order the order clause
374     * @param string $groupby the groupby clause
375     * @param string $limit the limit clause
376     * @return $this
377     */
378    public function view(Request $request, array $args = array(), $order = '', $groupby = '', $limit = '')
379    {
380        $args['FETCH_TYPE'] = 'assoc';
381
382        if(!empty($request->ids))
383        {
384            $args['id'] = $request->ids;
385            $limit = count($request->ids);
386        }
387        elseif(!empty($request->id))
388        {
389            $args['id'] = $request->id;
390            $limit = 1;
391        }
392
393        $datas = $this->_dao->get($args, 'id,login,rights,lang,email,openid,timezone,config', $order, $groupby, $limit);
394        if(!$datas)
395        {
396            $request->setResponse(new Response(array(
397                'status'    => 204
398            )));
399            return $this;
400        }
401
402        $multiple = !isset($datas['id']);
403
404        if($multiple)
405        {
406            foreach($datas as $row)
407            {
408                $row['config'] = @unserialize($row['config']);
409            }
410        }
411        else $datas['config'] = @unserialize($datas['config']);
412
413        $request->setResponse(new Response(array(
414            'datas'        => $datas,
415            'multiple'     => $multiple
416        )));
417        return $this;
418    }
419
420    /**
421     * Deletes everything related to a user
422     *
423     * @access public
424     * @param mixed $request the Request instance
425     * @return $this
426     */
427    public function deleteRelated(Request $request)
428    {
429        $this->_db->beginTransaction();
430        try
431        {
432            DAO::getCachedDAO('streams_groups')->delete();
433            DAO::getCachedDAO('news_relations')->delete();
434            DAO::getCachedDAO('streams_relations')->delete();
435            DAO::getCachedDAO('streams_relations_name')->delete();
436        }
437        catch(Exception $e)
438        {
439            $this->_db->rollback();
440            throw new Exception($e->getContent(), $e->getCode());
441        }
442        $this->_db->commit();
443
444        $request->setResponse(new Response(array(
445            'status'    => 204 // OK, no content to return
446        )));
447
448        return $this;
449    }
450
451    /**
452     * Changes the user interface language
453     *
454     * @author Pierre-Alain Mignot <contact@openwebreader.org>
455     * @access public
456     * @param string $newLang the new lang
457     * @param mixed $uid the id of the user
458     */
459    public function changeLang(Request $request)
460    {
461        if(empty($request->newlang))
462        {
463            $request->setResponse(new Response(array(
464                'do'        => 'error',
465                'error'     => 'Empty lang',
466                'status'    => Exception::E_OWR_BAD_REQUEST
467            )));
468            return $this;
469        }
470
471        $newLang = (string) User::iGet()->setLang($request->newlang);
472
473        $dao = $this->_dao->get(User::iGet()->getUid(), 'id,lang');
474        if(!$dao)
475        {
476            $request->setResponse(new Response(array(
477                'do'        => 'error',
478                'error'     => 'Invalid user id',
479                'status'    => Exception::E_OWR_BAD_REQUEST
480            )));
481        }
482
483        $dao->lang = $newLang;
484        $dao->save();
485
486        $request->setResponse(new Response);
487
488        return $this;
489    }
490}
Note: See TracBrowser for help on using the repository browser.