Loading CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.18) project(blogi) SET(CMAKE_CXX_FLAGS "-fPIC -Wall") SET(CMAKE_CXX_FLAGS "-fPIC -Wall -std=c++17") list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) Loading plugins/content/content.cpp +11 −7 Original line number Diff line number Diff line Loading @@ -243,21 +243,21 @@ namespace blogi { if(curform.getBoundary()){ for(libhttppp::HttpForm::MultipartForm::Data *curformdat=curform.MultipartFormData.getFormData(); curformdat; curformdat=curformdat->nextData()){ for(libhttppp::HttpForm::MultipartForm::Data::ContentDisposition *curctdisp=curformdat->getDisposition(); curformdat; curformdat=curformdat->nextData()){ if (strcmp(curctdisp->getKey(), "blog_title") == 0) { for(libhttppp::HttpForm::MultipartForm::Data::ContentDisposition *curctdisp=curformdat->getDisposition(); curctdisp; curctdisp=curctdisp->nextContentDisposition()){ if (strcmp(curctdisp->getValue(), "blog_title") == 0) { title.append(curformdat->Value.data(),curformdat->Value.size()); }else if(strcmp(curctdisp->getKey(), "blog_descrition") == 0){ }else if(strcmp(curctdisp->getValue(), "blog_descrition") == 0){ descrition.append(curformdat->Value.data(),curformdat->Value.size()); }else if (strcmp(curctdisp->getKey(), "blog_tags") == 0) { }else if (strcmp(curctdisp->getValue(), "blog_tags") == 0) { tags.append(curformdat->Value.data(),curformdat->Value.size()); } else if(strcmp(curctdisp->getKey(),"blog_content")==0){ else if(strcmp(curctdisp->getValue(),"blog_content")==0){ text.append(curformdat->Value.data(),curformdat->Value.size()); } } } size_t content_id = -1; ssize_t content_id = -1; if(!text.empty() && !title.empty() && !descrition.empty()){ Loading Loading @@ -691,7 +691,11 @@ namespace blogi { std::cerr << startpos << std::endl; if (strcmp(curl.c_str(),Args->config->buildurl("content/tag",url,512))>0){ size_t len = strlen(Args->config->buildurl("content/tag/",url,512)); contentIdxPage(req,page,curl.substr(len,curl.length()-len).c_str(),startpos,SITELIMIT); libhttppp::HttpForm dec; std::vector<char> ucurl; dec.urlDecode(curl.c_str()+len,curl.length()-len,ucurl); ucurl.push_back('\0'); contentIdxPage(req,page,ucurl.data(),startpos,SITELIMIT); }else{ contentIdxPage(req,page,nullptr,startpos,SITELIMIT); } Loading plugins/media/backend.h +3 −2 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ *******************************************************************************/ #include <string> #include <vector> #include <hiredis/hiredis.h> Loading @@ -34,14 +35,14 @@ namespace blogi { public: Store(){}; virtual ~Store(){}; virtual void save(const std::string key,const std::string value)=0; virtual void save(const std::string key,const std::vector<char> value)=0; virtual void load(const std::string key,std::string &value) =0; }; class RedisStore : public Store { public: RedisStore(const char *host,int port,const char *password=nullptr); void save(const std::string key,const std::string value) override; void save(const std::string key,const std::vector<char> value) override; void load(const std::string key,std::string &value) override; private: bool reconnect(); Loading plugins/media/media.cpp +82 −64 Original line number Diff line number Diff line Loading @@ -24,7 +24,9 @@ * (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> #include <map> #include <uuid/uuid.h> #include <htmlpp/html.h> Loading Loading @@ -151,38 +153,49 @@ namespace blogi { << "</div>"; } void uploadMedia(int id,libhttppp::HttpForm::MultipartForm::Data *dat,libhttppp::HttpRequest * req, libhtmlpp::HtmlString & setdiv){ void uploadMedia(int id,libhttppp::HttpRequest * req, libhtmlpp::HtmlString & setdiv){ char url[512]; std::string mediafilename,mediafile; std::map<std::vector<char>,std::vector<char>> media; libhttppp::HttpForm form; form.parse(req); if(dat){ for (libhttppp::HttpForm::MultipartForm::Data *curformdat = dat; curformdat; curformdat = curformdat->nextData()) { for (libhttppp::HttpForm::MultipartForm::Data *curformdat = form.MultipartFormData.getFormData(); curformdat; curformdat = curformdat->nextData()) { for(libhttppp::HttpForm::MultipartForm::Data::ContentDisposition* curctdisp = curformdat->getDisposition(); curctdisp; curctdisp=curctdisp->nextContentDisposition()){ if(curctdisp && strcmp(curctdisp->getValue(),"mediafile")==0){ mediafile.append(curformdat->Value.data(),curformdat->Value.size()); }else if(curctdisp && strcmp(curctdisp->getValue(),"mediafilename")==0){ mediafilename.append(curformdat->Value.data(),curformdat->Value.size()); std::vector<char> name; if(strcmp(curctdisp->getKey(),"filename")==0){ std::copy(curctdisp->getValue(),curctdisp->getValue()+strlen(curctdisp->getValue()), std::inserter<std::vector<char>>(name,name.begin())); name.push_back('\0'); media.insert({name,curformdat->Value}); } } } if(!mediafile.empty() && !mediafilename.empty()){ for(const auto& [mediafilename, mediafile] : media){ std::string ext; size_t expos=mediafilename.rfind('.'); size_t expos=std::string::npos; for(size_t im=mediafilename.size()-1; im > 0; --im){ if(mediafilename[im]=='.') expos=im; } if(expos==std::string::npos){ libhttppp::HTTPException excep; excep[libhttppp::HTTPException::Error] << "Upload media Wrong filename!"; throw excep; } if( (++expos) > mediafilename.length()){ if( (++expos) > mediafilename.size()){ libhttppp::HTTPException excep; excep[libhttppp::HTTPException::Error] << "Upload media Wrong filename!"; throw excep; } ext=mediafilename.substr(expos,mediafilename.length()-expos); std::copy(mediafilename.begin()+expos,mediafilename.end(), std::inserter<std::string>(ext,ext.begin())); blogi::SQL sql; blogi::DBResult res; Loading @@ -201,7 +214,12 @@ namespace blogi { sql.clear(); sql << "INSERT INTO media_items (album_id,name) VALUES('" << id << "','"; sql.escaped(mediafilename.substr(0,expos).c_str()) << "') RETURNING id"; std::string pname; std::copy(mediafilename.begin(),mediafilename.begin()+expos, std::inserter<std::string>(pname,pname.begin())); sql << "INSERT INTO media_items (album_id,name) VALUES('" << id << "','"; sql.escaped(pname.c_str()) << "') RETURNING id"; Args->database->exec(&sql,res); sql.clear(); Loading @@ -224,7 +242,6 @@ namespace blogi { _store->save(cfuuid,mediafile); } } blogi::SQL sql,sql2; blogi::DBResult res,res2; Loading Loading @@ -269,23 +286,22 @@ namespace blogi { id=atoi(curdat->getValue()); } libhttppp::HttpForm::MultipartForm::Data *dat=form.MultipartFormData.getFormData(); for (libhttppp::HttpForm::MultipartForm::Data *curformdat = dat; curformdat; curformdat = curformdat->nextData()) { for (libhttppp::HttpForm::MultipartForm::Data *curformdat = form.MultipartFormData.getFormData(); curformdat; curformdat = curformdat->nextData()) { for(libhttppp::HttpForm::MultipartForm::Data::ContentDisposition* curctdisp = curformdat->getDisposition(); curctdisp; curctdisp=curctdisp->nextContentDisposition()){ if(curctdisp && strcmp(curctdisp->getValue(),"albumid")==0){ if(strcmp(curctdisp->getValue(),"albumid")==0){ for(size_t i =0; i<curformdat->Value.size(); ++i){ if(!isdigit(curformdat->Value[i])){ libhttppp::HTTPException excep; excep[libhttppp::HTTPException::Error] << "Wrong formted Pageid!"; excep[libhttppp::HTTPException::Error] << "Wrong formated Pageid!"; throw excep; } } std::string buf; buf.resize(curformdat->Value.size()); std::copy(curformdat->Value.begin(),curformdat->Value.end(),buf.begin()); id=atoi(buf.c_str()); std::vector<char> buf; std::copy(curformdat->Value.begin(),curformdat->Value.end(), std::inserter<std::vector<char>>(buf,buf.begin())); buf.push_back('\0'); id=atoi(buf.data()); } } } Loading @@ -297,7 +313,7 @@ namespace blogi { } setdiv << "<div><span>View media library</span><br>"; uploadMedia(id,dat,req,setdiv); uploadMedia(id,req,setdiv); setdiv << "</div>"; } Loading @@ -324,6 +340,8 @@ namespace blogi { confirmed=true; } std::cout << mid << std::endl; if(strncmp(req->getRequestURL()+strlen(Args->config->buildurl("settings/media/editmediatypes/",url,512)),"delmtype",8)==0){ if(mid>=0){ if(confirmed){ Loading plugins/media/redis.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -52,16 +52,16 @@ blogi::RedisStore::RedisStore(const char *host,int port,const char *password){ } } void blogi::RedisStore::save(const std::string key, const std::string value){ void blogi::RedisStore::save(const std::string key, const std::vector<char> value){ REDISSAVE: redisReply* reply = (redisReply*) redisCommand(_RedisCTX,"SET %s %b",key.c_str(),value.c_str(),value.length()); if (reply && reply->type!=REDIS_REPLY_ERROR) { redisReply* reply = (redisReply*) redisCommand(_RedisCTX,"SET %s %b",key.c_str(),value.data(),value.size()); if (reply && reply->type==REDIS_REPLY_ERROR) { if(reconnect()) goto REDISSAVE; } freeReplyObject(reply); reply = (redisReply*) redisCommand(_RedisCTX, "save"); if (reply && reply->type!=REDIS_REPLY_ERROR) { if (reply && reply->type==REDIS_REPLY_ERROR) { if(reconnect()) goto REDISSAVE; } Loading Loading
CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.18) project(blogi) SET(CMAKE_CXX_FLAGS "-fPIC -Wall") SET(CMAKE_CXX_FLAGS "-fPIC -Wall -std=c++17") list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) Loading
plugins/content/content.cpp +11 −7 Original line number Diff line number Diff line Loading @@ -243,21 +243,21 @@ namespace blogi { if(curform.getBoundary()){ for(libhttppp::HttpForm::MultipartForm::Data *curformdat=curform.MultipartFormData.getFormData(); curformdat; curformdat=curformdat->nextData()){ for(libhttppp::HttpForm::MultipartForm::Data::ContentDisposition *curctdisp=curformdat->getDisposition(); curformdat; curformdat=curformdat->nextData()){ if (strcmp(curctdisp->getKey(), "blog_title") == 0) { for(libhttppp::HttpForm::MultipartForm::Data::ContentDisposition *curctdisp=curformdat->getDisposition(); curctdisp; curctdisp=curctdisp->nextContentDisposition()){ if (strcmp(curctdisp->getValue(), "blog_title") == 0) { title.append(curformdat->Value.data(),curformdat->Value.size()); }else if(strcmp(curctdisp->getKey(), "blog_descrition") == 0){ }else if(strcmp(curctdisp->getValue(), "blog_descrition") == 0){ descrition.append(curformdat->Value.data(),curformdat->Value.size()); }else if (strcmp(curctdisp->getKey(), "blog_tags") == 0) { }else if (strcmp(curctdisp->getValue(), "blog_tags") == 0) { tags.append(curformdat->Value.data(),curformdat->Value.size()); } else if(strcmp(curctdisp->getKey(),"blog_content")==0){ else if(strcmp(curctdisp->getValue(),"blog_content")==0){ text.append(curformdat->Value.data(),curformdat->Value.size()); } } } size_t content_id = -1; ssize_t content_id = -1; if(!text.empty() && !title.empty() && !descrition.empty()){ Loading Loading @@ -691,7 +691,11 @@ namespace blogi { std::cerr << startpos << std::endl; if (strcmp(curl.c_str(),Args->config->buildurl("content/tag",url,512))>0){ size_t len = strlen(Args->config->buildurl("content/tag/",url,512)); contentIdxPage(req,page,curl.substr(len,curl.length()-len).c_str(),startpos,SITELIMIT); libhttppp::HttpForm dec; std::vector<char> ucurl; dec.urlDecode(curl.c_str()+len,curl.length()-len,ucurl); ucurl.push_back('\0'); contentIdxPage(req,page,ucurl.data(),startpos,SITELIMIT); }else{ contentIdxPage(req,page,nullptr,startpos,SITELIMIT); } Loading
plugins/media/backend.h +3 −2 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ *******************************************************************************/ #include <string> #include <vector> #include <hiredis/hiredis.h> Loading @@ -34,14 +35,14 @@ namespace blogi { public: Store(){}; virtual ~Store(){}; virtual void save(const std::string key,const std::string value)=0; virtual void save(const std::string key,const std::vector<char> value)=0; virtual void load(const std::string key,std::string &value) =0; }; class RedisStore : public Store { public: RedisStore(const char *host,int port,const char *password=nullptr); void save(const std::string key,const std::string value) override; void save(const std::string key,const std::vector<char> value) override; void load(const std::string key,std::string &value) override; private: bool reconnect(); Loading
plugins/media/media.cpp +82 −64 Original line number Diff line number Diff line Loading @@ -24,7 +24,9 @@ * (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> #include <map> #include <uuid/uuid.h> #include <htmlpp/html.h> Loading Loading @@ -151,38 +153,49 @@ namespace blogi { << "</div>"; } void uploadMedia(int id,libhttppp::HttpForm::MultipartForm::Data *dat,libhttppp::HttpRequest * req, libhtmlpp::HtmlString & setdiv){ void uploadMedia(int id,libhttppp::HttpRequest * req, libhtmlpp::HtmlString & setdiv){ char url[512]; std::string mediafilename,mediafile; std::map<std::vector<char>,std::vector<char>> media; libhttppp::HttpForm form; form.parse(req); if(dat){ for (libhttppp::HttpForm::MultipartForm::Data *curformdat = dat; curformdat; curformdat = curformdat->nextData()) { for (libhttppp::HttpForm::MultipartForm::Data *curformdat = form.MultipartFormData.getFormData(); curformdat; curformdat = curformdat->nextData()) { for(libhttppp::HttpForm::MultipartForm::Data::ContentDisposition* curctdisp = curformdat->getDisposition(); curctdisp; curctdisp=curctdisp->nextContentDisposition()){ if(curctdisp && strcmp(curctdisp->getValue(),"mediafile")==0){ mediafile.append(curformdat->Value.data(),curformdat->Value.size()); }else if(curctdisp && strcmp(curctdisp->getValue(),"mediafilename")==0){ mediafilename.append(curformdat->Value.data(),curformdat->Value.size()); std::vector<char> name; if(strcmp(curctdisp->getKey(),"filename")==0){ std::copy(curctdisp->getValue(),curctdisp->getValue()+strlen(curctdisp->getValue()), std::inserter<std::vector<char>>(name,name.begin())); name.push_back('\0'); media.insert({name,curformdat->Value}); } } } if(!mediafile.empty() && !mediafilename.empty()){ for(const auto& [mediafilename, mediafile] : media){ std::string ext; size_t expos=mediafilename.rfind('.'); size_t expos=std::string::npos; for(size_t im=mediafilename.size()-1; im > 0; --im){ if(mediafilename[im]=='.') expos=im; } if(expos==std::string::npos){ libhttppp::HTTPException excep; excep[libhttppp::HTTPException::Error] << "Upload media Wrong filename!"; throw excep; } if( (++expos) > mediafilename.length()){ if( (++expos) > mediafilename.size()){ libhttppp::HTTPException excep; excep[libhttppp::HTTPException::Error] << "Upload media Wrong filename!"; throw excep; } ext=mediafilename.substr(expos,mediafilename.length()-expos); std::copy(mediafilename.begin()+expos,mediafilename.end(), std::inserter<std::string>(ext,ext.begin())); blogi::SQL sql; blogi::DBResult res; Loading @@ -201,7 +214,12 @@ namespace blogi { sql.clear(); sql << "INSERT INTO media_items (album_id,name) VALUES('" << id << "','"; sql.escaped(mediafilename.substr(0,expos).c_str()) << "') RETURNING id"; std::string pname; std::copy(mediafilename.begin(),mediafilename.begin()+expos, std::inserter<std::string>(pname,pname.begin())); sql << "INSERT INTO media_items (album_id,name) VALUES('" << id << "','"; sql.escaped(pname.c_str()) << "') RETURNING id"; Args->database->exec(&sql,res); sql.clear(); Loading @@ -224,7 +242,6 @@ namespace blogi { _store->save(cfuuid,mediafile); } } blogi::SQL sql,sql2; blogi::DBResult res,res2; Loading Loading @@ -269,23 +286,22 @@ namespace blogi { id=atoi(curdat->getValue()); } libhttppp::HttpForm::MultipartForm::Data *dat=form.MultipartFormData.getFormData(); for (libhttppp::HttpForm::MultipartForm::Data *curformdat = dat; curformdat; curformdat = curformdat->nextData()) { for (libhttppp::HttpForm::MultipartForm::Data *curformdat = form.MultipartFormData.getFormData(); curformdat; curformdat = curformdat->nextData()) { for(libhttppp::HttpForm::MultipartForm::Data::ContentDisposition* curctdisp = curformdat->getDisposition(); curctdisp; curctdisp=curctdisp->nextContentDisposition()){ if(curctdisp && strcmp(curctdisp->getValue(),"albumid")==0){ if(strcmp(curctdisp->getValue(),"albumid")==0){ for(size_t i =0; i<curformdat->Value.size(); ++i){ if(!isdigit(curformdat->Value[i])){ libhttppp::HTTPException excep; excep[libhttppp::HTTPException::Error] << "Wrong formted Pageid!"; excep[libhttppp::HTTPException::Error] << "Wrong formated Pageid!"; throw excep; } } std::string buf; buf.resize(curformdat->Value.size()); std::copy(curformdat->Value.begin(),curformdat->Value.end(),buf.begin()); id=atoi(buf.c_str()); std::vector<char> buf; std::copy(curformdat->Value.begin(),curformdat->Value.end(), std::inserter<std::vector<char>>(buf,buf.begin())); buf.push_back('\0'); id=atoi(buf.data()); } } } Loading @@ -297,7 +313,7 @@ namespace blogi { } setdiv << "<div><span>View media library</span><br>"; uploadMedia(id,dat,req,setdiv); uploadMedia(id,req,setdiv); setdiv << "</div>"; } Loading @@ -324,6 +340,8 @@ namespace blogi { confirmed=true; } std::cout << mid << std::endl; if(strncmp(req->getRequestURL()+strlen(Args->config->buildurl("settings/media/editmediatypes/",url,512)),"delmtype",8)==0){ if(mid>=0){ if(confirmed){ Loading
plugins/media/redis.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -52,16 +52,16 @@ blogi::RedisStore::RedisStore(const char *host,int port,const char *password){ } } void blogi::RedisStore::save(const std::string key, const std::string value){ void blogi::RedisStore::save(const std::string key, const std::vector<char> value){ REDISSAVE: redisReply* reply = (redisReply*) redisCommand(_RedisCTX,"SET %s %b",key.c_str(),value.c_str(),value.length()); if (reply && reply->type!=REDIS_REPLY_ERROR) { redisReply* reply = (redisReply*) redisCommand(_RedisCTX,"SET %s %b",key.c_str(),value.data(),value.size()); if (reply && reply->type==REDIS_REPLY_ERROR) { if(reconnect()) goto REDISSAVE; } freeReplyObject(reply); reply = (redisReply*) redisCommand(_RedisCTX, "save"); if (reply && reply->type!=REDIS_REPLY_ERROR) { if (reply && reply->type==REDIS_REPLY_ERROR) { if(reconnect()) goto REDISSAVE; } Loading