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