]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/rpcconfig/admins_methods.cpp
Fixed BFStream work with large strings, allowed null put on last.
[stg.git] / projects / stargazer / plugins / configuration / rpcconfig / admins_methods.cpp
1 #include <ostream> // xmlrpc-c devs have missed something :)
2
3 #include "stg/common.h"
4 #include "admins_methods.h"
5 #include "rpcconfig.h"
6
7 //------------------------------------------------------------------------------
8
9 void METHOD_ADMIN_GET::execute(xmlrpc_c::paramList const & paramList,
10                                xmlrpc_c::value *   const   retvalPtr)
11 {
12 std::string cookie = paramList.getString(0);
13 std::string login = paramList.getString(1);
14 paramList.verifyEnd(2);
15
16 std::map<std::string, xmlrpc_c::value> structVal;
17 ADMIN_INFO adminInfo;
18
19 if (config->GetAdminInfo(cookie, &adminInfo))
20     {
21     structVal["result"] = xmlrpc_c::value_boolean(false);
22     *retvalPtr = xmlrpc_c::value_struct(structVal);
23     return;
24     }
25
26 ADMIN * admin;
27
28 if (admins->Find(login, &admin))
29     {
30     structVal["result"] = xmlrpc_c::value_boolean(false);
31     *retvalPtr = xmlrpc_c::value_struct(structVal);
32     return;
33     }
34
35 structVal["result"] = xmlrpc_c::value_boolean(true);
36 structVal["login"] = xmlrpc_c::value_string(admin->GetLogin());
37 structVal["password"] = xmlrpc_c::value_string(admin->GetPassword());
38
39 const PRIV * priv = admin->GetPriv();
40
41 structVal["user_stat"] = xmlrpc_c::value_boolean(priv->userStat);
42 structVal["user_conf"] = xmlrpc_c::value_boolean(priv->userConf);
43 structVal["user_cash"] = xmlrpc_c::value_boolean(priv->userCash);
44 structVal["user_passwd"] = xmlrpc_c::value_boolean(priv->userPasswd);
45 structVal["user_add_del"] = xmlrpc_c::value_boolean(priv->userAddDel);
46 structVal["admin_chg"] = xmlrpc_c::value_boolean(priv->adminChg);
47 structVal["tariff_chg"] = xmlrpc_c::value_boolean(priv->tariffChg);
48
49 *retvalPtr = xmlrpc_c::value_struct(structVal);
50 }
51
52 //------------------------------------------------------------------------------
53
54 void METHOD_ADMIN_ADD::execute(xmlrpc_c::paramList const & paramList,
55                                xmlrpc_c::value *   const   retvalPtr)
56 {
57 std::string cookie = paramList.getString(0);
58 std::string login = paramList.getString(1);
59 paramList.verifyEnd(2);
60
61 ADMIN_INFO adminInfo;
62
63 if (config->GetAdminInfo(cookie, &adminInfo))
64     {
65     printfd(__FILE__, "METHOD_ADMIN_ADD::execute(): 'Not logged or cookie timeout'\n");
66     *retvalPtr = xmlrpc_c::value_boolean(false);
67     return;
68     }
69
70 ADMIN * admin;
71
72 if (admins->Find(adminInfo.admin, &admin))
73     {
74     printfd(__FILE__, "METHOD_ADMIN_ADD::execute(): 'Invalid admin (logged)'\n");
75     *retvalPtr = xmlrpc_c::value_boolean(false);
76     return;
77     }
78
79 if (admins->Add(login, admin))
80     {
81     printfd(__FILE__, "METHOD_ADMIN_ADD::execute(): 'Failed to add admin'\n");
82     *retvalPtr = xmlrpc_c::value_boolean(false);
83     return;
84     }
85
86 *retvalPtr = xmlrpc_c::value_boolean(true);
87 }
88
89 //------------------------------------------------------------------------------
90
91 void METHOD_ADMIN_DEL::execute(xmlrpc_c::paramList const & paramList,
92                                xmlrpc_c::value *   const   retvalPtr)
93 {
94 std::string cookie = paramList.getString(0);
95 std::string login = paramList.getString(1);
96 paramList.verifyEnd(2);
97
98 ADMIN_INFO adminInfo;
99
100 if (config->GetAdminInfo(cookie, &adminInfo))
101     {
102     *retvalPtr = xmlrpc_c::value_boolean(false);
103     return;
104     }
105
106 ADMIN * admin;
107
108 if (admins->Find(adminInfo.admin, &admin))
109     {
110     *retvalPtr = xmlrpc_c::value_boolean(false);
111     return;
112     }
113
114 if (admins->Del(login, admin))
115     {
116     *retvalPtr = xmlrpc_c::value_boolean(false);
117     return;
118     }
119
120 *retvalPtr = xmlrpc_c::value_boolean(true);
121 }
122
123 //------------------------------------------------------------------------------
124
125 void METHOD_ADMIN_CHG::execute(xmlrpc_c::paramList const & paramList,
126                                xmlrpc_c::value *   const   retvalPtr)
127 {
128 std::string cookie = paramList.getString(0);
129 std::string login = paramList.getString(1);
130 xmlrpc_c::value_struct info(paramList.getStruct(2));
131 paramList.verifyEnd(3);
132
133 ADMIN_INFO adminInfo;
134
135 if (config->GetAdminInfo(cookie, &adminInfo))
136     {
137     *retvalPtr = xmlrpc_c::value_boolean(false);
138     return;
139     }
140
141 ADMIN * loggedAdmin;
142
143 if (admins->Find(adminInfo.admin, &loggedAdmin))
144     {
145     *retvalPtr = xmlrpc_c::value_boolean(false);
146     return;
147     }
148
149 ADMIN * admin;
150
151 if (admins->Find(login, &admin))
152     {
153     *retvalPtr = xmlrpc_c::value_boolean(false);
154     return;
155     }
156
157 ADMIN_CONF conf;
158
159 conf.priv = *admin->GetPriv();
160 conf.password = admin->GetPassword();
161 conf.login = login;
162
163 std::map<std::string, xmlrpc_c::value> structVal(
164     static_cast<std::map<std::string, xmlrpc_c::value> >(xmlrpc_c::value_struct(info))
165     );
166
167 std::map<std::string, xmlrpc_c::value>::iterator it;
168
169 if ((it = structVal.find("password")) != structVal.end())
170     {
171     conf.password = xmlrpc_c::value_string(it->second);
172     }
173
174 if ((it = structVal.find("user_stat")) != structVal.end())
175     {
176     conf.priv.userStat = xmlrpc_c::value_boolean(it->second);
177     }
178
179 if ((it = structVal.find("user_conf")) != structVal.end())
180     {
181     conf.priv.userConf = xmlrpc_c::value_boolean(it->second);
182     }
183
184 if ((it = structVal.find("user_cash")) != structVal.end())
185     {
186     conf.priv.userCash = xmlrpc_c::value_boolean(it->second);
187     }
188
189 if ((it = structVal.find("user_passwd")) != structVal.end())
190     {
191     conf.priv.userPasswd = xmlrpc_c::value_boolean(it->second);
192     }
193
194 if ((it = structVal.find("user_add_del")) != structVal.end())
195     {
196     conf.priv.userAddDel = xmlrpc_c::value_boolean(it->second);
197     }
198
199 if ((it = structVal.find("admin_chg")) != structVal.end())
200     {
201     conf.priv.adminChg = xmlrpc_c::value_boolean(it->second);
202     }
203
204 if ((it = structVal.find("tariff_chg")) != structVal.end())
205     {
206     conf.priv.tariffChg = xmlrpc_c::value_boolean(it->second);
207     }
208
209 if (admins->Change(conf, loggedAdmin))
210     {
211     *retvalPtr = xmlrpc_c::value_boolean(false);
212     }
213
214 *retvalPtr = xmlrpc_c::value_boolean(true);
215 }
216
217 //------------------------------------------------------------------------------
218
219 void METHOD_ADMINS_GET::execute(xmlrpc_c::paramList const & paramList,
220                                 xmlrpc_c::value *   const   retvalPtr)
221 {
222 std::string cookie = paramList.getString(0);
223 paramList.verifyEnd(1);
224
225 std::map<std::string, xmlrpc_c::value> mainStructVal;
226 std::vector<xmlrpc_c::value> retval;
227 ADMIN_INFO adminInfo;
228
229 if (config->GetAdminInfo(cookie, &adminInfo))
230     {
231     mainStructVal["result"] = xmlrpc_c::value_boolean(false);
232     *retvalPtr = xmlrpc_c::value_struct(mainStructVal);
233     return;
234     }
235
236 ADMIN_CONF ac;
237 int h = admins->OpenSearch();
238
239 while (admins->SearchNext(h, &ac) == 0)
240     {
241     std::map<std::string, xmlrpc_c::value> structVal;
242     structVal["result"] = xmlrpc_c::value_boolean(true);
243     structVal["login"] = xmlrpc_c::value_string(ac.login);
244     structVal["password"] = xmlrpc_c::value_string(ac.password);
245     structVal["user_stat"] = xmlrpc_c::value_boolean(ac.priv.userStat);
246     structVal["user_conf"] = xmlrpc_c::value_boolean(ac.priv.userConf);
247     structVal["user_cash"] = xmlrpc_c::value_boolean(ac.priv.userCash);
248     structVal["user_passwd"] = xmlrpc_c::value_boolean(ac.priv.userPasswd);
249     structVal["user_add_del"] = xmlrpc_c::value_boolean(ac.priv.userAddDel);
250     structVal["admin_chg"] = xmlrpc_c::value_boolean(ac.priv.adminChg);
251     structVal["tariff_chg"] = xmlrpc_c::value_boolean(ac.priv.tariffChg);
252
253     retval.push_back(xmlrpc_c::value_struct(structVal));
254     }
255
256 *retvalPtr = xmlrpc_c::value_array(retval);
257 }