/* * This file is a part of CMSLU -- Content Management System like Unix * and is not publicly distributed * * Copyright (c) 2008-2009, Tomasz Sowa * All rights reserved. * */ #include "content.h" #include "../core/request.h" #include "../core/error.h" #include "../core/db.h" #include "../core/data.h" #include "../core/notify.h" #include "../core/misc.h" void Content::CheckSpecialFile() { static std::string fstab = "fstab"; Item * etc = data.dirs.GetEtcDir(); if( !etc ) return; if( request.item.parent_id != etc->id ) return; if( request.item.url == fstab ) { log << log3 << "Content: reloading mount points" << logend; data.mounts.ReadMounts(request.item.content); } } void Content::PostFunEmacsAdd() { request.session->done = Done::added_item; request.is_item = true; SetUser(request.item); request.item.group_id = -1; request.item.privileges = 0644; // !! tymczasowo, bedzie uzyte umask request.item.parent_id = request.dir_table.back()->id; request.item.type = Item::file; request.item.content_type = 1;// !! tymczasowo formatted text // dates (creation and modification) is set by request.item.Clear() at the beginning if( !request.CanUseEmacs(*request.dir_table.back() ) ) throw Error(Error::permision_denied); request.session->done_status = db.AddItem(request.item); if( request.session->done_status == Error::ok ) { log << log2 << "Content: added a new item" << logend; request.notify_code |= CMSLU_NOTIFY_ITEM_ADD; } } void Content::PostFunEmacsEdit(bool with_url) { request.session->done = Done::edited_item; if( !request.CanUseEmacs(request.item) ) throw Error(Error::permision_denied); time_t t = std::time(0); request.item.date_modification = *std::localtime( &t ); request.session->done_status = db.EditItemById(request.item, with_url); if( request.session->done_status == Error::ok ) { TemplatesFunctions::pattern_cacher.UpdatePattern(request.item); log << log2 << "Content: modified an item" << logend; request.notify_code |= CMSLU_NOTIFY_ITEM_EDIT; } } // returning true if the 'url' has to be changed bool Content::PostFunSetUrlSubject() { bool with_url = false; std::string * new_url = request.PostVar("url"); std::string * new_subject = request.PostVar("subject"); if( request.is_item ) { // editing an item if( new_url && *new_url != request.item.url ) with_url = true; } else { // adding a new item with_url = true; } if( new_url ) request.item.url = *new_url; if( new_subject ) request.item.subject = *new_subject; if( request.item.subject.empty() ) { request.item.subject = request.dir_table.back()->subject; request.item.subject += "_msg_"; request.item.subject += ToStr(db.Size(request.dir_table.back()->id, Item::file)); } // if request.item.url is empty then it will be set from request.item.subject PrepareUrl(request.item); return with_url; } void Content::PostFunEmacs() { bool adding = !request.is_item; try { bool with_url = PostFunSetUrlSubject(); request.PostVar("content", request.item.content); if( !CheckRebus() ) { request.status = Error::spam; SetUser(request.item); request.session->done = (adding)? Done::added_item : Done::edited_item; request.session->done_status = Error::incorrect_rebus; return; } // !! is tested in createthread once CheckGetPostTimes(); if( request.session->spam_score > 0 ) { request.status = Error::spam; SetUser(request.item); request.session->done = (adding)? Done::added_item : Done::edited_item; request.session->done_status = Error::spam; log << log1 << "Content: ignoring due to suspected spamming" << logend; return; } if( adding ) PostFunEmacsAdd(); else PostFunEmacsEdit(with_url); CheckSpecialFile(); } catch(const Error & e) { request.session->done_status = e; } if( request.session->done_status == Error::ok ) { request.session->item = request.item; if( data.mounts.CurrentMountType() == Mount::thread ) { if( adding ) db.EditThreadAddItem(request.dir_table.back()->id, request.item.id); // request.session->item = request.item; // request.session->done_timer = 2; RedirectTo(*request.dir_table.back()); } else { request.session->item = request.item; request.session->done_timer = 2; RedirectTo(request.item); } } else { log << log1 << "Content: PostFunEmacs: Error: " << request.session->done_status << logend; } } void Content::FunEmacs() { if( !request.is_item ) { // adding a new item if( !request.CanUseEmacs(*request.dir_table.back()) ) request.status = Error::permision_denied; return; } // editing an existing item if( !request.CanUseEmacs(request.item) ) { request.status = Error::permision_denied; return; } }