/* * 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/request.h" #include "core/misc.h" #include "functions/functions.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(Item & item) { priv_user_reqid = request->id; priv_user_table.clear(); if( !request->session->puser ) { // not logged priv_user_table.push_back(item.user_id); } else if( request->session->puser->super_user ) { // super user is allowed to change to any user for(size_t i=0 ; iusers.Size() ; ++i) priv_user_table.push_back( system->users[i].id ); // as well to nobody (-1) priv_user_table.push_back(-1); } else { // others priv_user_table.push_back(item.user_id); } } void priv_user_tab_init() { if( request->is_item ) priv_user_tab_init(request->item); else priv_user_tab_init(*request->dir_tab.back()); } void priv_user_tab(Info & i) { if( priv_user_reqid != request->id ) priv_user_tab_init(); priv_user_index = i.iter; i.res = priv_user_index < priv_user_table.size(); } void priv_user_tab_name(Info & i) { if( priv_user_index < priv_user_table.size() ) { long uid = priv_user_table[priv_user_index]; if( uid != -1 ) { User * puser = system->users.GetUser( uid ); if( puser ) HtmlEscape(i.out, puser->name); else i.out << "user_id: " << uid; } else { HtmlEscape(i.out, config->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( request->is_item ) { if( uid == request->item.user_id ) i.res = true; } else { if( uid == request->dir_tab.back()->user_id ) i.res = 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(Item & item) { priv_group_reqid = request->id; priv_group_table.clear(); if( !request->session->puser ) { // not logged priv_group_table.push_back(item.group_id); } else if( request->session->puser->super_user ) { // super user is allowed to change to any group for(size_t i=0 ; igroups.Size() ; ++i) priv_group_table.push_back( system->groups[i].id ); // as well to nogroup (-1) priv_group_table.push_back(-1); } else if( request->session->puser->id == 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 ; isession->puser->groups.size() ; ++i) { priv_group_table.push_back( request->session->puser->groups[i] ); if( 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(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(item.group_id); } } void priv_group_tab_init() { if( request->is_item ) priv_group_tab_init(request->item); else priv_group_tab_init(*request->dir_tab.back()); } void priv_group_tab(Info & i) { if( priv_group_reqid != request->id ) priv_group_tab_init(); priv_group_index = i.iter; i.res = 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 = system->groups.GetGroup( gid ); if( pgroup ) HtmlEscape(i.out, pgroup->name); else i.out << "group_id: " << gid; } else { HtmlEscape(i.out, config->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( request->is_item ) { if( gid == request->item.group_id ) i.res = true; } else { if( gid == request->dir_tab.back()->group_id ) i.res = true; } } } void priv_privileges(Info & i) { if( request->is_item ) i.out << std::setbase(8) << request->item.privileges << std::setbase(10); else i.out << std::setbase(8) << request->dir_tab.back()->privileges << std::setbase(10); } void priv_privileges_for_files(Info & i) { //!! bedzie uzyte umask i.out << std::setbase(8) << (int)0644 << std::setbase(10); } void priv_privileges_for_dirs(Info & i) { //!! bedzie uzyte umask i.out << std::setbase(8) << (int)0755 << std::setbase(10); } void priv_show_form_chown(Info & i) { i.res = (request->function->fun.url == "priv" || request->function->fun.url == "chown"); } void priv_show_form_chmod(Info & i) { i.res = (request->function->fun.url == "priv" || request->function->fun.url == "chmod"); } } // namespace TemplatesFunctions