Newer
Older
/*******************************************************************************
* 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>
class AuthDB : public libhttppp::HttpEvent{
public:
AuthDB(authdb::AuthBackend &backend,netplus::socket *ssock) : HttpEvent(ssock), _Backend(backend){
};
void listUsers(libhttppp::HttpRequest *curreq, const int tid, ULONG_PTR args){
_Backend.lock();
size_t rd=sizeof(authdb::AuthHeader),end=_Backend.end();
_Backend.setPos(rd);
libhtmlpp::HtmlElement root;
libhtmlpp::HtmlPage page;
page.loadFile(root,"../data/index.html");
libhtmlpp::HtmlString userlist,out;
libhtmlpp::HtmlElement *content=root.getElementbyID("content");
userlist <<"<div><p>UserList:</p>";
std::copy(cur->data,cur->data+cur->datasize,std::back_inserter(userlist));
userlist+= "<br>";
for(AuthDataRecord *curec=rec; curec; curec=curec->next()){
if(strcmp(curec->Data->fieldname,"username")!=0 && curec->Data->data){
userlist << "</div><div><ul><li><a class=\"button\" href=\"/admin/createuser\">CreateUser</a></li></ul></div>";
content->insertChild(userlist.parse());
libhtmlpp::print(&root,out,true);
rep.setContentType("text/html");
rep.send(curreq,out.c_str(),out.size());
}
void createUser(libhttppp::HttpRequest *curreq, const int tid, ULONG_PTR args){
libhttppp::HttpResponse rep;
libhttppp::HttpForm curform;
curform.parse(curreq);
if (curform.getBoundary()) {
uuid_t uid;
uuid_generate(uid);
for (libhttppp::HttpForm::MultipartForm::Data* curformdat = curform.MultipartFormData.getFormData();
curformdat; curformdat = curformdat->nextData()) {
for(libhttppp::HttpForm::MultipartForm::Data::ContentDisposition *curdispo=curformdat->getDisposition();
curdispo; curdispo=curdispo->nextContentDisposition()
){
if(curformdat->Value.empty() || !curdispo->getValue())
continue;
std::vector<char> tmp;
if(strcmp(curdispo->getValue(),"avatar")!=0){
std:copy(curformdat->Value.begin(),curformdat->Value.end(),std::back_inserter(tmp));
tmp.push_back('\0');
}
}else if(strcmp(curdispo->getValue(),"avatar")==0 && !curformdat->Value.empty()){
udat.setAvatar(curformdat->Value);
}
}
}
User user;
user.create(_Backend,&udat);
std::cout << "user created!" << std::endl;
}
page.loadFile(root,"../data/index.html");
libhtmlpp::HtmlString form,out;
form << "<form method=\"post\" enctype=\"multipart/form-data\">"
<< "<table>"
<< "<tr><td><label for=\"username\">username:</label></td>"
<< "<td><input type=\"text\" name=\"username\"></td></tr>"
<< "<tr><td><label for=\"firstname\">firstname:</label></td>"
<< "<td><input type=\"text\" name=\"firstname\"></td></tr>"
<< "<tr><td><label for=\"lastname\">lastname:</label></td>"
<< "<td><input type=\"text\" name=\"lastname\"></td></tr>"
<< "<tr><td><label for=\"mail\">mail:</label></td>"
<< "<td><input type=\"text\" name=\"mail\"></td></tr>"
<< "<tr><td><label for=\"avatar\">ProfilBild:</label></td>"
<< "<td><input type=\"file\" name=\"avatar\"></td></tr>"
<< "<tr><td></td><td><input type=\"submit\"></td></tr>"
<< "</table>"
<< "</form";
libhtmlpp::HtmlElement *content=root.getElementbyID("content");
content->insertChild(form.parse());
libhtmlpp::print(&root,out,true);
rep.setContentType("text/html");
rep.setContentLength(out.size());
rep.send(curreq,out.c_str(),out.size());
}
void AdminController(libhttppp::HttpRequest *curreq, const int tid, ULONG_PTR args){
if(strncmp(curreq->getRequestURL(),"/admin/listusers",16)==0){
listUsers(curreq,tid,args);
}else if(strncmp(curreq->getRequestURL(),"/admin/createuser",17)==0){
createUser(curreq,tid,args);
}else{
libhtmlpp::HtmlElement root;
libhtmlpp::HtmlPage page;
page.loadFile(root,"../data/index.html");
libhtmlpp::HtmlString out;
libhtmlpp::print(&root,out,true);
libhttppp::HttpResponse rep;
rep.setContentType("text/html");
rep.setContentLength(out.size());
rep.send(curreq,out.c_str(),out.size());
}
}
void RequestEvent(libhttppp::HttpRequest *curreq, const int tid, ULONG_PTR args){
if(strncmp(curreq->getRequestURL(),"/admin",6)==0){
AdminController(curreq,tid,args);
}else if(strncmp(curreq->getRequestURL(),"/api",4)==0){
}else{
libhttppp::HttpResponse rep;
rep.setState(HTTP307);
rep.setVersion(HTTPVERSION(1.1));
rep.setHeaderData("Location")->push_back("/admin");
rep.setContentType("text/html");
rep.send(curreq,nullptr,0);
};
private:
authdb::AuthBackend &_Backend;
};
int searchValue(authdb::AuthBackend &backend,const char*fieldname,const char *value){
int rd=sizeof(authdb::AuthHeader),brd=rd;
while(rd>backend.end()){
backend.ReadAuthData(user,rd);
rd=backend.getPos();
if(strcmp(user->fieldname,fieldname) == 0){
if(strcmp(user->data,value) == 0){
delete[] user->data;
delete user;
return -1;
}
AuthDataRecord::AuthDataRecord(){
_next=nullptr;
}
AuthDataRecord::AuthDataRecord(const AuthDataRecord &src){
_next=nullptr;
}
AuthDataRecord::~AuthDataRecord(){
};
bool getRecord(authdb::AuthBackend &backend,AuthDataRecord *dest,uuid_t id,int type){
bool found=false;
int rd=sizeof(authdb::AuthHeader),end=backend.end();
char plainid[255];
uuid_unparse(id,plainid);
AuthDataRecord *curec=dest;
while(rd<end){
backend.ReadAuthData(cur,rd);
rd=backend.getPos();
if(strcmp(cur->uuid,plainid) == 0 && cur->type == type){
memcpy(curec->Data,cur,sizeof(*cur));
if(rd<backend.end()){
curec->_next=new AuthDataRecord;
curec=curec->_next;
}
found=true;
}
}
int main(int argc, char *argv[]){
cmdplus::CmdController &cmd=cmdplus::CmdController::getInstance();
if(!cmd.checkRequired()){
std::cerr << "Config Path required !" << std::endl;
cmd.printHelp();
return -1;
}
confplus::Config config(cmd.getCmdbyKey("config")->getValue());
authdb::AuthBackend backend(authdb::AuthBackendType::File,
config.getValue(config.getKey("/AUTHDB/ADMINDB/PATH"),0),
"admin.local"
);
libhttppp::HttpD httpd(
config.getValue(config.getKey("/AUTHDB/BIND"),0),
config.getIntValue(config.getKey("/AUTHDB/PORT"),0),
config.getIntValue(config.getKey("/AUTHDB/MAXCONN"),0),
nullptr,
nullptr
);
authdb::AuthDB authdb(backend,httpd.getServerSocket());
}catch(authdb::AuthBackendError &e){
std::cerr << e.what() << std::endl;
}