diff --git a/Makefile b/Makefile index b6164c3..ed8727b 100755 --- a/Makefile +++ b/Makefile @@ -5,9 +5,11 @@ CXX = g++ endif ifndef CXXFLAGS -CXXFLAGS = -fPIC -Wall -pedantic -O2 -I/usr/local/include -I/home/tomek/roboczy/winix -I/home/tomek/roboczy/ezc/src -L/usr/local/lib -DEZC_USE_WINIX_LOGGER +CXXFLAGS = -fPIC -Wall -pedantic -O2 -I/usr/local/include -I/home/tomek/roboczy/winix -I/home/tomek/roboczy/ezc/src -L/usr/local/lib -I/usr/local/include/ImageMagick -DEZC_USE_WINIX_LOGGER endif + + export CXX export CXXFLAGS @@ -26,7 +28,7 @@ winix: FORCE @cd plugins/stats ; $(MAKE) -e @cd plugins/ticket ; $(MAKE) -e @cd ../ezc/src ; $(MAKE) -e - $(CXX) -shared -o winix.so $(CXXFLAGS) core/*.o db/*.o functions/*.o templates/*.o notify/*.o ../ezc/src/ezc.a -lfcgi -lpq -lz -lpthread -lfetch + $(CXX) -shared -o winix.so $(CXXFLAGS) core/*.o db/*.o functions/*.o templates/*.o notify/*.o ../ezc/src/ezc.a -lfcgi -lpq -lz -lpthread -lfetch `MagickWand-config --ldflags --libs` @cd main ; $(MAKE) -e # use the full path with winix.so $(CXX) -o winix $(CXXFLAGS) main/*.o /home/tomek/roboczy/winix/winix.so diff --git a/core/app.cpp b/core/app.cpp index 45f4786..5083e33 100755 --- a/core/app.cpp +++ b/core/app.cpp @@ -7,6 +7,7 @@ * */ +#include "wand/MagickWand.h" #include #include #include @@ -142,17 +143,24 @@ bool App::Init() templates.ReadTemplates(); // init notify after templates (it uses locales from templates) - system.notify.ReadTemplates(); - session_manager.LoadSessions(); + CreateStaticTree(); + MagickWandGenesis(); + plugin.Call(WINIX_PLUGIN_INIT); return true; } +void App::Uninit() +{ + MagickWandTerminus(); +} + + void App::Close() { @@ -165,30 +173,14 @@ void App::Close() bool App::BaseUrlRedirect() { - if( request.role == Request::responder ) - { - if( config.base_url_http_host.empty() ) - return false; - - if( Equal(config.base_url_http_host.c_str(), request.env_http_host) ) - return false; + if( config.base_url_http_host.empty() ) + return false; + + if( Equal(config.base_url_http_host.c_str(), request.env_http_host) ) + return false; - request.redirect_to = config.base_url; - AssignString(request.env_request_uri, request.redirect_to, false); - } - else - { - // authorizer - - if( config.base_url_auth_http_host.empty() ) - return false; - - if( Equal(config.base_url_auth_http_host.c_str(), request.env_http_host) ) - return false; - - request.redirect_to = config.base_url_auth; - AssignString(request.env_request_uri, request.redirect_to, false); - } + request.redirect_to = config.base_url; + AssignString(request.env_request_uri, request.redirect_to, false); log << log3 << "RC: BaseUrlRedirect from: " << request.env_http_host << logend; @@ -294,7 +286,7 @@ bool sent = false; return; - if( request.is_item && request.item.auth == Item::auth_none && + if( request.is_item && request.item.file_type == WINIX_ITEM_FILETYPE_NONE && request.item.content_type == Item::ct_raw && request.status == WINIX_ERR_OK && request.function ) { if( request.function == &functions.fun_cat ) @@ -669,7 +661,7 @@ bool App::CanSendContent(Header header) // if there is a redirect or a file to send then we do not send a content return false; - if( header == h_200 && request.role == Request::authorizer && request.is_item && request.item.auth != Item::auth_none ) + if( header == h_200 && request.role == Request::authorizer && request.is_item && request.item.file_type != WINIX_ITEM_FILETYPE_NONE ) // if there is an item and the item has 'file' storage we do not send a content return false; @@ -1063,3 +1055,21 @@ sigset_t set; +void App::CreateStaticTree() +{ + if( config.upload_dir.empty() ) + { + log << log1 << "App: config: upload_dir not set, you are not allowed to upload static content" << logend; + return; + } + + CreateDirs(L"/", config.upload_dir.c_str(), config.upload_dirs_chmod); + + CreateDirs(config.upload_dir.c_str(), L"simplefs/normal", config.upload_dirs_chmod); + CreateDirs(config.upload_dir.c_str(), L"simplefs/thumb", config.upload_dirs_chmod); + + CreateDirs(config.upload_dir.c_str(), L"hashfs/normal", config.upload_dirs_chmod); + CreateDirs(config.upload_dir.c_str(), L"hashfs/thumb", config.upload_dirs_chmod); + + CreateDirs(config.upload_dir.c_str(), L"tmp", config.upload_dirs_chmod); +} diff --git a/core/app.h b/core/app.h index 8de1cb6..3e9c110 100755 --- a/core/app.h +++ b/core/app.h @@ -49,6 +49,7 @@ public: bool InitFCGI(); bool DropPrivileges(); bool Init(); + void Uninit(); void Start(); void Close(); void LogUserGroups(); @@ -166,6 +167,8 @@ private: static void * SpecialThreadForSignals(void*); void FetchPageOnExit(); + void CreateStaticTree(); + // !! dodac do session managera? time_t last_sessions_save; }; diff --git a/core/config.cpp b/core/config.cpp index fe9fafb..d1f7160 100755 --- a/core/config.cpp +++ b/core/config.cpp @@ -109,10 +109,13 @@ void Config::AssignValues(bool stdout_is_closed) log_db_query = Bool(L"log_db_query", false); log_plugin_call = Bool(L"log_plugin_call", false); - post_file_max = Size(L"post_file_max", 8388608); // 8 MB - auth_simplefs_dir = Text(L"auth_simplefs_dir"); - auth_hashfs_dir = Text(L"auth_hashfs_dir"); - auth_tmp_dir = Text(L"auth_tmp_dir"); + post_file_max = Size(L"post_file_max", 8388608); // 8 MB + upload_dir = Text(L"upload_dir"); + upload_dirs_chmod = Int(L"upload_dirs_chmod", 0750); + upload_files_chmod = Int(L"upload_files_chmod", 0640); + create_thumb = Bool(L"create_thumb", false); // !! will be true + thumb_cx = Size(L"thumb_cx", 150); + thumb_cy = Size(L"thumb_cy", 150); templates_dir = Text(L"templates_dir"); templates_dir_default = Text(L"templates_dir_default"); @@ -131,13 +134,11 @@ void Config::AssignValues(bool stdout_is_closed) base_server = Text(L"base_server"); base_url = Text(L"base_url"); - base_url_auth = Text(L"base_url_auth"); base_url_static = Text(L"base_url_static"); base_url_common = Text(L"base_url_common"); NoLastSlash(base_server); NoLastSlash(base_url); - NoLastSlash(base_url_auth); NoLastSlash(base_url_static); NoLastSlash(base_url_common); @@ -187,7 +188,6 @@ void Config::AssignValues(bool stdout_is_closed) void Config::SetAdditionalVariables() { SetHttpHost(base_url, base_url_http_host); - SetHttpHost(base_url_auth, base_url_auth_http_host); if( html_filter_orphans_lang_str == "pl" ) html_filter_orphans_lang = HTMLFilter::lang_pl; diff --git a/core/config.h b/core/config.h index 2a2de92..067ff0c 100755 --- a/core/config.h +++ b/core/config.h @@ -186,13 +186,28 @@ public: // 0 - not used size_t post_file_max; - // directories for static files - std::wstring auth_simplefs_dir; - std::wstring auth_hashfs_dir; + // directory for static files + std::wstring upload_dir; - // temporary directory for static content used by the upload function - // should be on the same partition as auth_simplefs_dir and auth_hashfs_dir - std::wstring auth_tmp_dir; + // chmod of newly created directories (under upload_dir) + // default: 0750 + int upload_dirs_chmod; + + // chmod of newly created files (under upload_dir) + // default: 0640 + int upload_files_chmod; + + // create a thumbnail from an image + // default: false (!!will be true) + bool create_thumb; + + // width of thumbnails + // default: 150 + size_t thumb_cx; + + // height of thumbnails + // default: 150 + size_t thumb_cy; // locale: en, pl // default: en @@ -210,9 +225,6 @@ public: // the main address of the site (e.g. http://www.someserver.com) std::wstring base_url; - // static content authorized by winix - std::wstring base_url_auth; - // static content not authorized by winix std::wstring base_url_static; @@ -265,7 +277,6 @@ public: // set by SetAdditionalVariables() // without the first part http:// (or https://) or the whole string is empty std::wstring base_url_http_host; - std::wstring base_url_auth_http_host; Config(); diff --git a/core/item.cpp b/core/item.cpp index 4e98e77..7928159 100755 --- a/core/item.cpp +++ b/core/item.cpp @@ -54,10 +54,13 @@ void Item::Clear() content_id = -1; - auth = auth_none; - auth_path.clear(); + file_path.clear(); + file_fs = -1; + file_type = WINIX_ITEM_FILETYPE_NONE; html_template.clear(); SetDateToNow(); } + + diff --git a/core/item.h b/core/item.h index 377b0db..424e848 100755 --- a/core/item.h +++ b/core/item.h @@ -13,6 +13,11 @@ #include +#define WINIX_ITEM_FILETYPE_NONE 0 +#define WINIX_ITEM_FILETYPE_IMAGE 1 +#define WINIX_ITEM_FILETYPE_DOCUMENT 2 +#define WINIX_ITEM_FILETYPE_UNKNOWN 3 + struct Item { @@ -67,17 +72,25 @@ long default_item; // external static file authorized by winix +/* enum Auth { - auth_none = 0, /* there is not an external file */ - auth_image = 1, /* png, gif, jpg - only types available to render by a web browser*/ - auth_document = 2, /* pdf doc xls txt */ - auth_other = 3 /* other file */ + auth_none = 0, // there is not an external file + auth_image = 1, // png, gif, jpg - only types available to render by a web browser + auth_document = 2, // pdf doc xls txt + auth_other = 3 // other file }; Auth auth; std::wstring auth_path; // path to a file (if auth!=auth_none) +*/ + +// static file (if exists) +std::wstring file_path; // relative file path +int file_fs; // file system type where the file was saved +int file_type; // file type (none, image, doc, etc) + std::wstring html_template; diff --git a/core/misc.cpp b/core/misc.cpp index 1c48ea6..14505a5 100755 --- a/core/misc.cpp +++ b/core/misc.cpp @@ -12,6 +12,7 @@ #include "misc.h" #include "log.h" #include "templates/templates.h" +#include "utf8.h" int Toi(const std::string & str, int base) @@ -621,11 +622,12 @@ bool IsFile(const wchar_t * file) struct stat sb; static std::string afile; - AssignString(file, afile); // or it can be UTF-8 used + Ezc::WideToUTF8(file, afile); return (stat(afile.c_str(), &sb) == 0); } + bool IsFile(const std::wstring & file) { return IsFile(file.c_str()); @@ -638,17 +640,11 @@ static std::string adir; if( !IsFile(dir) ) { - AssignString(dir, adir); + Ezc::WideToUTF8(dir, adir); if( mkdir(adir.c_str(), priv) < 0 ) { - log << log1 << "Can't create a directory on fs: " << adir; - - if( !Equal(dir, adir.c_str()) ) - log << " original name was: " << dir; - - log << logend; - + log << log1 << "Can't create a directory on fs: " << adir << logend; return false; } } @@ -666,7 +662,7 @@ bool CreateDir(const std::wstring & dir, int priv) // creating directories (can be more than one) // 'dirs' can begin with a slash (will be skipped) -bool CreateDirs(const wchar_t * base_dir, const wchar_t * dirs, int priv) +bool CreateDirs(const wchar_t * base_dir, const wchar_t * dirs, int priv, bool skip_last) { static std::wstring temp; const wchar_t * p = dirs; @@ -688,11 +684,12 @@ const wchar_t * p = dirs; break; // taking the name - for( ; *p && *p!='/' ; ++p ) + for( ; *p!=0 && *p!='/' ; ++p ) temp += *p; - if( !CreateDir(temp.c_str(), priv) ) - return false; + if( !skip_last || *p!=0 ) + if( !CreateDir(temp.c_str(), priv) ) + return false; temp += '/'; } @@ -702,9 +699,9 @@ return true; -bool CreateDirs(const std::wstring & base_dir, const std::wstring & dirs, int priv) +bool CreateDirs(const std::wstring & base_dir, const std::wstring & dirs, int priv, bool skip_last) { - return CreateDirs(base_dir.c_str(), dirs.c_str(), priv); + return CreateDirs(base_dir.c_str(), dirs.c_str(), priv, skip_last); } @@ -736,8 +733,8 @@ bool CopyFile(const wchar_t * src, const wchar_t * dst) static std::string asrc, adst; FILE * in, * out; - AssignString(src, asrc); - AssignString(dst, adst); + Ezc::WideToUTF8(src, asrc); + Ezc::WideToUTF8(dst, adst); in = fopen(asrc.c_str(), "rb"); @@ -778,7 +775,7 @@ bool RemoveFile(const wchar_t * file) { static std::string afile; - AssignString(file, afile); + Ezc::WideToUTF8(file, afile); return unlink(afile.c_str()) == 0; } @@ -795,8 +792,8 @@ bool RenameFile(const wchar_t * from, const wchar_t * to) { static std::string afrom, ato; - AssignString(from, afrom); - AssignString(to, ato); + Ezc::WideToUTF8(from, afrom); + Ezc::WideToUTF8(to, ato); return rename(afrom.c_str(), ato.c_str()) == 0; } @@ -835,7 +832,7 @@ return name + i + 1; } -Item::Auth SelectFileType(const wchar_t * file_name) +int SelectFileType(const wchar_t * file_name) { const wchar_t * ext = GetFileExt(file_name); @@ -849,7 +846,7 @@ Item::Auth SelectFileType(const wchar_t * file_name) EqualNoCase(ext, L"gif") || EqualNoCase(ext, L"bmp") || EqualNoCase(ext, L"png") ) - return Item::auth_image; + return WINIX_ITEM_FILETYPE_IMAGE; if( EqualNoCase(ext, L"pdf") || EqualNoCase(ext, L"doc") || @@ -857,9 +854,9 @@ Item::Auth SelectFileType(const wchar_t * file_name) EqualNoCase(ext, L"txt") || EqualNoCase(ext, L"ods") || EqualNoCase(ext, L"odt") ) - return Item::auth_document; + return WINIX_ITEM_FILETYPE_DOCUMENT; -return Item::auth_other; +return WINIX_ITEM_FILETYPE_UNKNOWN; } diff --git a/core/misc.h b/core/misc.h index 9a258c1..16ded02 100755 --- a/core/misc.h +++ b/core/misc.h @@ -397,8 +397,11 @@ bool IsFile(const wchar_t * file); bool IsFile(const std::wstring & file); bool CreateDir(const wchar_t * dir, int priv); bool CreateDir(const std::wstring & dir, int priv); -bool CreateDirs(const wchar_t * base_dir, const wchar_t * dirs, int priv); -bool CreateDirs(const std::wstring & base_dir, const std::wstring & dirs, int priv); + +// creating directories (dirs) under base_dir (base_dir must exist) +// if skip_last == true then last part from dir is treated as a file (the last directory is not created) +bool CreateDirs(const wchar_t * base_dir, const wchar_t * dirs, int priv = 0755, bool skip_last = false); +bool CreateDirs(const std::wstring & base_dir, const std::wstring & dirs, int priv = 0755, bool skip_last = false); bool CopyFile(FILE * in, FILE * out); bool CopyFile(const wchar_t * src, const wchar_t * dst); @@ -411,7 +414,7 @@ bool RenameFile(const wchar_t * from, const wchar_t * to); bool RenameFile(const std::wstring & from, const std::wstring & to); const wchar_t * GetFileExt(const wchar_t * name); -Item::Auth SelectFileType(const wchar_t * file_name); +int SelectFileType(const wchar_t * file_name); time_t Time(const tm & par); time_t Time(const tm * par); diff --git a/core/postmultiparser.cpp b/core/postmultiparser.cpp index 007b318..265b090 100755 --- a/core/postmultiparser.cpp +++ b/core/postmultiparser.cpp @@ -476,29 +476,30 @@ void PostMultiParser::CreateTmpFile() wchar_t buf[1024]; size_t buf_len = sizeof(buf)/sizeof(wchar_t); - if( config->auth_tmp_dir.empty() ) + if( config->upload_dir.empty() ) { - log << log1 << "PMP: auth_tmp_dir is not set in the config" << logend; + log << log1 << "PMP: upload_dir is not set in the config" << logend; err = WINIX_ERR_CANT_CREATE_FILE; return; } - swprintf(buf, buf_len, L"%ls/winix_%u_%d_%u", config->auth_tmp_dir.c_str(), (unsigned)getpid(), tmp_filename_postfix, rand()); + swprintf(buf, buf_len, L"%ls/tmp/winix_%u_%d_%u", config->upload_dir.c_str(), (unsigned)getpid(), tmp_filename_postfix, rand()); tmp_filename_postfix += 1; - AssignString(buf, atmp_filename); - AssignString(atmp_filename, tmp_filename); // this make sure that the names are exactly the same + tmp_filename = buf; + Ezc::WideToUTF8(tmp_filename, atmp_filename); tmp_file.open(atmp_filename.c_str(), std::ios_base::binary | std::ios_base::out); + // !! dodac ustawienie chmod config.upload_files_chmod dla tymczasowego pliku if( !tmp_file ) { - log << log1 << "PMP: can't create a temporary file: " << tmp_filename << logend; + log << log1 << "PMP: can't create a temporary file: " << atmp_filename << logend; err = WINIX_ERR_CANT_CREATE_FILE; return; } - log << log3 << "PMP: using temporary file for the content: " << tmp_filename << logend; + log << log3 << "PMP: using temporary file for the content: " << atmp_filename << logend; } diff --git a/core/system.cpp b/core/system.cpp index 21466e2..d0e97cd 100755 --- a/core/system.cpp +++ b/core/system.cpp @@ -392,31 +392,30 @@ return puser->IsMemberOf(group); - -bool System::MakePathSimpleFs(std::wstring & path, long dir_id, bool create_dir) +// the path depends on parent_id +bool System::CreateNewFileSimpleFs(Item & item) { - if( config->auth_simplefs_dir.empty() ) + bool res = dirs.MakePath(item.parent_id, item.file_path); + + if( res ) { - log << log1 << "System: auth_simplefs_dir is not set in the config file" << logend; - return false; + if( !item.file_path.empty() && item.file_path[0] == '/' ) + item.file_path.erase(0, 1); + } + else + { + log << log1 << "System: CreateNewFileSimpleFs: can't create a path to item.id: " << item.id + << ", item.parent_id: " << item.parent_id << logend; } - if( !dirs.MakePath(dir_id, path) ) - return false; - - if( create_dir && !CreateDirs(config->auth_simplefs_dir, path, 0755) ) - return false; - - path.insert(0, config->auth_simplefs_dir); - -return true; +return res; } // the path depends on id -bool System::MakePathHashFs(std::wstring & path, long id, bool create_dir) +bool System::CreateNewFileHashFs(Item & item) { wchar_t buffer[50]; wchar_t * hash = buffer; @@ -424,79 +423,112 @@ size_t buffer_len = sizeof(buffer)/sizeof(wchar_t); // get 'id' as hexadecimal buffer[0] = '0'; - swprintf(buffer+1, buffer_len, L"%lx", (unsigned long)id); + swprintf(buffer+1, buffer_len, L"%lx", (unsigned long)item.id); - path = config->auth_hashfs_dir; - - if( path.empty() ) - { - log << log1 << "System: auth_hashfs_dir is not set in the config file" << logend; - return false; - } - - path += '/'; + item.file_path.clear(); // make sure that the length is even if( (wcslen(hash) & 1) != 0 ) hash = buffer + 1; // the first character was zero - // creating dirs without the last part - // the last part is a part of a file for(size_t i=0 ; hash[i] != 0 ; i+=2) { - path += hash[i]; - path += hash[i+1]; + item.file_path += hash[i]; + item.file_path += hash[i+1]; if( hash[i+2] != 0 ) - { - if( create_dir && !CreateDir(path, 0755) ) - return false; - - path += '/'; - } + item.file_path += '/'; } // one character more to make sure the path is unique // (we can have a directory without the character) - path += '_'; + item.file_path += '_'; return true; } -// making a complete path to a static file -bool System::MakePath(const Item & item, std::wstring & path, bool create_dir) + +// creating item.file_path and item.file_fs +// you should set file_type yourself +// this method uses: item.id, item.url, item.parent_id (for selecting a mountpoint) +bool System::CreateNewFile(Item & item) { bool res; + if( item.type != Item::file ) + { + log << log1 << "System: CreateNewFile: the item should be a file" << logend; + return false; + } + Mount * pmount = mounts.CalcMount(item.parent_id); - if( !pmount || pmount->fs == mounts.MountFsSimplefs() ) + if( !pmount || pmount->fs != mounts.MountFsHashfs() ) { - res = MakePathSimpleFs(path, item.parent_id, create_dir); + res = CreateNewFileSimpleFs(item); + item.file_fs = mounts.MountFsSimplefs(); } else { - res = MakePathHashFs(path, item.id, create_dir); + res = CreateNewFileHashFs(item); + item.file_fs = mounts.MountFsHashfs(); } if( res ) - path += item.url; + item.file_path += item.url; else - path.clear(); + item.file_path.clear(); return res; } - -bool System::MakePath(Item & item, bool create_dir) +// making a global file path +// you should call CreateNewFile before +bool System::MakeFilePath(const Item & item, std::wstring & path, bool thumb, bool create_dir, int chmod) { - return MakePath(item, item.auth_path, create_dir); + path.clear(); + + if( config->upload_dir.empty() ) + { + log << log1 << "System: MakePath: upload_dir is not set in the config file" << logend; + return false; + } + + if( item.file_path.empty() || item.file_type == WINIX_ITEM_FILETYPE_NONE ) + { + log << log1 << "System: MakePath: this item has not a static file" << logend; + return false; + } + + path = config->upload_dir; + + if( item.file_fs == mounts.MountFsHashfs() ) + path += L"/hashfs"; + else + path += L"/simplefs"; + + + if( thumb ) + path += L"/thumb"; + else + path += L"/normal"; + + + if( create_dir && !CreateDirs(path, item.file_path, chmod, true) ) + return false; + + path += '/'; + path += item.file_path; + +return true; } + + Error System::AddFile(Item & item, int notify_code) { if( item.type == Item::dir ) diff --git a/core/system.h b/core/system.h index 8a30525..1402c4d 100755 --- a/core/system.h +++ b/core/system.h @@ -85,8 +85,9 @@ public: bool IsMemberOfGroup(long user_id, const wchar_t * group_name); - bool MakePath(const Item & item, std::wstring & path, bool create_dir); - bool MakePath(Item & item, bool create_dir); // output path is: item.auth_path + // creating item.file_path and item.file_fs (the mountpoint where the item is located) + bool CreateNewFile(Item & item); + bool MakeFilePath(const Item & item, std::wstring & path, bool thumb = false, bool create_dir = false, int chmod = 0755); Error AddFile(Item & item, int notify_code = 0); Error EditFile(Item & item, bool with_url = true, int notify_code = 0); @@ -105,8 +106,8 @@ private: Synchro * synchro; std::wstring path; - bool MakePathSimpleFs(std::wstring & path, long dir_id, bool create_dir); - bool MakePathHashFs(std::wstring & path, long id, bool create_dir); + bool CreateNewFileSimpleFs(Item & item); + bool CreateNewFileHashFs(Item & item); }; diff --git a/db/db.cpp b/db/db.cpp index 854a7f1..b6d7662 100755 --- a/db/db.cpp +++ b/db/db.cpp @@ -239,7 +239,7 @@ Error Db::AddItemIntoItem(Item & item) { query.Clear(); query << R("insert into core.item (user_id, modification_user_id, group_id, privileges, " - "date_creation, date_modification, type, parent_id, content_id, auth, auth_path, " + "date_creation, date_modification, type, parent_id, content_id, file_path, file_fs, file_type, " "default_item, subject, guest_name, template, url) values (") << item.user_id << item.modification_user_id @@ -250,8 +250,9 @@ Error Db::AddItemIntoItem(Item & item) << static_cast(item.type) << item.parent_id << item.content_id - << static_cast(item.auth) - << item.auth_path + << item.file_path + << item.file_fs + << item.file_type << item.default_item << item.subject << item.guest_name @@ -346,7 +347,7 @@ Error Db::EditItemInItem(Item & item, bool with_url) query.Clear(); query << R("update core.item set (user_id, modification_user_id, group_id, privileges, " "date_creation, date_modification, type, default_item, parent_id, subject, " - "guest_name, auth, auth_path, template"); + "guest_name, file_path, file_fs, file_type, template"); if( with_url ) query << R(", url"); @@ -363,8 +364,9 @@ Error Db::EditItemInItem(Item & item, bool with_url) << item.parent_id << item.subject << item.guest_name - << static_cast(item.auth) - << item.auth_path + << item.file_path + << item.file_fs + << item.file_type << item.html_template; if( with_url ) @@ -626,7 +628,7 @@ PGresult * Db::GetItemsQuery(const DbItemQuery & iq, bool skip_other_sel) if( iq.sel_url ) query << R(" ,url"); if( iq.sel_type ) query << R(" ,type"); if( iq.sel_default_item ) query << R(" ,default_item"); - if( iq.sel_auth ) query << R(" ,auth, auth_path"); + if( iq.sel_file ) query << R(" ,file_path, file_fs, file_type"); if( iq.sel_html_template ) query << R(" ,template"); } @@ -635,7 +637,7 @@ PGresult * Db::GetItemsQuery(const DbItemQuery & iq, bool skip_other_sel) if( iq.sel_content ) query << R(" left join core.content on item.content_id = content.id"); - if( iq.where_id || iq.where_parent_id || iq.where_type || iq.where_auth ) + if( iq.where_id || iq.where_parent_id || iq.where_type || iq.where_file_type ) { query << R(" where "); const char * add_and = " and "; @@ -645,16 +647,16 @@ PGresult * Db::GetItemsQuery(const DbItemQuery & iq, bool skip_other_sel) if( iq.where_parent_id ){ query << R(if_and) << R("parent_id=") << iq.parent_id ; if_and = add_and; } if( iq.where_type ) { query << R(if_and) << R("type=") << int(iq.type) ; if_and = add_and; } - if( iq.where_auth ) + if( iq.where_file_type ) { - query << R(if_and) << R("auth"); + query << R(if_and) << R("file_type"); - if( iq.auth_equal ) + if( iq.file_type_equal ) query << R("="); else query << R("!="); - query << static_cast(iq.auth); + query << iq.file_type; if_and = add_and; } } @@ -1038,7 +1040,7 @@ return result; -Error Db::EditAuthById(Item & item, long id) +Error Db::EditFileById(Item & item, long id) { PGresult * r = 0; Error result = WINIX_ERR_OK; @@ -1046,12 +1048,11 @@ Error Db::EditAuthById(Item & item, long id) try { query.Clear(); - query << R("update core.item set (auth, auth_path) = (") - << static_cast(item.auth) - << item.auth_path - << R(") where id=") - << id - << R(";"); + query << R("update core.item set (file_path, file_fs, file_type) = (") + << item.file_path + << item.file_fs + << item.file_type + << R(") where id=") << id << R(";"); r = AssertQuery(query); AssertResult(r, PGRES_COMMAND_OK); @@ -1142,8 +1143,8 @@ return result; bool Db::DelItemDelItem(const Item & item) { - long rows = 0; - PGresult * r = 0; + long affected = 0; + PGresult * r = 0; try { @@ -1155,7 +1156,7 @@ bool Db::DelItemDelItem(const Item & item) r = AssertQuery(query); AssertResult(r, PGRES_COMMAND_OK); - long affected = AffectedRows(r); + affected = AffectedRows(r); if( affected > 1 ) log << log1 << "Db: more than one item were deleted" << logend; @@ -1169,7 +1170,7 @@ bool Db::DelItemDelItem(const Item & item) ClearResult(r); -return rows != 0; +return affected != 0; } @@ -1240,9 +1241,9 @@ return result; bool Db::DelItem(const Item & item) { long contents; - + Error result = DelItemCountContents(item, contents); - + if( result == WINIX_ERR_OK && contents == 1 ) DelItemDelContent(item); diff --git a/db/db.h b/db/db.h index 74e79b8..15b1244 100755 --- a/db/db.h +++ b/db/db.h @@ -63,7 +63,7 @@ public: bool GetPriv(Item & item, long id); Error EditPrivById(Item & item, long id); Error EditParentUrlById(Item & item, long id); - Error EditAuthById(Item & item, long id); + Error EditFileById(Item & item, long id); // file_path, file_fs, file_type Error DelDirById(long id); Error EditSubjectById(Item & item, long id); diff --git a/db/dbitemcolumns.cpp b/db/dbitemcolumns.cpp index 1ab8133..7e50ede 100755 --- a/db/dbitemcolumns.cpp +++ b/db/dbitemcolumns.cpp @@ -30,10 +30,11 @@ void DbItemColumns::SetColumns(PGresult * r) content = PQfnumber(r, "content"); content_type = PQfnumber(r, "content_type"); guest_name = PQfnumber(r, "guest_name"); - auth = PQfnumber(r, "auth"); - auth_path = PQfnumber(r, "auth_path"); html_template = PQfnumber(r, "template"); modification_user_id = PQfnumber(r, "modification_user_id"); + file_path = PQfnumber(r, "file_path"); + file_fs = PQfnumber(r, "file_fs"); + file_type = PQfnumber(r, "file_type"); } @@ -55,10 +56,11 @@ void DbItemColumns::SetItem(PGresult * r, long row, Item & item) if( content != -1 ) item.content = DbBase::AssertValueWide(r, row, content); if( content_type != -1 ) item.content_type = static_cast( DbBase::AssertValueInt(r, row, content_type) ); if( guest_name != -1 ) item.guest_name = DbBase::AssertValueWide(r, row, guest_name); - if( auth != -1 ) item.auth = static_cast( DbBase::AssertValueInt(r, row, auth) ); - if( auth_path != -1 ) item.auth_path = DbBase::AssertValueWide(r, row, auth_path); if( html_template != -1 ) item.html_template = DbBase::AssertValueWide(r, row, html_template); if( modification_user_id != -1 ) item.modification_user_id = DbBase::AssertValueLong(r, row, modification_user_id); + if( file_path != -1 ) item.file_path = DbBase::AssertValueWide(r, row, file_path); + if( file_fs != -1 ) item.file_fs = DbBase::AssertValueInt(r, row, file_fs); + if( file_type != -1 ) item.file_type = DbBase::AssertValueInt(r, row, file_type); } diff --git a/db/dbitemcolumns.h b/db/dbitemcolumns.h index 4de1b06..659f70f 100755 --- a/db/dbitemcolumns.h +++ b/db/dbitemcolumns.h @@ -34,11 +34,12 @@ struct DbItemColumns int content; int content_type; int guest_name; - int auth; - int auth_path; int modification_user_id; int html_template; - + int file_path; + int file_fs; + int file_type; + void SetColumns(PGresult * r); void SetItem(PGresult * r, long row, Item & item); }; diff --git a/db/dbitemquery.cpp b/db/dbitemquery.cpp index 620ec33..ab6ead9 100755 --- a/db/dbitemquery.cpp +++ b/db/dbitemquery.cpp @@ -14,15 +14,15 @@ DbItemQuery::DbItemQuery() { - sort_asc = true; - auth_equal = true; + sort_asc = true; + file_type_equal = true; SetAll(true, false); id = -1; parent_id = -1; type = Item::none; - auth = Item::auth_none; + file_type = WINIX_ITEM_FILETYPE_NONE; limit = 0; // limit and offset not used by default offset = 0; @@ -43,7 +43,7 @@ void DbItemQuery::SetAllSel(bool sel) sel_url = sel; sel_type = sel; sel_default_item = sel; - sel_auth = sel; + sel_file = sel; sel_html_template = sel; } @@ -54,7 +54,7 @@ void DbItemQuery::SetAllWhere(bool where_) where_id = where_; where_parent_id = where_; where_type = where_; - where_auth = where_; + where_file_type = where_; } @@ -91,11 +91,11 @@ void DbItemQuery::WhereType(Item::Type type_) -void DbItemQuery::WhereAuth(Item::Auth st, bool equal) +void DbItemQuery::WhereFileType(int file_t, bool equal) { - where_auth = true; - auth = st; - auth_equal = equal; + where_file_type = true; + file_type = file_t; + file_type_equal = equal; } diff --git a/db/dbitemquery.h b/db/dbitemquery.h index 71c079c..98f8ac1 100755 --- a/db/dbitemquery.h +++ b/db/dbitemquery.h @@ -30,19 +30,19 @@ struct DbItemQuery bool sel_url; // url bool sel_type; // type (dir, file, none) bool sel_default_item; // default_item - bool sel_auth; // auth, auth_path + bool sel_file; // file_path, file_fs, file_type bool sel_html_template; // template bool where_id; // bool where_parent_id; // bool where_type; - bool where_auth; + bool where_file_type; long id; // if where_id is true long parent_id; // if where_parent_id is true Item::Type type; - Item::Auth auth; - bool auth_equal; // if true means auth should be equal + int file_type; + bool file_type_equal; // if true means file_type should be equal bool sort_asc; long limit; @@ -57,7 +57,7 @@ struct DbItemQuery void WhereId(long id_); void WhereParentId(long parent_id_); void WhereType(Item::Type type_); - void WhereAuth(Item::Auth st, bool equal = true); + void WhereFileType(int file_t, bool equal = true); void Limit(long l); // setting 0 turns off void Offset(long o); // setting 0 turns off diff --git a/functions/cp.cpp b/functions/cp.cpp index f14e67e..407eb4c 100755 --- a/functions/cp.cpp +++ b/functions/cp.cpp @@ -79,24 +79,26 @@ return res == 0; } - -void Cp::CpAuth(Item & item) +void Cp::CpStaticFile(Item & item) { - if( !system->MakePath(item, mv_new_path, true) ) + bool res1 = system->MakeFilePath(item, old_path); + bool res2 = system->CreateNewFile(item); + bool res3 = system->MakeFilePath(item, mv_new_path, false, true, config->upload_dirs_chmod); + + if( !res1 || !res2 || !res3 ) { request->status = WINIX_ERR_PERMISSION_DENIED; return; } - if( CopyFile(item.auth_path, mv_new_path) ) + if( CopyFile(old_path, mv_new_path) ) { - log << log1 << "Content: copied static file from: " << item.auth_path << ", to: " << mv_new_path << logend; - item.auth_path = mv_new_path; - request->status = db->EditAuthById(item, item.id); + log << log1 << "Cp: copied static file from: " << old_path << ", to: " << mv_new_path << logend; + request->status = db->EditFileById(item, item.id); } else { - log << log1 << "Content: can't copy a file from: " << item.auth_path << ", to: " << mv_new_path << logend; + log << log1 << "Cp: can't copy a file from: " << old_path << ", to: " << mv_new_path << logend; request->status = WINIX_ERR_PERMISSION_DENIED; } } @@ -124,8 +126,8 @@ void Cp::CpItem(Item & item, long dst_dir_id) if( request->status == WINIX_ERR_OK ) { - if( item.auth != Item::auth_none ) - CpAuth(item); + if( item.file_type != WINIX_ITEM_FILETYPE_NONE ) + CpStaticFile(item); } } diff --git a/functions/cp.h b/functions/cp.h index 25f806a..96a105b 100755 --- a/functions/cp.h +++ b/functions/cp.h @@ -38,12 +38,13 @@ private: std::wstring mv_dir; std::wstring mv_file; std::wstring mv_new_path; + std::wstring old_path; long mv_dir_id; bool CpCheckAccessFrom(); bool CheckAccessTo(long dir_id); bool ParseDir(long & dir_id, std::wstring & dir, std::wstring & file); - void CpAuth(Item & item); + void CpStaticFile(Item & item); void CpSetNewAttributes(Item & item); void CpItem(Item & item, long dst_dir_id); void CpPrepare(); diff --git a/functions/default.cpp b/functions/default.cpp index 47fca56..a5fcb3c 100755 --- a/functions/default.cpp +++ b/functions/default.cpp @@ -80,10 +80,18 @@ void Default::MakePost() try { long defaultid = PostFunDefaultParsePath(); - request->status = db->EditDefaultItem(request->dir_tab.back()->id, defaultid); + + if( defaultid != request->dir_tab.back()->id ) + { + request->status = db->EditDefaultItem(request->dir_tab.back()->id, defaultid); - if( request->status == WINIX_ERR_OK ) - request->dir_tab.back()->default_item = defaultid; + if( request->status == WINIX_ERR_OK ) + request->dir_tab.back()->default_item = defaultid; + } + else + { + log << "Default: skipping the same directory" << logend; + } } catch(const Error & e) { diff --git a/functions/download.cpp b/functions/download.cpp index 752db12..e16d693 100755 --- a/functions/download.cpp +++ b/functions/download.cpp @@ -32,16 +32,20 @@ void Download::MakeGet() } - if( !system->HasReadAccess(request->item) || - request->item.auth == Item::auth_none || - request->item.auth_path.empty() ) + if( !system->HasReadAccess(request->item) || + request->item.file_type == WINIX_ITEM_FILETYPE_NONE || + request->item.file_path.empty() ) { request->status = WINIX_ERR_PERMISSION_DENIED; return; } request->send_as_attachment = request->IsParam(L"attachment"); - request->x_sendfile = request->item.auth_path; + + if( request->item.file_type == WINIX_ITEM_FILETYPE_IMAGE && config->create_thumb && request->IsParam(L"thumb") ) + system->MakeFilePath(request->item, request->x_sendfile, true); + else + system->MakeFilePath(request->item, request->x_sendfile); } diff --git a/functions/functionparser.cpp b/functions/functionparser.cpp index 648f170..a61cb9b 100755 --- a/functions/functionparser.cpp +++ b/functions/functionparser.cpp @@ -81,7 +81,7 @@ void FunctionParser::ParseItem() { request->last_item = &request->item; - if( request->role == Request::authorizer && request->item.auth == Item::auth_none ) + if( request->role == Request::authorizer && request->item.file_type == WINIX_ITEM_FILETYPE_NONE ) { log << log1 << "FP: item.url: " << url << " exists but has not a static content (authorizer role)" << logend; request->status = WINIX_ERR_NO_ITEM; diff --git a/functions/functions.cpp b/functions/functions.cpp index 2ff4fa8..601b661 100755 --- a/functions/functions.cpp +++ b/functions/functions.cpp @@ -232,7 +232,7 @@ void Functions::Parse() void Functions::SetDefaultFunctionForFile() { - if( request->item.auth != Item::auth_none ) + if( request->item.file_type != WINIX_ITEM_FILETYPE_NONE ) request->function = &fun_download; else if( system->HasReadExecAccess(request->item) ) diff --git a/functions/funthread.cpp b/functions/funthread.cpp index 993dff5..680debf 100755 --- a/functions/funthread.cpp +++ b/functions/funthread.cpp @@ -71,7 +71,7 @@ void FunThread::MakeGet() iq.WhereParentId(request->dir_tab.back()->id); iq.WhereType(Item::file); - iq.WhereAuth(Item::auth_none); + iq.WhereFileType(WINIX_ITEM_FILETYPE_NONE); db->GetItems(request->item_tab, iq); db->GetThreads(request->dir_tab.back()->id, thread_tab); diff --git a/functions/ls.cpp b/functions/ls.cpp index b5a29c6..84b2c1d 100755 --- a/functions/ls.cpp +++ b/functions/ls.cpp @@ -34,7 +34,7 @@ void Ls::MakeGet() if( request->IsParam(L"ckeditor_browse") ) { - iq.WhereAuth(Item::auth_image); + iq.WhereFileType(WINIX_ITEM_FILETYPE_IMAGE); db->GetItems(request->item_tab, iq); } else diff --git a/functions/mv.cpp b/functions/mv.cpp index 9a59282..341efac 100755 --- a/functions/mv.cpp +++ b/functions/mv.cpp @@ -146,28 +146,26 @@ return res == 0; -void Mv::MoveAuth(Item & item) +void Mv::MoveStaticFile(Item & item) { - if( !system->MakePath(item, mv_new_path, true) ) + bool res1 = system->MakeFilePath(item, old_path); + bool res2 = system->CreateNewFile(item); + bool res3 = system->MakeFilePath(item, mv_new_path, false, true, config->upload_dirs_chmod); + + if( !res1 || !res2 || !res3 ) { request->status = WINIX_ERR_PERMISSION_DENIED; return; } - if( RenameFile(item.auth_path, mv_new_path) ) + if( RenameFile(old_path, mv_new_path) ) { - log << log1 << "Mv: moved static file from: " << item.auth_path << ", to: " << mv_new_path << logend; - item.auth_path = mv_new_path; - request->status = db->EditAuthById(item, item.id); + log << log1 << "Mv: moved static file from: " << old_path << ", to: " << mv_new_path << logend; + request->status = db->EditFileById(item, item.id); } else { - int err = errno; - - log << log1 << "Mv: can't move a file from: " << item.auth_path << ", to: " << mv_new_path << ", "; - log.SystemErr(err); - log << logend; - + log << log1 << "Mv: can't move a file from: " << old_path << ", to: " << mv_new_path << logend; request->status = WINIX_ERR_PERMISSION_DENIED; } } @@ -210,8 +208,8 @@ void Mv::MoveFile(Item & item, bool redirect) { log << log2 << "Mv: the file was moved to: " << mv_dir << item.url << logend; - if( item.auth != Item::auth_none ) - MoveAuth(item); + if( item.file_type != WINIX_ITEM_FILETYPE_NONE ) + MoveStaticFile(item); if( redirect ) system->RedirectTo(item); @@ -227,7 +225,7 @@ DbItemQuery iq; iq.sel_parent_id = true; iq.sel_type = true; iq.sel_url = true; - iq.sel_auth = true; + iq.sel_file = true; iq.WhereParentId(request->dir_tab.back()->id); db->GetItems(request->item_tab, iq); @@ -252,10 +250,10 @@ void Mv::MoveAuthPrepareQuery() mv_auth_iq.sel_parent_id = true; mv_auth_iq.sel_type = true; mv_auth_iq.sel_url = true; - mv_auth_iq.sel_auth = true; + mv_auth_iq.sel_file = true; mv_auth_iq.WhereType(Item::file); - mv_auth_iq.WhereAuth(Item::auth_none, false); + mv_auth_iq.WhereFileType(WINIX_ITEM_FILETYPE_NONE, false); } @@ -274,7 +272,7 @@ void Mv::MoveAuthContentOfDir(const Item & item) db->GetItems(mv_auth, mv_auth_iq); for(size_t i=0 ; i mv_auth; DbItemQuery mv_auth_iq; @@ -40,7 +41,7 @@ private: bool MoveCheckAccessTo(long dir_id); bool MoveCheckMountPoints(long dir_id); bool MoveParseDir(long & dir_id, std::wstring & dir, std::wstring & file); - void MoveAuth(Item & item); + void MoveStaticFile(Item & item); bool MoveIsTheSameFile(const Item & item); void MoveFile(Item & item, bool redirect = true); void MoveContentOfDir(); diff --git a/functions/rm.cpp b/functions/rm.cpp index 29048e6..c299c25 100755 --- a/functions/rm.cpp +++ b/functions/rm.cpp @@ -78,10 +78,10 @@ void Rm::RemoveAuthPrepareQuery() rm_auth_iq.sel_parent_id = true; rm_auth_iq.sel_type = true; - rm_auth_iq.sel_auth = true; + rm_auth_iq.sel_file = true; rm_auth_iq.WhereType(Item::file); - rm_auth_iq.WhereAuth(Item::auth_none, false); + rm_auth_iq.WhereFileType(WINIX_ITEM_FILETYPE_NONE, false); } @@ -104,15 +104,12 @@ void Rm::RemoveAllDirs(long dir_id) db->GetItems(request->item_tab, rm_auth_iq); for(size_t i=0 ; iitem_tab.size() ; ++i) - RemoveAuth(request->item_tab[i]); + RemoveStaticFile(request->item_tab[i]); if( db->DelDirById(dir_id) == WINIX_ERR_OK ) { system->dirs.DelDir(dir_id); - db->RemoveThread(dir_id); -// !! tticket -// db->RemoveTicket(dir_id); plugin.Call(WINIX_DIR_REMOVED, dir_id); } @@ -160,29 +157,27 @@ void Rm::RemoveDir() -void Rm::RemoveAuth(Item & item) +void Rm::RemoveStaticFile(Item & item) { - if( item.auth_path.empty() ) + if( item.file_path.empty() ) { - log << log1 << "Content: can't remove a static file: auth_path is empty" << logend; + log << log1 << "Rm: can't remove a static file: file_path is empty" << logend; return; } - if( ::RemoveFile(item.auth_path) ) + if( !system->MakeFilePath(item, path) ) + return; + + if( ::RemoveFile(path) ) { - log << log1 << "Content: removed static file: " << item.auth_path << logend; - item.auth_path.clear(); - item.auth = Item::auth_none; + log << log1 << "Rm: removed static file: " << path << logend; + item.file_path.clear(); + item.file_type = WINIX_ITEM_FILETYPE_NONE; // we don't store it to db (will be removed or is removed already) } else { - int err = errno; - - log << log1 << "Content: can't remove a file: " << item.auth_path; - log.SystemErr(err); - log << logend; - + log << log1 << "Rm: can't remove a file: " << path << logend; request->status = WINIX_ERR_PERMISSION_DENIED; } } @@ -198,26 +193,19 @@ void Rm::RemoveFile() request->status = WINIX_ERR_UNKNOWN_PARAM; return; } - if( db->DelItem( request->item ) ) { - log << log2 << "Content: deleted item: subject: " << request->item.subject << ", id: " << request->item.id << logend; + log << log2 << "Rm: deleted item: subject: " << request->item.subject << ", id: " << request->item.id << logend; TemplatesFunctions::pattern_cacher.DeletePattern(request->item); plugin.Call(WINIX_FILE_REMOVED, request->item.id); if( system->mounts.pmount->type == system->mounts.MountTypeThread() ) db->EditThreadRemoveItem(request->item.parent_id); - /* - !! tticket - else - if( system->mounts.pmount->type == system->mounts.MountTypeTicket() ) - db->EditTicketRemoveItem(request->item.id); - */ - if( request->item.auth != Item::auth_none ) - RemoveAuth(request->item); + if( request->item.file_type != WINIX_ITEM_FILETYPE_NONE ) + RemoveStaticFile(request->item); } else { diff --git a/functions/rm.h b/functions/rm.h index 8d671bb..d5ed609 100755 --- a/functions/rm.h +++ b/functions/rm.h @@ -29,13 +29,14 @@ public: private: DbItemQuery rm_auth_iq; + std::wstring path; bool HasAccess(const Item & item); void RemoveAuthPrepareQuery(); void RemoveAllDirs(long dir_id); void RemoveAllDirs(); void RemoveDir(); - void RemoveAuth(Item & item); + void RemoveStaticFile(Item & item); void RemoveFile(); }; diff --git a/functions/upload.cpp b/functions/upload.cpp index ad9b48b..439b11f 100755 --- a/functions/upload.cpp +++ b/functions/upload.cpp @@ -7,6 +7,7 @@ * */ +#include "wand/MagickWand.h" #include #include #include @@ -14,6 +15,7 @@ #include "upload.h" #include "core/misc.h" #include "functions/functions.h" +#include "utf8.h" @@ -38,21 +40,9 @@ bool Upload::HasAccess(const Item & item) if( !system->mounts.pmount ) return false; - if( system->mounts.pmount->fs == system->mounts.MountFsSimplefs() && config->auth_simplefs_dir.empty() ) + if( config->upload_dir.empty() ) { - log << log1 << "Request: can't use upload function, auth_simplefs_dir must be set in the config file" << logend; - return false; - } - - if( system->mounts.pmount->fs == system->mounts.MountFsHashfs() && config->auth_hashfs_dir.empty() ) - { - log << log1 << "Request: can't use upload function, auth_hashfs_dir must be set in the config file" << logend; - return false; - } - - if( config->auth_tmp_dir.empty() ) - { - log << log1 << "Request: can't use upload function, auth_tmp_dir must be set in the config file" << logend; + log << log1 << "Request: can't use upload function, upload_dir must be set in the config file" << logend; return false; } @@ -77,40 +67,78 @@ return true; -bool Upload::UploadCreatePath() +void Upload::CreateThumbnail(const Item & item) { - if( !system->MakePath(request->item, true) ) + if( !system->MakeFilePath(item, path) || + !system->MakeFilePath(item, path_thumb, true, true, config->upload_dirs_chmod) ) + return; + + Ezc::WideToUTF8(path, patha); + Ezc::WideToUTF8(path_thumb, path_thumba); + + MagickWand * wand = NewMagickWand(); + + if( MagickReadImage(wand, patha.c_str()) ) + { + //log <images_thumb_cx, config->images_thumb_cy, CubicFilter, 0.25); + //MagickScaleImage(wand, 100, 100); + MagickThumbnailImage(wand, config->thumb_cx, config->thumb_cy); + + if( MagickWriteImage(wand, path_thumba.c_str()) ) + log << log3 << "Upload: created a thumbnail: " << path_thumba << logend; + } + + DestroyMagickWand(wand); +} + + +bool Upload::UploadSaveStaticFile(const Item & item, const std::wstring & tmp_filename) +{ + if( !system->MakeFilePath(item, path, false, true, config->upload_dirs_chmod) ) { request->status = WINIX_ERR_PERMISSION_DENIED; return false; } -return true; -} - - - - -void Upload::UploadSaveFile(const std::wstring & tmp_filename, const std::wstring & destination) -{ - if( RenameFile(tmp_filename, destination) ) + if( RenameFile(tmp_filename, path) ) { - log << log1 << "Content: uploaded a new file: " << destination << logend; + log << log1 << "Upload: uploaded a new file: " << path << logend; + return true; } else { - int err = errno; - - // !! skasowac takze plik z bazy danych? - log << log1 << "Content: can't move the tmp file from: " << tmp_filename << ", to: " << destination << ", "; - log.SystemErr(err); - log << logend; - + log << log1 << "Upload: can't move the tmp file from: " << tmp_filename << ", to: " << path << logend; request->status = WINIX_ERR_PERMISSION_DENIED; + return false; } } +void Upload::UploadFile(Item & item, const std::wstring & tmp_filename) +{ + // we should add the file beforehand to get the proper item.id + request->status = system->AddFile(item); + + if( request->status == WINIX_ERR_OK ) + { + if( system->CreateNewFile(item) ) + { + if( UploadSaveStaticFile(item, tmp_filename) ) + { + request->status = db->EditFileById(item, item.id); + + if( item.file_type == WINIX_ITEM_FILETYPE_IMAGE && config->create_thumb ) + CreateThumbnail(item); + } + else + { + db->DelItem(item); + } + } + } +} + bool Upload::FunUploadCheckAbuse() { @@ -136,7 +164,6 @@ return true; - void Upload::UploadMulti() { request->item.Clear(); // clearing and setting date @@ -151,21 +178,12 @@ void Upload::UploadMulti() { const wchar_t * file_name = i->second.filename.c_str(); - request->item.subject = file_name; - request->item.url = file_name; - request->item.auth = SelectFileType(file_name); + request->item.subject = file_name; + request->item.url = file_name; + request->item.file_type = SelectFileType(file_name); functions->PrepareUrl(request->item); - request->status = system->AddFile(request->item); - - if( !UploadCreatePath() ) - return; - - if( request->status == WINIX_ERR_OK ) - { - UploadSaveFile(i->second.tmp_filename, request->item.auth_path); - request->status = db->EditAuthById(request->item, request->item.id); - } + UploadFile(request->item, i->second.tmp_filename); } system->RedirectToLastDir(); @@ -177,14 +195,14 @@ void Upload::UploadSingle() const std::wstring & new_subject = request->PostVar(L"subject"); const std::wstring & new_url = request->PostVar(L"url"); bool has_subject = !new_subject.empty(); - bool has_url = !new_url.empty(); //(new_url && (*new_url)[0] != 0 ); + bool has_url = !new_url.empty(); functions->ReadItem(request->item, Item::file); // ReadItem() changes the url if it is empty functions->SetUser(request->item); request->item.privileges = 0644; // !! tymczasowo const wchar_t * file_name = request->post_file_tab.begin()->second.filename.c_str(); - request->item.auth = SelectFileType(file_name); + request->item.file_type = SelectFileType(file_name); if( !has_subject ) request->item.subject = file_name; @@ -194,19 +212,8 @@ void Upload::UploadSingle() request->item.url = file_name; functions->PrepareUrl(request->item); } - - request->status = system->AddFile(request->item); - // url can be changed by PostFunEmacsAdd() - if( !UploadCreatePath() ) - return; - - if( request->status == WINIX_ERR_OK ) - { - const std::wstring & tmp_filename = request->post_file_tab.begin()->second.tmp_filename; - UploadSaveFile(tmp_filename, request->item.auth_path); - request->status = db->EditAuthById(request->item, request->item.id); - } + UploadFile(request->item, request->post_file_tab.begin()->second.tmp_filename); if( request->status == WINIX_ERR_OK ) system->RedirectTo(request->item, L"/cat"); diff --git a/functions/upload.h b/functions/upload.h index 157dee1..90b24e2 100755 --- a/functions/upload.h +++ b/functions/upload.h @@ -28,10 +28,14 @@ public: private: + std::wstring path, path_thumb; + std::string patha, path_thumba; + bool HasAccess(const Item & item); - bool UploadCreatePath(); - void UploadSaveFile(const std::wstring & tmp_filename, const std::wstring & destination); + void CreateThumbnail(const Item & item); + bool UploadSaveStaticFile(const Item & item, const std::wstring & tmp_filename); bool FunUploadCheckAbuse(); + void UploadFile(Item & item, const std::wstring & tmp_filename); void UploadMulti(); void UploadSingle(); }; diff --git a/html/fun_cat.html b/html/fun_cat.html index 21b0612..81efed6 100755 --- a/html/fun_cat.html +++ b/html/fun_cat.html @@ -1,11 +1,11 @@ [if mount_page_arg_is "subject"][if mount_page_arg_is "info"]

