/* * 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" bool Content::Init() { templates.Read(); return true; } bool Content::DirsHaveReadExecPerm() { std::vector::iterator i; for(i = request.dir_table.begin() ; i!=request.dir_table.end() ; ++i) { if( !request.HasReadExecAccess(**i) ) return false; } return true; } void Content::SetDefaultFunctionForFile() { if( request.HasReadExecAccess(request.item) ) request.pfunction = data.functions.GetFunction(FUN_RUN); else request.pfunction = data.functions.GetFunction(FUN_CAT); if( request.pfunction ) log << log3 << "Content: default function: " << request.pfunction->item.url << logend; } void Content::SetDefaultFunctionForDir() { Mount mount = data.mounts.GetCurrentMountPoint(); if( mount.type == Mount::thread ) { request.pfunction = data.functions.GetFunction(FUN_THREAD); if( request.pfunction ) log << log3 << "Content: default function: " << request.pfunction->item.url << logend; } else { long default_item = request.dir_table.back()->default_item; if( default_item == -1 ) { request.pfunction = data.functions.GetFunction(FUN_LS); if( request.pfunction ) log << log3 << "Content: default function: " << request.pfunction->item.url << logend; } else { request.session->IncrementTimersIfExist(); log << log3 << "Content: Default item: id: " << default_item << logend; RedirectTo(default_item); } } } void Content::SetDefaultFunction() { if( request.is_item ) { SetDefaultFunctionForFile(); } else { SetDefaultFunctionForDir(); } } void Content::MakeStandardFunction() { if( !request.pfunction ) SetDefaultFunction(); if( request.result == Request::redirect ) return; if( !request.pfunction ) { log << log1 << "Content: no function (neither cat nor ls)" << logend; return; } if( request.pfunction->code == FUN_LOGOUT ) FunLogout(); else if( request.pfunction->code == FUN_CAT ) FunCat(); else if( request.pfunction->code == FUN_LS ) FunLs(); else if( request.pfunction->code == FUN_EMACS ) FunEmacs(); else if( request.pfunction->code == FUN_MKDIR ) FunMkdir(); else if( request.pfunction->code == FUN_DEFAULT ) FunDefault(); else if( request.pfunction->code == FUN_PRIV ) FunPriv(); else if( request.pfunction->code == FUN_RM ) FunRm(); else if( request.pfunction->code == FUN_RUN ) FunRun(); else if( request.pfunction->code == FUN_NODE ) FunNode(); else if( request.pfunction->code == FUN_WHO ) FunWho(); else if( request.pfunction->code == FUN_LAST ) FunLast(); else if( request.pfunction->code == FUN_THREAD ) FunThread(); else if( request.pfunction->code == FUN_CREATETHREAD ) FunCreateThread(); else request.status = Error::permision_denied; } void Content::MakePost() { if( !request.pfunction ) { log << log1 << "Content: MakePost: no function" << logend; request.status = Error::no_function; return; } switch( request.pfunction->code ) { case FUN_EMACS: PostFunEmacs(); break; case FUN_MKDIR: PostFunMkdir(); break; case FUN_DEFAULT: PostFunDefault(); break; case FUN_PRIV: PostFunPriv(); break; case FUN_LOGIN: PostFunLogin(); break; case FUN_CREATETHREAD: PostFunCreateThread(); break; default: log << log1 << "Content: unknown post function" << logend; // !! moze daj tutaj tez access denied? break; } } void Content::Make() { if( request.dir_table.empty() ) { log << log1 << "Content: there is no a root dir (dir_table is empty)" << logend; return; } // request.status can be changed by function_parser if( request.status == Error::ok ) { if( DirsHaveReadExecPerm() ) { if( request.method == Request::post ) MakePost(); if( request.result == Request::redirect ) return; if( request.status == Error::ok ) MakeStandardFunction(); } else request.status = Error::permision_denied; } if( request.result == Request::redirect ) return; if( request.dir_table.empty() ) { log << log1 << "Content: there is no a root dir (dir_table is empty -- after calling some standard functions)" << logend; return; } templates.Generate(); //request.PrintGetTable(); //request.PrintEnv(); //request.PrintIn(); } // !! mozna zrobic jakas obsluge kiedy nie mozemy sie redirectnac, np gdy wystapil blad // !! moze zwracac jakas wartosc? void Content::RedirectTo(const Item & item) { std::string path; request.result = Request::redirect; request.str = data.base_url; if( item.type == Item::dir ) { // item_id is pointing to a directory data.dirs.MakePath(item.id, path); request.str += path; } else { if( !data.dirs.MakePath(item.parent_id, path) ) log << log1 << "Content: Can't redirect: no dirs for item id: " << item.id << logend; request.str += path; request.str += item.url; } } void Content::RedirectTo(long item_id) { std::string path; Item * pdir; request.result = Request::redirect; request.str = data.base_url; pdir = data.dirs.GetDir(item_id); if( pdir ) { // item_id is pointing to a directory data.dirs.MakePath(pdir->id, path); request.str += path; } else { // !! zrobic nowy interfejs // !! GetItem pozamieniac na GetFile db.GetItem(request.item_table, item_id); if( !request.item_table.empty() ) { if( !data.dirs.MakePath(request.item_table[0].parent_id, path) ) log << log1 << "Content: Can't redirect: no dirs for item id: " << request.item_table[0].id << ", requested directory id: " << request.item_table[0].parent_id << logend; request.str += path + request.item_table[0].url; } else { log << log1 << "Content: Can't redirect: no such item: id: " << item_id << logend; } } } void Content::ReadAdditionalInfo() { if( request.dir_table.empty() ) return; Mount mount = data.mounts.GetCurrentMountPoint(); if( mount.type == Mount::thread ) { db.GetThreadByDirId(request.dir_table.back()->id, request.thread); } }