Loading client/client.cpp +69 −0 Changes for client/client.cpp: 69 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -820,5 +820,74 @@ bool Client::GPOexits(class uuid::uuid gpoid) { // keeping name for compatibilit return ret; } std::vector<Client::GroupInfo> Client::listGroups() { ensure_http_client(_Con); json_object* jresponse = json_object_new_object(); json_object* cmd = json_object_new_array(); json_object* obj = json_object_new_object(); json_object_object_add(obj, "clientsession", json_object_new_string(_Con.getClientId().c_str())); json_object_object_add(obj, "listgroups", json_object_new_string("")); json_object_array_add(cmd, obj); json_object_object_add(jresponse, "commands", cmd); size_t outsize = 0; const char* tmp = json_object_to_json_string_length(jresponse, 0, &outsize); std::vector<char> out; out.reserve(outsize); std::copy(tmp, tmp + outsize, std::back_inserter(out)); libhttppp::HttpRequest nreq; nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); json_tokener* jtok = json_tokener_new(); json_object* jrequest = json_tokener_parse_ex(jtok, resp.data(), resp.size() - 1); if (!jrequest) { const char* err = json_tokener_error_desc(json_tokener_get_error(jtok)); json_tokener_free(jtok); throw authdb::AuthBackendError(err); } if (json_object_get_type(jrequest) != json_type_array) { json_object_put(jrequest); json_tokener_free(jtok); throw(authdb::AuthBackendError("Invalid Api Commands")); } std::vector<GroupInfo> groups; int fcount = json_object_array_length(jrequest); for (int i = 0; i < fcount; ++i) { json_object_object_foreach(json_object_array_get_idx(jrequest, i), key, val) { if (strcmp(key, "groups") == 0 && json_object_get_type(val) == json_type_array) { int glen = json_object_array_length(val); for (int g = 0; g < glen; ++g) { json_object* jgrp = json_object_array_get_idx(val, g); json_object* jgid = json_object_object_get(jgrp, "gid"); json_object* jname = json_object_object_get(jgrp, "name"); if (jgid && jname) { groups.push_back({json_object_get_string(jgid), json_object_get_string(jname)}); } } } } } json_object_put(jrequest); json_tokener_free(jtok); return groups; } } // namespace client } // namespace authdb client/client.h +7 −0 Changes for client/client.h: 7 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -120,6 +120,13 @@ namespace authdb { void changeUserPw(const std::string& oldpw,const std::string& newpw); void getAvatar(const ::uuid::uuid &did,const ::uuid::uuid &uid,libhttppp::HttpRequest &resq, libhttppp::HttpResponse &resp); struct GroupInfo { std::string gid; std::string name; }; std::vector<GroupInfo> listGroups(); private: ClientConnection &_Con; friend class Session; Loading src/api.cpp +45 −0 Changes for src/api.cpp: 45 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ #include "user.h" #include "client.h" #include "gpo.h" #include "group.h" #include "session.h" #include "domain.h" #include "plugin.h" Loading Loading @@ -633,6 +634,49 @@ public: } } void listGroups(json_object *request, json_object *response) { json_object* cmd = get_commands_array_or_throw(request); int fcount = json_object_array_length(cmd); for (int i = 0; i < fcount; ++i) { json_object_object_foreach(json_object_array_get_idx(cmd, i), key, val) { (void)val; if (strcmp(key, "listgroups") == 0) { json_object* out = json_object_new_object(); json_object* jarr = json_object_new_array(); Group group; size_t rd = sizeof(authdb::AuthHeader), end = _Backend.end(); while (rd < end) { std::shared_ptr<authdb::AuthData::Record> cur = std::make_shared<authdb::AuthData::Record>(); _Backend.setPos(rd); _Backend.read((unsigned char*)cur.get(), sizeof(AuthData::Record)); rd = _Backend.getPos() + cur->datasize; if (cur->type == GroupData && strcmp(cur->fieldname, "groupname") == 0) { class GroupData gdat(cur->ruid); try { size_t upos = sizeof(authdb::AuthHeader); group.info(_Backend, gdat, upos); json_object *jgrp = json_object_new_object(); json_object_object_add(jgrp, "gid", json_object_new_string(uuid::uuid(cur->ruid).c_str())); json_object_object_add(jgrp, "name", json_object_new_string(gdat.getName().c_str())); json_object_array_add(jarr, jgrp); } catch (AuthBackendError &e) { std::cerr << e.what() << std::endl; } } } json_object_object_add(out, "groups", jarr); json_object_array_add(response, out); } } } } Api(AuthBackend &admin, class ::uuid::uuid did, libhttppp::HttpRequest& curreq, const int /*tid*/, ULONG_PTR /*args*/) : _Backend(admin), _Did(did), _SessionData(nullptr) { Loading Loading @@ -683,6 +727,7 @@ public: // With client connection only if (curcon) { existsGPO(jrequest, jresponse); listGroups(jrequest, jresponse); } // With user session only Loading Loading
client/client.cpp +69 −0 Changes for client/client.cpp: 69 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -820,5 +820,74 @@ bool Client::GPOexits(class uuid::uuid gpoid) { // keeping name for compatibilit return ret; } std::vector<Client::GroupInfo> Client::listGroups() { ensure_http_client(_Con); json_object* jresponse = json_object_new_object(); json_object* cmd = json_object_new_array(); json_object* obj = json_object_new_object(); json_object_object_add(obj, "clientsession", json_object_new_string(_Con.getClientId().c_str())); json_object_object_add(obj, "listgroups", json_object_new_string("")); json_object_array_add(cmd, obj); json_object_object_add(jresponse, "commands", cmd); size_t outsize = 0; const char* tmp = json_object_to_json_string_length(jresponse, 0, &outsize); std::vector<char> out; out.reserve(outsize); std::copy(tmp, tmp + outsize, std::back_inserter(out)); libhttppp::HttpRequest nreq; nreq.setHeaderData("accept")->push_back("application/json"); nreq.setHeaderData("content-type")->push_back("application/json"); nreq.setRequestURL(_Con._RequestPath.c_str()); std::vector<char> resp(_Con._Client->Post(nreq, out, _Con._MaxTries)); resp.push_back('\0'); json_object_put(jresponse); json_tokener* jtok = json_tokener_new(); json_object* jrequest = json_tokener_parse_ex(jtok, resp.data(), resp.size() - 1); if (!jrequest) { const char* err = json_tokener_error_desc(json_tokener_get_error(jtok)); json_tokener_free(jtok); throw authdb::AuthBackendError(err); } if (json_object_get_type(jrequest) != json_type_array) { json_object_put(jrequest); json_tokener_free(jtok); throw(authdb::AuthBackendError("Invalid Api Commands")); } std::vector<GroupInfo> groups; int fcount = json_object_array_length(jrequest); for (int i = 0; i < fcount; ++i) { json_object_object_foreach(json_object_array_get_idx(jrequest, i), key, val) { if (strcmp(key, "groups") == 0 && json_object_get_type(val) == json_type_array) { int glen = json_object_array_length(val); for (int g = 0; g < glen; ++g) { json_object* jgrp = json_object_array_get_idx(val, g); json_object* jgid = json_object_object_get(jgrp, "gid"); json_object* jname = json_object_object_get(jgrp, "name"); if (jgid && jname) { groups.push_back({json_object_get_string(jgid), json_object_get_string(jname)}); } } } } } json_object_put(jrequest); json_tokener_free(jtok); return groups; } } // namespace client } // namespace authdb
client/client.h +7 −0 Changes for client/client.h: 7 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -120,6 +120,13 @@ namespace authdb { void changeUserPw(const std::string& oldpw,const std::string& newpw); void getAvatar(const ::uuid::uuid &did,const ::uuid::uuid &uid,libhttppp::HttpRequest &resq, libhttppp::HttpResponse &resp); struct GroupInfo { std::string gid; std::string name; }; std::vector<GroupInfo> listGroups(); private: ClientConnection &_Con; friend class Session; Loading
src/api.cpp +45 −0 Changes for src/api.cpp: 45 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ #include "user.h" #include "client.h" #include "gpo.h" #include "group.h" #include "session.h" #include "domain.h" #include "plugin.h" Loading Loading @@ -633,6 +634,49 @@ public: } } void listGroups(json_object *request, json_object *response) { json_object* cmd = get_commands_array_or_throw(request); int fcount = json_object_array_length(cmd); for (int i = 0; i < fcount; ++i) { json_object_object_foreach(json_object_array_get_idx(cmd, i), key, val) { (void)val; if (strcmp(key, "listgroups") == 0) { json_object* out = json_object_new_object(); json_object* jarr = json_object_new_array(); Group group; size_t rd = sizeof(authdb::AuthHeader), end = _Backend.end(); while (rd < end) { std::shared_ptr<authdb::AuthData::Record> cur = std::make_shared<authdb::AuthData::Record>(); _Backend.setPos(rd); _Backend.read((unsigned char*)cur.get(), sizeof(AuthData::Record)); rd = _Backend.getPos() + cur->datasize; if (cur->type == GroupData && strcmp(cur->fieldname, "groupname") == 0) { class GroupData gdat(cur->ruid); try { size_t upos = sizeof(authdb::AuthHeader); group.info(_Backend, gdat, upos); json_object *jgrp = json_object_new_object(); json_object_object_add(jgrp, "gid", json_object_new_string(uuid::uuid(cur->ruid).c_str())); json_object_object_add(jgrp, "name", json_object_new_string(gdat.getName().c_str())); json_object_array_add(jarr, jgrp); } catch (AuthBackendError &e) { std::cerr << e.what() << std::endl; } } } json_object_object_add(out, "groups", jarr); json_object_array_add(response, out); } } } } Api(AuthBackend &admin, class ::uuid::uuid did, libhttppp::HttpRequest& curreq, const int /*tid*/, ULONG_PTR /*args*/) : _Backend(admin), _Did(did), _SessionData(nullptr) { Loading Loading @@ -683,6 +727,7 @@ public: // With client connection only if (curcon) { existsGPO(jrequest, jresponse); listGroups(jrequest, jresponse); } // With user session only Loading