/******************************************************************************* * 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 "types.h" #include "user.h" authdb::UserData::UserData(){ Data=new AuthDataRecord; username=nullptr; firstname=nullptr; lastname=nullptr; mail=nullptr; pwhash=nullptr; avatar=nullptr; } authdb::UserData::UserData(uuid_t id) : UserData(){ uuid_unparse(id,uid); } 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){ Data=new AuthDataRecord; target=Data; } } } target->Data->type=DataType::UserData; target->Data->storage=StorageType::TextStorage; memcpy(target->Data->uuid,uid,strlen(uid)+1); snprintf(target->Data->fieldname,255,"%s","firstname"); target->Data->datasize=strlen(src)+1; target->Data->data= new char[target->Data->datasize]; memcpy(target->Data->data,src,target->Data->datasize); firstname=target; } const char *authdb::UserData::getFirstname(){ if(firstname && firstname->Data) return firstname->Data->data; else throw(authdb::AuthBackendError("data not found !")); } 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){ Data=new AuthDataRecord; target=Data; } } } target->Data->type=DataType::UserData; target->Data->storage=StorageType::TextStorage; memcpy(target->Data->uuid,uid,strlen(uid)+1); snprintf(target->Data->fieldname,255,"%s","lastname"); target->Data->datasize=strlen(src)+1; target->Data->data= new char[target->Data->datasize]; memcpy(target->Data->data,src,target->Data->datasize); lastname=target; } const char * authdb::UserData::getLastename(){ if(lastname && lastname->Data) return lastname->Data->data; else throw(authdb::AuthBackendError("data not found !")); } 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){ Data=new AuthDataRecord; target=Data; } } } target->Data->type=DataType::UserData; target->Data->storage=StorageType::TextStorage; memcpy(target->Data->uuid,uid,strlen(uid)+1); snprintf(target->Data->fieldname,255,"%s","mail"); target->Data->datasize=strlen(src)+1; target->Data->data= new char[target->Data->datasize]; memcpy(target->Data->data,src,target->Data->datasize); mail=target; } const char *authdb::UserData::getMail(){ if(mail && mail->Data) return mail->Data->data; else throw(authdb::AuthBackendError("data not found !")); } 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){ Data=new AuthDataRecord; target=Data; } } } target->Data->type=DataType::UserData; target->Data->storage=StorageType::TextStorage; memcpy(target->Data->uuid,uid,strlen(uid)+1); snprintf(target->Data->fieldname,255,"%s","password"); target->Data->datasize=strlen(src)+1; target->Data->data= new char[target->Data->datasize]; memcpy(target->Data->data,src,target->Data->datasize); pwhash=target; } const char * authdb::UserData::getPwHash(){ if(pwhash && pwhash->Data) return pwhash->Data->data; else throw(authdb::AuthBackendError("data not found !")); } 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){ Data=new AuthDataRecord; target=Data; } } } target->Data->type=DataType::UserData; target->Data->storage=StorageType::TextStorage; memcpy(target->Data->uuid,uid,strlen(uid)+1); snprintf(target->Data->fieldname,255,"%s","username"); target->Data->datasize=strlen(src)+1; target->Data->data= new char[target->Data->datasize]; memcpy(target->Data->data,src,target->Data->datasize); username=target; } const char * authdb::UserData::getUsername(){ if(username && username->Data) return username->Data->data; else throw(authdb::AuthBackendError("data nout found !")); } 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,"avatar")==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){ Data=new AuthDataRecord; target=Data; } } } target->Data->type=DataType::UserData; target->Data->storage=StorageType::BinaryStorage; memcpy(target->Data->uuid,uid,strlen(uid)+1); snprintf(target->Data->fieldname,255,"%s","avatar"); 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::UserData::getAvatar(std::vector& dest){ if(avatar && avatar->Data) std::copy(avatar->Data->data,avatar->Data->data+avatar->Data->datasize, std::back_inserter(dest)); else throw(authdb::AuthBackendError("data nout found !")); } void authdb::User::create(AuthBackend &backend,class UserData* dat){ authdb::AuthData *cur=new AuthData; size_t rd=sizeof(authdb::AuthHeader),end=backend.end(); backend.setPos(rd); std::string userlist="UserList:\r\n"; while(rddatasize; if(strcmp(cur->fieldname,"username")==0){ cur->data=new char[cur->datasize]; backend.read((unsigned char*)cur->data,cur->datasize); if(strncmp(cur->data,dat->username->Data->data,dat->username->Data->datasize) == 0){ delete[] cur->data; delete cur; throw authdb::AuthBackendError("Create User: Username Exists aborting!"); }else if(strcmp(cur->uuid,dat->username->Data->uuid)==0){ delete[] cur->data; delete cur; throw authdb::AuthBackendError("Create User: UUID already Exists aborting!"); } delete[] cur->data; } } delete cur; size_t wd=end; for(AuthDataRecord *curec=dat->Data; curec; curec=curec->next()){ backend.WriteAuthData(curec->Data,wd); wd=backend.end(); } } void authdb::User::edit(AuthBackend &backend, uuid_t *uid,class UserData& dat, size_t &pos){ } void authdb::User::remove(AuthBackend &backend, uuid_t *uid){ } void authdb::User::info(AuthBackend &backend, uuid_t *uid,class UserData& dat, size_t &pos){ size_t end=backend.end(); char cuid[255]; if(!uid) throw AuthBackendError("user info uid required!"); uuid_unparse(*uid,cuid); while(posdatasize; if(strcmp(cuid,cur->uuid) == 0){ uuid_t uid; uuid_parse(cur->uuid,uid); backend.setPos(sizeof(AuthHeader)); getRecord(backend,dat.Data,uid,DataType::UserData); std::copy(cur->uuid,cur->uuid+(strlen(cur->uuid)+1),dat.uid); for(AuthDataRecord *curec=dat.Data; curec; curec=curec->next()){ if(strcmp(curec->Data->fieldname,"username")==0){ dat.setUserName(curec->Data->data); }else if(strcmp(curec->Data->fieldname,"firstname")==0){ dat.setFirstName(curec->Data->data); }else if(strcmp(curec->Data->fieldname,"lastname")==0){ dat.setLastName(curec->Data->data); }else if(strcmp(curec->Data->fieldname,"mail")==0){ dat.setMail(curec->Data->data); }else if(strcmp(curec->Data->fieldname,"pwhash")==0){ dat.setPwHash(curec->Data->data); }else if(strcmp(curec->Data->fieldname,"avatar")==0){ std::vector tmp; std::copy(curec->Data->data,curec->Data->data+curec->Data->datasize, std::back_inserter(tmp)); dat.setAvatar(tmp); }/*else{ while(dat.Data->Data){ if(!dat.Data->_next){ dat.Data=dat.Data->_next; break; } dat.Data=dat.Data->_next; }; dat.Data=new AuthDataRecord; memcpy(dat.Data->Data,curec->Data,sizeof(authdb::AuthData)); dat.Data->Data->data=new char[curec->Data->datasize]; memcpy(dat.Data->Data->data,curec->Data->data,curec->Data->datasize); }*/ } } delete cur; } }