Commit ce89de3b authored by jan.koester's avatar jan.koester
Browse files

group list via json api

parent 33143f8a
Loading
Loading
Loading
Loading
Loading
+69 −0
Changes for client/client.cpp: 69 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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
+7 −0
Changes for client/client.h: 7 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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;
+45 −0
Changes for src/api.cpp: 45 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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"
@@ -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) {
@@ -683,6 +727,7 @@ public:
        // With client connection only
        if (curcon) {
            existsGPO(jrequest, jresponse);
            listGroups(jrequest, jresponse);
        }

        // With user session only