From 3e328932fc8b6ba07e8310017af73a741ca2d743 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Tue, 30 Dec 2008 01:05:03 +0000 Subject: [PATCH] added: created directory 'content' which has Content:: files added: created directory 'templates' which has Templates:: and TemplatesFunctions:: files changed: content.cpp split into many files (directory 'content') changed: templates.cpp split into many files (directory 'templates') added: full permissions changed: building of the program (GNU make is used now) Makefile and Makefile.dep added into directories added: a parser 'FunctionParser' is used to parse the GET string it recognizes directories, items, functions, functions parameters added: other classes: Function, Functions added: function: ls, privileges changed: function 'id' to 'node' changed: version: to 0.2.0 added/changed: a lot of work have been done git-svn-id: svn://ttmath.org/publicrep/cmslu/trunk@469 e52654a7-88a9-db11-a3e9-0013d4bc506e --- Makefile | 74 ++-- confparser/Makefile | 29 ++ confparser/Makefile.dep | 3 + content/Makefile | 26 ++ content/Makefile.dep | 108 +++++ content/cat.cpp | 38 ++ content/content.cpp | 256 ++++++++++++ content/content.h | 73 ++++ content/emacs.cpp | 133 +++++++ content/login.cpp | 51 +++ content/logout.cpp | 45 +++ content/ls.cpp | 47 +++ content/node.cpp | 30 ++ content/privileges.cpp | 83 ++++ content/rm.cpp | 69 ++++ core/Makefile | 26 ++ core/Makefile.dep | 61 +++ core/config.cpp | 51 ++- core/config.h | 5 + core/content.cpp | 570 --------------------------- core/content.h | 79 ---- core/data.h | 7 +- core/db.cpp | 73 +++- core/db.h | 4 + core/dirs.cpp | 84 +++- core/dirs.h | 21 +- core/done.cpp | 5 + core/done.h | 8 +- core/error.cpp | 10 + core/error.h | 17 +- core/function.cpp | 53 +++ core/function.h | 52 +++ core/functionparser.cpp | 181 +++++++++ core/functionparser.h | 45 +++ core/functions.cpp | 113 ++++++ core/functions.h | 42 ++ core/log.cpp | 2 + core/log.h | 4 +- core/main.cpp | 3 +- core/misc.cpp | 56 ++- core/misc.h | 12 +- core/request.cpp | 99 ++++- core/request.h | 59 ++- core/requestcontroller.cpp | 13 +- core/requestcontroller.h | 4 +- core/session.cpp | 3 +- core/session.h | 11 +- core/templates.cpp | 788 ------------------------------------- core/templates.h | 50 --- core/users.cpp | 1 - core/users.h | 2 + templates/Makefile | 26 ++ templates/Makefile.dep | 82 ++++ templates/dir.cpp | 104 +++++ templates/doc.cpp | 79 ++++ templates/done.cpp | 72 ++++ templates/item.cpp | 248 ++++++++++++ templates/priv.cpp | 218 ++++++++++ templates/sys.cpp | 40 ++ templates/templates.cpp | 312 +++++++++++++++ templates/templates.h | 165 ++++++++ templates/user.cpp | 49 +++ 62 files changed, 3457 insertions(+), 1617 deletions(-) create mode 100755 confparser/Makefile create mode 100755 confparser/Makefile.dep create mode 100755 content/Makefile create mode 100755 content/Makefile.dep create mode 100755 content/cat.cpp create mode 100755 content/content.cpp create mode 100755 content/content.h create mode 100755 content/emacs.cpp create mode 100755 content/login.cpp create mode 100755 content/logout.cpp create mode 100755 content/ls.cpp create mode 100755 content/node.cpp create mode 100755 content/privileges.cpp create mode 100755 content/rm.cpp create mode 100755 core/Makefile create mode 100755 core/Makefile.dep delete mode 100755 core/content.cpp delete mode 100755 core/content.h create mode 100755 core/function.cpp create mode 100755 core/function.h create mode 100755 core/functionparser.cpp create mode 100755 core/functionparser.h create mode 100755 core/functions.cpp create mode 100755 core/functions.h delete mode 100755 core/templates.cpp delete mode 100755 core/templates.h create mode 100755 templates/Makefile create mode 100755 templates/Makefile.dep create mode 100755 templates/dir.cpp create mode 100755 templates/doc.cpp create mode 100755 templates/done.cpp create mode 100755 templates/item.cpp create mode 100755 templates/priv.cpp create mode 100755 templates/sys.cpp create mode 100755 templates/templates.cpp create mode 100755 templates/templates.h create mode 100755 templates/user.cpp diff --git a/Makefile b/Makefile index ff185eb..9806fe0 100755 --- a/Makefile +++ b/Makefile @@ -1,51 +1,53 @@ CC = g++ -o = data.o content.o log.o sessionmanager.o requestcontroller.o dircontainer.o session.o main.o done.o request.o misc.o templates.o httpsimpleparser.o db.o error.o db_itemcolumns.o users.o config.o dirs.o groups.o confparser.o ezc.o CFLAGS = -Wall -pedantic -g -I/usr/local/include -L/usr/local/lib name = cmslu.fcgi - -all: $(name) $(mod_cms) - -$(name): $(o) - g++ -o $(name) $(CFLAGS) $(o) -lfcgi -lpq +export CC +export CFLAGS - - -.SUFFIXES: .cpp .o - -.cpp.o: - $(CC) -c $(CFLAGS) $< +all: $(name) -data.o: core/data.cpp core/data.h core/misc.h core/log.h core/item.h core/error.h core/dirs.h core/db.h core/dircontainer.h core/user.h core/group.h core/ugcontainer.h core/users.h core/groups.h -content.o: core/content.cpp core/content.h core/templates.h core/../../ezc/src/ezc.h core/data.h core/misc.h core/log.h core/item.h core/error.h core/dirs.h core/db.h core/dircontainer.h core/user.h core/group.h core/ugcontainer.h core/users.h core/groups.h core/request.h core/requesttypes.h core/session.h core/done.h core/getparser.h core/httpsimpleparser.h core/postparser.h core/cookieparser.h -log.o: core/log.cpp core/log.h -sessionmanager.o: core/sessionmanager.cpp core/sessionmanager.h core/request.h core/requesttypes.h core/log.h core/session.h core/error.h core/item.h core/done.h core/user.h core/getparser.h core/httpsimpleparser.h core/postparser.h core/cookieparser.h core/data.h core/misc.h core/dirs.h core/db.h core/dircontainer.h core/group.h core/ugcontainer.h core/users.h core/groups.h -requestcontroller.o: core/requestcontroller.cpp core/requestcontroller.h core/data.h core/misc.h core/log.h core/item.h core/error.h core/dirs.h core/db.h core/dircontainer.h core/user.h core/group.h core/ugcontainer.h core/users.h core/groups.h core/request.h core/requesttypes.h core/session.h core/done.h core/getparser.h core/httpsimpleparser.h core/postparser.h core/cookieparser.h core/content.h core/templates.h core/../../ezc/src/ezc.h core/sessionmanager.h -dircontainer.o: core/dircontainer.cpp core/dircontainer.h core/item.h core/log.h -session.o: core/session.cpp core/session.h core/requesttypes.h core/error.h core/log.h core/item.h core/done.h core/user.h -main.o: core/main.cpp core/requestcontroller.h core/data.h core/misc.h core/log.h core/item.h core/error.h core/dirs.h core/db.h core/dircontainer.h core/user.h core/group.h core/ugcontainer.h core/users.h core/groups.h core/request.h core/requesttypes.h core/session.h core/done.h core/getparser.h core/httpsimpleparser.h core/postparser.h core/cookieparser.h core/content.h core/templates.h core/../../ezc/src/ezc.h core/sessionmanager.h core/config.h core/../confparser/confparser.h -done.o: core/done.cpp core/done.h -request.o: core/request.cpp core/request.h core/requesttypes.h core/log.h core/session.h core/error.h core/item.h core/done.h core/user.h core/getparser.h core/httpsimpleparser.h core/postparser.h core/cookieparser.h -misc.o: core/misc.cpp core/misc.h core/log.h core/item.h -templates.o: core/templates.cpp core/templates.h core/../../ezc/src/ezc.h core/data.h core/misc.h core/log.h core/item.h core/error.h core/dirs.h core/db.h core/dircontainer.h core/user.h core/group.h core/ugcontainer.h core/users.h core/groups.h core/request.h core/requesttypes.h core/session.h core/done.h core/getparser.h core/httpsimpleparser.h core/postparser.h core/cookieparser.h -httpsimpleparser.o: core/httpsimpleparser.cpp core/httpsimpleparser.h -db.o: core/db.cpp core/db.h core/log.h core/item.h core/misc.h core/error.h core/dircontainer.h core/user.h core/group.h core/ugcontainer.h -error.o: core/error.cpp core/error.h core/log.h -db_itemcolumns.o: core/db_itemcolumns.cpp core/db.h core/log.h core/item.h core/misc.h core/error.h core/dircontainer.h core/user.h core/group.h core/ugcontainer.h -users.o: core/users.cpp core/users.h core/user.h core/db.h core/log.h core/item.h core/misc.h core/error.h core/dircontainer.h core/group.h core/ugcontainer.h -config.o: core/config.cpp core/config.h core/../confparser/confparser.h core/error.h core/log.h core/data.h core/misc.h core/item.h core/dirs.h core/db.h core/dircontainer.h core/user.h core/group.h core/ugcontainer.h core/users.h core/groups.h -dirs.o: core/dirs.cpp core/dirs.h core/item.h core/error.h core/log.h core/db.h core/misc.h core/dircontainer.h core/user.h core/group.h core/ugcontainer.h -groups.o: core/groups.cpp core/groups.h core/group.h core/db.h core/log.h core/item.h core/misc.h core/error.h core/dircontainer.h core/user.h core/ugcontainer.h +$(name): core content confparser templates ezc + g++ -o $(name) $(CFLAGS) core/core.a content/content.a confparser/confparser.a templates/templates.a ../ezc/src/ezc.a -lfcgi -lpq -confparser.o: confparser/confparser.cpp confparser/confparser.h -ezc.o: ../ezc/src/ezc.cpp ../ezc/src/ezc.h + +core: FORCE + @cd core ; $(MAKE) -e + +templates: FORCE + @cd templates ; $(MAKE) -e + +confparser: FORCE + @cd confparser ; $(MAKE) -e + +content: FORCE + @cd content ; $(MAKE) -e + +ezc: FORCE + @cd ../ezc/src ; $(MAKE) -e + clean: - rm -f *.o + @cd core ; $(MAKE) -e clean + @cd templates ; $(MAKE) -e clean + @cd confparser ; $(MAKE) -e clean + @cd content ; $(MAKE) -e clean + @cd ../ezc/src ; $(MAKE) -e clean rm -f $(name) - + + +FORCE: + + + +depend: + cd core ; $(MAKE) -e depend + cd templates ; $(MAKE) -e depend + cd confparser ; $(MAKE) -e depend + cd content ; $(MAKE) -e depend + cd ../ezc/src ; $(MAKE) -e depend diff --git a/confparser/Makefile b/confparser/Makefile new file mode 100755 index 0000000..5ec39dd --- /dev/null +++ b/confparser/Makefile @@ -0,0 +1,29 @@ +o = confparser.o + + + +all: confparser.a + + +confparser.a: $(o) + ar rcs confparser.a $(o) + + +.SUFFIXES: .cpp .o + +.cpp.o: + $(CC) -c $(CFLAGS) $< + + + +depend: + makedepend -Y. -f- *.cpp > Makefile.dep + + +clean: + rm -f *.o + rm -f *.a + + +include Makefile.dep + diff --git a/confparser/Makefile.dep b/confparser/Makefile.dep new file mode 100755 index 0000000..b0b3c30 --- /dev/null +++ b/confparser/Makefile.dep @@ -0,0 +1,3 @@ +# DO NOT DELETE + +confparser.o: confparser.h diff --git a/content/Makefile b/content/Makefile new file mode 100755 index 0000000..c10cc4b --- /dev/null +++ b/content/Makefile @@ -0,0 +1,26 @@ +o = content.o privileges.o emacs.o login.o rm.o cat.o logout.o ls.o node.o + + +all: content.a + +content.a: $(o) + ar rcs content.a $(o) + + +.SUFFIXES: .cpp .o + +.cpp.o: + $(CC) -c $(CFLAGS) $< + + +depend: + makedepend -Y. -f- *.cpp > Makefile.dep + + +clean: + rm -f *.o + rm -f *.a + + + +include Makefile.dep diff --git a/content/Makefile.dep b/content/Makefile.dep new file mode 100755 index 0000000..c5744b6 --- /dev/null +++ b/content/Makefile.dep @@ -0,0 +1,108 @@ +# DO NOT DELETE + +cat.o: content.h ../templates/templates.h ../../ezc/src/ezc.h ../core/data.h +cat.o: ../core/misc.h ../core/log.h ../core/item.h ../core/error.h +cat.o: ../core/dirs.h ../core/db.h ../core/dircontainer.h ../core/user.h +cat.o: ../core/group.h ../core/ugcontainer.h ../core/users.h ../core/groups.h +cat.o: ../core/functions.h ../core/function.h ../core/request.h +cat.o: ../core/requesttypes.h ../core/session.h ../core/done.h +cat.o: ../core/getparser.h ../core/httpsimpleparser.h ../core/postparser.h +cat.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +cat.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +cat.o: ../core/log.h ../core/misc.h ../core/function.h +cat.o: ../core/functionparser.h ../core/request.h ../core/data.h +content.o: content.h ../templates/templates.h ../../ezc/src/ezc.h +content.o: ../core/data.h ../core/misc.h ../core/log.h ../core/item.h +content.o: ../core/error.h ../core/dirs.h ../core/db.h ../core/dircontainer.h +content.o: ../core/user.h ../core/group.h ../core/ugcontainer.h +content.o: ../core/users.h ../core/groups.h ../core/functions.h +content.o: ../core/function.h ../core/request.h ../core/requesttypes.h +content.o: ../core/session.h ../core/done.h ../core/getparser.h +content.o: ../core/httpsimpleparser.h ../core/postparser.h +content.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +content.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +content.o: ../core/log.h ../core/misc.h ../core/function.h +content.o: ../core/functionparser.h ../core/request.h ../core/data.h +emacs.o: content.h ../templates/templates.h ../../ezc/src/ezc.h +emacs.o: ../core/data.h ../core/misc.h ../core/log.h ../core/item.h +emacs.o: ../core/error.h ../core/dirs.h ../core/db.h ../core/dircontainer.h +emacs.o: ../core/user.h ../core/group.h ../core/ugcontainer.h ../core/users.h +emacs.o: ../core/groups.h ../core/functions.h ../core/function.h +emacs.o: ../core/request.h ../core/requesttypes.h ../core/session.h +emacs.o: ../core/done.h ../core/getparser.h ../core/httpsimpleparser.h +emacs.o: ../core/postparser.h ../core/cookieparser.h ../core/item.h +emacs.o: ../core/db.h ../core/error.h ../core/user.h ../core/group.h +emacs.o: ../core/users.h ../core/groups.h ../core/log.h ../core/misc.h +emacs.o: ../core/function.h ../core/functionparser.h ../core/request.h +emacs.o: ../core/data.h +login.o: content.h ../templates/templates.h ../../ezc/src/ezc.h +login.o: ../core/data.h ../core/misc.h ../core/log.h ../core/item.h +login.o: ../core/error.h ../core/dirs.h ../core/db.h ../core/dircontainer.h +login.o: ../core/user.h ../core/group.h ../core/ugcontainer.h ../core/users.h +login.o: ../core/groups.h ../core/functions.h ../core/function.h +login.o: ../core/request.h ../core/requesttypes.h ../core/session.h +login.o: ../core/done.h ../core/getparser.h ../core/httpsimpleparser.h +login.o: ../core/postparser.h ../core/cookieparser.h ../core/item.h +login.o: ../core/db.h ../core/error.h ../core/user.h ../core/group.h +login.o: ../core/users.h ../core/groups.h ../core/log.h ../core/misc.h +login.o: ../core/function.h ../core/functionparser.h ../core/request.h +login.o: ../core/data.h +logout.o: content.h ../templates/templates.h ../../ezc/src/ezc.h +logout.o: ../core/data.h ../core/misc.h ../core/log.h ../core/item.h +logout.o: ../core/error.h ../core/dirs.h ../core/db.h ../core/dircontainer.h +logout.o: ../core/user.h ../core/group.h ../core/ugcontainer.h +logout.o: ../core/users.h ../core/groups.h ../core/functions.h +logout.o: ../core/function.h ../core/request.h ../core/requesttypes.h +logout.o: ../core/session.h ../core/done.h ../core/getparser.h +logout.o: ../core/httpsimpleparser.h ../core/postparser.h +logout.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +logout.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +logout.o: ../core/log.h ../core/misc.h ../core/function.h +logout.o: ../core/functionparser.h ../core/request.h ../core/data.h +ls.o: content.h ../templates/templates.h ../../ezc/src/ezc.h ../core/data.h +ls.o: ../core/misc.h ../core/log.h ../core/item.h ../core/error.h +ls.o: ../core/dirs.h ../core/db.h ../core/dircontainer.h ../core/user.h +ls.o: ../core/group.h ../core/ugcontainer.h ../core/users.h ../core/groups.h +ls.o: ../core/functions.h ../core/function.h ../core/request.h +ls.o: ../core/requesttypes.h ../core/session.h ../core/done.h +ls.o: ../core/getparser.h ../core/httpsimpleparser.h ../core/postparser.h +ls.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +ls.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +ls.o: ../core/log.h ../core/misc.h ../core/function.h +ls.o: ../core/functionparser.h ../core/request.h ../core/data.h +node.o: content.h ../templates/templates.h ../../ezc/src/ezc.h ../core/data.h +node.o: ../core/misc.h ../core/log.h ../core/item.h ../core/error.h +node.o: ../core/dirs.h ../core/db.h ../core/dircontainer.h ../core/user.h +node.o: ../core/group.h ../core/ugcontainer.h ../core/users.h +node.o: ../core/groups.h ../core/functions.h ../core/function.h +node.o: ../core/request.h ../core/requesttypes.h ../core/session.h +node.o: ../core/done.h ../core/getparser.h ../core/httpsimpleparser.h +node.o: ../core/postparser.h ../core/cookieparser.h ../core/item.h +node.o: ../core/db.h ../core/error.h ../core/user.h ../core/group.h +node.o: ../core/users.h ../core/groups.h ../core/log.h ../core/misc.h +node.o: ../core/function.h ../core/functionparser.h ../core/request.h +node.o: ../core/data.h +privileges.o: content.h ../templates/templates.h ../../ezc/src/ezc.h +privileges.o: ../core/data.h ../core/misc.h ../core/log.h ../core/item.h +privileges.o: ../core/error.h ../core/dirs.h ../core/db.h +privileges.o: ../core/dircontainer.h ../core/user.h ../core/group.h +privileges.o: ../core/ugcontainer.h ../core/users.h ../core/groups.h +privileges.o: ../core/functions.h ../core/function.h ../core/request.h +privileges.o: ../core/requesttypes.h ../core/session.h ../core/done.h +privileges.o: ../core/getparser.h ../core/httpsimpleparser.h +privileges.o: ../core/postparser.h ../core/cookieparser.h ../core/item.h +privileges.o: ../core/db.h ../core/error.h ../core/user.h ../core/group.h +privileges.o: ../core/users.h ../core/groups.h ../core/log.h ../core/misc.h +privileges.o: ../core/function.h ../core/functionparser.h ../core/request.h +privileges.o: ../core/data.h +rm.o: content.h ../templates/templates.h ../../ezc/src/ezc.h ../core/data.h +rm.o: ../core/misc.h ../core/log.h ../core/item.h ../core/error.h +rm.o: ../core/dirs.h ../core/db.h ../core/dircontainer.h ../core/user.h +rm.o: ../core/group.h ../core/ugcontainer.h ../core/users.h ../core/groups.h +rm.o: ../core/functions.h ../core/function.h ../core/request.h +rm.o: ../core/requesttypes.h ../core/session.h ../core/done.h +rm.o: ../core/getparser.h ../core/httpsimpleparser.h ../core/postparser.h +rm.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +rm.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +rm.o: ../core/log.h ../core/misc.h ../core/function.h +rm.o: ../core/functionparser.h ../core/request.h ../core/data.h diff --git a/content/cat.cpp b/content/cat.cpp new file mode 100755 index 0000000..1e24759 --- /dev/null +++ b/content/cat.cpp @@ -0,0 +1,38 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "content.h" + + + + + + + + + + +void Content::FunCat() +{ + if( !request.is_item ) + { + log << log1 << "Content: Cat function requires an item" << logend; + request.status = Error::item_required; + return; + } + + + if( !request.HasReadAccess(request.item) ) + { + request.status = Error::permision_denied; + return; + } +} + + diff --git a/content/content.cpp b/content/content.cpp new file mode 100755 index 0000000..7bb148b --- /dev/null +++ b/content/content.cpp @@ -0,0 +1,256 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "content.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::SetDefaultFunction() +{ + if( request.is_item ) + { + request.pfunction = data.functions.GetFunction(Function::cat); + + 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(Function::ls); + + if( request.pfunction ) + log << log3 << "Content: default function: " << request.pfunction->item.url << logend; + } + else + { + log << log3 << "Content: Default item: id: " << default_item << logend; + RedirectTo(default_item); + } + } +} + + + + +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 == Function::logout ) + FunLogout(); + else + if( request.pfunction->code == Function::cat ) + FunCat(); + else + if( request.pfunction->code == Function::ls ) + FunLs(); + else + if( request.pfunction->code == Function::emacs ) + FunEmacs(); + else + if( request.pfunction->code == Function::privileges ) + FunPrivileges(); + else + if( request.pfunction->code == Function::rm ) + FunRm(); + else + if( request.pfunction->code == Function::node ) + FunNode(); + +} + + + + +void Content::MakePost() +{ + if( !request.pfunction ) + { + log << log1 << "Content: MakePost: no function" << logend; + request.status = Error::no_function; + return; + } + + + switch( request.pfunction->code ) + { + case Function::emacs: + PostFunEmacs(); + break; + + case Function::privileges: + PostFunPrivileges(); + break; + + case Function::login: + PostFunLogin(); + break; + + default: + log << log1 << "Content: unknown post function" << logend; + break; + } +} + + + +void Content::Make() +{ + if( request.dir_table.empty() ) + { + log << log1 << "Content: there is no a root dir" << 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; + + 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; + } + } +} + + + + + + diff --git a/content/content.h b/content/content.h new file mode 100755 index 0000000..36ffc14 --- /dev/null +++ b/content/content.h @@ -0,0 +1,73 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#ifndef headerfilecontent +#define headerfilecontent + +#include +#include + +#include "../templates/templates.h" +#include "../core/request.h" +#include "../core/error.h" +#include "../core/misc.h" +#include "../core/db.h" +#include "../core/user.h" +#include "../core/function.h" +#include "../core/functionparser.h" + + + +class Content +{ + Templates templates; + + + + + void PrepareUrl(Item & item); + + + void SetDefaultFunction(); + bool DirsHaveReadExecPerm(); + + void MakeStandardFunction(); + + + + void MakePost(); + + void FunCat(); + void FunLogout(); + void FunLs(); + void FunEmacs(); + void FunPrivileges(); + void FunRm(); + void FunNode(); + + void PostFunLogin(); + void PostFunEmacsAdd(); + void PostFunEmacsEdit(bool with_url); + void PostFunEmacs(); + void PostFunPrivileges(); + + void RedirectTo(const Item & item); + void RedirectTo(long item_id); + +public: + + bool Init(); + + void Make(); + + +}; + + +#endif diff --git a/content/emacs.cpp b/content/emacs.cpp new file mode 100755 index 0000000..ede7bf7 --- /dev/null +++ b/content/emacs.cpp @@ -0,0 +1,133 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "content.h" + + + + +void Content::PrepareUrl(Item & item) +{ + CorrectUrl(item); + + if( data.functions.GetFunction(item.url) ) + { + // the name provided by an user is the same as a name of a function + // we add one underscore character at the beginning + + // names of functions should not begin with an underscore '_' + // and we can simply add one '_' at the beginning + // and the name will be unique + item.url.insert(item.url.begin(), '_'); + } +} + + + +void Content::PostFunEmacsAdd() +{ + request.session->done = Done::added_item; + + request.is_item = true; + + request.item.user_id = request.session->puser ? request.session->puser->id : -1; + 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; + + if( !request.HasWriteAccess(*request.dir_table.back() ) ) + throw Error(Error::permision_denied); + + request.session->done_status = db.AddItem(request.item); +} + + + +void Content::PostFunEmacsEdit(bool with_url) +{ + request.session->done = Done::edited_item; + + if( !request.HasWriteAccess(request.item) ) + throw Error(Error::permision_denied); + + request.session->done_status = db.EditItemById(request.item, with_url); +} + + + +void Content::PostFunEmacs() +{ + try + { + // these old values are ignored (if exists) + request.item.url = request.PostVar("url"); + request.item.subject = request.PostVar("subject"); + request.item.content = request.PostVar("content"); + + bool with_url = false; + + if( !request.is_item || request.PostVar("old_url") != request.item.url ) + with_url = true; + + PrepareUrl(request.item); + + if( request.is_item ) + PostFunEmacsEdit(with_url); + else + PostFunEmacsAdd(); + } + catch(const Error & e) + { + request.session->done_status = e; + } + + + + if( request.session->done_status == Error::ok ) + { + 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.HasReadWriteAccess(*request.dir_table.back()) ) + request.status = Error::permision_denied; + + return; + } + + // editing an existing item + if( !request.HasReadWriteAccess(request.item) ) + { + request.status = Error::permision_denied; + return; + } +} + + + + diff --git a/content/login.cpp b/content/login.cpp new file mode 100755 index 0000000..b6de905 --- /dev/null +++ b/content/login.cpp @@ -0,0 +1,51 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "content.h" + + + + +void Content::PostFunLogin() +{ + try + { + std::string & login = request.PostVar("login"); + std::string & pass = request.PostVar("password"); + long user_id; + + if( db.CheckUser(login, pass, user_id) ) + { + request.session->puser = data.users.GetUser(user_id); + + if( !request.session->puser ) + { + log << log1 << "Content: user: " << login << " is in the database but is not in data.users" << logend; + return; + } + + log << log2 << "User " << login << " (id: " << user_id << ") logged" << logend; + + if( request.is_item ) + { + RedirectTo(request.item); + } + else + { + RedirectTo(*request.dir_table.back()); + } + } + } + catch(const Error &) + { + } +} + + + diff --git a/content/logout.cpp b/content/logout.cpp new file mode 100755 index 0000000..c5e11b8 --- /dev/null +++ b/content/logout.cpp @@ -0,0 +1,45 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "content.h" + + + + + + + + + + + +void Content::FunLogout() +{ + if( request.session->puser ) + { + log << log2 << "User: " << request.session->puser->name << ", id: " << request.session->puser->id << " logged out" << logend; + + request.session->puser = 0; + } + + request.result = Request::redirect; + std::string path; + + data.dirs.MakePath(request.dir_table.back()->id, path); + + request.str = data.base_url + path; + + if( request.is_item ) + request.str += request.item.url; + + request.session->done = Done::loggedout; + request.session->done_timer = 2; +} + + diff --git a/content/ls.cpp b/content/ls.cpp new file mode 100755 index 0000000..9f25058 --- /dev/null +++ b/content/ls.cpp @@ -0,0 +1,47 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "content.h" + + + + + + + + + + + + +void Content::FunLs() +{ + if( request.is_item ) + { + // we're showing only the item + request.item_table.push_back( request.item ); + return; + } + + // we're showing the whole directory + Item item_ref; + + item_ref.parent_id = request.dir_table.back()->id; + + // !! zrobic inna metode, inny interfejs (jako parametr niech bierze parent_id), i zeby nie odczytywala contentu i subjectu (a moze tylko subject? przyda sie przy ls -l) + db.GetItems(request.item_table, item_ref); +} + + + + + + + + diff --git a/content/node.cpp b/content/node.cpp new file mode 100755 index 0000000..b07e8dd --- /dev/null +++ b/content/node.cpp @@ -0,0 +1,30 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "content.h" + + + + + + +void Content::FunNode() +{ + if( request.param_table.empty() ) + { + //request.status = Error + //!!zglosic 404 + return; + } + + long id = atol( request.param_table[0]->c_str() ); + + RedirectTo(id); +} + diff --git a/content/privileges.cpp b/content/privileges.cpp new file mode 100755 index 0000000..9b57de0 --- /dev/null +++ b/content/privileges.cpp @@ -0,0 +1,83 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "content.h" + + + + + +void Content::PostFunPrivileges() +{ + // !! narazie tylko dla plikow + if( !request.is_item ) + return; + + try + { + long user_id = data.users.GetUserId( request.PostVar("user") ); + long group_id = data.groups.GetGroupId( request.PostVar("group") ); + int privileges = strtol( request.PostVar("privileges").c_str() , 0, 8); + + if( !request.CanChangeUser(request.item, user_id) ) + throw Error(Error::cant_change_user); + + if( !request.CanChangeGroup(request.item, group_id) ) + throw Error(Error::cant_change_group); + + if( !request.CanChangePrivileges(request.item, privileges) ) + throw Error(Error::cant_change_privileges); + + request.item.user_id = user_id; + request.item.group_id = group_id; + request.item.privileges = privileges; + + request.session->done = Done::privileged_item; + request.session->done_status = db.EditPrivById(request.item, request.item.id); + } + catch(const Error & e) + { + log << log1 << "Content: FunChmod: Error: " << e << logend; + request.session->done_status = e; + } + + if( request.session->done_status == Error::ok ) + { + request.session->item = request.item; + request.session->done_timer = 2; + RedirectTo(request.item); + } + else + { + log << log1 << "Content: PostFunPrivileges: Error: " << static_cast(request.session->done_status) << logend; + } +} + + + + + +void Content::FunPrivileges() +{ + if( !request.is_item ) + { + // !! chwilowi tylko dla plikow + request.status == Error::item_required; + return; + } + + // you must be an owner of the item (or a superuser) + // !! moze wykorzystac request.CanChangeUser() ? + if( !request.session->puser || (!request.session->puser->super_user && request.session->puser->id != request.item.user_id) ) + { + request.status = Error::permision_denied; + return; + } + +} diff --git a/content/rm.cpp b/content/rm.cpp new file mode 100755 index 0000000..09b1b76 --- /dev/null +++ b/content/rm.cpp @@ -0,0 +1,69 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "content.h" + + + + + + +void Content::FunRm() +{ + // !! narazie usuwanie tylko dla plikow + + if( !request.is_item ) + { + request.status = Error::permision_denied; + return; + } + + if( !request.HasWriteAccess(*request.dir_table.back()) || !request.HasWriteAccess(request.item) ) + { + request.status = Error::permision_denied; + return; + } + + + if( request.param_table.empty() ) + { + // we'll put some information about the deleted item (on the next page) + request.session->item = request.item; + + // !! zmienic interfejs dla db.DelItem + if( db.DelItem( request.item ) ) + { + request.session->done_status = Error::ok; + log << log2 << "Content: deleted item: subject: " << request.item.subject << ", id: " << request.item.id << logend; + } + else + { + request.session->done_status = Error::db_no_item; + } + + request.session->done = Done::deleted_item; + request.result = Request::redirect; + + RedirectTo(*request.dir_table.back()); + + request.session->done_timer = 2; + } + else + { + if( request.IsParam("potwierdz") ) + { + //request.result = Request::del_item_confirm; + } + else + request.result = Request::err404; + } +} + + + diff --git a/core/Makefile b/core/Makefile new file mode 100755 index 0000000..1f0a504 --- /dev/null +++ b/core/Makefile @@ -0,0 +1,26 @@ +o = data.o log.o sessionmanager.o requestcontroller.o dircontainer.o session.o main.o done.o request.o misc.o httpsimpleparser.o db.o error.o db_itemcolumns.o users.o config.o dirs.o groups.o function.o functionparser.o functions.o + + + +all: core.a + +core.a: $(o) + ar rcs core.a $(o) + +.SUFFIXES: .cpp .o + +.cpp.o: + $(CC) -c $(CFLAGS) $< + + + +depend: + makedepend -Y. -f- *.cpp > Makefile.dep + + +clean: + rm -f *.o + rm -f *.a + + +include Makefile.dep diff --git a/core/Makefile.dep b/core/Makefile.dep new file mode 100755 index 0000000..581d0e9 --- /dev/null +++ b/core/Makefile.dep @@ -0,0 +1,61 @@ +# DO NOT DELETE + +config.o: config.h ../confparser/confparser.h error.h log.h data.h misc.h +config.o: item.h dirs.h db.h dircontainer.h user.h group.h ugcontainer.h +config.o: users.h groups.h functions.h function.h +data.o: data.h misc.h log.h item.h error.h dirs.h db.h dircontainer.h user.h +data.o: group.h ugcontainer.h users.h groups.h functions.h function.h +db.o: db.h log.h item.h misc.h error.h dircontainer.h user.h group.h +db.o: ugcontainer.h +db_itemcolumns.o: db.h log.h item.h misc.h error.h dircontainer.h user.h +db_itemcolumns.o: group.h ugcontainer.h +dircontainer.o: dircontainer.h item.h log.h +dirs.o: dirs.h item.h error.h log.h db.h misc.h dircontainer.h user.h group.h +dirs.o: ugcontainer.h +done.o: done.h +error.o: error.h log.h +function.o: function.h log.h item.h +functionparser.o: functionparser.h request.h requesttypes.h log.h session.h +functionparser.o: error.h item.h done.h user.h getparser.h httpsimpleparser.h +functionparser.o: postparser.h cookieparser.h function.h data.h misc.h dirs.h +functionparser.o: db.h dircontainer.h group.h ugcontainer.h users.h groups.h +functionparser.o: functions.h +functions.o: functions.h function.h log.h item.h +groups.o: groups.h group.h db.h log.h item.h misc.h error.h dircontainer.h +groups.o: user.h ugcontainer.h +httpsimpleparser.o: httpsimpleparser.h +log.o: log.h +main.o: requestcontroller.h data.h misc.h log.h item.h error.h dirs.h db.h +main.o: dircontainer.h user.h group.h ugcontainer.h users.h groups.h +main.o: functions.h function.h request.h requesttypes.h session.h done.h +main.o: getparser.h httpsimpleparser.h postparser.h cookieparser.h +main.o: ../content/content.h ../templates/templates.h ../../ezc/src/ezc.h +main.o: ../core/data.h ../core/request.h ../core/item.h ../core/db.h +main.o: ../core/error.h ../core/user.h ../core/group.h ../core/users.h +main.o: ../core/groups.h ../core/log.h ../core/misc.h ../core/function.h +main.o: ../core/functionparser.h sessionmanager.h config.h +main.o: ../confparser/confparser.h +misc.o: misc.h log.h item.h +request.o: request.h requesttypes.h log.h session.h error.h item.h done.h +request.o: user.h getparser.h httpsimpleparser.h postparser.h cookieparser.h +request.o: function.h +requestcontroller.o: requestcontroller.h data.h misc.h log.h item.h error.h +requestcontroller.o: dirs.h db.h dircontainer.h user.h group.h ugcontainer.h +requestcontroller.o: users.h groups.h functions.h function.h request.h +requestcontroller.o: requesttypes.h session.h done.h getparser.h +requestcontroller.o: httpsimpleparser.h postparser.h cookieparser.h +requestcontroller.o: ../content/content.h ../templates/templates.h +requestcontroller.o: ../../ezc/src/ezc.h ../core/data.h ../core/request.h +requestcontroller.o: ../core/item.h ../core/db.h ../core/error.h +requestcontroller.o: ../core/user.h ../core/group.h ../core/users.h +requestcontroller.o: ../core/groups.h ../core/log.h ../core/misc.h +requestcontroller.o: ../core/function.h ../core/functionparser.h +requestcontroller.o: sessionmanager.h +session.o: session.h requesttypes.h error.h log.h item.h done.h user.h +sessionmanager.o: sessionmanager.h request.h requesttypes.h log.h session.h +sessionmanager.o: error.h item.h done.h user.h getparser.h httpsimpleparser.h +sessionmanager.o: postparser.h cookieparser.h function.h data.h misc.h dirs.h +sessionmanager.o: db.h dircontainer.h group.h ugcontainer.h users.h groups.h +sessionmanager.o: functions.h +users.o: users.h user.h db.h log.h item.h misc.h error.h dircontainer.h +users.o: group.h ugcontainer.h diff --git a/core/config.cpp b/core/config.cpp index cc41f4e..e4056e4 100755 --- a/core/config.cpp +++ b/core/config.cpp @@ -20,27 +20,31 @@ Config::Config() +//!! czy tu w ogole mozemy uzywac log << ? +//!! przeciez jeszcze nie zostal przetworzony plik konfiguracyjny + + void Config::ShowError() { switch( conf_parser.status ) { case ConfParser::ok: - log << log2 << "config syntax ok" << logend; + log << log2 << "Config: syntax ok" << logend; break; case ConfParser::cant_open_file: if( errors_to_stdout ) - std::cout << "cant open a config file: " << data.config_file << std::endl; + std::cout << "Config: cant open a config file: " << data.config_file << std::endl; - log << log1 << "cant open a config file: " << data.config_file << logend; + log << log1 << "Config: cant open a config file: " << data.config_file << logend; break; case ConfParser::syntax_error: if( errors_to_stdout ) - std::cout << "syntax error a config file: line " << conf_parser.line << std::endl; + std::cout << "Config: syntax error, line: " << conf_parser.line << std::endl; - log << log1 << "config file: syntax error: line " << conf_parser.line << logend; + log << log1 << "Config: syntax error, line: " << conf_parser.line << logend; break; } } @@ -56,11 +60,11 @@ bool Config::ReadConfig(bool errors_to_stdout_) if( data.config_file.empty() ) { - log << log2 << "name of the config file is empty" << logend; + log << log2 << "Config: name of the config file is empty" << logend; return false; } - log << log2 << "reading config file" << logend; + log << log2 << "Config: reading a config file" << logend; ConfParser::Status status = conf_parser.Parse( data.config_file.c_str() ); @@ -102,6 +106,9 @@ void Config::AssignValues() data.db_user = Text("db_user"); data.db_pass = Text("db_pass"); data.base_url = Text("base_url"); + + NoLastSlash(data.base_url); + data.one_item_is_showed = Bool("one_item_is_showed"); data.priv_no_user = Text("priv_no_user"); @@ -117,11 +124,11 @@ std::string & Config::Text(const char * name) if( i == conf_parser.table.end() ) { - log << log2 << "warning: " << name << " is not defined in the config, default will be: \"" << default_str << "\"" << logend; + log << log2 << "Config: warning: " << name << " is not defined in the config, default will be: \"" << default_str << "\"" << logend; return default_str; } - //log << log3 << name << "=" << i->second << logend; + log << log3 << "Config: " << name << "=" << i->second << logend; return i->second; } @@ -135,12 +142,12 @@ int Config::Int(const char * name) if( i == conf_parser.table.end() || i->second.empty() ) { - log << log2 << "warning: " << name << " is not defined in the config, default will be: " << default_int << logend; + log << log2 << "Config: warning: " << name << " is not defined in the config, default will be: " << default_int << logend; return default_int; } long res = (i->second[0] == '0')? strtol(i->second.c_str() + 1, 0, 8) : strtol(i->second.c_str(), 0, 10); - log << log3 << name << "=" << res << logend; + log << log3 << "Config: " << name << "=" << res << logend; return res; } @@ -153,7 +160,7 @@ bool Config::Bool(const char * name) if( i == conf_parser.table.end() ) { - log << log2 << "warning: " << name << " is not defined in the config, default will be: " << (default_bool?"true":"false") << logend; + log << log2 << "Config: warning: " << name << " is not defined in the config, default will be: " << (default_bool?"true":"false") << logend; return default_int; } @@ -162,7 +169,7 @@ bool Config::Bool(const char * name) if( i->second == "true" || i->second == "1" || i->second == "yes" ) res = true; - log << log3 << name << "=" << (res?"true":"false") << logend; + log << log3 << "Config: " << name << "=" << (res?"true":"false") << logend; return res; } @@ -170,13 +177,23 @@ return res; +void Config::NoLastSlash(std::string & s) +{ + if( s.empty() ) + return; + + log << log2 << "Config: removing the last slash from: " << s << logend; + + if( *(--s.end()) == '/' ) + s.erase(--s.end()); +} + + + + - - - - diff --git a/core/config.h b/core/config.h index e51ec8f..2e3fe28 100755 --- a/core/config.h +++ b/core/config.h @@ -16,6 +16,8 @@ #include "data.h" #include "log.h" +#include + class Config { @@ -44,6 +46,9 @@ private: bool errors_to_stdout; + + void NoLastSlash(std::string & s); + }; diff --git a/core/content.cpp b/core/content.cpp deleted file mode 100755 index aae3d88..0000000 --- a/core/content.cpp +++ /dev/null @@ -1,570 +0,0 @@ -/* - * This file is a part of CMSLU -- Content Management System like Unix - * and is not publicly distributed - * - * Copyright (c) 2008, Tomasz Sowa - * All rights reserved. - * - */ - -#include "content.h" - - - - -bool Content::Init() -{ - templates.Read(); - - -return true; -} - - - - - -void Content::AddItem() -{ - try - { - request.session->done = Done::added_item; - - if( !request.session->puser || !request.session->puser->super_user ) - // !! chwilowo tylko super user moze - throw Error(Error::permision_denied); - - request.item.user_id = data.users.GetUserId( request.PostVar("user") ); - request.item.group_id = data.groups.GetGroupId( request.PostVar("group") ); - request.item.privileges = strtol( request.PostVar("privileges").c_str() , 0, 8); - request.item.subject = request.PostVar("subject"); - request.item.content = request.PostVar("content"); - request.item.parent_id = data.dirs.GetDirId( request.PostVar("directory") ); - request.item.type = Item::file; - PrepareUrlSubject(request.item); - - request.session->done_status = db.AddItem(request.item); - request.session->done_timer = 2; - request.session->item = request.item; - - RedirectTo(request.item); - - } - catch(const Error & e) - { - log << log1 << "Content: AddItem: Error: " << e << logend; - request.session->done_status = e; - request.session->done_timer = 1; - } -} - - - -void Content::AssertPrivileges(Item & old_item, Item & new_item) -{ - if( !request.CanChangeUser(old_item, new_item.user_id) ) - throw Error(Error::cant_change_user); - - if( !request.CanChangeGroup(old_item, new_item.group_id) ) - throw Error(Error::cant_change_group); - - if( !request.CanChangePrivileges(old_item, new_item.privileges) ) - throw Error(Error::cant_change_privileges); -} - - - -void Content::EditItem() -{ - try - { - request.session->done = Done::edited_item; - - request.item.id = atol( request.PostVar("id").c_str() ); - request.item.user_id = data.users.GetUserId( request.PostVar("user") ); - request.item.group_id = data.groups.GetGroupId( request.PostVar("group") ); - request.item.privileges = strtol( request.PostVar("privileges").c_str() , 0, 8); - request.item.subject = request.PostVar("subject"); - request.item.content = request.PostVar("content"); - - bool with_subject = false; - - if( request.PostVar("old_subject") != request.item.subject ) - with_subject = true; - - request.item.parent_id = data.dirs.GetDirId( request.PostVar("directory") ); // !! moze nie byc takiego, zglosic komunikat - request.item.type = Item::file; - PrepareUrlSubject(request.item); - - Item old_item; - db.GetPriv(old_item, request.item.id); - AssertPrivileges(old_item, request.item); - - if( !request.HasWriteAccess(old_item) ) - throw Error(Error::permision_denied); - - request.session->done_status = db.EditItemById(request.item, with_subject); - } - catch(const Error & e) - { - log << log1 << "Content: EditItem: Error: " << e << logend; - request.session->done_status = e; - } - - request.session->item = request.item; - request.session->done_timer = 2; - RedirectTo(request.item); - -} - - - -void Content::LogUser() -{ - try - { - std::string & login = request.PostVar("login"); - std::string & pass = request.PostVar("password"); - long user_id; - - if( db.CheckUser(login, pass, user_id) ) - { - request.session->puser = data.users.GetUser(user_id); - - if( !request.session->puser ) - { - log << log1 << "Content: user: " << login << " is in the database but is not in data.users" << logend; - return; - } - - request.session->is_logged = true; - request.session->user_id = user_id; - - - log << log2 << "User " << login << " (id: " << user_id << ") logged" << logend; - } - } - catch(const Error &) - { - } -} - - - -void Content::MakeDirectoryStructure() -{ - GetTable::size_type get_table_len = request.get_table.size(); - get_index = 0; - request.dir = -1; - - Item * pdir; - if( !data.dirs.GetRootDir(&pdir) ) - // there is no a root dir - return; - - request.dir = pdir->id; - - for( ; get_index < get_table_len ; ++get_index) - { - if( !data.dirs.GetDir(request.get_table[get_index], pdir->id, &pdir) ) - break; - - request.cur_dir_table.push_back( *pdir ); - } - - request.dir = pdir->id; - data.dirs.GetDirChilds(request.dir, request.dir_table); -} - - - - -Request::Result Content::StandardFunction(std::string & name) -{ -Request::Result res = Request::err404; - - // language polish - // in the future there'll be something here - // names of functions should not begin with an underscore '_' - - if( name == "dodaj" ) - res = Request::add_item; - else - if( name == "edytuj" ) - res = Request::edit_item; - else - if( name == "id" ) - res = Request::show_item_by_id; - else - if( name == "usun" ) - res = Request::del_item; - else - if( name == "potwierdz" ) - res = Request::confirm; - else - if( name == "wyloguj" ) - res = Request::logout; - -return res; -} - - - -void Content::PrepareUrlSubject(Item & item) -{ - SetUrlSubjectFromSubject(item); - - if( StandardFunction(item.url) != Request::err404 ) - { - // names of functions should not begin with an underscore '_' - // and we can simply add one '_' at the beginning - // and the name will be unique - item.url.insert(item.url.begin(), '_'); - } -} - - -bool Content::MakeGetCheckDir() -{ - if( get_index == request.get_table.size() ) - { - // request was for a directory - - //// - if( !request.cur_dir_table.empty() && !request.HasReadAccess(request.cur_dir_table.back()) ) - { - request.result = Request::err_per_denied; - return true; - } - //// - - - db.GetItems(request.item_table, item); - - - - // !! temporarily - long default_id = -1; - if( request.cur_dir_table.empty() ) - { - //default_id = data.dirs.root.default_item; - } - else - { - default_id = request.cur_dir_table.back().default_item; - } - - - if( default_id != -1 ) - { - request.result = Request::show_item; - - std::vector::iterator i; - for(i = request.item_table.begin() ; i != request.item_table.end() ; ++i) - { - if( i->id == default_id ) - request.item_table[0] = *i; - } - - request.item_table.resize(1); - } - else - - if( data.one_item_is_showed && - request.item_table.size() == 1 && - request.item_table[0].type == Item::file ) - { - request.result = Request::show_item; - } - else - { - request.result = Request::show_dir; - } - - return true; - } - - -return false; -} - - - -// zrobic tak ze gdzie podajemy cala liste aby nie ladowac contentu z bazy danych do itemow -void Content::MakeGet() -{ - MakeDirectoryStructure(); - - item.Clear(); - - // request.dir is set by MakeDirectoryStructure() - item.parent_id = request.dir; - - if( MakeGetCheckDir() ) - return; - - // request was for an item or a standard function - request.result = StandardFunction( request.get_table[get_index] ); - - if( request.result != Request::err404 ) - { - // request for a standard function - ++get_index; - return; - } - - if( request.get_table[get_index].empty() ) - // we do not have an empty url - // err404 at the end - return; - - // if we want to search by url then request.get_table[get_index] should not be empty - item.url = request.get_table[get_index++]; - db.GetItems(request.item_table, item); - - if( request.item_table.empty() ) - // err404 at the end - return; - - //// - if( request.HasReadAccess(request.item_table[0]) )// !! tymczasowo dla 0 tylko - request.result = Request::show_item; - else - request.result = Request::err_per_denied; - //// - - if( get_index == request.get_table.size() ) - { - return; - } - - // there is a standard function at the end - request.result = StandardFunction( request.get_table[get_index++] ); -} - - - -void Content::MakeAddItem() -{ - if( !request.session->puser ) - { - // not logged - request.item.Clear(); - } - else - { - request.item.user_id = request.session->puser->id; - } -} - - -void Content::MakeEditItem() -{ - if( !request.item_table.empty() ) - request.item = request.item_table[0]; - else - { - log << log1 << "Content: request.item_table should not be empty" << logend; - request.result = Request::err404; - } -} - - -void Content::AppendCurDir(std::string & dir) -{ - std::vector::size_type a; - - for(a=0 ; apuser || !request.session->puser->super_user ) - // !! chwilowo tylko super user moze - { - - request.result = Request::err_per_denied; - request.CopyFirstItem(); - - return; - } - - - - if( get_index == request.get_table.size() ) - { - request.CopyFirstItem(); - request.session->item = request.item; - - if( db.DelItem( request.item ) ) - { - request.session->done = Done::deleted_item; - request.session->done_status = Error::ok; - log << log2 << "Content: deleted item: subject: " << request.item.subject << ", id: " << request.item.id << logend; - } - else - { - request.session->done = Done::deleted_item; - request.session->done_status = Error::db_no_item; - } - - request.result = Request::redirect; - request.str = data.base_url; - AppendCurDir(request.str); - request.session->done_timer = 2; - } - else - { - if( StandardFunction( request.get_table[get_index++] ) == Request::confirm ) - { - request.result = Request::del_item_confirm; - request.CopyFirstItem(); - } - else - request.result = Request::err404; - } -} - - -void Content::MakeLogout() -{ - if( request.session->is_logged ) - { - log << log2 << "User id: " << request.session->user_id << " logged out" << logend; - - request.session->is_logged = false; - request.session->user_id = 0; - request.session->puser = 0; - } - - request.result = Request::redirect; - std::string path; - data.dirs.MakePath(request.dir, path); - request.str = data.base_url + path; - - if( !request.item_table.empty() ) - request.str += request.item_table[0].url; - - request.session->done = Done::loggedout; - request.session->done_timer = 2; -} - - - -void Content::MakeStandardFunction() -{ - if( request.result == Request::add_item ) - { - MakeAddItem(); - } - else - if( request.result == Request::edit_item ) - { - MakeEditItem(); - } - else - if( request.result == Request::show_item_by_id ) - { - MakeShowItemById(); - } - else - if( request.result == Request::del_item ) - { - MakeDelItem(); - } - else - if( request.result == Request::logout ) - { - MakeLogout(); - } - - -} - - - -void Content::MakePost() -{ - if( request.IsPostVar("add_item") ) - AddItem(); - else - if( request.IsPostVar("edit_item") ) - EditItem(); - else - if( request.IsPostVar("logging") ) - LogUser(); - - -} - - -void Content::Make() -{ - MakePost(); - - if( request.result == Request::redirect ) - return; - - MakeGet(); - MakeStandardFunction(); - - templates.Generate(); - - //request.PrintGetTable(); - //request.PrintEnv(); - //request.PrintIn(); -} - - - -void Content::RedirectTo(const Item & item) -{ -std::string path; - - request.result = Request::redirect; - data.dirs.MakePath(item.parent_id, path); - request.str = data.base_url + path + item.url; -} - - - - - - - - diff --git a/core/content.h b/core/content.h deleted file mode 100755 index 2111a95..0000000 --- a/core/content.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This file is a part of CMSLU -- Content Management System like Unix - * and is not publicly distributed - * - * Copyright (c) 2008, Tomasz Sowa - * All rights reserved. - * - */ - -#ifndef headerfilecontent -#define headerfilecontent - -#include -#include - -#include "templates.h" -#include "request.h" -#include "error.h" -#include "misc.h" -#include "db.h" -#include "user.h" - - - - -class Content -{ - // index to request.get_table - // set after calling MakeDirectoryStructure() - // index of the last item which is not a directory (or is equal get_table.size()) - GetTable::size_type get_index; - - - // temporarily object used for some purposes - Item item; - - - Templates templates; - - - void AssertPrivileges(Item & old_item, Item & new_item); - - void AddItem(); - void EditItem(); - void LogUser(); - - void MakeDirectoryStructure(); - Request::Result StandardFunction(std::string & name); - void PrepareUrlSubject(Item & item); - bool MakeGetCheckDir(); - - void MakeAddItem(); - void MakeEditItem(); - void MakeShowItemById(); - void MakeDelItem(); - void MakeLogout(); - void MakeStandardFunction(); - - - void AppendCurDir(std::string & dir); - - void MakePost(); - void MakeGet(); - - - - void RedirectTo(const Item & item); - -public: - - bool Init(); - - void Make(); - - -}; - - -#endif diff --git a/core/data.h b/core/data.h index bf17d4d..e88c8f9 100755 --- a/core/data.h +++ b/core/data.h @@ -21,7 +21,7 @@ #include "dirs.h" #include "users.h" #include "groups.h" - +#include "functions.h" @@ -76,6 +76,7 @@ public: // if there is one item in a directory // it will be showed // (instead of showing directory contents) + // !! wywalic to, nie bedzie uzywane bool one_item_is_showed; // string used in a place where is a user (or group) selected @@ -111,6 +112,10 @@ public: // groups Groups groups; + // functions (ls, cat, etc) + Functions functions; + + Data(); diff --git a/core/db.cpp b/core/db.cpp index 131bd84..e1f311b 100755 --- a/core/db.cpp +++ b/core/db.cpp @@ -485,7 +485,7 @@ return result; - +// !! with_subject zamienic na with_url Error Db::EditItemInItem(Item & item, bool with_subject) { PGresult * r = 0; @@ -634,6 +634,8 @@ return result; // item.id must be set +// !! with_subject zamienic na with_url +// !! moze nazwa poprostu EditItem (nie trzeba tego ById) ? (sprawdzic czy nie koliduje z inna nazwa) Error Db::EditItemById(Item & item, bool with_subject) { Error result = EditItemGetContentId(item); @@ -760,6 +762,44 @@ void Db::GetItem(std::vector & item_table, long id) +// !! nowy interfejs +Error Db::GetItem(long parent_id, const std::string & url, Item & item) +{ + PGresult * r = 0; + Error result = Error::ok; + + try + { + AssertConnection(); + + std::ostringstream query; + query << "select * from core.item left join core.content on item.content_id = content.id where type='1' and item.parent_id='"; + query << parent_id << "' and item.url='" << Escape(url) << "';"; + + r = AssertQuery( query.str() ); + AssertResultStatus(r, PGRES_TUPLES_OK); + + int rows = PQntuples(r); + + if( rows == 0 ) + throw Error(Error::db_no_item); + + ItemColumns col; + col.SetColumns(r); + col.SetItem(r, 0, item); + } + catch(const Error & e) + { + result = e; + } + + ClearResult(r); + + +return result; +} + + bool Db::GetPriv(Item & item, long id) { bool result = false; @@ -797,6 +837,37 @@ return result; } +// !! to jest nowy interfejs, z jawnym podaniem id +Error Db::EditPrivById(Item & item, long id) +{ + PGresult * r = 0; + Error result = Error::ok; + + try + { + AssertConnection(); + std::ostringstream query; + query << "update core.item set (user_id, group_id, privileges) = ("; + query << '\'' << item.user_id << "', "; + query << '\'' << item.group_id << "', "; + query << '\'' << item.privileges << "' "; + + query << ") where id='" << id << "';"; + + r = AssertQuery(query.str()); + AssertResultStatus(r, PGRES_COMMAND_OK); + } + catch(const Error & e) + { + result = e; + } + + ClearResult(r); + +return result; +} + + bool Db::DelItemDelItem(const Item & item) diff --git a/core/db.h b/core/db.h index d669eea..9d3c07e 100755 --- a/core/db.h +++ b/core/db.h @@ -45,11 +45,15 @@ public: void GetItems(std::vector & item_table, Item & item_ref); void GetItem(std::vector & item_table, long id); bool GetPriv(Item & item, long id); + Error EditPrivById(Item & item, long id); + bool DelItem(const Item & item); void GetDirs(DirContainer & dir_table); void GetUsers(UGContainer & user_table); void GetGroups(UGContainer & group_table); + // !! nowy interfejs + Error GetItem(long parent_id, const std::string & url, Item & item); protected: diff --git a/core/dirs.cpp b/core/dirs.cpp index 10a309c..45f4c7e 100755 --- a/core/dirs.cpp +++ b/core/dirs.cpp @@ -179,6 +179,18 @@ return true; } +bool Dirs::GetDirChilds(long parent, std::vector & childs_table) +{ + if( parent != -1 && !IsDir(parent) ) + return false; + + DirContainer::ParentIterator i = dir_table.FindFirstParent(parent); + + for( ; i != dir_table.ParentEnd() ; i = dir_table.NextParent(i) ) + childs_table.push_back( &(*i->second) ); + +return true; +} @@ -213,7 +225,7 @@ DirContainer::Iterator i; // with exceptions -Item * Dirs::GetDir(const std::string & path) +Item * Dirs::GetDirT(const std::string & path) { Item * pitem; @@ -224,7 +236,7 @@ return pitem; } -Item * Dirs::GetDir(const std::string & name, long parent) +Item * Dirs::GetDirT(const std::string & name, long parent) { Item * pitem; @@ -236,7 +248,7 @@ return pitem; } -long Dirs::GetDirId(const std::string & path) +long Dirs::GetDirIdT(const std::string & path) { long id; @@ -247,7 +259,7 @@ return id; } -long Dirs::GetDirId(const std::string & name, long parent) +long Dirs::GetDirIdT(const std::string & name, long parent) { long id; @@ -259,3 +271,67 @@ return id; +// !! nowy interfejs + + + +Item * Dirs::GetRootDir() +{ + DirContainer::Iterator root = dir_table.GetRoot(); + + if( root == dir_table.End() ) + return 0; + +return &(*root); +} + + +Item * Dirs::GetDir(const std::string & name, long parent) +{ + DirContainer::ParentIterator i = dir_table.FindFirstParent(parent); + + for( ; i!=dir_table.ParentEnd() ; i = dir_table.NextParent(i) ) + if( i->second->url == name ) + return &(*i->second); + +return 0; +} + + + +Item * Dirs::GetDir(const std::string & path) +{ + DirContainer::Iterator root = dir_table.GetRoot(); + + if( root == dir_table.End() ) + // ops, we do not have a root dir + return 0; + + Item * pitem = &(*root); + + std::string name; + const char * s = path.c_str(); + + while( ExtractName(s, name) ) + { + pitem = GetDir(name, pitem->id); + + if( !pitem ) + return 0; + } + + +return pitem; +} + + +Item * Dirs::GetDir(long id) +{ + DirContainer::Iterator i = dir_table.FindId(id); + + if( i == dir_table.End() ) + return 0; + +return &(*i); +} + diff --git a/core/dirs.h b/core/dirs.h index 604b8c1..c8cb4f9 100755 --- a/core/dirs.h +++ b/core/dirs.h @@ -56,17 +56,32 @@ public: bool GetDirId(const std::string & path, long * id); bool GetDirId(const std::string & name, long parent, long * id); + //!! ta nie bedzie chyba potrzebna bool GetDirChilds(long parent, std::vector & childs_table); // only returns dir-children + bool GetDirChilds(long parent, std::vector & childs_table); // only returns dir-children + bool MakePath(long id, std::string & path); // with an Error exception // if the path or name are invalid these methods throw an exception - Item * GetDir(const std::string & path); + Item * GetDirT(const std::string & path); + Item * GetDirT(const std::string & name, long parent); + long GetDirIdT(const std::string & path); + long GetDirIdT(const std::string & name, long parent); + + + + // !! nowy interfejs + + // returns null if there is no a root dir + Item * GetRootDir(); Item * GetDir(const std::string & name, long parent); - long GetDirId(const std::string & path); - long GetDirId(const std::string & name, long parent); + Item * GetDir(const std::string & path); + Item * GetDir(long id); + + }; diff --git a/core/done.cpp b/core/done.cpp index 452f3a2..d07b06c 100755 --- a/core/done.cpp +++ b/core/done.cpp @@ -40,3 +40,8 @@ bool Done::operator!=(Code c) const return code != c; } + +Done::operator int() +{ + return static_cast( code ); +} diff --git a/core/done.h b/core/done.h index 0280dc9..928b39d 100755 --- a/core/done.h +++ b/core/done.h @@ -12,17 +12,18 @@ -// what have been done +// what has been done class Done { public: enum Code { - none, + none = 0, added_item, edited_item, deleted_item, + privileged_item, loggedout }; @@ -33,7 +34,8 @@ public: bool operator==(Code c) const; bool operator!=(Code c) const; - + operator int(); + private: Code code; diff --git a/core/error.cpp b/core/error.cpp index 4ff68a4..55b0f7b 100755 --- a/core/error.cpp +++ b/core/error.cpp @@ -63,6 +63,16 @@ bool Error::operator!=(Code c) const return code != c; } +bool Error::operator==(const Error & e) const +{ + return code == e.code; +} + + +bool Error::operator!=(const Error & e) const +{ + return code != e.code; +} std::ostream & operator<<(std::ostream & out, const Error & e) { diff --git a/core/error.h b/core/error.h index b8d4a42..ecb28d2 100755 --- a/core/error.h +++ b/core/error.h @@ -29,17 +29,21 @@ public: db_incorrect_query, db_incorrent_result_status, db_no_column, - db_no_item, + db_no_item, // !! zamienic na no_item db_incorrect_login, db_more_than_one_login, db_err_currval, - no_cookie, + no_postvar, incorrect_dir, cant_change_user, cant_change_group, cant_change_privileges, - permision_denied, + permision_denied, // !! permission_denied (dwa ss) + no_root_dir, + no_function, // !! zamienic na no_function + item_required, // !! zamienic na no_item (i usunac db_no_item) + unknown = 1000 @@ -57,6 +61,8 @@ public: bool operator==(Code c) const; bool operator!=(Code c) const; + bool operator==(const Error & e) const; + bool operator!=(const Error & e) const; friend std::ostream & operator<<(std::ostream & out, const Error & e); friend Log & operator<<(Log & out, const Error & e); @@ -70,10 +76,5 @@ private: }; -std::ostream & operator<<(std::ostream & out, const Error & e); -Log & operator<<(Log & out, const Error & e); - - - #endif diff --git a/core/function.cpp b/core/function.cpp new file mode 100755 index 0000000..57cab75 --- /dev/null +++ b/core/function.cpp @@ -0,0 +1,53 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "function.h" + + + +Function::Function() +{ + code = none; +} + + +Function::Function(const Function & f) +{ + code = f.code; + item = f.item; +} + + + +Function & Function::operator=(const Function & f) +{ + code = f.code; + item = f.item; + +return *this; +} + + + + + + + + + + + + + + + + + + + diff --git a/core/function.h b/core/function.h new file mode 100755 index 0000000..ddafd77 --- /dev/null +++ b/core/function.h @@ -0,0 +1,52 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#ifndef headerfilefunction +#define headerfilefunction + +#include +#include "log.h" +#include "item.h" + + + + +class Function +{ + +public: + + enum Code + { + none, + ls, + cat, + node, + emacs, + privileges, + rm, + login, + logout + }; + + + Code code; + Item item; + + + Function(); + Function(const Function & f); + Function & operator=(const Function & f); + +}; + + + + +#endif diff --git a/core/functionparser.cpp b/core/functionparser.cpp new file mode 100755 index 0000000..c748690 --- /dev/null +++ b/core/functionparser.cpp @@ -0,0 +1,181 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "functionparser.h" + + + + + +void FunctionParser::SkipEmptyString(const char * msg) +{ + for( ; get_index != get_table_len && request.get_table[get_index].empty() ; ++get_index ) + log << log3 << msg << logend; +} + + + + +void FunctionParser::ParseDirectories() +{ + Item * pdir = data.dirs.GetRootDir(); + + if( !pdir ) + { + // there is no the root dir + request.status = Error::no_root_dir; + return; + } + + while( true ) + { + request.dir_table.push_back( pdir ); + log << log3 << "FP: Directory: "; + + if( pdir->parent_id == -1 ) + log << "(root)" << logend; + else + log << pdir->url << logend; + + SkipEmptyString("FP: Directory: skipped empty string"); + + if( get_index == get_table_len ) + break; + + pdir = data.dirs.GetDir(request.get_table[get_index], pdir->id); + + if( !pdir ) + break; + + ++get_index; + } +} + + + +void FunctionParser::ParseItem() +{ + SkipEmptyString("FP: Item: skipped empty string"); + + if( get_index == get_table_len ) + return; + + // request.dir_table has at least one element + long parent_id = request.dir_table.back()->id; + const std::string & url = request.get_table[get_index]; + + request.status = db.GetItem(parent_id, url, request.item); + + if( request.status == Error::ok ) + { + ++get_index; + request.is_item = true; + log << log3 << "FP: Item: id: " << request.item.id << ", url: " << request.item.url << logend; + } + else + log << log3 << "FP: No Item: url: " << url << logend; +} + + + +void FunctionParser::ParseFunction() +{ + SkipEmptyString("FP: Function: skipped empty string"); + + if( get_index == get_table_len ) + return; + + request.pfunction = data.functions.GetFunction(request.get_table[get_index]); + + + if( request.pfunction ) + { + ++get_index; + log << log3 << "FP: Function: " << request.pfunction->item.url << logend; + } +} + + + +void FunctionParser::ParseParams() +{ + while( true ) + { + SkipEmptyString("FP: Params: skipped empty string"); + + if( get_index == get_table_len ) + break; + + request.param_table.push_back( &request.get_table[get_index] ); + log << log3 << "FP: Params: " << request.get_table[get_index] << logend; + + ++get_index; + } +} + + + + +void FunctionParser::Parse() +{ + request.status = Error::ok; + get_index = 0; + get_table_len = request.get_table.size(); + request.pfunction = 0; + request.is_item = false; + + ParseDirectories(); + + if( request.status != Error::ok ) + return; + + ParseFunction(); + + if( !request.pfunction ) + { + ParseItem(); + + if( request.status != Error::ok ) + return; + + ParseFunction(); + + if( !request.pfunction && get_index != get_table_len ) + { + request.status = Error::no_function; + log << log3 << "FP: Parse: unknown function: \"" << request.get_table[get_index] << "\"" << logend; + return; + } + } + + ParseParams(); +} + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/functionparser.h b/core/functionparser.h new file mode 100755 index 0000000..ad1e5ee --- /dev/null +++ b/core/functionparser.h @@ -0,0 +1,45 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#ifndef headerfilefunctionparser +#define headerfilefunctionparser + +#include "request.h" +#include "log.h" +#include "item.h" +#include "error.h" +#include "data.h" +#include "db.h" + + + + + +class FunctionParser +{ + GetTable::size_type get_index; + GetTable::size_type get_table_len; + + void SkipEmptyString(const char * msg); + + void ParseDirectories(); + void ParseItem(); + void ParseFunction(); + void ParseParams(); + +public: + + + void Parse(); + + +}; + + +#endif diff --git a/core/functions.cpp b/core/functions.cpp new file mode 100755 index 0000000..c006f5d --- /dev/null +++ b/core/functions.cpp @@ -0,0 +1,113 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "functions.h" + + + + + + +void Functions::Clear() +{ + table.clear(); +} + + + +void Functions::ReadFunctions() +{ + Clear(); + + Function f; + + f.item.user_id = -1; + f.item.group_id = -1; + f.item.privileges = 0644; + f.item.parent_id = -1; // !! temporarily doesn't matter + f.item.id = -1; + f.item.type = Item::file; + + // in the future we will read these functions from the database + f.code = Function::ls; + f.item.url = "list"; + table.insert( std::make_pair(f.item.url, f) ); + + f.code = Function::cat; + f.item.url = "wyswietl"; + table.insert( std::make_pair(f.item.url, f) ); + + f.code = Function::node; + f.item.url = "node"; + table.insert( std::make_pair(f.item.url, f) ); + + f.code = Function::emacs; + f.item.url = "edytuj"; + table.insert( std::make_pair(f.item.url, f) ); + + f.code = Function::privileges; + f.item.url = "uprawnienia"; + table.insert( std::make_pair(f.item.url, f) ); + + f.code = Function::rm; + f.item.url = "usun"; + table.insert( std::make_pair(f.item.url, f) ); + + f.code = Function::logout; + f.item.url = "wyloguj"; + table.insert( std::make_pair(f.item.url, f) ); + + f.code = Function::login; + f.item.url = "login"; + table.insert( std::make_pair(f.item.url, f) ); +} + + + + + +Function * Functions::GetFunction(const std::string & name) +{ +Table::iterator i = table.find(name); + + if( i == table.end() ) + return 0; + +return &(i->second); +} + + +// !! in the future there will be a special container where we can search through the Code object +Function * Functions::GetFunction(Function::Code code) +{ +Table::iterator i = table.begin(); + + for( ; i != table.end() ; ++i ) + { + if( i->second.code == code ) + return &(i->second); + } + + +return 0; +} + + + + + + + + + + + + + + diff --git a/core/functions.h b/core/functions.h new file mode 100755 index 0000000..236aa96 --- /dev/null +++ b/core/functions.h @@ -0,0 +1,42 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#ifndef headerfilefunctions +#define headerfilefunctions + +#include +#include +#include "function.h" + + + + +class Functions +{ + +typedef std::map Table; +Table table; + +public: + + + + void Clear(); + void ReadFunctions(); + + Function * GetFunction(const std::string & name); + Function * GetFunction(Function::Code code); + + + +}; + + + +#endif diff --git a/core/log.cpp b/core/log.cpp index c6dd4ad..48d6d71 100755 --- a/core/log.cpp +++ b/core/log.cpp @@ -25,6 +25,8 @@ void Log::Init(int log_l, const std::string & log_f, bool log_std) log_stdout = log_std; } + + Log & Log::operator<<(const char * s) diff --git a/core/log.h b/core/log.h index 92d82ad..6043552 100755 --- a/core/log.h +++ b/core/log.h @@ -17,9 +17,12 @@ #include +// !! dodac manipulator logsave, logi zostana zapisane pod koniec wykonywania jednego requesta (albo po kilku w zaleznosci od jakiejs opcji w konfigu) +// logsave zostanie wywolane w requestcontroller.cpp przy konczeniu wykonywania requesta enum Manipulators { logend, log1, log2, log3 }; + class Log { std::ostringstream buffer; @@ -32,7 +35,6 @@ public: Log(); void Init(int log_l, const std::string & log_f, bool log_std); - Log & operator<<(const char * s); Log & operator<<(const std::string & s); diff --git a/core/main.cpp b/core/main.cpp index 2d32d26..82f610f 100755 --- a/core/main.cpp +++ b/core/main.cpp @@ -103,7 +103,8 @@ RequestController req_controller; return 1; log << log2 << "checking for table consistency:" << logend; - db.CheckAllUrlSubject(); + // !! zrobic wyjatek dla root + //db.CheckAllUrlSubject(); log << log1 << "cmslu started" << logend; diff --git a/core/misc.cpp b/core/misc.cpp index f924efa..4f8e599 100755 --- a/core/misc.cpp +++ b/core/misc.cpp @@ -31,8 +31,54 @@ static char buffer[50]; -void SetUrlSubjectFromSubject(Item & item) + +bool CorrectUrlChar(char c) { + if( (c >= 'a' && c <='z') || + (c >= 'A' && c <='Z') || + (c >= '0' && c <='9') || + (c == '(' || c == ')' || c == '.' || c == ',' || c == '_' ) + ) + { + return true; + } + +return false; +} + + +void CorrectUrl(Item & item) +{ +std::string::iterator i; + + for(i = item.url.begin(); i!=item.url.end() ; ++i) + { + if( !CorrectUrlChar(*i) ) + { + int c = ChangeLocalChar(*i); + + if( CorrectUrlChar(c) ) + *i = c; + else + *i = '_'; + } + } + + if( item.url.empty() ) + item.url = "bez_nazwy"; // !! wrzucic do pliku konfiguracyjnego + else + if( item.url[0] >= '0' && item.url[0] <= '9' ) + // url must begin with a letter + item.url.insert(item.url.begin(), '_'); +} + + +void SetUrlFromSubject(Item & item) +{ + item.url = item.subject; + CorrectUrl(item); + +/* std::string::iterator i; item.url.clear(); @@ -59,10 +105,12 @@ std::string::iterator i; if( item.url[0] >= '0' && item.url[0] <= '9' ) // url must begin with a letter item.url.insert(item.url.begin(), '_'); +*/ } + int polish_letters_simple[] = { 'a', 'A', 'c', 'C', @@ -108,7 +156,7 @@ return c; } -void HtmlSpecial(std::ostringstream & out, const std::string & in) +void HtmlEscape(std::ostringstream & out, const std::string & in) { std::string::const_iterator i; @@ -128,11 +176,11 @@ std::string::const_iterator i; } -std::string HtmlSpecial(const std::string & in) +std::string HtmlEscape(const std::string & in) { std::ostringstream out; - HtmlSpecial(out, in); + HtmlEscape(out, in); return out.str(); } diff --git a/core/misc.h b/core/misc.h index 51800c1..30f9037 100755 --- a/core/misc.h +++ b/core/misc.h @@ -17,16 +17,20 @@ #include "item.h" #define MAJOR_VER 0 -#define MINOR_VER 1 +#define MINOR_VER 2 #define REVISION_VER 0 void ToString(std::string & s, int value); void ToString(std::string & s, long value); -void SetUrlSubjectFromSubject(Item & item); int ChangeLocalChar(unsigned char c); -void HtmlSpecial(std::ostringstream & out, const std::string & in); -std::string HtmlSpecial(const std::string & in); + +bool CorrectUrlChar(char c); +void CorrectUrl(Item & item); +void SetUrlFromSubject(Item & item); + +void HtmlEscape(std::ostringstream & out, const std::string & in); +std::string HtmlEscape(const std::string & in); #endif diff --git a/core/request.cpp b/core/request.cpp index b2d680e..0484ec1 100755 --- a/core/request.cpp +++ b/core/request.cpp @@ -13,13 +13,18 @@ Request::Request() : char_empty(0) { + id = 0; Clear(); } void Request::Clear() { - // warning: don't clear in, out, err, env + // warning: don't clear: in, out, err, env + + // id is never 0 + if( ++id == 0 ) + ++id; get_table.clear(); post_table.clear(); @@ -40,15 +45,22 @@ void Request::Clear() session = 0; - result = err404; // tutaj moze cos lepszego, cos w stylu 'not implemented' + result = err404; // !! tutaj moze cos lepszego, cos w stylu 'not implemented' - dir = -1; - cur_dir_table.clear(); +// dir = -1; +// cur_dir_table.clear(); item_table.clear(); - dir_table.clear(); +// dir_table2.clear(); item.Clear(); str.clear(); + + dir_table.clear(); + is_item = false; + pfunction = 0; + param_table.clear(); + + status = Error::ok; } @@ -113,14 +125,29 @@ std::string & Request::PostVar(const char * var) p = post_table.find(var); if( p == post_table.end() ) - throw Error(Error::no_cookie); - + { + throw Error(Error::no_postvar); + } + return p->second; } - - +/* +bool Request::PostVar(const char * var, std::string & result) +{ + PostTable::iterator p; + + p = post_table.find(var); + + if( p == post_table.end() ) + return false; + + result = p->second; + +return true; +} +*/ @@ -197,13 +224,12 @@ void Request::ReadEnvVariables() // we store that values because FCGX_GetParam has O(n) complexity // with this variables (env_*) we have O(1) - env_request_method = SetEnvVar("REQUEST_METHOD"); - env_request_uri = SetEnvVar("REQUEST_URI"); - env_http_cookie = SetEnvVar("HTTP_COOKIE"); - env_remote_addr = SetEnvVar("REMOTE_ADDR"); - env_http_host = SetEnvVar("HTTP_HOST"); - - log << log1 << "IP: " << env_remote_addr << logend; + env_request_method = SetEnvVar("REQUEST_METHOD"); + env_request_uri = SetEnvVar("REQUEST_URI"); + env_http_cookie = SetEnvVar("HTTP_COOKIE"); + env_remote_addr = SetEnvVar("REMOTE_ADDR"); + env_http_host = SetEnvVar("HTTP_HOST"); + env_http_user_agent = SetEnvVar("HTTP_USER_AGENT"); } @@ -222,7 +248,7 @@ void Request::CheckMethod() void Request::ReadParameters() { -// some parameters (get) we have always +// !!some parameters (get) we have always // if( method == get ) { GetParser get_parser(env_request_uri, get_table); @@ -240,10 +266,30 @@ void Request::ReadParameters() } + +void Request::StandardLog() +{ + time_t t = std::time(0); + std::tm * loct = std::localtime(&t); + + char buffer[70]; + sprintf(buffer, "%d.%02d.%02d %02d:%02d:%02d ", int(loct->tm_year + 1900), + int(loct->tm_mon + 1), + int(loct->tm_mday), + int(loct->tm_hour), + int(loct->tm_min), + int(loct->tm_sec)); + + log << log1 << buffer << env_remote_addr << ' ' << env_request_method << ' ' << env_request_uri << ' ' << env_http_user_agent << logend; +} + + + // reading everything void Request::Read() { - ReadEnvVariables(); + ReadEnvVariables(); + StandardLog(); CheckMethod(); ReadParameters(); } @@ -257,7 +303,7 @@ void Request::SendAll() FCGX_PutS("Status: 301 Moved Permanently\r\n", out); FCGX_FPrintF(out, "Location: %s\r\n", str.c_str()); - log << log2 << "Redirect into: " << str << logend; + log << log2 << "Redirect to: " << str << logend; } else { @@ -288,6 +334,21 @@ void Request::SendAll() +bool Request::IsParam(const char * s) +{ + std::vector::iterator i; + + for(i=param_table.begin() ; i!=param_table.end() ; ++i) + { + if( **i == s ) + return true; + } + +return false; +} + + + bool Request::CanChangeUser(const Item & item, long new_user_id) { if( !session ) diff --git a/core/request.h b/core/request.h index 0f4931c..a2e4e43 100755 --- a/core/request.h +++ b/core/request.h @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include "requesttypes.h" #include "log.h" #include "session.h" @@ -22,10 +24,18 @@ #include "cookieparser.h" #include "item.h" #include "error.h" +#include "function.h" struct Request { + // request id + // is incremented for each request and is never 0 + // (from -1 will be incremented twice) + // it's used for some optimalization e.g. in templates + size_t id; + + FCGX_Stream * in, * out, * err; FCGX_ParamArray env; // defined as 'char **' @@ -48,6 +58,7 @@ struct Request const char * env_http_cookie; const char * env_remote_addr; const char * env_http_host; + const char * env_http_user_agent; // current session // is set after calling session_manager.SetSession() @@ -55,29 +66,51 @@ struct Request // 'done_status' is set if 'done' is different than 'nothing' - Error done_status; + Error done_status; // !! wywalic - jest przeciez w session // what to do enum Result { err_internal, err404, err_per_denied, show_dir, show_item, show_item_by_id, add_item, edit_item, del_item, del_item_confirm, confirm, redirect, logout } result; // zamienic na to_do - - - // current directory e.g. /foo/bar - std::vector cur_dir_table; + + // !! nowe skladowe + // current directory + // !! zapewnic aby byl minimum jeden katalog (root) + + // !! moze nazwac to poprostu dir? + std::vector dir_table; + + bool is_item; + + // this item is used for many purposes such as editing, adding an item etc. + Item item; + + // null if there is no a function + Function * pfunction; + + // !! moze nazwac to poprostu param? + std::vector param_table; + + Error status; + + // ------------------ + + // !! stare skladowe + // current directory e.g. /foo/bar + //std::vector cur_dir_table; // id of the last directory (bar) or -1 - long dir; + //long dir; + + // ------------------ // items in the current directory // maybe without contents? std::vector item_table; // directories in the current directory - std::vector dir_table; + //std::vector dir_table2; - // this item is used for many purposes such as editing, adding an item etc. - Item item; // this string is used for many purposes such as redirecting std::string str; @@ -91,14 +124,17 @@ struct Request void Clear(); + bool IsParam(const char * s); + void SetCookie(const char * name, const char * value); void SetCookie(const char * name, long value); bool IsPostVar(const char * var); std::string & PostVar(const char * var); // with a throw - + //bool PostVar(const char * var, std::string & result); // item_table[0] -> item + // !! to tez nie bedzie potrzebne void CopyFirstItem(); @@ -126,6 +162,9 @@ private: const char char_empty; const char * SetEnvVar(const char * var); + + void StandardLog(); + }; diff --git a/core/requestcontroller.cpp b/core/requestcontroller.cpp index 33f1b4e..abbb05b 100755 --- a/core/requestcontroller.cpp +++ b/core/requestcontroller.cpp @@ -99,6 +99,7 @@ bool RequestController::Init() data.dirs.ReadDirs(); data.users.ReadUsers(); data.groups.ReadGroups(); + data.functions.ReadFunctions(); // if( !content.Init() ) @@ -131,7 +132,7 @@ void RequestController::Loop() { while( FCGX_Accept(&request.in, &request.out, &request.err, &request.env) == 0 ) { - log << log2 << "start request" << logend; + log << log2 << "---------------------------------------------------------------------------------" << logend; try { @@ -143,13 +144,15 @@ void RequestController::Loop() // and then BaseUrlRedirect() will be called (for performance) if( !BaseUrlRedirect() ) { - session_manager.SetSession(); // setting request.session as well + session_manager.SetSession(); // set request.session as well request.session->CheckTimers(); + + function_parser.Parse(); content.Make(); } - request.SendAll(); + request.SendAll(); } catch(const std::exception & e) { @@ -165,10 +168,6 @@ void RequestController::Loop() } - log << log2 << "end request" << logend; - log << log2 << "---------------------------------------------------------------------------------" << logend; - - // !! this should be immediately after FCGX_Accept() but signals don't want to break FCGX_Accept if( data.signal_hup ) { diff --git a/core/requestcontroller.h b/core/requestcontroller.h index 9a56598..a0a769e 100755 --- a/core/requestcontroller.h +++ b/core/requestcontroller.h @@ -21,7 +21,7 @@ #include "data.h" #include "log.h" #include "request.h" -#include "content.h" +#include "../content/content.h" #include "sessionmanager.h" #include "postparser.h" #include "cookieparser.h" @@ -34,6 +34,8 @@ class RequestController bool BaseUrlRedirect(); + FunctionParser function_parser; + public: RequestController(); diff --git a/core/session.cpp b/core/session.cpp index 60652dd..424a866 100755 --- a/core/session.cpp +++ b/core/session.cpp @@ -22,8 +22,6 @@ void Session::Clear() { id = 0; time = 0; - is_logged = false; - user_id = -1; puser = 0; done = Done::none; done_status = Error::ok; @@ -31,6 +29,7 @@ void Session::Clear() done_timer = 0; } + bool Session::operator==(const Session & s) const { return id == s.id; diff --git a/core/session.h b/core/session.h index 9d3017d..2503afb 100755 --- a/core/session.h +++ b/core/session.h @@ -22,15 +22,12 @@ struct Session { // 0 - means that there is no session - long id; + long id; + + // when this session was created int time; - - bool is_logged; - - // !! moze tutaj -1 kiedy nie zalogowany i wywalic is_logged? - long user_id; // logged user - // !! moze wywalic user_id i zostawic tylko to? kiedy nie zalogowany to bedzie tutaj 0 + // 0 - means that nobody is logged User * puser; // what is done diff --git a/core/templates.cpp b/core/templates.cpp deleted file mode 100755 index aca812b..0000000 --- a/core/templates.cpp +++ /dev/null @@ -1,788 +0,0 @@ -/* - * This file is a part of CMSLU -- Content Management System like Unix - * and is not publicly distributed - * - * Copyright (c) 2008, Tomasz Sowa - * All rights reserved. - * - */ - -#include "templates.h" - - - - -namespace TemplatesFunctions -{ -Pattern pat_index; -Pattern pat_item; -Pattern pat_dir; -Pattern pat_item_add_edit; -Pattern pat_item_del_confirm; -Pattern pat_err_404; -Pattern pat_err_per_denied; -Pattern pat_err_internal; - -Functions functions; - - -void is_group_tv(Info & i) -{ - long gid = data.groups.GetGroupId("tv"); - - if( request.session->puser && request.session->puser->IsMemberOf(gid) ) - i.result = true; -} - - -void language(Info & i) -{ - // at the moment only Polish language - i.out << "pl"; -} - -void title(Info & i) -{ - i.out << ""; -} - - -void charset(Info & i) -{ - i.out << "iso-8859-2"; -} - - -void version_major(Info & i) -{ - i.out << MAJOR_VER; -} - - -void version_minor(Info & i) -{ - i.out << MINOR_VER; -} - - - -void version_revision(Info & i) -{ - i.out << REVISION_VER; -} - - -void user_name(Info & i) -{ - User * puser = data.users.GetUser(request.session->user_id); - - if( puser ) - i.out << puser->name; -} - - - - -void content(Info & i) -{ -Pattern * p; - - switch( request.result ) - { - case Request::add_item: - case Request::edit_item: - p = &pat_item_add_edit; - break; - - case Request::show_dir: - p = &pat_dir; - break; - - case Request::show_item: - p = &pat_item; - break; - - case Request::del_item_confirm: - p = &pat_item_del_confirm; - break; - - case Request::err_internal: - p = &pat_err_internal; - break; - - case Request::err_per_denied: - p = &pat_err_per_denied; - break; - - case Request::err404: - default: - p = &pat_err_404; - } - - Generator gen(i.out, *p, functions); - - gen.Generate(); -} - - -void base_url(Info & i) -{ - i.out << data.base_url; -} - - -void current_url(Info & i) -{ - i.out << request.env_request_uri; -} - - - - -void user_logged(Info & i) -{ - i.result = request.session->is_logged; -} - - -void user_super_user(Info & i) -{ - if( request.session->puser && request.session->puser->super_user ) - i.result = true; -} - - - - - -void item_id(Info & i) -{ - i.out << request.item.id; -} - -void item_subject(Info & i) -{ - i.out << request.item.subject; -} - - -void item_content(Info & i) -{ - i.out << request.item.content; -} - - -void item_subject_escape(Info & i) -{ - i.out << HtmlSpecial(request.item.subject); -} - - -void item_content_escape(Info & i) -{ - i.out << HtmlSpecial(request.item.content); -} - - -void item_privileges(Info & i) -{ - i.out << std::setbase(8) << request.item.privileges << std::setbase(10); -} - - -void item_url_subject(Info & i) // !! zmienic nazwe -{ - i.out << request.item.url; -} - - -void item_dir(Info & i) -{ -std::string path; - - if( data.dirs.MakePath(request.item.parent_id, path) ) - { - i.out << path; - } - else - { - i.out << "problem with generating a path"; - } -} - - -// --------- - - -void old_item_id(Info & i) -{ - i.out << request.session->item.id; -} - -void old_item_subject(Info & i) -{ - i.out << HtmlSpecial(request.session->item.subject); -} - - -void old_item_content(Info & i) -{ - //i.out << HtmlSpecial(request.session->item.content); -i.out << request.session->item.content; -} - - -void old_item_url_subject(Info & i) // zmienic nazwe !! -{ - i.out << request.session->item.url; -} - - -void old_item_dir(Info & i) -{ -std::string path; - - if( data.dirs.MakePath(request.session->item.parent_id, path) ) - { - i.out << path; - } - else - { - i.out << "problem with generating a path"; - } -} - - - -// ---- - -void full_dir(Info & i) -{ -std::vector::size_type a; - - for(a=0 ; a::size_type item_index, dir_index; - - - -void dir_items(Info & i) -{ - if( i.iter >= (int)request.dir_table.size() ) - { - i.result = false; - } - else - { - i.result = true; - dir_index = i.iter; - } -} - - -void dir_subject2(Info & i) -{ - if( dir_index < request.dir_table.size() ) - { - if( request.dir_table[dir_index].subject.empty() ) - i.out << "bez nazwy"; - else - HtmlSpecial(i.out, request.dir_table[dir_index].subject); - } -} - -void dir_url_subject2(Info & i) // zmienic nazwe -{ - if( dir_index < request.dir_table.size() ) - { - HtmlSpecial(i.out, request.dir_table[dir_index].url); - } -} - - -void items(Info & i) // zamienic na fitems !! -{ - if( i.iter >= (int)request.item_table.size() ) - { - i.result = false; - } - else - { - i.result = true; - item_index = i.iter; - } -} - - -void item_subject2(Info & i) -{ - if( item_index < request.item_table.size() ) - { - if( request.item_table[item_index].subject.empty() ) - i.out << "bez nazwy"; - else - HtmlSpecial(i.out, request.item_table[item_index].subject); - } -} - -void item_url_subject2(Info & i) // !! zmienic nazwe -{ - if( item_index < request.item_table.size() ) - HtmlSpecial(i.out, request.item_table[item_index].url); -} - -void item_content2(Info & i) -{ - if( item_index < request.item_table.size() ) - //HtmlSpecial(i.out, request.item_table[item_index].content); - i.out << request.item_table[item_index].content; -} - -void item_id2(Info & i) -{ - if( item_index < request.item_table.size() ) - i.out << request.item_table[item_index].id; -} - - - -void incorrect_dir(Info & i) -{ - if( request.session->done_status == Error::incorrect_dir ) - i.result = true; - else - i.result = false; -} - - - -std::vector::size_type current_dir_index; - - - -void fcurrent_dir(Info & i) -{ - if( i.iter < (int)request.cur_dir_table.size() ) - { - current_dir_index = i.iter; - i.result = true; - } - else - i.result = false; -} - - - -void current_dir_part_link(Info & i) -{ - std::vector::size_type a; - - i.out << data.base_url; - - for(a = 0 ; a <= current_dir_index && a < request.cur_dir_table.size() ; ++a) - { - i.out << request.cur_dir_table[a].url << '/'; - } -} - -void current_dir_part_url(Info & i) -{ - if( current_dir_index < request.cur_dir_table.size() ) - i.out << request.cur_dir_table[current_dir_index].url; -} - - - -void edit_item(Info & i) -{ - i.result = request.result == Request::edit_item; -} - - -void added_item(Info &i) -{ - i.result = request.session->done == Done::added_item; -} - - -void edited_item(Info &i) -{ - i.result = request.session->done == Done::edited_item; -} - -void deleted_item(Info &i) -{ - i.result = request.session->done == Done::deleted_item; -} - - - -// zostawic tylko jedna funkcje done_with_errors (bedzie uzywana do roznych celow) !! -void deleted_item_errors(Info & i) -{ - i.result = request.session->done_status != Error::ok; -} - - -void done_with_errors(Info & i) -{ - i.result = request.session->done_status != Error::ok; -} - - -void done_status(Info & i) -{ - i.out << static_cast( request.session->done_status ); -} - - - -void fitems_in_dir(Info & i) -{ -// i.out << "abc: " << variables["fitems_directory"]; - -} - - -void loggedout(Info & i) -{ - i.result = request.session->done == Done::loggedout; -} - - - -std::vector fgroup_table; -size_t fgroup_index; - - - - -void fitem_group_initializing() -{ - fgroup_table.clear(); - - if( !request.session->puser ) - { - // not logged - fgroup_table.push_back(request.item.group_id); - } - else - if( request.session->puser->super_user ) - { - // super user is allowed to change to any group - for(size_t i=0 ; ipuser->id == request.item.user_id ) - { - bool was_current_group = false; - // owner of the item -- is allowed to change only to a group in which he belongs to - for(size_t i=0 ; ipuser->groups.size() ; ++i) - { - fgroup_table.push_back( request.session->puser->groups[i] ); - - if( request.item.group_id == request.session->puser->groups[i] ) - was_current_group = true; - } - - // we're showing the item.group_id if it's different - if( !was_current_group ) - fgroup_table.push_back(request.item.group_id); - - // switching to -1 is allowed too - fgroup_table.push_back(-1); - } - else - { - // not the owner and not a super user -- the same as not logged - fgroup_table.push_back(request.item.group_id); - } -} - - -void fitem_group(Info & i) -{ - if( i.iter == 0 ) - fitem_group_initializing(); - - fgroup_index = i.iter; - i.result = fgroup_index < fgroup_table.size(); -} - - - - -void fitem_group_name(Info & i) -{ - if( fgroup_index < fgroup_table.size() ) - { - long gid = fgroup_table[fgroup_index]; - - if( gid != -1 ) - { - Group * pgroup = data.groups.GetGroup( gid ); - - if( pgroup ) - i.out << pgroup->name; - else - i.out << "group_id: " << gid; - } - else - { - i.out << data.priv_no_group; - } - } -} - - - -void fitem_group_default(Info & i) -{ - if( fgroup_index < fgroup_table.size() ) - { - long gid = fgroup_table[fgroup_index]; - - if( gid == request.item.group_id ) - i.result = true; - } -} - - - - - - -std::vector fuser_table; -size_t fuser_index; - - -void fitem_user_initializing() -{ - fuser_table.clear(); - - if( !request.session->puser ) - { - // not logged - fuser_table.push_back(request.item.user_id); - } - else - if( request.session->puser->super_user ) - { - // super user is allowed to change to any user - for(size_t i=0 ; iname; - else - i.out << "user_id: " << uid; - } - else - { - i.out << data.priv_no_user; - } - } -} - - - -void fitem_user_default(Info & i) -{ - if( fuser_index < fuser_table.size() ) - { - long uid = fuser_table[fuser_index]; - - if( uid == request.item.user_id ) - i.result = true; - } -} - - - - -} // namespace TemplatesFunctions - - - - -void Templates::CreateFunctions() -{ - using namespace TemplatesFunctions; - - functions.Clear(); - - - functions.Insert("is_group_tv", is_group_tv); - - functions.Insert("language", language); - functions.Insert("title", title); - functions.Insert("charset", charset); - functions.Insert("content", content); - functions.Insert("version_major", version_major); - functions.Insert("version_minor", version_minor); - functions.Insert("version_revision", version_revision); - functions.Insert("base_url", base_url); - functions.Insert("current_url", current_url); - functions.Insert("user_logged", user_logged); - functions.Insert("user_super_user", user_super_user); - - - functions.Insert("item_id", item_id); - functions.Insert("item_subject", item_subject); - functions.Insert("item_content", item_content); - functions.Insert("item_subject_escape", item_subject_escape); - functions.Insert("item_content_escape", item_content_escape); - functions.Insert("item_url_subject", item_url_subject); - functions.Insert("item_dir", item_dir); - functions.Insert("item_privileges", item_privileges); - - functions.Insert("old_item_id", old_item_id); - functions.Insert("old_item_subject", old_item_subject); - functions.Insert("old_item_content", old_item_content); - functions.Insert("old_item_url_subject", old_item_url_subject); - functions.Insert("old_item_dir", old_item_dir); - - functions.Insert("dir_items", dir_items); - functions.Insert("items", items); - functions.Insert("item_subject2", item_subject2); - functions.Insert("dir_subject2", dir_subject2); - functions.Insert("full_dir", full_dir); - functions.Insert("dir_url_subject2", dir_url_subject2); - functions.Insert("item_url_subject2", item_url_subject2); - functions.Insert("item_content2", item_content2); - functions.Insert("item_id2", item_id2); - - - functions.Insert("edit_item", edit_item); - - - functions.Insert("incorrect_dir", incorrect_dir); - - functions.Insert("fcurrent_dir", fcurrent_dir); - functions.Insert("current_dir_part_link", current_dir_part_link); - functions.Insert("current_dir_part_url", current_dir_part_url); - - functions.Insert("added_item", added_item); - functions.Insert("edited_item", edited_item); - functions.Insert("deleted_item", deleted_item); - functions.Insert("loggedout", loggedout); - functions.Insert("deleted_item_errors", deleted_item_errors); - - - functions.Insert("done_with_errors", done_with_errors); - functions.Insert("done_status", done_status); - - - - - - functions.Insert("fitems_in_dir", fitems_in_dir); - - - functions.Insert("user_name", user_name); - - functions.Insert("fitem_group", fitem_group); - functions.Insert("fitem_group_name", fitem_group_name); - functions.Insert("fitem_group_default", fitem_group_default); - - functions.Insert("fitem_user", fitem_user); - functions.Insert("fitem_user_name", fitem_user_name); - functions.Insert("fitem_user_default", fitem_user_default); - -} - - - - - -void Templates::Read() -{ - using namespace TemplatesFunctions; - - pat_index.Directory(data.templates); - pat_index.ParseFile(data.default_index); - - pat_item.Directory(data.templates); - pat_item.ParseFile("item.html"); - - pat_dir.Directory(data.templates); - pat_dir.ParseFile("dir.html"); - - pat_item_add_edit.Directory(data.templates); - pat_item_add_edit.ParseFile("item_add_edit.html"); - - pat_err_404.Directory(data.templates); - pat_err_404.ParseFile("err_404.html"); - - pat_err_per_denied.Directory(data.templates); - pat_err_per_denied.ParseFile("err_per_denied.html"); - - pat_item_del_confirm.Directory(data.templates); - pat_item_del_confirm.ParseFile("item_del_confirm.html"); - - pat_err_internal.Directory(data.templates); - pat_err_internal.ParseFile("err_internal.html"); - - CreateFunctions(); - -} - - - -void Templates::Generate() -{ - using namespace TemplatesFunctions; - - // clear some variables (indexes for example) - item_index = 0; - current_dir_index = 0; - - - Generator generator(request.page, pat_index, functions); - - generator.Generate(); -} - diff --git a/core/templates.h b/core/templates.h deleted file mode 100755 index dc93bc4..0000000 --- a/core/templates.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is a part of CMSLU -- Content Management System like Unix - * and is not publicly distributed - * - * Copyright (c) 2008, Tomasz Sowa - * All rights reserved. - * - */ - -#ifndef headerfiletemplates -#define headerfiletemplates - -#include - -#include "../../ezc/src/ezc.h" -#include "data.h" -#include "request.h" -#include "item.h" -#include "db.h" -#include "error.h" -#include "user.h" -#include "group.h" -#include "users.h" -#include "groups.h" - - -using namespace Ezc; - - - - -class Templates -{ - - - -public: - - - void Read(); - void Generate(); - - void CreateFunctions(); - - -}; - - - -#endif diff --git a/core/users.cpp b/core/users.cpp index cf6002d..c8b0e3d 100755 --- a/core/users.cpp +++ b/core/users.cpp @@ -11,7 +11,6 @@ - Users::Users() { Clear(); diff --git a/core/users.h b/core/users.h index 748575d..96e8939 100755 --- a/core/users.h +++ b/core/users.h @@ -16,6 +16,8 @@ #include "ugcontainer.h" + + class Users { diff --git a/templates/Makefile b/templates/Makefile new file mode 100755 index 0000000..1eaed39 --- /dev/null +++ b/templates/Makefile @@ -0,0 +1,26 @@ +o = templates.o sys.o item.o doc.o user.o dir.o done.o priv.o + + +all: templates.a + +templates.a: $(o) + ar rcs templates.a $(o) + +.SUFFIXES: .cpp .o + +.cpp.o: + $(CC) -c $(CFLAGS) $< + + +depend: + makedepend -Y. -f- *.cpp > Makefile.dep + + +clean: + rm -f *.o + rm -f *.a + + +include Makefile.dep + + diff --git a/templates/Makefile.dep b/templates/Makefile.dep new file mode 100755 index 0000000..c04a9ea --- /dev/null +++ b/templates/Makefile.dep @@ -0,0 +1,82 @@ +# DO NOT DELETE + +dir.o: templates.h ../../ezc/src/ezc.h ../core/data.h ../core/misc.h +dir.o: ../core/log.h ../core/item.h ../core/error.h ../core/dirs.h +dir.o: ../core/db.h ../core/dircontainer.h ../core/user.h ../core/group.h +dir.o: ../core/ugcontainer.h ../core/users.h ../core/groups.h +dir.o: ../core/functions.h ../core/function.h ../core/request.h +dir.o: ../core/requesttypes.h ../core/session.h ../core/done.h +dir.o: ../core/getparser.h ../core/httpsimpleparser.h ../core/postparser.h +dir.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +dir.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +dir.o: ../core/log.h +doc.o: templates.h ../../ezc/src/ezc.h ../core/data.h ../core/misc.h +doc.o: ../core/log.h ../core/item.h ../core/error.h ../core/dirs.h +doc.o: ../core/db.h ../core/dircontainer.h ../core/user.h ../core/group.h +doc.o: ../core/ugcontainer.h ../core/users.h ../core/groups.h +doc.o: ../core/functions.h ../core/function.h ../core/request.h +doc.o: ../core/requesttypes.h ../core/session.h ../core/done.h +doc.o: ../core/getparser.h ../core/httpsimpleparser.h ../core/postparser.h +doc.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +doc.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +doc.o: ../core/log.h +done.o: templates.h ../../ezc/src/ezc.h ../core/data.h ../core/misc.h +done.o: ../core/log.h ../core/item.h ../core/error.h ../core/dirs.h +done.o: ../core/db.h ../core/dircontainer.h ../core/user.h ../core/group.h +done.o: ../core/ugcontainer.h ../core/users.h ../core/groups.h +done.o: ../core/functions.h ../core/function.h ../core/request.h +done.o: ../core/requesttypes.h ../core/session.h ../core/done.h +done.o: ../core/getparser.h ../core/httpsimpleparser.h ../core/postparser.h +done.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +done.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +done.o: ../core/log.h +item.o: templates.h ../../ezc/src/ezc.h ../core/data.h ../core/misc.h +item.o: ../core/log.h ../core/item.h ../core/error.h ../core/dirs.h +item.o: ../core/db.h ../core/dircontainer.h ../core/user.h ../core/group.h +item.o: ../core/ugcontainer.h ../core/users.h ../core/groups.h +item.o: ../core/functions.h ../core/function.h ../core/request.h +item.o: ../core/requesttypes.h ../core/session.h ../core/done.h +item.o: ../core/getparser.h ../core/httpsimpleparser.h ../core/postparser.h +item.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +item.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +item.o: ../core/log.h +priv.o: templates.h ../../ezc/src/ezc.h ../core/data.h ../core/misc.h +priv.o: ../core/log.h ../core/item.h ../core/error.h ../core/dirs.h +priv.o: ../core/db.h ../core/dircontainer.h ../core/user.h ../core/group.h +priv.o: ../core/ugcontainer.h ../core/users.h ../core/groups.h +priv.o: ../core/functions.h ../core/function.h ../core/request.h +priv.o: ../core/requesttypes.h ../core/session.h ../core/done.h +priv.o: ../core/getparser.h ../core/httpsimpleparser.h ../core/postparser.h +priv.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +priv.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +priv.o: ../core/log.h +sys.o: templates.h ../../ezc/src/ezc.h ../core/data.h ../core/misc.h +sys.o: ../core/log.h ../core/item.h ../core/error.h ../core/dirs.h +sys.o: ../core/db.h ../core/dircontainer.h ../core/user.h ../core/group.h +sys.o: ../core/ugcontainer.h ../core/users.h ../core/groups.h +sys.o: ../core/functions.h ../core/function.h ../core/request.h +sys.o: ../core/requesttypes.h ../core/session.h ../core/done.h +sys.o: ../core/getparser.h ../core/httpsimpleparser.h ../core/postparser.h +sys.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +sys.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +sys.o: ../core/log.h +templates.o: templates.h ../../ezc/src/ezc.h ../core/data.h ../core/misc.h +templates.o: ../core/log.h ../core/item.h ../core/error.h ../core/dirs.h +templates.o: ../core/db.h ../core/dircontainer.h ../core/user.h +templates.o: ../core/group.h ../core/ugcontainer.h ../core/users.h +templates.o: ../core/groups.h ../core/functions.h ../core/function.h +templates.o: ../core/request.h ../core/requesttypes.h ../core/session.h +templates.o: ../core/done.h ../core/getparser.h ../core/httpsimpleparser.h +templates.o: ../core/postparser.h ../core/cookieparser.h ../core/item.h +templates.o: ../core/db.h ../core/error.h ../core/user.h ../core/group.h +templates.o: ../core/users.h ../core/groups.h ../core/log.h +user.o: templates.h ../../ezc/src/ezc.h ../core/data.h ../core/misc.h +user.o: ../core/log.h ../core/item.h ../core/error.h ../core/dirs.h +user.o: ../core/db.h ../core/dircontainer.h ../core/user.h ../core/group.h +user.o: ../core/ugcontainer.h ../core/users.h ../core/groups.h +user.o: ../core/functions.h ../core/function.h ../core/request.h +user.o: ../core/requesttypes.h ../core/session.h ../core/done.h +user.o: ../core/getparser.h ../core/httpsimpleparser.h ../core/postparser.h +user.o: ../core/cookieparser.h ../core/item.h ../core/db.h ../core/error.h +user.o: ../core/user.h ../core/group.h ../core/users.h ../core/groups.h +user.o: ../core/log.h diff --git a/templates/dir.cpp b/templates/dir.cpp new file mode 100755 index 0000000..6bc14e7 --- /dev/null +++ b/templates/dir.cpp @@ -0,0 +1,104 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "templates.h" + + +namespace TemplatesFunctions +{ + + + +void dir(Info & i) +{ + for(size_t a=0 ; aurl); + i.out << '/'; + } +} + + + + + +static std::vector dir_childs_table; +static size_t dir_childs_index; + +// request.id is never 0 and we can start dir_childs_reqid from 0 +static size_t dir_childs_reqid = 0; + + + +void dir_childs_tab(Info & i) +{ + if( dir_childs_reqid != request.id ) + { + dir_childs_reqid = request.id; + dir_childs_table.clear(); + + if( !request.dir_table.empty() ) + data.dirs.GetDirChilds(request.dir_table.back()->id, dir_childs_table); + } + + dir_childs_index = i.iter; + i.result = dir_childs_index < dir_childs_table.size(); +} + + +void dir_childs_tab_url(Info & i) +{ + if( dir_childs_index < dir_childs_table.size() ) + HtmlEscape(i.out, dir_childs_table[dir_childs_index]->url); +} + + + + + + + + + +static size_t dir_index; + + +void dir_tab(Info & i) +{ + dir_index = i.iter; + i.result = dir_index < request.dir_table.size(); +} + + +void dir_tab_url(Info & i) +{ + if( dir_index < request.dir_table.size() ) + HtmlEscape(i.out, request.dir_table[dir_index]->url); +} + + +void dir_tab_link(Info & i) +{ + i.out << data.base_url; + + for(size_t a = 0 ; a <= dir_index && a < request.dir_table.size() ; ++a) + { + HtmlEscape(i.out, request.dir_table[a]->url); + i.out << '/'; + } +} + + + + + +} // namespace TemplatesFunctions + + + diff --git a/templates/doc.cpp b/templates/doc.cpp new file mode 100755 index 0000000..a2e708e --- /dev/null +++ b/templates/doc.cpp @@ -0,0 +1,79 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "templates.h" + + +namespace TemplatesFunctions +{ + + + + + +void doc_language(Info & i) +{ + // at the moment only Polish language + i.out << "pl"; +} + + + +void doc_title(Info & i) +{ + size_t a = 0; + + // from 1 means skipping the root directory + for(a = 1 ; aurl; + + if( request.is_item ) + i.out << " / " << request.item.subject; +} + + + +void doc_charset(Info & i) +{ + i.out << "iso-8859-2"; +} + + + + +void doc_base_url(Info & i) +{ + i.out << data.base_url; +} + + + +void doc_current_url(Info & i) +{ + i.out << request.env_request_uri; +} + + + +void doc_status_error(Info & i) +{ + i.result = request.status != Error::ok; +} + + +void doc_status_code(Info & i) +{ + i.out << static_cast( request.status ); +} + + + +} // namespace TemplatesFunctions + + diff --git a/templates/done.cpp b/templates/done.cpp new file mode 100755 index 0000000..c5a7647 --- /dev/null +++ b/templates/done.cpp @@ -0,0 +1,72 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "templates.h" + + +namespace TemplatesFunctions +{ + + + +void done_errors(Info & i) +{ + i.result = request.session->done_status != Error::ok; +} + + +void done_status(Info & i) +{ + i.out << static_cast( request.session->done_status ); +} + + +void done_status_incorrect_dir(Info & i) +{ + i.result = request.session->done_status == Error::incorrect_dir; +} + + + +void done_added_item(Info & i) +{ + i.result = request.session->done == Done::added_item; +} + + +void done_edited_item(Info & i) +{ + i.result = request.session->done == Done::edited_item; +} + + +void done_deleted_item(Info & i) +{ + i.result = request.session->done == Done::deleted_item; +} + + +void done_privileged_item(Info & i) +{ + i.result = request.session->done == Done::privileged_item; +} + + +void done_loggedout(Info & i) +{ + i.result = request.session->done == Done::loggedout; +} + + + + +} // namespace TemplatesFunctions + + + diff --git a/templates/item.cpp b/templates/item.cpp new file mode 100755 index 0000000..1ea66ec --- /dev/null +++ b/templates/item.cpp @@ -0,0 +1,248 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "templates.h" + + +namespace TemplatesFunctions +{ + + + + + + +void item_is(Info & i) +{ + i.result = request.is_item; +} + + + +void item_id(Info & i) +{ + i.out << request.item.id; +} + + + +void item_subject(Info & i) +{ + HtmlEscape(i.out, request.item.subject); +} + + +void item_subject_noescape(Info & i) +{ + i.out << request.item.subject; +} + + + +void item_content(Info & i) +{ + HtmlEscape(i.out, request.item.content); +} + + + +void item_content_noescape(Info & i) +{ + i.out << request.item.content; +} + + +void item_privileges(Info & i) +{ + i.out << std::setbase(8) << request.item.privileges << std::setbase(10); +} + + +void item_dir(Info & i) +{ + dir(i); +} + + +void item_url(Info & i) +{ + HtmlEscape(i.out, request.item.url); +} + + +void item_link(Info & i) +{ + HtmlEscape(i.out, data.base_url); + item_dir(i); + item_url(i); +} + + + + + + + + +void item_old_id(Info & i) +{ + i.out << request.session->item.id; +} + + +void item_old_subject(Info & i) +{ + HtmlEscape(i.out, request.session->item.subject); +} + + +void item_old_subject_noescape(Info & i) +{ + i.out << request.session->item.subject; +} + + +void item_old_content(Info & i) +{ + HtmlEscape(i.out, request.session->item.content); +} + + +void item_old_content_noescape(Info & i) +{ + i.out << request.session->item.content; +} + + +void item_old_privileges(Info & i) +{ + i.out << std::setbase(8) << request.session->item.privileges << std::setbase(10); +} + + +void item_old_dir(Info & i) +{ +std::string path; + + if( data.dirs.MakePath(request.session->item.parent_id, path) ) + HtmlEscape(i.out, path); + else + i.out << "/the path does not exist/"; +} + + +void item_old_url(Info & i) +{ + HtmlEscape(i.out, request.session->item.url); +} + + +void item_old_link(Info & i) +{ + HtmlEscape(i.out, data.base_url); + item_old_dir(i); + item_old_url(i); +} + + + + + + + +static size_t item_index; + + +void item_tab(Info & i) +{ + item_index = i.iter; + i.result = item_index < request.item_table.size(); +} + + +void item_tab_id(Info & i) +{ + if( item_index < request.item_table.size() ) + i.out << request.item_table[item_index].id; +} + + +void item_tab_subject(Info & i) +{ + if( item_index < request.item_table.size() ) + HtmlEscape(i.out, request.item_table[item_index].subject); +} + +void item_tab_subject_noescape(Info & i) +{ + if( item_index < request.item_table.size() ) + i.out << request.item_table[item_index].subject; +} + + +void item_tab_content(Info & i) +{ + if( item_index < request.item_table.size() ) + HtmlEscape(i.out, request.item_table[item_index].content); +} + + +void item_tab_content_noescape(Info & i) +{ + if( item_index < request.item_table.size() ) + i.out << request.item_table[item_index].content; +} + + +void item_tab_privileges(Info & i) +{ + if( item_index < request.item_table.size() ) + i.out << std::setbase(8) << request.item_table[item_index].privileges << std::setbase(10); +} + + + +void item_tab_dir(Info & i) +{ + if( item_index < request.item_table.size() ) + { + std::string path; + + if( data.dirs.MakePath(request.item_table[item_index].parent_id, path) ) + HtmlEscape(i.out, path); + else + i.out << "/the path does not exist/"; + } +} + + +void item_tab_url(Info & i) +{ + if( item_index < request.item_table.size() ) + HtmlEscape(i.out, request.item_table[item_index].url); +} + + +void item_tab_link(Info & i) +{ + if( item_index < request.item_table.size() ) + { + HtmlEscape(i.out, data.base_url); + item_tab_dir(i); + item_tab_url(i); + } +} + + +} // namespace TemplatesFunctions + + + + + diff --git a/templates/priv.cpp b/templates/priv.cpp new file mode 100755 index 0000000..82875c8 --- /dev/null +++ b/templates/priv.cpp @@ -0,0 +1,218 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "templates.h" + + +namespace TemplatesFunctions +{ + + +static std::vector priv_user_table; +static size_t priv_user_index; +static size_t priv_user_reqid = 0; + + + +void priv_user_tab_init() +{ + priv_user_reqid = request.id; + priv_user_table.clear(); + + if( !request.session->puser ) + { + // not logged + priv_user_table.push_back(request.item.user_id); + } + else + if( request.session->puser->super_user ) + { + // super user is allowed to change to any user + for(size_t i=0 ; iname); + else + i.out << "user_id: " << uid; + } + else + { + HtmlEscape(i.out, data.priv_no_user); + } + } +} + + + +void priv_user_tab_isdefault(Info & i) +{ + if( priv_user_index < priv_user_table.size() ) + { + long uid = priv_user_table[priv_user_index]; + + if( uid == request.item.user_id ) + i.result = true; + } +} + + + + + + + + +static std::vector priv_group_table; +static size_t priv_group_index; +static size_t priv_group_reqid = 0; + + + +void priv_group_tab_init() +{ + priv_group_reqid = request.id; + priv_group_table.clear(); + + if( !request.session->puser ) + { + // not logged + priv_group_table.push_back(request.item.group_id); + } + else + if( request.session->puser->super_user ) + { + // super user is allowed to change to any group + for(size_t i=0 ; ipuser->id == request.item.user_id ) + { + bool was_current_group = false; + // owner of the item -- is allowed to change only to a group in which he belongs to + for(size_t i=0 ; ipuser->groups.size() ; ++i) + { + priv_group_table.push_back( request.session->puser->groups[i] ); + + if( request.item.group_id == request.session->puser->groups[i] ) + was_current_group = true; + } + + // we're showing the item.group_id if it's different + if( !was_current_group ) + priv_group_table.push_back(request.item.group_id); + + // switching to -1 is allowed too + priv_group_table.push_back(-1); + } + else + { + // not the owner and not a super user -- the same as not logged + priv_group_table.push_back(request.item.group_id); + } +} + + +void priv_group_tab(Info & i) +{ + if( priv_group_reqid != request.id ) + priv_group_tab_init(); + + priv_group_index = i.iter; + i.result = priv_group_index < priv_group_table.size(); +} + + + + +void priv_group_tab_name(Info & i) +{ + if( priv_group_index < priv_group_table.size() ) + { + long gid = priv_group_table[priv_group_index]; + + if( gid != -1 ) + { + Group * pgroup = data.groups.GetGroup( gid ); + + if( pgroup ) + HtmlEscape(i.out, pgroup->name); + else + i.out << "group_id: " << gid; + } + else + { + HtmlEscape(i.out, data.priv_no_group); + } + } +} + + + +void priv_group_tab_isdefault(Info & i) +{ + if( priv_group_index < priv_group_table.size() ) + { + long gid = priv_group_table[priv_group_index]; + + if( gid == request.item.group_id ) + i.result = true; + } +} + + + + + + + +} // namespace TemplatesFunctions + + + + + + diff --git a/templates/sys.cpp b/templates/sys.cpp new file mode 100755 index 0000000..f71f0f9 --- /dev/null +++ b/templates/sys.cpp @@ -0,0 +1,40 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "templates.h" + + +namespace TemplatesFunctions +{ + + +void sys_ver_major(Info & i) +{ + i.out << MAJOR_VER; +} + + +void sys_ver_minor(Info & i) +{ + i.out << MINOR_VER; +} + + + +void sys_ver_revision(Info & i) +{ + i.out << REVISION_VER; +} + + + + +} // namespace TemplatesFunctions + + diff --git a/templates/templates.cpp b/templates/templates.cpp new file mode 100755 index 0000000..b978f15 --- /dev/null +++ b/templates/templates.cpp @@ -0,0 +1,312 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "templates.h" + + + + +namespace TemplatesFunctions +{ +Ezc::Pattern pat_index; +Ezc::Pattern pat_fun_cat; +Ezc::Pattern pat_fun_ls; +Ezc::Pattern pat_fun_emacs; +Ezc::Pattern pat_fun_privileges; +Ezc::Pattern pat_fun_rm; +Ezc::Pattern pat_err_item_required; +Ezc::Pattern pat_err_404; +Ezc::Pattern pat_err_per_denied; +Ezc::Pattern pat_err_others; + + + +Ezc::Functions functions; + + + + + +// !! tymczasowa funkcja +void is_group_tv(Info & i) +{ + long gid = data.groups.GetGroupId("tv"); + + if( request.session->puser && request.session->puser->IsMemberOf(gid) ) + i.result = true; +} + + + + +Ezc::Pattern * content_for_function() +{ +Ezc::Pattern * p = 0; + + + if( !request.pfunction ) + { + log << log1 << "Templates: no function" << logend; + return p; + } + + + switch( request.pfunction->code ) + { + case Function::cat: + p = &pat_fun_cat; + break; + + case Function::ls: + p = &pat_fun_ls; + break; + + case Function::rm: + p = &pat_fun_rm; + break; + + case Function::emacs: + p = &pat_fun_emacs; + break; + + case Function::privileges: + p = &pat_fun_privileges; + break; + + default: + break; + } + + +return p; +} + + + +void content(Info & i) +{ +Ezc::Pattern * p = 0; + + switch( request.status ) + { + case Error::ok: + p = content_for_function(); + break; + + case Error::item_required: + p = &pat_err_item_required; + break; + + case Error::permision_denied: + p = &pat_err_per_denied; + break; + + case Error::db_no_item: + case Error::no_function: + p = &pat_err_404; + break; + + default: + p = &pat_err_others; + break; + } + + + if( p ) + { + Ezc::Generator gen(i.out, *p, functions); + gen.Generate(); + } + else + { + i.out << ""; + } + +} + + + + +} // namespace TemplatesFunctions + + + + +void Templates::CreateFunctions() +{ + using namespace TemplatesFunctions; + + functions.Clear(); + + + /* + sys + */ + functions.Insert("sys_ver_major", sys_ver_major); + functions.Insert("sys_ver_minor", sys_ver_minor); + functions.Insert("sys_ver_revision", sys_ver_revision); + + + /* + doc + */ + functions.Insert("doc_language", doc_language); + functions.Insert("doc_title", doc_title); + functions.Insert("doc_charset", doc_charset); + functions.Insert("doc_base_url", doc_base_url); + functions.Insert("doc_current_url", doc_current_url); + functions.Insert("doc_status_error", doc_status_error); + functions.Insert("doc_status_code", doc_status_code); + + + /* + item + */ + functions.Insert("item_is", item_is); + functions.Insert("item_id", item_id); + functions.Insert("item_subject", item_subject); + functions.Insert("item_subject_noescape", item_subject_noescape); + functions.Insert("item_content", item_content); + functions.Insert("item_content_noescape", item_content_noescape); + functions.Insert("item_privileges", item_privileges); + functions.Insert("item_dir", item_dir); + functions.Insert("item_url", item_url); + functions.Insert("item_link", item_link); + + functions.Insert("item_old_id", item_old_id); + functions.Insert("item_old_subject", item_old_subject); + functions.Insert("item_old_subject_noescape", item_old_subject_noescape); + functions.Insert("item_old_content", item_old_content); + functions.Insert("item_old_content_noescape", item_old_content_noescape); + functions.Insert("item_old_privileges", item_old_privileges); + functions.Insert("item_old_dir", item_old_dir); + functions.Insert("item_old_url", item_old_url); + functions.Insert("item_old_link", item_old_link); + + functions.Insert("item_tab", item_tab); + functions.Insert("item_tab_id", item_tab_id); + functions.Insert("item_tab_subject", item_tab_subject); + functions.Insert("item_tab_subject_noescape", item_tab_subject_noescape); + functions.Insert("item_tab_content", item_tab_content); + functions.Insert("item_tab_content_noescape", item_tab_content_noescape); + functions.Insert("item_tab_privileges", item_tab_privileges); + functions.Insert("item_tab_dir", item_tab_dir); + functions.Insert("item_tab_url", item_tab_url); + functions.Insert("item_tab_link", item_tab_link); + + + /* + dir + */ + functions.Insert("dir", dir); + + functions.Insert("dir_childs_tab", dir_childs_tab); + functions.Insert("dir_childs_tab_url", dir_childs_tab_url); + + functions.Insert("dir_tab", dir_tab); + functions.Insert("dir_tab_url", dir_tab_url); + functions.Insert("dir_tab_link", dir_tab_link); + + + /* + user + */ + functions.Insert("user_name", user_name); + functions.Insert("user_logged", user_logged); + functions.Insert("user_super_user", user_super_user); + + + /* + privileges + */ + functions.Insert("priv_user_tab", priv_user_tab); + functions.Insert("priv_user_tab_name", priv_user_tab_name); + functions.Insert("priv_user_tab_isdefault", priv_user_tab_isdefault); + + functions.Insert("priv_group_tab", priv_group_tab); + functions.Insert("priv_group_tab_name", priv_group_tab_name); + functions.Insert("priv_group_tab_isdefault", priv_group_tab_isdefault); + + + /* + done + */ + functions.Insert("done_errors", done_errors); + functions.Insert("done_status", done_status); + functions.Insert("done_status_incorrect_dir", done_status_incorrect_dir); + functions.Insert("done_added_item", done_added_item); + functions.Insert("done_edited_item", done_edited_item); + functions.Insert("done_deleted_item", done_deleted_item); + functions.Insert("done_privileged_item", done_privileged_item); + functions.Insert("done_loggedout", done_loggedout); + + + /* + others + */ + functions.Insert("content", content); + + + // !! tymczasowa + functions.Insert("is_group_tv", is_group_tv); +} + + + + + +void Templates::Read() +{ + using namespace TemplatesFunctions; + + pat_index.Directory(data.templates); + pat_index.ParseFile(data.default_index); + + pat_err_404.Directory(data.templates); + pat_err_404.ParseFile("err_404.html"); + + pat_err_per_denied.Directory(data.templates); + pat_err_per_denied.ParseFile("err_per_denied.html"); + + pat_fun_cat.Directory(data.templates); + pat_fun_cat.ParseFile("fun_cat.html"); + + pat_fun_ls.Directory(data.templates); + pat_fun_ls.ParseFile("fun_ls.html"); + + pat_fun_rm.Directory(data.templates); + pat_fun_rm.ParseFile("fun_rm.html"); + + pat_err_item_required.Directory(data.templates); + pat_err_item_required.ParseFile("err_item_required.html"); + + pat_fun_emacs.Directory(data.templates); + pat_fun_emacs.ParseFile("fun_emacs.html"); + + pat_fun_privileges.Directory(data.templates); + pat_fun_privileges.ParseFile("fun_privileges.html"); + + pat_err_others.Directory(data.templates); + pat_err_others.ParseFile("err_others.html"); + + CreateFunctions(); +} + + + +void Templates::Generate() +{ + using namespace TemplatesFunctions; + + + Ezc::Generator generator(request.page, pat_index, functions); + + generator.Generate(); +} + diff --git a/templates/templates.h b/templates/templates.h new file mode 100755 index 0000000..9b8f9a3 --- /dev/null +++ b/templates/templates.h @@ -0,0 +1,165 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#ifndef headerfiletemplates +#define headerfiletemplates + +#include + +#include "../../ezc/src/ezc.h" +#include "../core/data.h" +#include "../core/request.h" +#include "../core/item.h" +#include "../core/db.h" +#include "../core/error.h" +#include "../core/user.h" +#include "../core/group.h" +#include "../core/users.h" +#include "../core/groups.h" +#include "../core/log.h" + + + + +namespace TemplatesFunctions +{ + using Ezc::Info; + + /* + sys + */ + void sys_ver_major(Info & i); + void sys_ver_minor(Info & i); + void sys_ver_revision(Info & i); + + + /* + doc + */ + void doc_language(Info & i); + void doc_title(Info & i); + void doc_charset(Info & i); + void doc_base_url(Info & i); + void doc_current_url(Info & i); + void doc_status_error(Info & i); + void doc_status_code(Info & i); + + + /* + item + */ + void item_is(Info & i); + void item_id(Info & i); + void item_subject(Info & i); + void item_subject_noescape(Info & i); + void item_content(Info & i); + void item_content_noescape(Info & i); + void item_privileges(Info & i); + void item_dir(Info & i); // the same as full_dir() + void item_url(Info & i); + void item_link(Info & i); + + // !! wprowadzic item_old_is ? + void item_old_id(Info & i); + void item_old_subject(Info & i); + void item_old_subject_noescape(Info & i); + void item_old_content(Info & i); + void item_old_content_noescape(Info & i); + void item_old_privileges(Info & i); + void item_old_dir(Info & i); + void item_old_url(Info & i); + void item_old_link(Info & i); + + void item_tab(Info & i); + void item_tab_id(Info & i); + void item_tab_subject(Info & i); + void item_tab_subject_noescape(Info & i); + void item_tab_content(Info & i); + void item_tab_content_noescape(Info & i); + void item_tab_privileges(Info & i); + void item_tab_dir(Info & i); + void item_tab_url(Info & i); + void item_tab_link(Info & i); + + + /* + dir + */ + void dir(Info & i); + + void dir_childs_tab(Info & i); + void dir_childs_tab_url(Info & i); + + void dir_tab(Info & i); + void dir_tab_url(Info & i); + void dir_tab_link(Info & i); + + + /* + user + */ + void user_name(Info & i); + void user_logged(Info & i); + void user_super_user(Info & i); + + + /* + privileges + */ + void priv_user_tab(Info & i); + void priv_user_tab_name(Info & i); + void priv_user_tab_isdefault(Info & i); + + void priv_group_tab(Info & i); + void priv_group_tab_name(Info & i); + void priv_group_tab_isdefault(Info & i); + + + + /* + done + */ + void done_errors(Info & i); + void done_status(Info & i); + void done_status_incorrect_dir(Info & i); + + void done_added_item(Info & i); + void done_edited_item(Info & i); + void done_deleted_item(Info & i); + void done_privileged_item(Info & i); + void done_loggedout(Info & i); + + + + + +} // namespace TemplatesFunctions + + + + +class Templates +{ + + + +public: + + + void Read(); + void Generate(); + + void CreateFunctions(); + + +}; + + + +#endif diff --git a/templates/user.cpp b/templates/user.cpp new file mode 100755 index 0000000..96d1f2d --- /dev/null +++ b/templates/user.cpp @@ -0,0 +1,49 @@ +/* + * This file is a part of CMSLU -- Content Management System like Unix + * and is not publicly distributed + * + * Copyright (c) 2008, Tomasz Sowa + * All rights reserved. + * + */ + +#include "templates.h" + + +namespace TemplatesFunctions +{ + + + +void user_logged(Info & i) +{ + i.result = request.session->puser != 0; +} + + +void user_name(Info & i) +{ + if( !request.session->puser ) + return; + + i.out << request.session->puser->name; +} + + + +void user_super_user(Info & i) +{ + if( request.session->puser && request.session->puser->super_user ) + i.result = true; +} + + + + + + + +} // namespace TemplatesFunctions + + +