/*************************************************************************
* UrBackup - Client/Server backup system
* Copyright (C) 2011-2014 Martin Raiber
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
**************************************************************************/
#include "helper.h"
#include "../../stringtools.h"
#include "../database.h"
#include
#include
extern std::string server_identity;
Helper::Helper(THREAD_ID pTID, str_map *pGET, str_nmap *pPARAMS)
{
session=NULL;
update(pTID,pGET,pPARAMS);
}
void Helper::update(THREAD_ID pTID, str_map *pGET, str_nmap *pPARAMS)
{
tid=pTID;
GET=pGET;
PARAMS=pPARAMS;
if(GET==NULL)
{
return;
}
if( session==NULL )
{
session=Server->getSessionMgr()->getUser( (*GET)[L"ses"], widen((*PARAMS)["REMOTE_ADDR"]+(*PARAMS)["HTTP_USER_AGENT"]) );
}
//Get language from ACCEPT_LANGUAGE
str_map::iterator lit=GET->find(L"lang");
if(lit!=GET->end() && lit->second!=L"-")
{
language=wnarrow(lit->second);
}
else
{
std::wstring langs=(*GET)[L"langs"];
std::vector clangs;
Tokenize(langs, clangs, L",");
for(size_t j=0;jfind("ACCEPT_LANGUAGE");
if(al==PARAMS->end())
al=PARAMS->find("HTTP_ACCEPT_LANGUAGE");
if(al!=PARAMS->end())
{
std::vector toks;
Tokenize(al->second, toks, ",");
for(size_t i=0;igetDatabase(tid, TRANSLATIONDB);
ITemplate *tmpl=Server->createTemplate("urbackup/templates/"+name);
/*if( db!=NULL )
{
tmpl->addValueTable(db, "translation_"+language );
}*/
if( invalid_session==true )
tmpl->setValue(L"INVALID_SESSION",L"true");
else if(session!=NULL)
tmpl->setValue(L"SESSION", session->session);
if( session!=NULL && session->id==-1 )
tmpl->setValue(L"INVALID_ID",L"true");
templates.push_back( tmpl );
return tmpl;
}
Helper::~Helper(void)
{
if( session!=NULL )
Server->getSessionMgr()->releaseUser(session);
for(size_t i=0;idestroy( templates[i] );
}
}
void Helper::Write(std::string str)
{
Server->Write( tid, str );
}
void Helper::WriteTemplate(ITemplate *tmpl)
{
Server->Write( tid, tmpl->getData() );
}
IDatabase *Helper::getDatabase(void)
{
return Server->getDatabase(tid, URBACKUPDB_SERVER);
}
std::wstring Helper::generateSession(std::wstring username)
{
return Server->getSessionMgr()->GenerateSessionIDWithUser( username, widen((*PARAMS)["REMOTE_ADDR"]+(*PARAMS)["HTTP_USER_AGENT"]) );
}
std::string Helper::getRights(const std::string &domain)
{
if(session==NULL) return "none";
if(session->id==0) return "all";
if(getRightsInt("all")=="all")
return "all";
return getRightsInt(domain);
}
std::string Helper::getRightsInt(const std::string &domain)
{
if(session==NULL) return "none";
IQuery *q=getDatabase()->Prepare("SELECT t_right FROM settings_db.si_permissions WHERE clientid=? AND t_domain=?");
q->Bind(session->id);
q->Bind(domain);
db_results res=q->Read();
q->Reset();
if(!res.empty())
{
return wnarrow(res[0][L"t_right"]);
}
else
{
return "none";
}
}
void Helper::releaseAll(void)
{
if(session!=NULL)
{
Server->getSessionMgr()->releaseUser(session);
session=NULL;
}
}
std::string Helper::getTimeFormatString(void)
{
return "%Y-%m-%d %H:%M";
}
std::string Helper::getLanguage(void)
{
return language;
}
std::vector Helper::getRightIDs(std::string rights)
{
std::vector clientid;
if(rights!="all" && rights!="none" )
{
std::vector s_clientid;
Tokenize(rights, s_clientid, ",");
for(size_t i=0;i right_ids)
{
bool r_ok=false;
if(rights!="all")
{
for(size_t i=0;iPrepare("SELECT id, name, password_md5 FROM settings_db.si_users WHERE name=?");
q->Bind(username);
db_results res=q->Read();
if(!res.empty())
{
std::wstring password_md5=res[0][L"password_md5"];
std::string ui_password=wnarrow(password);
std::string r_password=Server->GenerateHexMD5(Server->ConvertToUTF8(session->mStr[L"rnd"]+password_md5));
if(r_password!=ui_password)
{
return false;
}
else
{
if(user_id!=NULL)
{
*user_id=watoi(res[0][L"id"]);
}
return true;
}
}
return false;
}
std::vector Helper::clientRights(const std::string& right_name, bool& all_client_rights)
{
std::string rights=getRights(right_name);
std::vector clientid;
if(rights!="all" && rights!="none" )
{
std::vector s_clientid;
Tokenize(rights, s_clientid, ",");
for(size_t i=0;i3)
{
if(next(ret, 0, "#I"))
{
ret=ret.substr(2);
}
if(ret[ret.size()-1]=='#')
{
ret=ret.substr(0, ret.size()-1);
}
}
return ret;
}
void Helper::sleep(unsigned int ms)
{
if(session!=NULL)
{
Server->getSessionMgr()->releaseUser(session);
}
Server->wait(ms);
if(session!=NULL)
{
Server->getSessionMgr()->lockUser(session);
}
}