]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/sgconfig/parser_admin.cpp
Optimized sending answers in sgconfig.
[stg.git] / projects / stargazer / plugins / configuration / sgconfig / parser_admin.cpp
1 #include <stdio.h>
2 #include <string.h>
3
4 #include "parser.h"
5
6 //-----------------------------------------------------------------------------
7 //  GET ADMINS
8 //-----------------------------------------------------------------------------
9 int PARSER_GET_ADMINS::ParseStart(void *, const char *el, const char **)
10 {
11 if (strcasecmp(el, "GetAdmins") == 0)
12     {
13     return 0;
14     }
15 return -1;
16 }
17 //-----------------------------------------------------------------------------
18 int PARSER_GET_ADMINS::ParseEnd(void *, const char *el)
19 {
20 if (strcasecmp(el, "GetAdmins") == 0)
21     {
22     CreateAnswer();
23     return 0;
24     }
25 return -1;
26 }
27 //-----------------------------------------------------------------------------
28 void PARSER_GET_ADMINS::CreateAnswer()
29 {
30 const PRIV * priv = currAdmin->GetPriv();
31 if (!priv->adminChg)
32     {
33     answer = "<Error Result=\"Error. Access denied.\"/>";
34     return;
35     }
36
37 answer.clear();
38
39 answer += "<Admins>";
40 ADMIN_CONF ac;
41 int h = admins->OpenSearch();
42
43 while (admins->SearchNext(h, &ac) == 0)
44     {
45     unsigned int p = (ac.priv.userStat << 0) +
46                      (ac.priv.userConf << 2) +
47                      (ac.priv.userCash << 4) +
48                      (ac.priv.userPasswd << 6) +
49                      (ac.priv.userAddDel << 8) +
50                      (ac.priv.adminChg << 10) +
51                      (ac.priv.tariffChg << 12);
52     answer += "<admin login=\"" + ac.login + "\" priv=\"" + x2str(p) + "\"/>";
53     }
54 admins->CloseSearch(h);
55 answer += "</Admins>";
56 }
57 //-----------------------------------------------------------------------------
58
59 //-----------------------------------------------------------------------------
60 //  DEL ADMIN
61 //-----------------------------------------------------------------------------
62 int PARSER_DEL_ADMIN::ParseStart(void *, const char *el, const char **attr)
63 {
64 strError = "";
65 if (strcasecmp(el, "DelAdmin") == 0)
66     {
67     adminToDel = attr[1];
68     return 0;
69     }
70 return -1;
71 }
72 //-----------------------------------------------------------------------------
73 int PARSER_DEL_ADMIN::ParseEnd(void *, const char *el)
74 {
75 if (strcasecmp(el, "DelAdmin") == 0)
76     {
77     CreateAnswer();
78     return 0;
79     }
80 return -1;
81 }
82 //-----------------------------------------------------------------------------
83 void PARSER_DEL_ADMIN::CreateAnswer()
84 {
85 if (admins->Del(adminToDel, currAdmin) == 0)
86     answer = "<DelAdmin Result=\"Ok\"/>";
87 else
88     answer = "<DelAdmin Result=\"Error. " + admins->GetStrError() + "\"/>";
89 }
90 //-----------------------------------------------------------------------------
91 //  ADD ADMIN
92 //-----------------------------------------------------------------------------
93 int PARSER_ADD_ADMIN::ParseStart(void *, const char *el, const char **attr)
94 {
95 if (strcasecmp(el, "AddAdmin") == 0)
96     {
97     adminToAdd = attr[1];
98     return 0;
99     }
100 return -1;
101 }
102 //-----------------------------------------------------------------------------
103 int PARSER_ADD_ADMIN::ParseEnd(void *, const char *el)
104 {
105 if (strcasecmp(el, "AddAdmin") == 0)
106     {
107     CreateAnswer();
108     return 0;
109     }
110 return -1;
111 }
112 //-----------------------------------------------------------------------------
113 void PARSER_ADD_ADMIN::CreateAnswer()
114 {
115 if (admins->Add(adminToAdd, currAdmin) == 0)
116     answer = "<AddAdmin Result=\"Ok\"/>";
117 else
118     answer = "<AddAdmin Result=\"Error. " + admins->GetStrError() + "\"/>";
119 }
120 //-----------------------------------------------------------------------------
121 //-----------------------------------------------------------------------------
122 //  CHG ADMIN
123 //-----------------------------------------------------------------------------
124 int PARSER_CHG_ADMIN::ParseStart(void *, const char *el, const char **attr)
125 {
126 if (strcasecmp(el, "ChgAdmin") == 0)
127     {
128     for (int i = 0; i < 6; i+=2)
129         {
130         printfd(__FILE__, "PARSER_CHG_ADMIN::attr[%d] = %s\n", i, attr[i]);
131         if (attr[i] == NULL)
132             break;
133
134         if (strcasecmp(attr[i], "Login") == 0)
135             {
136             login = attr[i + 1];
137             continue;
138             }
139
140         if (strcasecmp(attr[i], "Priv") == 0)
141             {
142             privAsString = attr[i + 1];
143             continue;
144             }
145
146         if (strcasecmp(attr[i], "Password") == 0)
147             {
148             password = attr[i + 1];
149             continue;
150             }
151         }
152
153     return 0;
154     }
155 return -1;
156 }
157 //-----------------------------------------------------------------------------
158 int PARSER_CHG_ADMIN::ParseEnd(void *, const char *el)
159 {
160 if (strcasecmp(el, "ChgAdmin") == 0)
161     {
162     CreateAnswer();
163     return 0;
164     }
165 return -1;
166 }
167 //-----------------------------------------------------------------------------
168 void PARSER_CHG_ADMIN::CreateAnswer()
169 {
170 if (!login.empty())
171     {
172     ADMIN * origAdmin = NULL;
173
174     if (admins->Find(login.data(), &origAdmin))
175         {
176         answer = "<ChgAdmin Result = \"Admin '" + login.data() + "' is not found.\"/>";
177         return;
178         }
179
180     ADMIN_CONF conf(origAdmin->GetConf());
181
182     if (!password.empty())
183         conf.password = password.data();
184
185     if (!privAsString.empty())
186         {
187         int p = 0;
188         if (str2x(privAsString.data().c_str(), p) < 0)
189             {
190             answer = "<ChgAdmin Result = \"Incorrect parameter Priv.\"/>";
191             return;
192             }
193
194         conf.priv.FromInt(p);
195         }
196
197     if (admins->Change(conf, currAdmin) != 0)
198         answer = "<ChgAdmin Result = \"" + admins->GetStrError() + "\"/>";
199     else
200         answer = "<ChgAdmin Result = \"Ok\"/>";
201     }
202 else
203     answer = "<ChgAdmin Result = \"Incorrect parameter login.\"/>";
204 }