Newer
Older
/*******************************************************************************
* 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 <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.
*******************************************************************************/
namespace authdb {
template <class UserData &U,class AuthData *Y>
const char *getUserData(const char *varname){
if(Y && Y->Data ){
return Y->Data->data;
}else{
for(AuthData *currec=Y; currec; currec=currec->next()){
if(strcmp(currec->Data->fieldname,varname)){
Y->Data=currec->Data;
return Y->Data->data;
}
}
}
throw(authdb::AuthBackendError("Lastname data not found !"));
}
};
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){
AuthData *curec=Data;
if(!target){
while(curec){
if(curec->Data->type == authdb::UserData &&
strcmp(curec->Data->uuid,uid)==0 &&
strcmp(curec->Data->fieldname,"firstname")==0
){
target=curec->Data;
target->datasize=0;
delete[] target->data;
target->data=nullptr;
if(!target){
AuthData::Record newrec;
target=Data->append(newrec)->Data;
target->type=DataType::UserData;
target->storage=StorageType::TextStorage;
strcpy(target->uuid,uid);
snprintf(target->fieldname,255,"%s","firstname");
target->datasize=strlen(src)+1;
target->data= new char[target->datasize];
strcpy(target->data,src);
if(firstname && firstname->data)
return firstname->data;
AuthData::Record *target=lastname;
AuthData *curec=Data;
if(!target){
while(curec){
if(curec->Data->type == authdb::UserData &&
strcmp(curec->Data->uuid,uid)==0 &&
strcmp(curec->Data->fieldname,"lastname")==0
){
target=curec->Data;
target->datasize=0;
delete[] target->data;
target->data=nullptr;
if(!target){
AuthData::Record newrec;
target=Data->append(newrec)->Data;
target->type=DataType::UserData;
target->storage=StorageType::TextStorage;
strcpy(target->uuid,uid);
snprintf(target->fieldname,255,"%s","lastname");
target->datasize=strlen(src)+1;
target->data= new char[target->datasize];
strcpy(target->data,src);
if(lastname && lastname->data){
return lastname->data;
}else{
for(AuthData *currec=Data; currec; currec=currec->next()){
if(strcmp(currec->Data->fieldname,"lastname")){
lastname=currec->Data;
return lastname->data;
}
}
}
throw(authdb::AuthBackendError("Lastname data not found !"));
AuthData::Record *target=mail;
AuthData *curec=Data;
if(!target){
while(curec){
if(curec->Data->type == authdb::UserData &&
strcmp(curec->Data->uuid,uid)==0 &&
strcmp(curec->Data->fieldname,"mail")==0
){
target=curec->Data;
target->datasize=0;
delete[] target->data;
target->data=nullptr;
if(!target){
AuthData::Record newrec;
target=Data->append(newrec)->Data;
target->type=DataType::UserData;
target->storage=StorageType::TextStorage;
strcpy(target->uuid,uid);
snprintf(target->fieldname,255,"%s","mail");
target->datasize=strlen(src)+1;
target->data= new char[target->datasize];
strcpy(target->data,src);
AuthData *curec=Data;
if(!target){
while(curec){
if(curec->Data->type == authdb::UserData &&
strcmp(curec->Data->uuid,uid)==0 &&
strcmp(curec->Data->fieldname,"pwhash")==0
){
target=curec->Data;
target->datasize=0;
delete[] target->data;
target->data=nullptr;
if(!target){
AuthData::Record newrec;
target=Data->append(newrec)->Data;
target->type=DataType::UserData;
target->storage=StorageType::TextStorage;
strcpy(target->uuid,uid);
snprintf(target->fieldname,255,"%s","pwhash");
target->datasize=strlen(src)+1;
target->data= new char[target->datasize];
strcpy(target->data,src);
AuthData *curec=Data;
if(!target){
while(curec){
if(curec->Data->type == authdb::UserData &&
strcmp(curec->Data->uuid,uid)==0 &&
strcmp(curec->Data->fieldname,"username")==0
){
target=curec->Data;
target->datasize=0;
delete[] target->data;
target->data=nullptr;
if(!target){
AuthData::Record newrec;
target=Data->append(newrec)->Data;
target->type=DataType::UserData;
target->storage=StorageType::TextStorage;
strcpy(target->uuid,uid);
snprintf(target->fieldname,255,"%s","username");
target->datasize=strlen(src)+1;
target->data= new char[target->datasize];
strcpy(target->data,src);
if(username && username->data)
return username->data;
void authdb::UserData::setAvatar(const std::vector<char>& src){
AuthData *curec=Data;
if(!target){
while(curec){
if(curec->Data->type == authdb::UserData &&
strcmp(curec->Data->uuid,uid)==0 &&
strcmp(curec->Data->fieldname,"avatar")==0
){
target=curec->Data;
target->datasize=0;
delete[] target->data;
target->data=nullptr;
if(!target){
AuthData::Record newrec;
target=Data->append(newrec)->Data;
target->type=DataType::UserData;
target->storage=StorageType::BinaryStorage;
memcpy(target->uuid,uid,strlen(uid)+1);
snprintf(target->fieldname,255,"%s","avatar");
target->datasize=src.size();
target->data= new char[target->datasize];
memcpy(target->data,src.data(),target->datasize);
void authdb::UserData::getAvatar(std::vector<char>& dest){
if(avatar && avatar->data)
std::copy(avatar->data,avatar->data+avatar->datasize,
size_t rd=sizeof(authdb::AuthHeader),end=backend.end();
std::string userlist="UserList:\r\n";
while(rd<end){
backend.setPos(rd);
backend.read((unsigned char*)cur,sizeof(AuthData::Record));
cur->data=new char[cur->datasize];
backend.read((unsigned char*)cur->data,cur->datasize);
delete[] cur->data;
delete cur;
throw authdb::AuthBackendError("Create User: Username Exists aborting!");
delete[] cur->data;
delete cur;
throw authdb::AuthBackendError("Create User: UUID already Exists aborting!");
}
for(AuthData *curec=dat->Data; curec; curec=curec->next()){
curec->Data->type=UserData;
backend.setPos(wd);
backend.write((unsigned char*)curec->Data,sizeof(AuthData::Record));
backend.write((unsigned char*)curec->Data->data,curec->Data->datasize);
void authdb::User::edit(AuthBackend &backend, uuid_t uid,class UserData& dat, size_t &pos){
void authdb::User::remove(AuthBackend &backend,const uuid_t uid){
delRecord(backend,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!");
authdb::AuthData::Record *cur=new AuthData::Record;
backend.setPos(pos);
backend.read((unsigned char*)cur,sizeof(AuthData::Record));
if(cur->type == UserData && strcmp(cuid,cur->uuid) == 0){
if(!getRecord(backend,*dat.Data,uid,DataType::UserData))
continue;
if(strcmp(dat.Data->Data->fieldname,"username")==0){
dat.username=dat.Data->Data;
}else if(strcmp(dat.Data->Data->fieldname,"firstname")==0){
dat.firstname=dat.Data->Data;
}else if(strcmp(dat.Data->Data->fieldname,"lastname")==0){
dat.lastname=dat.Data->Data;
}else if(strcmp(dat.Data->Data->fieldname,"mail")==0){
dat.mail=dat.Data->Data;
}else if(strcmp(dat.Data->Data->fieldname,"pwhash")==0){
dat.pwhash=dat.Data->Data;
}else if(strcmp(dat.Data->Data->fieldname,"avatar")==0){
dat.avatar=dat.Data->Data;