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