/******************************************************************************* * Copyright (c) 2025, Jan Koester jan.koester@gmx.net * 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 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 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 "user.h" authdb::UserData::UserData(uuid_t id){ new AuthDataRecord; uuid_unparse(id,uid); Data=nullptr; username=nullptr; firstname=nullptr; lastname=nullptr; mail=nullptr; pwhash=nullptr; avatar=nullptr; } authdb::UserData::~UserData(){ delete Data; } void authdb::UserData::setFirstName(const char* src){ AuthDataRecord *target=firstname; if(!target){ for(AuthDataRecord *curec=Data; curec; curec=curec->next()){ if(strcmp(curec->Data.uuid,uid)==0 && strcmp(curec->Data.fieldname,"firstname")==0){ target=curec; break; } } if(!target){ target=Data; while(target){ if(!target->_next){ target->_next=new AuthDataRecord; target=target->next(); break; } target=target->next(); }; if(!target) target=new AuthDataRecord; } } target->Data.type=1; memcpy(target->Data.uuid,uid,strlen(uid)+1); snprintf(target->Data.fieldname,255,"%s","firstname"); target->Data.datasize=strlen(src); target->Data.data= new char[target->Data.datasize]; memcpy(target->Data.data,src,target->Data.datasize); firstname=target; } void authdb::UserData::setLastName(const char* src){ AuthDataRecord *target=lastname; if(!target){ for(AuthDataRecord *curec=Data; curec; curec=curec->next()){ if(strcmp(curec->Data.uuid,uid)==0 && strcmp(curec->Data.fieldname,"lastname")==0){ target=curec; break; } } if(!target){ target=Data; while(target){ if(!target->_next){ target->_next=new AuthDataRecord; target=target->next(); break; } target=target->next(); }; if(!target) target=new AuthDataRecord; } } target->Data.type=1; memcpy(target->Data.uuid,uid,strlen(uid)+1); snprintf(target->Data.fieldname,255,"%s","lastname"); target->Data.datasize=strlen(src); target->Data.data= new char[target->Data.datasize]; memcpy(target->Data.data,src,target->Data.datasize); lastname=target; } void authdb::UserData::setMail(const char* src){ AuthDataRecord *target=mail; if(!target){ for(AuthDataRecord *curec=Data; curec; curec=curec->next()){ if(strcmp(curec->Data.uuid,uid)==0 && strcmp(curec->Data.fieldname,"mail")==0){ target=curec; break; } } if(!target){ target=Data; while(target){ if(!target->_next){ target->_next=new AuthDataRecord; target=target->next(); break; } target=target->next(); }; if(!target) target=new AuthDataRecord; } } target->Data.type=1; memcpy(target->Data.uuid,uid,strlen(uid)+1); snprintf(target->Data.fieldname,255,"%s","mail"); target->Data.datasize=strlen(src); target->Data.data= new char[target->Data.datasize]; memcpy(target->Data.data,src,target->Data.datasize); mail=target; } void authdb::UserData::setPwHash(const char* src){ AuthDataRecord *target=pwhash; if(!target){ for(AuthDataRecord *curec=Data; curec; curec=curec->next()){ if(strcmp(curec->Data.uuid,uid)==0 && strcmp(curec->Data.fieldname,"password")==0){ target=curec; break; } } if(!target){ target=Data; while(target){ if(!target->_next){ target->_next=new AuthDataRecord; target=target->next(); break; } target=target->next(); }; if(!target) target=new AuthDataRecord; } } target->Data.type=1; memcpy(target->Data.uuid,uid,strlen(uid)+1); snprintf(target->Data.fieldname,255,"%s","password"); target->Data.datasize=strlen(src); target->Data.data= new char[target->Data.datasize]; memcpy(target->Data.data,src,target->Data.datasize); pwhash=target; } void authdb::UserData::setUserName(const char* src){ AuthDataRecord *target=username; if(!target){ for(AuthDataRecord *curec=Data; curec; curec=curec->next()){ if(strcmp(curec->Data.uuid,uid)==0 && strcmp(curec->Data.fieldname,"username")==0){ target=curec; break; } } if(!target){ target=Data; while(target){ if(!target->_next){ target->_next=new AuthDataRecord; target=target->next(); break; } target=target->next(); }; if(!target) target=new AuthDataRecord; } } target->Data.type=1; memcpy(target->Data.uuid,uid,strlen(uid)+1); snprintf(target->Data.fieldname,255,"%s","username"); target->Data.datasize=strlen(src); target->Data.data= new char[target->Data.datasize]; memcpy(target->Data.data,src,target->Data.datasize); username=target; } void authdb::UserData::setAvatar(const std::vector& src){ AuthDataRecord *target=avatar; if(!target){ for(AuthDataRecord *curec=Data; curec; curec=curec->next()){ if(strcmp(curec->Data.uuid,uid)==0 && strcmp(curec->Data.fieldname,"lastname")==0){ target=curec; break; } } if(!target){ target=Data; while(target){ if(!target->_next){ target->_next=new AuthDataRecord; target=target->next(); break; } target=target->next(); }; if(!target) target=new AuthDataRecord; } } target->Data.type=1; memcpy(target->Data.uuid,uid,strlen(uid)+1); snprintf(target->Data.fieldname,255,"%s","lastname"); target->Data.datasize=src.size(); target->Data.data= new char[target->Data.datasize]; memcpy(target->Data.data,src.data(),target->Data.datasize); avatar=target; } void authdb::User::create(AuthBackend &backend,UserData* dat){ authdb::AuthData cur; size_t rd=sizeof(authdb::AuthHeader),end=backend.end(); backend.setPos(rd); std::string userlist="UserList:\r\n"; while(rdusername->Data.data,dat->username->Data.datasize) == 0){ throw authdb::AuthBackendError("Create User: Username Exists aborting!"); }else if(strcmp(cur.uuid,dat->username->Data.uuid)==0){ throw authdb::AuthBackendError("Create User: UUID already Exists aborting!"); } } for(AuthDataRecord *curec=dat->Data; curec; curec=curec->next()){ backend.WriteAuthData(curec->Data,backend.end()); } } void authdb::User::edit(AuthBackend &backend, uuid_t uid,UserData& dat, size_t pos){ } void authdb::User::remove(AuthBackend &backend, uuid_t uid){ } void authdb::User::info(AuthBackend &backend, uuid_t uid,UserData& dat, size_t pos) { } void authdb::User::getAdditional(AuthBackend &backend, uuid_t uid, struct AuthData& data, size_t pos){ } void authdb::User::editAdditional(AuthBackend &backend, uuid_t uid, struct AuthData& data, const char* fieldname){ } void authdb::User::remAdditional(AuthBackend &backend, uuid_t uid, const char* fieldname){ }