panel admina
[watermeloncms.git] / wtrmln / modules / plugins / user.php
blob10590d7c324fd7a67d8d89f297cc98d132e07323
1 <?php
2 /********************************************************************
4 Watermelon CMS
6 Copyright 2008-2009 Radosław Pietruszewski
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 version 2 as published by the Free Software Foundation.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 ********************************************************************/
23 class User extends Plugin
26 * private Model_User $User
28 * Instancja klasy Model_User
30 private $User;
33 * private static bool $LoggedIn
35 * stan użytkownika (zalogowany/niezalogowany)
38 private static $LoggedIn = null;
41 * private static object[] $users
43 * tablica z danymi userów w postaci obiektu.
45 * $users = array(UID => object(...), UID => object())
48 private static $users;
51 * public void User()
53 * Konstruktor. Uzupełnia pole $User.
56 public function User()
58 parent::Plugin();
60 $this->User = $this->load->model('user');
64 * public bool Login(string $user, string $password, bool $autologin)
66 * Loguje użytkownika. Zwraca true, jeśli logowanie wypadło pomyślnie, w
67 * przeciwnym wypadku zwraca false.
69 * string $user - Nazwa użytkownika
70 * string $password - Hasło użytkownika (w czystej postaci)
71 * bool $autologin - Zalogować usera automatycznie przy każdej wizycie?
72 * TRUE - Tak, loguj mnie automatycznie
73 * FALSE - Nie loguj mnie automatycznie
76 public function Login($user, $password, $autologin)
78 // Walidacja wprowadzonych danych
80 if(empty($user))
82 $errors[] = 'Pole <em>login</em> musi być wypełnione.';
85 if(empty($password))
87 $errors[] = 'Pole <em>hasło</em> musi być wypełnione.';
90 if(isset($errors))
92 setH1('Błąd logowania');
94 echo $this->load->view('login_loginerrors', array('errors' => $errors));
95 return false;
98 // sprawdzamy, czy user istnieje
100 $userdata = $this->User->LoginUserData($user);
102 if($userdata->num_rows() == 0)
104 setH1('Błąd logowania');
106 $errors[] = 'Użytkownik <em>' . $user . '</em> nie istnieje.';
108 echo $this->load->view('login_loginerrors', array('errors' => $errors));
109 return false;
112 // sprawdzamy poprawność hasła
114 $userdata = $userdata->to_obj();
116 if($userdata->password != strHash($password . $userdata->salt, intval($userdata->hashalgo)))
118 setH1('Błąd logowania');
120 $errors[] = 'Niepoprawne hasło.';
122 echo $this->load->view('login_loginerrors', array('errors' => $errors));
123 return false;
126 // generujemy nowy salt i hash i
127 // zmieniamy hashalgo (jeśli nieaktualne)
129 $salt = strHash(uniqid(mt_rand(), true));
131 $salt = substr($salt, 0, 16);
133 $hash = strHash($password . $salt);
135 $this->User->updatePassword($user, $hash, $salt, Config::$defaultHashAlgo);
137 // logujemy :]
139 $_SESSION['WTRMLN_USER'] = $user;
140 $_SESSION['WTRMLN_UID'] = $userdata->id;
141 $_SESSION['WTRMLN_PASS'] = $hash;
142 $_SESSION['WTRMLN_LASTSEEN'] = time();
144 // jeszcze informacyjka
146 //setH1('Logowanie udane');
148 //echo $this->load->view('login_success');
150 siteredirect('msg:login_success');
152 return true;
155 public function Register($user, $password, $password2/*, $email, $email2, $data*/)
157 // Walidacja wprowadzonych danych
159 if(empty($user))
161 $errors[] = 'Pole <em>login</em> musi być wypełnione.';
164 if(empty($password))
166 $errors[] = 'Pole <em>hasło</em> musi być wypełnione.';
169 if(empty($password2))
171 $errors[] = 'Pole <em>powtórz hasło</em> musi być wypełnione.';
174 if(isset($errors))
176 setH1('Błąd rejestracji');
178 echo $this->load->view('register_errors', array('errors' => $errors));
179 return false;
182 // sprawdzamy, czy hasła pasują do siebie
184 if($password !== $password2)
186 setH1('Błąd rejestracji');
188 $errors[] = 'Hasła nie pasują do siebie';
190 echo $this->load->view('register_errors', array('errors' => $errors));
191 return false;
194 // sprawdzamy, czy user istnieje
196 $userdata = $this->User->LoginUserData($user);
198 if($userdata->exists())
200 setH1('Błąd rejestracji');
202 $errors[] = 'Użytkownik <em>' . $user . '</em> już istnieje.';
204 echo $this->load->view('register_errors', array('errors' => $errors));
205 return false;
208 // generujemy salt i hash
210 $salt = strHash(uniqid(mt_rand(), true));
212 $salt = substr($salt, 0, 16);
214 $hash = strHash($password . $salt);
216 $id = $this->User->register($user, $hash, $salt);
218 model('pw')->SendPW(1, $id, 'Witaj na stronie!', "Dzięki za rejestrację.\nMożesz już usunąć tą wiadomość.\nPozdrowienia, ekipa strony.", time());
220 $this->Login($user, $password, 0);
222 //TODO
226 * public void Logout()
228 * wylogowuje użytkownika (niszczy sesję, nie pokazuje żadnych treści)
231 public function Logout()
233 session_destroy();
235 self::$LoggedIn = false;
239 * public bool IsLoggedIn()
241 * Sprawdza, czy użytkownik jest zalogowany.
243 * zwraca true, jeśli jeśli użytkownik jest zalogowany,
244 * w przeciwnym wypadku zwraca false.
247 public function IsLoggedIn()
249 // sprawdzamy, czy już wcześniej funkcja była odpalana
251 if(self::$LoggedIn !== null)
253 return self::$LoggedIn;
256 // sprawdzamy, czy sesja istnieje
258 if(!isset($_SESSION['WTRMLN_USER']))
260 self::$LoggedIn = false;
261 return false;
264 // sprawdzamy, czy user istnieje
266 $userdata = $this->User->LoginUserData($_SESSION['WTRMLN_USER']);
268 if(!$userdata->exists())
270 self::$LoggedIn = false;
271 return false;
274 // sprawdzamy, czy UID pasuje do nicka
276 $userdata = $userdata->to_obj();
278 if($userdata->id != $_SESSION['WTRMLN_UID'])
280 self::$LoggedIn = false;
281 return false;
284 // sprawdzamy poprawność hasła
286 if($_SESSION['WTRMLN_PASS'] != $userdata->password)
288 self::$LoggedIn = false;
289 return false;
292 // sprawdzamy kiedy ostatnio był użytkownik
293 // jeśli przekroczony limit długości sesji (1800 sekund)
294 // automatycznie wylogowuje
296 if($_SESSION['WTRMLN_LASTSEEN'] < time() - 1800)
298 $this->Logout();
299 return false;
302 // aktualizujemy dane
304 $_SESSION['WTRMLN_LASTSEEN'] = time();
306 self::$LoggedIn = true;
308 $this->User->UpdateLastSeen($_SESSION['WTRMLN_UID']);
310 return true;
314 * public bool IsAdmin()
316 * sprawdza, czy zalogowany użytkownik jest adminem.
317 * jednocześnie sprawdza, czy w ogóle jest zalogowany.
319 * zwraca true, jeśil zalogowany użytkownik jest adminem,
320 * a gdy użytkownik nie jest adminem, lub w ogóle nie jest
321 * zalogowany zwraca false.
324 public function IsAdmin()
326 // sprawdzamy, czy w ogóle jest zalogowany
328 if(!$this->IsLoggedIn())
330 return false;
333 // sprawdzamy, czy jest w tablicy superusers
335 $superusers = Config::getSuperusers();
337 if(array_search($_SESSION['WTRMLN_USER'], $superusers) === false)
339 return false;
342 // sprawdzamy, czy ma odpowiednie uprawnienia w bazie danych
344 $priviliges = $this->getData($_SESSION['WTRMLN_UID']);
346 if($priviliges->a_paaccess !== '1')
348 return false;
351 return true;
355 * public static string getNick(uint $uid)
357 * zwraca nick danego użytkownika na podstawie UID
359 * uint $uid - ID użytkownika, którego nick ma zostać zwrócony
362 public static function getNick($uid)
364 $uid = intval($uid);
366 if(isset(self::$users[$uid]))
368 return self::$users[$uid]->nick;
371 $data = Loader::model('user')->UserData($uid)->to_obj();
373 self::$users[$uid] = $data;
375 return $data->nick;
379 * public static string getData(uint $uid)
381 * zwraca dane danego użytkownika na podstawie UID
383 * uint $uid - ID użytkownika, którego dane mają zostać zwrócone
386 public static function getData($uid)
388 $uid = intval($uid);
390 if(isset(self::$users[$uid]))
392 return self::$users[$uid];
395 $data = Loader::model('user')->UserData($uid)->to_obj();
397 self::$users[$uid] = $data;
399 return $data;
403 * public static bool CanI(string $what)
405 * sprawdza, czy aktualnie zalogowany użytkownik ma
406 * uprawnianie $what. Zwraca true, jeśli tak, w
407 * przeciwnym wypadku lub gdy nie jest zalogowany
408 * zwraca false;
411 public static function CanI($what)
413 if(!Controller::$_user->IsLoggedIn())
415 return false;
418 $data = self::getData($_SESSION['WTRMLN_UID']);
420 if($data->$what == '1')
422 return true;
424 else
426 return false;