[else]

[end][item_subject]

[end] [if mount_page_arg_is "info"][include "item_info.html"][end] -[if-one item_auth_is_image] +[if-one item_filetype_is_image] [item_subject] [item_print_content] [else] - [if-no item_auth_is_none] + [if-no item_filetype_is_none] {download}: [item_subject] [item_print_content] [else] diff --git a/main/main.cpp b/main/main.cpp index 599a63f..1d8b3fd 100755 --- a/main/main.cpp +++ b/main/main.cpp @@ -120,6 +120,8 @@ int main(int argv, char ** argc) app.WaitForThreads(); // now all others threads are terminated + app.Uninit(); + log.PutDate(log1); log << "winix stopped" << logend << logsavenow; diff --git a/plugins/ticket/funticket.cpp b/plugins/ticket/funticket.cpp index 73fb543..b2e5624 100755 --- a/plugins/ticket/funticket.cpp +++ b/plugins/ticket/funticket.cpp @@ -60,7 +60,7 @@ void FunTicket::MakeGet() DbItemQuery iq; iq.WhereParentId(request->dir_tab.back()->id); iq.WhereType(Item::file); - iq.WhereAuth(Item::auth_none); + iq.WhereFileType(WINIX_ITEM_FILETYPE_NONE); db->GetItems(request->item_tab, iq); if( !request->item_tab.empty() ) diff --git a/templates/dir.cpp b/templates/dir.cpp index 5b289d0..6ebc9d6 100755 --- a/templates/dir.cpp +++ b/templates/dir.cpp @@ -253,8 +253,9 @@ void dir_tab_link(Info & i) } -static Item dir_last_default_item; -static size_t dir_last_default_item_reqid = 0; +static Item dir_last_default_item; +static size_t dir_last_default_item_reqid = 0; +static std::wstring dir_last_path; @@ -264,7 +265,6 @@ void dir_last_default_item_init() return; dir_last_default_item_reqid = request->id; - dir_last_default_item.Clear(); if( request->dir_tab.empty() ) @@ -275,13 +275,9 @@ void dir_last_default_item_init() if( default_item == -1 ) return; - std::vector item_tab; // !! tymczasowo, nie bedzie tego po zmianie interfejsu dla Db - db->GetItem(item_tab, default_item); - - if( item_tab.empty() ) - return; - - dir_last_default_item = item_tab[0]; + // !! tutaj nie musimy odczytywac wszystkiego (contentu itp) + if( db->GetItemById(default_item, dir_last_default_item) != WINIX_ERR_OK ) + dir_last_default_item.Clear(); } @@ -289,12 +285,10 @@ void dir_last_default_item_init() void dir_last_default_item_dir(Info & i) { dir_last_default_item_init(); - - std::wstring path; - + if( dir_last_default_item.parent_id != -1 ) - if( system->dirs.MakePath(dir_last_default_item.parent_id, path) ) - i.out << path; + if( system->dirs.MakePath(dir_last_default_item.parent_id, dir_last_path) ) + i.out << dir_last_path; } diff --git a/templates/doc.cpp b/templates/doc.cpp index e67bd86..bbed535 100755 --- a/templates/doc.cpp +++ b/templates/doc.cpp @@ -56,12 +56,6 @@ void doc_base_url(Info & i) } -void doc_base_url_auth(Info & i) -{ - i.out << config->base_url_auth; -} - - void doc_base_url_static(Info & i) { i.out << config->base_url_static; diff --git a/templates/item.cpp b/templates/item.cpp index 5e2e053..d7d51bd 100755 --- a/templates/item.cpp +++ b/templates/item.cpp @@ -169,15 +169,15 @@ void item_link(Info & i) -void item_auth_is_none(Info & i) +void item_filetype_is_none(Info & i) { - i.res = request->item.auth == Item::auth_none; + i.res = request->item.file_type == WINIX_ITEM_FILETYPE_NONE; } -void item_auth_is_image(Info & i) +void item_filetype_is_image(Info & i) { - i.res = request->item.auth == Item::auth_image; + i.res = request->item.file_type == WINIX_ITEM_FILETYPE_IMAGE; } @@ -407,15 +407,6 @@ void item_tab_link(Info & i) } -void item_tab_link_auth(Info & i) -{ - if( item_index < request->item_tab.size() ) - { - i.out << config->base_url_auth; - item_tab_dir(i); - item_tab_url(i); - } -} void item_tab_can_read(Info & i) diff --git a/templates/stat.cpp b/templates/stat.cpp index 055833c..7fccfb1 100755 --- a/templates/stat.cpp +++ b/templates/stat.cpp @@ -19,14 +19,14 @@ namespace TemplatesFunctions void stat_item_type_is_file(Info & i) { - i.res = request->is_item && request->item.auth == Item::auth_none; + i.res = request->is_item && request->item.file_type == WINIX_ITEM_FILETYPE_NONE; } void stat_item_type_is_static_file(Info & i) { - i.res = request->is_item && request->item.auth != Item::auth_none; + i.res = request->is_item && request->item.file_type != WINIX_ITEM_FILETYPE_NONE; } diff --git a/templates/templates.cpp b/templates/templates.cpp index 56002c9..3afc749 100755 --- a/templates/templates.cpp +++ b/templates/templates.cpp @@ -186,7 +186,6 @@ void Templates::CreateFunctions() */ ezc_functions.Insert("doc_title", doc_title); ezc_functions.Insert("doc_base_url", doc_base_url); - ezc_functions.Insert("doc_base_url_auth", doc_base_url_auth); ezc_functions.Insert("doc_base_url_static", doc_base_url_static); ezc_functions.Insert("doc_base_url_common", doc_base_url_common); ezc_functions.Insert("doc_current_url", doc_current_url); @@ -209,8 +208,8 @@ void Templates::CreateFunctions() ezc_functions.Insert("item_url", item_url); ezc_functions.Insert("item_url_is", item_url_is); ezc_functions.Insert("item_link", item_link); - ezc_functions.Insert("item_auth_is_none", item_auth_is_none); - ezc_functions.Insert("item_auth_is_image", item_auth_is_image); + ezc_functions.Insert("item_filetype_is_none", item_filetype_is_none); + ezc_functions.Insert("item_filetype_is_image", item_filetype_is_image); ezc_functions.Insert("item_can_read", item_can_read); ezc_functions.Insert("item_can_write", item_can_write); @@ -240,7 +239,6 @@ void Templates::CreateFunctions() ezc_functions.Insert("item_tab_dir", item_tab_dir); ezc_functions.Insert("item_tab_url", item_tab_url); ezc_functions.Insert("item_tab_link", item_tab_link); - ezc_functions.Insert("item_tab_link_auth", item_tab_link_auth); ezc_functions.Insert("item_tab_can_read", item_tab_can_read); ezc_functions.Insert("item_tab_can_write", item_tab_can_write); ezc_functions.Insert("item_tab_user", item_tab_user); diff --git a/templates/templates.h b/templates/templates.h index ccebe71..741dcd5 100755 --- a/templates/templates.h +++ b/templates/templates.h @@ -116,7 +116,6 @@ namespace TemplatesFunctions */ void doc_title(Info & i); void doc_base_url(Info & i); - void doc_base_url_auth(Info & i); void doc_base_url_static(Info & i); void doc_base_url_common(Info & i); void doc_current_url(Info & i); @@ -141,8 +140,8 @@ namespace TemplatesFunctions void item_url(Info & i); void item_url_is(Info & i); void item_link(Info & i); - void item_auth_is_none(Info & i); - void item_auth_is_image(Info & i); + void item_filetype_is_none(Info & i); + void item_filetype_is_image(Info & i); void item_can_read(Info & i); void item_can_write(Info & i); void item_can_remove(Info & i); @@ -171,7 +170,6 @@ namespace TemplatesFunctions void item_tab_dir(Info & i); void item_tab_url(Info & i); void item_tab_link(Info & i); - void item_tab_link_auth(Info & i); void item_tab_can_read(Info & i); void item_tab_can_write(Info & i); void item_tab_user(Info & i);