/* * This file is a part of Winix * and is not publicly distributed * * Copyright (c) 2008-2010, Tomasz Sowa * All rights reserved. * */ #include #include "users.h" Users::Users() { how_many_logged = 0; Clear(); } void Users::SetCur(Cur * pcur) { cur = pcur; } void Users::Clear() { table.Clear(); } void Users::ReadUsers(Db * db) { Clear(); db->GetUsers(table); } void Users::SetTimeZoneOffset(int offset) { Table::Iterator i; for(i=table.Begin() ; i!=table.End() ; ++i) { (*i)->time_zone_offset = offset; } } bool Users::AddUser(const User & user) { Table::Iterator i = table.PushBack(user); return (i != table.End()); } bool Users::IsUser(const std::wstring & name) { return table.Is(name); } User * Users::GetUser(long user_id) { Table::Iterator i = table.FindId(user_id); if( i == table.End() ) return 0; return &(**i); } User * Users::GetUser(const std::wstring & name) { Table::Iterator i = table.FindName(name); if( i == table.End() ) return 0; return &(**i); } long Users::GetUserId(const std::wstring & name) { User * puser = GetUser(name); if( !puser ) return -1; return puser->id; } Users::Iterator Users::Begin() { return table.Begin(); } Users::Iterator Users::End() { return table.End(); } Users::SizeType Users::Size() { return table.Size(); } User & Users::operator[](Users::SizeType pos) { // !! IMPROVE ME // add checking the range and returning an empty User struct if out of range return table[pos]; } void Users::LoginUser(long user_id, bool remember_me) { if( !cur->session ) return; if( cur->session->id == 0 ) { log << log1 << "Users: cannot login a user on a temporary session" << logend; return; } cur->session->puser = GetUser(user_id); cur->session->spam_score = 0; if( !cur->session->puser ) { log << log1 << "Users: user id: " << user_id << " is not in system.users table" << logend; return; } cur->session->remember_me = remember_me; last.UserLogin(user_id, cur->session->puser->name, inet_addr(cur->request->env_remote_addr), cur->session->id); // !! jesli uzytkownik ponownie sie loguje ten sam na ta sama sesje to mozna nie zwiekszac licznika how_many_logged += 1; log << log2 << "User " << cur->session->puser->name << " (id: " << user_id << ") logged" << logend; } void Users::LogoutCurrentUser() { if( !cur->session || !cur->session->puser ) return; log << log2 << "Users: user " << cur->session->puser->name << ", id: " << cur->session->puser->id << " logged out" << logend; last.UserLogout(cur->session->puser->id, cur->session->id); if( how_many_logged > 0 ) // for safety how_many_logged -= 1; cur->session->puser = 0; cur->session->remember_me = 0; } void Users::IncrementLoggedUsers() { how_many_logged += 1; } long Users::HowManyLogged() { return how_many_logged; }