X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/02be813c72c75c61beaef0266bd5adf713e67b42..8d9dd942e45cfcf2d0fa647a984f01b58fd5a7f0:/projects/stargazer/plugins/configuration/sgconfig/parser.cpp?ds=inline diff --git a/projects/stargazer/plugins/configuration/sgconfig/parser.cpp b/projects/stargazer/plugins/configuration/sgconfig/parser.cpp index c933b5fe..dd654a1e 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/parser.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/parser.cpp @@ -1,27 +1,176 @@ -#include <stdio.h> -#include <sys/utsname.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> +/* + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Author : Boris Mikhailenko <stg34@stargazer.dp.ua> + */ -#include <cstring> -#include <cerrno> -#include <sstream> +#include "parser.h" -#include "stg/version.h" #include "stg/tariffs.h" +#include "stg/admin.h" +#include "stg/users.h" #include "stg/user_property.h" #include "stg/settings.h" -#include "parser.h" +#include "stg/logger.h" +#include "stg/version.h" +#include "stg/store.h" + +#include <cstring> +#include <cstdio> // sprintf + +#include <sys/utsname.h> #define UNAME_LEN (256) + +namespace +{ + +std::string UserToXML(const USER & user, bool loginInStart, bool showPass, time_t lastTime = 0) +{ +std::string answer; + +if (loginInStart) + answer += "<User result=\"ok\">"; +else + answer += "<User result=\"ok\" login=\"" + user.GetLogin() + "\">"; + +answer += "<Login value=\"" + user.GetLogin() + "\"/>"; + +if (user.GetProperty().password.ModificationTime() > lastTime) + { + if (showPass) + answer += "<Password value=\"" + user.GetProperty().password.Get() + "\" />"; + else + answer += "<Password value=\"++++++\"/>"; + } + +if (user.GetProperty().cash.ModificationTime() > lastTime) + answer += "<Cash value=\"" + x2str(user.GetProperty().cash.Get()) + "\"/>"; +if (user.GetProperty().freeMb.ModificationTime() > lastTime) + answer += "<FreeMb value=\"" + x2str(user.GetProperty().freeMb.Get()) + "\"/>"; +if (user.GetProperty().credit.ModificationTime() > lastTime) + answer += "<Credit value=\"" + x2str(user.GetProperty().credit.Get()) + "\"/>"; + +if (user.GetProperty().nextTariff.Get() != "") + { + if (user.GetProperty().tariffName.ModificationTime() > lastTime || + user.GetProperty().nextTariff.ModificationTime() > lastTime) + answer += "<Tariff value=\"" + user.GetProperty().tariffName.Get() + "/" + user.GetProperty().nextTariff.Get() + "\"/>"; + } +else + { + if (user.GetProperty().tariffName.ModificationTime() > lastTime) + answer += "<Tariff value=\"" + user.GetProperty().tariffName.Get() + "\"/>"; + } + +if (user.GetProperty().note.ModificationTime() > lastTime) + answer += "<Note value=\"" + Encode12str(user.GetProperty().note) + "\"/>"; +if (user.GetProperty().phone.ModificationTime() > lastTime) + answer += "<Phone value=\"" + Encode12str(user.GetProperty().phone) + "\"/>"; +if (user.GetProperty().address.ModificationTime() > lastTime) + answer += "<Address value=\"" + Encode12str(user.GetProperty().address) + "\"/>"; +if (user.GetProperty().email.ModificationTime() > lastTime) + answer += "<Email value=\"" + Encode12str(user.GetProperty().email) + "\"/>"; + +std::vector<const USER_PROPERTY_LOGGED<std::string> *> userdata; +userdata.push_back(user.GetProperty().userdata0.GetPointer()); +userdata.push_back(user.GetProperty().userdata1.GetPointer()); +userdata.push_back(user.GetProperty().userdata2.GetPointer()); +userdata.push_back(user.GetProperty().userdata3.GetPointer()); +userdata.push_back(user.GetProperty().userdata4.GetPointer()); +userdata.push_back(user.GetProperty().userdata5.GetPointer()); +userdata.push_back(user.GetProperty().userdata6.GetPointer()); +userdata.push_back(user.GetProperty().userdata7.GetPointer()); +userdata.push_back(user.GetProperty().userdata8.GetPointer()); +userdata.push_back(user.GetProperty().userdata9.GetPointer()); + +for (size_t i = 0; i < userdata.size(); i++) + if (userdata[i]->ModificationTime() > lastTime) + answer += "<UserData" + x2str(i) + " value=\"" + Encode12str(userdata[i]->Get()) + "\" />"; + +if (user.GetProperty().realName.ModificationTime() > lastTime) + answer += "<Name value=\"" + Encode12str(user.GetProperty().realName) + "\"/>"; +if (user.GetProperty().group.ModificationTime() > lastTime) + answer += "<Group value=\"" + Encode12str(user.GetProperty().group) + "\"/>"; +if (user.GetConnectedModificationTime() > lastTime) + answer += std::string("<Status value=\"") + (user.GetConnected() ? "1" : "0") + "\"/>"; +if (user.GetProperty().alwaysOnline.ModificationTime() > lastTime) + answer += std::string("<AOnline value=\"") + (user.GetProperty().alwaysOnline.Get() ? "1" : "0") + "\"/>"; +if (user.GetCurrIPModificationTime() > lastTime) + answer += "<CurrIP value=\"" + inet_ntostring(user.GetCurrIP()) + "\"/>"; +if (user.GetPingTime() > lastTime) + answer += "<PingTime value=\"" + x2str(user.GetPingTime()) + "\"/>"; +if (user.GetProperty().ips.ModificationTime() > lastTime) + answer += "<IP value=\"" + user.GetProperty().ips.Get().GetIpStr() + "\"/>"; + +answer += "<Traff"; +const DIR_TRAFF & upload(user.GetProperty().down.Get()); +const DIR_TRAFF & download(user.GetProperty().up.Get()); +if (user.GetProperty().up.ModificationTime() > lastTime) + for (size_t j = 0; j < DIR_NUM; j++) + answer += " MU" + x2str(j) + "=\"" + x2str(upload[j]) + "\""; +if (user.GetProperty().down.ModificationTime() > lastTime) + for (size_t j = 0; j < DIR_NUM; j++) + answer += " MD" + x2str(j) + "=\"" + x2str(download[j]) + "\""; +if (user.GetSessionUploadModificationTime() > lastTime) + for (size_t j = 0; j < DIR_NUM; j++) + answer += " SU" + x2str(j) + "=\"" + x2str(user.GetSessionUpload()[j]) + "\""; +if (user.GetSessionDownloadModificationTime() > lastTime) + for (size_t j = 0; j < DIR_NUM; j++) + answer += " SD" + x2str(j) + "=\"" + x2str(user.GetSessionDownload()[j]) + "\""; +answer += "/>"; + +if (user.GetProperty().disabled.ModificationTime() > lastTime) + answer += std::string("<Down value=\"") + (user.GetProperty().disabled.Get() ? "1" : "0") + "\"/>"; +if (user.GetProperty().disabledDetailStat.ModificationTime() > lastTime) + answer += std::string("<DisableDetailStat value=\"") + (user.GetProperty().disabledDetailStat.Get() ? "1" : "0") + "\"/>"; +if (user.GetProperty().passive.ModificationTime() > lastTime) + answer += std::string("<Passive value=\"") + (user.GetProperty().passive.Get() ? "1" : "0") + "\"/>"; +if (user.GetProperty().lastCashAdd.ModificationTime() > lastTime) + answer += "<LastCash value=\"" + x2str(user.GetProperty().lastCashAdd.Get()) + "\"/>"; +if (user.GetProperty().lastCashAddTime.ModificationTime() > lastTime) + answer += "<LastTimeCash value=\"" + x2str(user.GetProperty().lastCashAddTime.Get()) + "\"/>"; +if (user.GetProperty().lastActivityTime.ModificationTime() > lastTime) + answer += "<LastActivityTime value=\"" + x2str(user.GetProperty().lastActivityTime.Get()) + "\"/>"; +if (user.GetProperty().creditExpire.ModificationTime() > lastTime) + answer += "<CreditExpire value=\"" + x2str(user.GetProperty().creditExpire.Get()) + "\"/>"; + +if (lastTime == 0) + { + answer += "<AuthorizedBy>"; + std::vector<std::string> list(user.GetAuthorizers()); + for (std::vector<std::string>::const_iterator it = list.begin(); it != list.end(); ++it) + answer += "<Auth name=\"" + *it + "\"/>"; + answer += "</AuthorizedBy>"; + } + +answer += "</User>"; + +return answer; +} + +} // namespace anonymous + //----------------------------------------------------------------------------- // GET SERVER INFO //----------------------------------------------------------------------------- int PARSER_GET_SERVER_INFO::ParseStart(void *, const char *el, const char **) { -answerList->erase(answerList->begin(), answerList->end()); +answer.clear(); if (strcasecmp(el, "GetServerInfo") == 0) { return 0; @@ -41,7 +190,6 @@ return -1; //----------------------------------------------------------------------------- void PARSER_GET_SERVER_INFO::CreateAnswer() { -char s[UNAME_LEN + 128]; char un[UNAME_LEN]; struct utsname utsn; @@ -56,49 +204,24 @@ strcat(un, utsn.machine); strcat(un, " "); strcat(un, utsn.nodename); -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); -answerList->push_back("<ServerInfo>"); - -sprintf(s, "<version value=\"%s\"/>", SERVER_VERSION); -answerList->push_back(s); - -sprintf(s, "<tariff_num value=\"%u\"/>", tariffs->Count()); -answerList->push_back(s); - -sprintf(s, "<tariff value=\"%d\"/>", 2); -answerList->push_back(s); - -sprintf(s, "<users_num value=\"%u\"/>", users->Count()); -answerList->push_back(s); - -sprintf(s, "<uname value=\"%s\"/>", un); -answerList->push_back(s); +answer.clear(); +answer += "<ServerInfo>"; +answer += std::string("<version value=\"") + SERVER_VERSION + "\"/>"; +answer += "<tariff_num value=\"" + x2str(tariffs->Count()) + "\"/>"; +answer += "<tariff value=\"2\"/>"; +answer += "<user_num value=\"" + x2str(users->Count()) + "\"/>"; +answer += std::string("<uname value=\"") + un + "\"/>"; +answer += "<dir_num value=\"" + x2str(DIR_NUM) + "\"/>"; +answer += "<day_fee value=\"" + x2str(settings->GetDayFee()) + "\"/>"; -sprintf(s, "<dir_num value=\"%d\"/>", DIR_NUM); -answerList->push_back(s); +for (size_t i = 0; i< DIR_NUM; i++) + answer += "<dir_name_" + x2str(i) + " value=\"" + Encode12str(settings->GetDirName(i)) + "\"/>"; -sprintf(s, "<day_fee value=\"%d\"/>", settings->GetDayFee()); -answerList->push_back(s); - -for (int i = 0; i< DIR_NUM; i++) - { - string dn2e; - Encode12str(dn2e, settings->GetDirName(i)); - sprintf(s, "<dir_name_%d value=\"%s\"/>", i, dn2e.c_str()); - answerList->push_back(s); - } - -answerList->push_back("</ServerInfo>"); +answer += "</ServerInfo>"; } //----------------------------------------------------------------------------- // GET USER //----------------------------------------------------------------------------- -PARSER_GET_USER::PARSER_GET_USER() -{ - -} -//----------------------------------------------------------------------------- int PARSER_GET_USER::ParseStart(void *, const char *el, const char **attr) { if (strcasecmp(el, "GetUser") == 0) @@ -128,180 +251,21 @@ return -1; //----------------------------------------------------------------------------- void PARSER_GET_USER::CreateAnswer() { -string s; -string enc; - USER_PTR u; -answerList->erase(answerList->begin(), answerList->end()); +answer.clear(); if (users->FindByName(login, &u)) { - s = "<user result=\"error\"/>"; - answerList->push_back(s); + answer = "<User result=\"error\" reason=\"User not found.\"/>"; return; } -s = "<user result=\"ok\">"; -answerList->push_back(s); - -s = "<login value=\"" + u->GetLogin() + "\"/>"; -answerList->push_back(s); - -if (currAdmin->GetPriv()->userConf || currAdmin->GetPriv()->userPasswd) - s = "<password value=\"" + u->GetProperty().password.Get() + "\" />"; -else - s = "<password value=\"++++++\"/>"; -answerList->push_back(s); - -strprintf(&s, "<cash value=\"%f\" />", u->GetProperty().cash.Get()); -answerList->push_back(s); - -strprintf(&s, "<freemb value=\"%f\" />", u->GetProperty().freeMb.Get()); -answerList->push_back(s); - -strprintf(&s, "<credit value=\"%f\" />", u->GetProperty().credit.Get()); -answerList->push_back(s); - -if (u->GetProperty().nextTariff.Get() != "") - { - strprintf(&s, "<tariff value=\"%s/%s\" />", - u->GetProperty().tariffName.Get().c_str(), - u->GetProperty().nextTariff.Get().c_str()); - } -else - { - strprintf(&s, "<tariff value=\"%s\" />", - u->GetProperty().tariffName.Get().c_str()); - } - -answerList->push_back(s); - -Encode12str(enc, u->GetProperty().note); -s = "<note value=\"" + enc + "\" />"; -answerList->push_back(s); - -Encode12str(enc, u->GetProperty().phone); -s = "<phone value=\"" + enc + "\" />"; -answerList->push_back(s); - -Encode12str(enc, u->GetProperty().address); -s = "<address value=\"" + enc + "\" />"; -answerList->push_back(s); - -Encode12str(enc, u->GetProperty().email); -s = "<email value=\"" + enc + "\" />"; -answerList->push_back(s); - - -vector<USER_PROPERTY_LOGGED<string> *> userdata; -userdata.push_back(u->GetProperty().userdata0.GetPointer()); -userdata.push_back(u->GetProperty().userdata1.GetPointer()); -userdata.push_back(u->GetProperty().userdata2.GetPointer()); -userdata.push_back(u->GetProperty().userdata3.GetPointer()); -userdata.push_back(u->GetProperty().userdata4.GetPointer()); -userdata.push_back(u->GetProperty().userdata5.GetPointer()); -userdata.push_back(u->GetProperty().userdata6.GetPointer()); -userdata.push_back(u->GetProperty().userdata7.GetPointer()); -userdata.push_back(u->GetProperty().userdata8.GetPointer()); -userdata.push_back(u->GetProperty().userdata9.GetPointer()); - -string tmpI; -for (unsigned i = 0; i < userdata.size(); i++) - { - Encode12str(enc, userdata[i]->Get()); - s = "<UserData" + x2str(i, tmpI) + " value=\"" + enc + "\" />"; - answerList->push_back(s); - } - -Encode12str(enc, u->GetProperty().realName); -s = "<name value=\"" + enc + "\" />"; -answerList->push_back(s); - -Encode12str(enc, u->GetProperty().group); -s = "<GROUP value=\"" + enc + "\" />"; -answerList->push_back(s); - -strprintf(&s, "<status value=\"%d\" />", u->GetConnected()); -answerList->push_back(s); - -strprintf(&s, "<aonline value=\"%d\" />", u->GetProperty().alwaysOnline.Get()); -answerList->push_back(s); - -strprintf(&s, "<currip value=\"%s\" />", inet_ntostring(u->GetCurrIP()).c_str()); -answerList->push_back(s); - -strprintf(&s, "<PingTime value=\"%lu\" />", u->GetPingTime()); -answerList->push_back(s); - -stringstream sstr; -sstr << u->GetProperty().ips.Get(); -strprintf(&s, "<ip value=\"%s\" />", sstr.str().c_str()); -answerList->push_back(s); - -char * ss; -ss = new char[DIR_NUM*25*4 + 50]; -char st[50]; -sprintf(ss, "<traff"); -DIR_TRAFF upload; -DIR_TRAFF download; -download = u->GetProperty().down.Get(); -upload = u->GetProperty().up.Get(); - -for (int j = 0; j < DIR_NUM; j++) - { - string s; - x2str(upload[j], s); - sprintf(st, " MU%d=\"%s\"", j, s.c_str()); - strcat(ss, st); - - x2str(download[j], s); - sprintf(st, " MD%d=\"%s\"", j, s.c_str()); - strcat(ss, st); - - sprintf(st, " SU%d=\"0\"", j); - strcat(ss, st); - - sprintf(st, " SD%d=\"0\"", j); - strcat(ss, st); - } -strcat(ss, " />"); -answerList->push_back(ss); -delete[] ss; - -strprintf(&s, "<down value=\"%d\" />", u->GetProperty().disabled.Get()); -answerList->push_back(s); - -strprintf(&s, "<DisableDetailStat value=\"%d\" />", u->GetProperty().disabledDetailStat.Get()); -answerList->push_back(s); - -strprintf(&s, "<passive value=\"%d\" />", u->GetProperty().passive.Get()); -answerList->push_back(s); - -strprintf(&s, "<LastCash value=\"%f\" />", u->GetProperty().lastCashAdd.Get()); -answerList->push_back(s); - -strprintf(&s, "<LastTimeCash value=\"%ld\" />", u->GetProperty().lastCashAddTime.Get()); -answerList->push_back(s); - -strprintf(&s, "<LastActivityTime value=\"%ld\" />", u->GetProperty().lastActivityTime.Get()); -answerList->push_back(s); - -strprintf(&s, "<CreditExpire value=\"%ld\" />", u->GetProperty().creditExpire.Get()); -answerList->push_back(s); - -strprintf(&s, "</user>"); -answerList->push_back(s); +answer = UserToXML(*u, false, currAdmin->GetPriv()->userConf || currAdmin->GetPriv()->userPasswd); } //----------------------------------------------------------------------------- // GET USERS //----------------------------------------------------------------------------- -PARSER_GET_USERS::PARSER_GET_USERS() - : lastUserUpdateTime(0), - lastUpdateFound(false) -{ -} -//----------------------------------------------------------------------------- int PARSER_GET_USERS::ParseStart(void *, const char *el, const char ** attr) { /*if (attr && *attr && *(attr+1)) @@ -350,20 +314,7 @@ return -1; //----------------------------------------------------------------------------- void PARSER_GET_USERS::CreateAnswer() { -answerList->erase(answerList->begin(), answerList->end()); - -string s; -string userStart; -string traffStart; -string traffMiddle; -string traffFinish; -string middle; -string userFinish; - - -string enc; - -USER_PTR u; +answer.clear(); int h = users->OpenSearch(); if (!h) @@ -372,282 +323,24 @@ if (!h) users->CloseSearch(h); return; } -string updateTime; -x2str(time(NULL), updateTime); if (lastUpdateFound) - answerList->push_back("<Users LastUpdate=\"" + updateTime + "\">"); + answer += "<Users LastUpdate=\"" + x2str(time(NULL)) + "\">"; else - answerList->push_back("<Users>"); - -while (1) - { - if (users->SearchNext(h, &u)) - { - break; - } - userStart = "<user login=\"" + u->GetLogin() + "\">"; - middle = ""; - - if (u->GetProperty().password.ModificationTime() > lastUserUpdateTime) - { - if (currAdmin->GetPriv()->userConf || currAdmin->GetPriv()->userPasswd) - s = "<password value=\"" + u->GetProperty().password.Get() + "\" />"; - else - s = "<password value=\"++++++\"/>"; - middle += s; - } - - - if (u->GetProperty().cash.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<cash value=\"%f\" />", u->GetProperty().cash.Get()); - middle += s; - //printfd(__FILE__, "cash value=\"%f\"\n", u->GetProperty().cash.Get()); - } - - - if (u->GetProperty().freeMb.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<freemb value=\"%f\" />", u->GetProperty().freeMb.Get()); - middle += s; - } - - if (u->GetProperty().credit.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<credit value=\"%f\" />", u->GetProperty().credit.Get()); - middle += s; - } - - if (u->GetProperty().nextTariff.Get() != "") - { - if (u->GetProperty().tariffName.ModificationTime() > lastUserUpdateTime - || u->GetProperty().nextTariff.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<tariff value=\"%s/%s\" />", - u->GetProperty().tariffName.Get().c_str(), - u->GetProperty().nextTariff.Get().c_str()); - middle += s; - } - } - else - { - if (u->GetProperty().tariffName.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<tariff value=\"%s\" />", - u->GetProperty().tariffName.Get().c_str()); - middle += s; - } - } - - if (u->GetProperty().note.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().note); - strprintf(&s, "<note value=\"%s\" />", enc.c_str()); - middle += s; - } - - if (u->GetProperty().phone.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().phone); - strprintf(&s, "<phone value=\"%s\" />", enc.c_str()); - middle += s; - } - - if (u->GetProperty().address.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().address); - strprintf(&s, "<address value=\"%s\" />", enc.c_str()); - middle += s; - } - - if (u->GetProperty().email.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().email); - strprintf(&s, "<email value=\"%s\" />", enc.c_str()); - middle += s; - } - - vector<USER_PROPERTY_LOGGED<string> *> userdata; - userdata.push_back(u->GetProperty().userdata0.GetPointer()); - userdata.push_back(u->GetProperty().userdata1.GetPointer()); - userdata.push_back(u->GetProperty().userdata2.GetPointer()); - userdata.push_back(u->GetProperty().userdata3.GetPointer()); - userdata.push_back(u->GetProperty().userdata4.GetPointer()); - userdata.push_back(u->GetProperty().userdata5.GetPointer()); - userdata.push_back(u->GetProperty().userdata6.GetPointer()); - userdata.push_back(u->GetProperty().userdata7.GetPointer()); - userdata.push_back(u->GetProperty().userdata8.GetPointer()); - userdata.push_back(u->GetProperty().userdata9.GetPointer()); - - string tmpI; - for (unsigned i = 0; i < userdata.size(); i++) - { - if (userdata[i]->ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, userdata[i]->Get()); - s = "<UserData" + x2str(i, tmpI) + " value=\"" + enc + "\" />"; - middle += s; - } - } - - if (u->GetProperty().realName.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().realName); - strprintf(&s, "<name value=\"%s\" />", enc.c_str()); - middle += s; - } - - if (u->GetProperty().group.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().group); - strprintf(&s, "<GROUP value=\"%s\" />", enc.c_str()); - middle += s; - } - - if (u->GetProperty().alwaysOnline.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<aonline value=\"%d\" />", u->GetProperty().alwaysOnline.Get()); - middle += s; - } - - if (u->GetCurrIPModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<currip value=\"%s\" />", inet_ntostring(u->GetCurrIP()).c_str()); - middle += s; - } - - - if (u->GetConnectedModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<status value=\"%d\" />", u->GetConnected()); - middle += s; - } - - if (u->GetPingTime() > lastUserUpdateTime) - { - strprintf(&s, "<PingTime value=\"%lu\" />", u->GetPingTime()); - middle += s; - } - - if (u->GetProperty().ips.ModificationTime() > lastUserUpdateTime) - { - stringstream sstr; - sstr << u->GetProperty().ips.Get(); - strprintf(&s, "<ip value=\"%s\" />", sstr.str().c_str()); - middle += s; - } - - char st[50]; - traffStart = "<traff"; - DIR_TRAFF upload; - DIR_TRAFF download; - download = u->GetProperty().down.Get(); - upload = u->GetProperty().up.Get(); - traffMiddle = ""; - - if (u->GetProperty().up.ModificationTime() > lastUserUpdateTime) - { - for (int j = 0; j < DIR_NUM; j++) - { - string s; - x2str(upload[j], s); - sprintf(st, " MU%d=\"%s\" ", j, s.c_str()); - traffMiddle += st; - } - } - - if (u->GetProperty().down.ModificationTime() > lastUserUpdateTime) - { - for (int j = 0; j < DIR_NUM; j++) - { - x2str(download[j], s); - sprintf(st, " MD%d=\"%s\" ", j, s.c_str()); - traffMiddle += st; - } - } - - traffFinish = " />"; - if (traffMiddle.length() > 0) - { - middle += traffStart; - middle += traffMiddle; - middle += traffFinish; - } - - if (u->GetProperty().disabled.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<down value=\"%d\" />", u->GetProperty().disabled.Get()); - middle += s; - } - - if (u->GetProperty().disabledDetailStat.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<DisableDetailStat value=\"%d\" />", u->GetProperty().disabledDetailStat.Get()); - middle += s; - } - - //printfd(__FILE__, ">>>>> %s\n", s.c_str()); - - if (u->GetProperty().passive.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<passive value=\"%d\" />", u->GetProperty().passive.Get()); - middle += s; - } - - if (u->GetProperty().lastCashAdd.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<LastCash value=\"%f\" />", u->GetProperty().lastCashAdd.Get()); - middle += s; - } - - if (u->GetProperty().lastCashAddTime.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<LastTimeCash value=\"%ld\" />", u->GetProperty().lastCashAddTime.Get()); - middle += s; - } - - - if (u->GetProperty().lastActivityTime.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<LastActivityTime value=\"%ld\" />", u->GetProperty().lastActivityTime.Get()); - middle += s; - } - - if (u->GetProperty().creditExpire.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<CreditExpire value=\"%ld\" />", u->GetProperty().creditExpire.Get()); - middle += s; - } + answer += "<Users>"; +USER_PTR u; - userFinish = "</user>"; - - if (middle.length() > 0) - { - /*printfd(__FILE__, "login: %s\n", u->GetLogin().c_str()); - printfd(__FILE__, "middle: %s\n", middle.c_str());*/ - - answerList->push_back(userStart); - answerList->push_back(middle); - answerList->push_back(userFinish); - } - } +while (users->SearchNext(h, &u) == 0) + answer += UserToXML(*u, true, currAdmin->GetPriv()->userConf || currAdmin->GetPriv()->userPasswd, lastUserUpdateTime); users->CloseSearch(h); -//answerList->push_back("</Users>"); - -answerList->push_back("</Users>"); +answer += "</Users>"; } //----------------------------------------------------------------------------- // ADD USER //----------------------------------------------------------------------------- -PARSER_ADD_USER::PARSER_ADD_USER() -{ -depth = 0; -} -//----------------------------------------------------------------------------- int PARSER_ADD_USER::ParseStart(void *, const char *el, const char **attr) { depth++; @@ -694,17 +387,10 @@ depth = 0; //----------------------------------------------------------------------------- void PARSER_ADD_USER::CreateAnswer() { -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); - if (CheckUserData() == 0) - { - answerList->push_back("<AddUser result=\"ok\"/>"); - } + answer = "<AddUser result=\"ok\"/>"; else - { - answerList->push_back("<AddUser result=\"error\" reason=\"Access denied\"/>"); - } + answer = "<AddUser result=\"error\" reason=\"Access denied\"/>"; } //----------------------------------------------------------------------------- int PARSER_ADD_USER::CheckUserData() @@ -720,10 +406,13 @@ return -1; // PARSER CHG USER //----------------------------------------------------------------------------- PARSER_CHG_USER::PARSER_CHG_USER() - : usr(NULL), + : BASE_PARSER(), + usr(NULL), ucr(NULL), upr(NULL), downr(NULL), + cashMsg(), + login(), cashMustBeAdded(false), res(0) { @@ -754,11 +443,11 @@ ucr = new USER_CONF_RES; upr = new RESETABLE<uint64_t>[DIR_NUM]; downr = new RESETABLE<uint64_t>[DIR_NUM]; -}; +} //----------------------------------------------------------------------------- -string PARSER_CHG_USER::EncChar2String(const char * strEnc) +std::string PARSER_CHG_USER::EncChar2String(const char * strEnc) { -string str; +std::string str; Decode21str(str, strEnc); return str; } @@ -926,13 +615,12 @@ else if (strcasecmp(el, "traff") == 0) { int j = 0; - int dir; DIR_TRAFF dtu; DIR_TRAFF dtd; - unsigned long long t = 0; + uint64_t t = 0; while (attr[j]) { - dir = attr[j][2] - '0'; + int dir = attr[j][2] - '0'; if (strncasecmp(attr[j], "md", 2) == 0) { @@ -948,8 +636,6 @@ else } j+=2; } - usr->down = dtd; - usr->up = dtu; return 0; } @@ -986,22 +672,19 @@ return -1; //----------------------------------------------------------------------------- void PARSER_CHG_USER::CreateAnswer() { -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); - switch (res) { case 0: - answerList->push_back("<SetUser result=\"ok\"/>"); + answer = "<SetUser result=\"ok\"/>"; break; case -1: - answerList->push_back("<SetUser result=\"error\"/>"); + answer = "<SetUser result=\"error\"/>"; break; case -2: - answerList->push_back("<SetUser result=\"error\"/>"); + answer = "<SetUser result=\"error\"/>"; break; default: - answerList->push_back("<SetUser result=\"error\"/>"); + answer = "<SetUser result=\"error\"/>"; break; } @@ -1009,6 +692,7 @@ switch (res) //----------------------------------------------------------------------------- int PARSER_CHG_USER::AplayChanges() { +printfd(__FILE__, "PARSER_CHG_USER::AplayChanges()\n"); USER_PTR u; res = 0; @@ -1018,53 +702,88 @@ if (users->FindByName(login, &u)) return -1; } -if (!ucr->ips.res_empty()) - if (!u->GetProperty().ips.Set(ucr->ips.const_data(), currAdmin, login, store)) +bool check = false; +bool alwaysOnline = u->GetProperty().alwaysOnline; +if (!ucr->alwaysOnline.empty()) + { + check = true; + alwaysOnline = ucr->alwaysOnline.const_data(); + } +bool onlyOneIP = u->GetProperty().ips.ConstData().OnlyOneIP(); +if (!ucr->ips.empty()) + { + check = true; + onlyOneIP = ucr->ips.const_data().OnlyOneIP(); + } + +if (check && alwaysOnline && !onlyOneIP) + { + printfd(__FILE__, "Requested change leads to a forbidden state: AlwaysOnline with multiple IP's\n"); + GetStgLogger()("%s Requested change leads to a forbidden state: AlwaysOnline with multiple IP's", currAdmin->GetLogStr().c_str()); + res = -1; + return -1; + } + +for (size_t i = 0; i < ucr->ips.const_data().Count(); ++i) + { + CONST_USER_PTR user; + uint32_t ip = ucr->ips.const_data().operator[](i).ip; + if (users->IsIPInUse(ip, login, &user)) + { + printfd(__FILE__, "Trying to assign an IP %s to '%s' that is already in use by '%s'\n", inet_ntostring(ip).c_str(), login.c_str(), user->GetLogin().c_str()); + GetStgLogger()("%s trying to assign an IP %s to '%s' that is currently in use by '%s'", currAdmin->GetLogStr().c_str(), inet_ntostring(ip).c_str(), login.c_str(), user->GetLogin().c_str()); res = -1; + return -1; + } + } -if (!ucr->address.res_empty()) - if (!u->GetProperty().address.Set(ucr->address.const_data(), currAdmin, login, store)) +if (!ucr->ips.empty()) + if (!u->GetProperty().ips.Set(ucr->ips.const_data(), currAdmin, login, store)) res = -1; -if (!ucr->alwaysOnline.res_empty()) +if (!ucr->alwaysOnline.empty()) if (!u->GetProperty().alwaysOnline.Set(ucr->alwaysOnline.const_data(), currAdmin, login, store)) res = -1; -if (!ucr->creditExpire.res_empty()) +if (!ucr->address.empty()) + if (!u->GetProperty().address.Set(ucr->address.const_data(), currAdmin, login, store)) + res = -1; + +if (!ucr->creditExpire.empty()) if (!u->GetProperty().creditExpire.Set(ucr->creditExpire.const_data(), currAdmin, login, store)) res = -1; -if (!ucr->credit.res_empty()) +if (!ucr->credit.empty()) if (!u->GetProperty().credit.Set(ucr->credit.const_data(), currAdmin, login, store)) res = -1; -if (!usr->freeMb.res_empty()) +if (!usr->freeMb.empty()) if (!u->GetProperty().freeMb.Set(usr->freeMb.const_data(), currAdmin, login, store)) res = -1; -if (!ucr->disabled.res_empty()) +if (!ucr->disabled.empty()) if (!u->GetProperty().disabled.Set(ucr->disabled.const_data(), currAdmin, login, store)) res = -1; -if (!ucr->disabledDetailStat.res_empty()) +if (!ucr->disabledDetailStat.empty()) if (!u->GetProperty().disabledDetailStat.Set(ucr->disabledDetailStat.const_data(), currAdmin, login, store)) res = -1; -if (!ucr->email.res_empty()) +if (!ucr->email.empty()) if (!u->GetProperty().email.Set(ucr->email.const_data(), currAdmin, login, store)) res = -1; -if (!ucr->group.res_empty()) +if (!ucr->group.empty()) if (!u->GetProperty().group.Set(ucr->group.const_data(), currAdmin, login, store)) res = -1; -if (!ucr->note.res_empty()) +if (!ucr->note.empty()) if (!u->GetProperty().note.Set(ucr->note.const_data(), currAdmin, login, store)) res = -1; -vector<USER_PROPERTY_LOGGED<string> *> userdata; +std::vector<USER_PROPERTY_LOGGED<std::string> *> userdata; userdata.push_back(u->GetProperty().userdata0.GetPointer()); userdata.push_back(u->GetProperty().userdata1.GetPointer()); userdata.push_back(u->GetProperty().userdata2.GetPointer()); @@ -1078,31 +797,31 @@ userdata.push_back(u->GetProperty().userdata9.GetPointer()); for (int i = 0; i < (int)userdata.size(); i++) { - if (!ucr->userdata[i].res_empty()) + if (!ucr->userdata[i].empty()) { if(!userdata[i]->Set(ucr->userdata[i].const_data(), currAdmin, login, store)) res = -1; } } -if (!ucr->passive.res_empty()) +if (!ucr->passive.empty()) if (!u->GetProperty().passive.Set(ucr->passive.const_data(), currAdmin, login, store)) res = -1; -if (!ucr->password.res_empty()) +if (!ucr->password.empty()) if (!u->GetProperty().password.Set(ucr->password.const_data(), currAdmin, login, store)) res = -1; -if (!ucr->phone.res_empty()) +if (!ucr->phone.empty()) if (!u->GetProperty().phone.Set(ucr->phone.const_data(), currAdmin, login, store)) res = -1; -if (!ucr->realName.res_empty()) +if (!ucr->realName.empty()) if (!u->GetProperty().realName.Set(ucr->realName.const_data(), currAdmin, login, store)) res = -1; -if (!usr->cash.res_empty()) +if (!usr->cash.empty()) { //if (*currAdmin->GetPriv()->userCash) { @@ -1124,7 +843,7 @@ if (!usr->cash.res_empty()) } -if (!ucr->tariffName.res_empty()) +if (!ucr->tariffName.empty()) { if (tariffs->FindByName(ucr->tariffName.const_data())) { @@ -1139,7 +858,7 @@ if (!ucr->tariffName.res_empty()) } } -if (!ucr->nextTariff.res_empty()) +if (!ucr->nextTariff.empty()) { if (tariffs->FindByName(ucr->nextTariff.const_data())) { @@ -1159,14 +878,14 @@ int upCount = 0; int downCount = 0; for (int i = 0; i < DIR_NUM; i++) { - if (!upr[i].res_empty()) + if (!upr[i].empty()) { - up[i] = upr[i]; + up[i] = upr[i].data(); upCount++; } - if (!downr[i].res_empty()) + if (!downr[i].empty()) { - down[i] = downr[i]; + down[i] = downr[i].data(); downCount++; } } @@ -1179,15 +898,6 @@ if (downCount) if (!u->GetProperty().down.Set(down, currAdmin, login, store)) res = -1; -/*if (!usr->down.res_empty()) - { - u->GetProperty().down.Set(usr->down.const_data(), currAdmin, login, store); - } -if (!usr->up.res_empty()) - { - u->GetProperty().up.Set(usr->up.const_data(), currAdmin, login, store); - }*/ - u->WriteConf(); u->WriteStat(); @@ -1278,7 +988,7 @@ if (strcasecmp(el, "Message") == 0) printfd(__FILE__, "User not found. %s\n", logins[i].c_str()); continue; } - msg.header.creationTime = stgTime; + msg.header.creationTime = static_cast<unsigned int>(stgTime); u->AddMessage(&msg); result = res_ok; } @@ -1321,22 +1031,18 @@ return 0; //----------------------------------------------------------------------------- void PARSER_SEND_MESSAGE::CreateAnswer() { -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); -//answerList->push_back("<SendMessageResult value=\"ok\"/>"); -// switch (result) { case res_ok: - answerList->push_back("<SendMessageResult value=\"ok\"/>"); + answer = "<SendMessageResult value=\"ok\"/>"; break; case res_params_error: printfd(__FILE__, "res_params_error\n"); - answerList->push_back("<SendMessageResult value=\"Parameters error\"/>"); + answer = "<SendMessageResult value=\"Parameters error.\"/>"; break; case res_unknown: printfd(__FILE__, "res_unknown\n"); - answerList->push_back("<SendMessageResult value=\"Unknown user\"/>"); + answer = "<SendMessageResult value=\"Unknown user.\"/>"; break; default: printfd(__FILE__, "res_default\n"); @@ -1385,9 +1091,9 @@ return -1; void PARSER_DEL_USER::CreateAnswer() { if (res) - answerList->push_back("<DelUser value=\"error\" reason=\"User not found\"/>"); + answer = "<DelUser value=\"error\" reason=\"User not found\"/>"; else - answerList->push_back("<DelUser value=\"ok\"/>"); + answer = "<DelUser value=\"ok\"/>"; } //----------------------------------------------------------------------------- /*void PARSERDELUSER::CreateAnswer(char * mes) @@ -1453,10 +1159,10 @@ return -1; //----------------------------------------------------------------------------- void PARSER_CHECK_USER::CreateAnswer() { -if (result) - answerList->push_back("<CheckUser value=\"Ok\"/>"); +if (error) + answer = std::string("<CheckUser value=\"Err\" reason=\"") + error + "\"/>"; else - answerList->push_back("<CheckUser value=\"Err\"/>"); + answer = "<CheckUser value=\"Ok\"/>"; } //----------------------------------------------------------------------------- //-----------------------------------------------------------------------------