Skip to content
authdb.cpp 6.05 KiB
Newer Older
jan.koester's avatar
jan.koester committed
/*******************************************************************************
jan.koester's avatar
jan.koester committed
 * Copyright (c) 2025, Jan Koester jan.koester@gmx.net
jan.koester's avatar
jan.koester committed
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 * Neither the name of the <organization> nor the
 *      names of its contributors may be used to endorse or promote products
 *      derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *******************************************************************************/

#include <iostream>
jan.koester's avatar
jan.koester committed
#include <cstring>
#include <uuid/uuid.h>
jan.koester's avatar
jan.koester committed

#include "backend.h"
jan.koester's avatar
jan.koester committed
#include "authdb.h"
jan.koester's avatar
jan.koester committed

jan.koester's avatar
jan.koester committed
void authdb::ReadAuthData(authdb::AuthBackend &backend,struct AuthData& adata,int pos){
    backend.lock();
    backend.setPos(pos);
    backend.read((unsigned char*)&adata,sizeof(adata));
    backend.setPos(pos+sizeof(adata));
    adata.data=new char[adata.datasize];
    backend.read((unsigned char*)adata.data,adata.datasize);
    backend.unlock();
}

void authdb::WriteAuthData(authdb::AuthBackend &backend,const struct AuthData &adata,int pos){
    backend.lock();
    backend.setPos(pos);
    backend.newRevesion();
    backend.write((unsigned char*)&adata,sizeof(adata));
    backend.write((unsigned char*)adata.data,adata.datasize);
    backend.unlock();
}
jan.koester's avatar
jan.koester committed


jan.koester's avatar
jan.koester committed
int main(int argc, char *argv[]){
    authdb::AuthBackend backend(authdb::AuthBackendType::File,"test.db","tuxist.de");
jan.koester's avatar
jan.koester committed
    try {

jan.koester's avatar
jan.koester committed
        if(strcmp(argv[1],"user")==0 ){
            if(strcmp(argv[2],"create")==0 ){
                authdb::AuthData user;

                uuid_t id;
                uuid_generate(id);

                uuid_unparse(id,user.uuid);

                user.type=1;
                snprintf(user.fieldname,255,"%s",argv[3]);
                user.datasize=strlen(argv[4])+1;
                user.data = new char[strlen(argv[4])+1];
                snprintf(user.data,strlen(argv[4])+1,"%s",argv[4]);
jan.koester's avatar
jan.koester committed


jan.koester's avatar
jan.koester committed
                authdb::AuthData euser;
                int rd=sizeof(authdb::AuthHeader);
                while(rd<backend.end()){
                    ReadAuthData(backend,euser,rd);
                    rd=backend.getPos();
                    if(strcmp(euser.fieldname,"username") == 0 && strcmp(euser.data,user.data)==0 ){
                        delete[] euser.data;
                        throw authdb::AuthBackendError("Username already exits");
                    }
                    delete[] euser.data;
                }

                WriteAuthData(backend,user,backend.end());
            }else if(strcmp(argv[2],"edit")==0 ){
                int rd=sizeof(authdb::AuthHeader);

                if(strcmp(argv[4],"username")==0){
                    throw authdb::AuthBackendError("Username not editable");
                }

                authdb::AuthData euser;

                char uid[255];

                while(rd<backend.end()){
                    ReadAuthData(backend,euser,rd);
                    rd=backend.getPos();
                    if(strcmp(euser.fieldname,"username") == 0 && strcmp(euser.data,argv[3])==0 ){
                        memcpy(uid,euser.uuid,strlen(euser.uuid)+1);
                        authdb::AuthData newattr;
                        newattr.type=1;
                        memcpy(newattr.uuid,uid,strlen(uid)+1);
                        memcpy(newattr.fieldname,argv[4],strlen(argv[4])+1);
                        newattr.datasize=strlen(argv[4])+1;
                        newattr.data = new char[strlen(argv[5])+1];
                        snprintf(newattr.data,strlen(argv[5])+1,"%s",argv[5]);
                        WriteAuthData(backend,newattr,backend.end());
                    }
                }
            }else if(strcmp(argv[2],"list")==0){
                authdb::AuthData user,attr;
                int rd=sizeof(authdb::AuthHeader),rd2=rd;
                std::cout << "Revesion :" << backend.getRevesion() << std::endl;
                while(rd<backend.end()){
                    ReadAuthData(backend,user,rd);
                    rd=backend.getPos();
                    if(strcmp(user.fieldname,"username") == 0){
                        std::cout << user.fieldname  << ": " << user.data << std::endl;
                        std::cout << "  id: " << user.uuid << std::endl;
                        while(rd2<backend.end()){
                            ReadAuthData(backend,attr,rd2);
                            if(strcmp(attr.fieldname,"username") != 0 &&
                                strcmp(attr.uuid,user.uuid)==0){
                                std::cout << "  " << attr.fieldname << ": " << attr.data << std::endl;
                            }
                            rd2=backend.getPos();
                        }
                        rd2=sizeof(authdb::AuthHeader);
                    }
                    delete[] user.data;
                }
            }
        }
jan.koester's avatar
jan.koester committed
    }catch(authdb::AuthBackendError &e){
        std::cerr << e.what() << std::endl;
    }
jan.koester's avatar
jan.koester committed
}