/* * This file is a part of Winix * and is not publicly distributed * * Copyright (c) 2008-2010, Tomasz Sowa * All rights reserved. * */ #include "templates.h" #include "core/misc.h" #include "functions/functions.h" namespace TemplatesFunctions { void dir(Info & i) { for(size_t a=0 ; arequest->dir_tab.size() ; ++a) i.out << cur->request->dir_tab[a]->url << '/'; } void dir_without_slash(Info & i) { for(size_t a=0 ; arequest->dir_tab.size() ; ++a) { i.out << cur->request->dir_tab[a]->url; if( a < cur->request->dir_tab.size()-1 ) i.out << '/'; } } void dir_is_root(Info & i) { i.res = cur->request->dir_tab.size() == 1; } void dir_parent(Info & i) { if( cur->request->dir_tab.empty() ) return; for(size_t a=0 ; arequest->dir_tab.size()-1 ; ++a) { i.out << cur->request->dir_tab[a]->url << '/'; } } void dir_parent_without_slash(Info & i) { if( cur->request->dir_tab.empty() ) return; for(size_t a=0 ; arequest->dir_tab.size()-1 ; ++a) { i.out << cur->request->dir_tab[a]->url; if( cur->request->dir_tab.size()>=2 && arequest->dir_tab.size()-2 ) i.out << '/'; } } //!! moze wystarczy sprawdzac tylko ostatni katalog? // bo inaczej i tak bylo by 'access denied' void dir_can_read_exec(Info & i) { i.res = system->HasReadExecAccessToPath(cur->request->dir_tab); } void dir_can_write(Info & i) { i.res = system->HasWriteAccess(*cur->request->dir_tab.back()); } void dir_can_remove(Info & i) { bool result = true; if( cur->request->dir_tab.size() == 1 ) { // rm for the root dir // only the superuser can do it if( !cur->session->puser || !cur->session->puser->super_user ) result = false; } else { Item * last_but_one_dir = *(--(--cur->request->dir_tab.end())); if( !system->HasWriteAccess(*last_but_one_dir) ) result = false; } i.res = result; } void dir_can_use_emacs(Info & i) { i.res = functions->fun_emacs.HasAccess(); } void dir_can_use_mkdir(Info & i) { i.res = functions->fun_mkdir.HasAccess(); } static std::vector dir_childs_table; static size_t dir_childs_index; // cur->request->id is never 0 and we can start dir_childs_reqid from 0 static size_t dir_childs_reqid = 0; // is the first directory the parent ('..') static bool dir_childs_has_parent; void dir_childs_tab(Info & i) { if( dir_childs_reqid != cur->request->id ) { dir_childs_reqid = cur->request->id; dir_childs_table.clear(); dir_childs_has_parent = false; if( !cur->request->dir_tab.empty() ) { if( cur->request->dir_tab.size() >= 2 && i.par == L"with_parent") { Item * dir_up = cur->request->dir_tab[cur->request->dir_tab.size()-2]; dir_childs_table.push_back(dir_up); dir_childs_has_parent = true; } system->dirs.GetDirChilds(cur->request->dir_tab.back()->id, dir_childs_table); } } dir_childs_index = i.iter; i.res = dir_childs_index < dir_childs_table.size(); } // is this child a parent ('..') void dir_childs_is_parent(Info & i) { i.res = (dir_childs_has_parent && dir_childs_index == 0); } void dir_childs_tab_url(Info & i) { if( dir_childs_index < dir_childs_table.size() ) i.out << dir_childs_table[dir_childs_index]->url; } void dir_childs_tab_privileges(Info & i) { if( dir_childs_index < dir_childs_table.size() ) i.out << "0" << Toa(dir_childs_table[dir_childs_index]->privileges, 8); } void dir_childs_tab_user(Info & i) { if( dir_childs_index < dir_childs_table.size() ) { long user_id = dir_childs_table[dir_childs_index]->user_id; User * puser = system->users.GetUser(user_id); if( puser ) i.out << puser->name; else { i.out << "~"; if( !dir_childs_table[dir_childs_index]->guest_name.empty() ) i.out << dir_childs_table[dir_childs_index]->guest_name; else i.out << "guest"; // !! dodac do konfiga } } } void dir_childs_tab_group(Info & i) { if( dir_childs_index < dir_childs_table.size() ) { long group_id = dir_childs_table[dir_childs_index]->group_id; Group * pgroup = system->groups.GetGroup(group_id); if( pgroup ) i.out << pgroup->name; else i.out << group_id; } } static size_t dir_index; void dir_tab(Info & i) { dir_index = i.iter; i.res = dir_index < cur->request->dir_tab.size(); } void dir_tab_url(Info & i) { if( dir_index < cur->request->dir_tab.size() ) i.out << cur->request->dir_tab[dir_index]->url; } void dir_tab_link(Info & i) { doc_proto(i); i.out << config->base_url; for(size_t a = 0 ; a <= dir_index && a < cur->request->dir_tab.size() ; ++a) { i.out << cur->request->dir_tab[a]->url; i.out << '/'; } } void dir_last_link_to(Info & i) { i.out << cur->request->dir_tab.back()->link_to; } void dir_last_is_link_redirect(Info & i) { i.res = cur->request->dir_tab.back()->link_redirect == 1; } void dir_last_subject(Info & i) { i.out << cur->request->dir_tab.back()->subject; } void dir_last_user(Info & i) { User * puser = system->users.GetUser(cur->request->dir_tab.back()->user_id); if( puser ) i.out << puser->name; else { i.out << "~"; if( !cur->request->dir_tab.back()->guest_name.empty() ) i.out << cur->request->dir_tab.back()->guest_name; else i.out << "guest"; // !! dodac do konfiga } } void dir_last_url(Info & i) { i.out << cur->request->dir_tab.back()->url; } void dir_last_url_is(Info & i) { i.res = cur->request->dir_tab.back()->url == i.par; } void dir_last_date_creation(Info & i) { tm rtm = system->LocalTime(cur->request->dir_tab.back()->date_creation); i.out << DateToStr(rtm.tm_year + 1900, rtm.tm_mon + 1, rtm.tm_mday, rtm.tm_hour, rtm.tm_min, rtm.tm_sec); } void dir_last_date_modification(Info & i) { tm rtm = system->LocalTime(cur->request->dir_tab.back()->date_modification); i.out << DateToStr(rtm.tm_year + 1900, rtm.tm_mon + 1, rtm.tm_mday, rtm.tm_hour, rtm.tm_min, rtm.tm_sec); } void dir_last_date_creation_nice(Info & i) { print_date_nice(i, cur->request->dir_tab.back()->date_creation); } void dir_last_date_modification_nice(Info & i) { print_date_nice(i, cur->request->dir_tab.back()->date_modification); } void dir_last_dates_equal(Info & i) { tm * ptm1 = &cur->request->dir_tab.back()->date_creation; tm * ptm2 = &cur->request->dir_tab.back()->date_modification; i.res = ptm1->tm_year == ptm2->tm_year && ptm1->tm_mon == ptm2->tm_mon && ptm1->tm_mday == ptm2->tm_mday && ptm1->tm_hour == ptm2->tm_hour && ptm1->tm_min == ptm2->tm_min && ptm1->tm_sec == ptm2->tm_sec; } void dir_last_users_different(Info & i) { i.res = (cur->request->dir_tab.back()->user_id != cur->request->dir_tab.back()->modification_user_id); } void dir_last_modification_user(Info & i) { User * puser = system->users.GetUser(cur->request->dir_tab.back()->modification_user_id); print_user_name(i, puser, cur->request->dir_tab.back()->guest_name); } void dir_last_html_template(Info & i) { i.out << cur->request->dir_tab.back()->html_template; } void dir_last_has_html_template(Info & i) { i.res = !cur->request->dir_tab.back()->html_template.empty(); } } // namespace TemplatesFunctions