- added to FunctionBase: bool register_default_models (default true)

if true then winix will add default models for ezc templates such as "request", "item", etc.
- some methods from templates/item.cpp moved to Item
This commit is contained in:
Tomasz Sowa 2021-06-20 18:04:50 +02:00
parent e7c7324058
commit 79eda7abb0
21 changed files with 271 additions and 83 deletions

View File

@ -344,6 +344,7 @@ bool App::Init()
model_connector.set_winix_locale(&TemplatesFunctions::locale);
model_connector.set_winix_session_manager(&session_manager);
model_connector.set_winix_time_zones(&system.time_zones);
model_connector.set_winix_pattern_cacher(&TemplatesFunctions::pattern_cacher);
if( !TryToMakeDatabaseMigration() )
return false;
@ -846,6 +847,24 @@ void App::CheckPostRedirect()
}
void App::AddDefaultModels()
{
if( !cur.request->send_bin_stream && !cur.request->return_json )
{
if( cur.request->function && cur.request->function->register_default_models )
{
cur.request->models.Add(L"request", cur.request);
if( cur.request->is_item )
{
cur.request->models.Add(L"item", cur.request->item);
}
}
}
}
// !! IMPROVE ME change to a better name
// may ProcessRequest()? but probably it is already defined...
// this method needs some refactoring
@ -886,6 +905,8 @@ void App::Make()
if( !cur.request->redirect_to.empty() )
return;
AddDefaultModels();
if( cur.request->status == WINIX_ERR_OK )
functions.MakeFunction();

View File

@ -194,6 +194,7 @@ private:
void SetLocale();
void CheckPostRedirect();
void MakePage();
void AddDefaultModels();
void Make();
void SaveSessionsIfNeeded(); // !! IMPROVE ME wywalic do menagera sesji??
void LogAccess();

View File

@ -1389,7 +1389,7 @@ using namespace misc_private;
tmp_qencode.clear();
QEncode(in, tmp_qencode);
tmp_qencode.to_string(out, clear);
tmp_qencode.to_str(out, clear);
tmp_qencode.clear();
}

View File

@ -771,7 +771,7 @@ void UrlEncode(char c, StringType & out, bool clear_out = true)
static pt::TextStream tmp;
UrlEncode(c, tmp);
tmp.to_string(out, clear_out);
tmp.to_str(out, clear_out);
}
@ -882,6 +882,7 @@ void QEncode(const std::wstring & in, pt::TextStreamBase<char_type, stack_size,
}
// no thread safe
void QEncode(const std::wstring & in, std::string & out, bool clear = true);

View File

@ -94,6 +94,11 @@ public:
void Str(const StringType & str);
void Str(const StringType && str);
void to_str(std::string & str, bool clear_string = true) const;
void to_str(std::wstring & str, bool clear_string = true) const;
void to_string(std::string & str, bool clear_string = true) const;
void to_string(std::wstring & str, bool clear_string = true) const;
CharType operator[](size_t index);
TextStream & operator<<(const char * str);
@ -115,6 +120,8 @@ public:
TextStream & operator<<(const pt::Space & space);
TextStream & operator<<(const pt::Date & date);
TextStream & operator<<(const TextStream & stream);
template<typename arg_char_type, size_t arg_stack_size, size_t arg_heap_block_size>
TextStream & operator<<(const pt::TextStreamBase<arg_char_type, arg_stack_size, arg_heap_block_size> & arg);
@ -233,10 +240,59 @@ void TextStream<StringType>::Str(const StringType & str)
template<class StringType>
void TextStream<StringType>::Str(const StringType && str)
{
buffer = str;
buffer = std::move(str);
}
template<class StringType>
void TextStream<StringType>::to_str(std::string & str, bool clear_string) const
{
return to_string(str, clear_string);
}
template<class StringType>
void TextStream<StringType>::to_str(std::wstring & str, bool clear_string) const
{
return to_string(str, clear_string);
}
template<class StringType>
void TextStream<StringType>::to_string(std::string & str, bool clear_string) const
{
if( clear_string )
str.clear();
if constexpr (sizeof(typename StringType::value_type) == sizeof(char))
{
str.append(buffer);
}
else
{
pt::wide_to_utf8(buffer, str, false);
}
}
template<class StringType>
void TextStream<StringType>::to_string(std::wstring & str, bool clear_string) const
{
if( clear_string )
str.clear();
if constexpr (sizeof(typename StringType::value_type) == sizeof(wchar_t))
{
str.append(buffer);
}
else
{
pt::utf8_to_wide(buffer, str, false);
}
}
template<class StringType>
typename TextStream<StringType>::CharType TextStream<StringType>::operator[](size_t index)
@ -455,6 +511,19 @@ return *this;
}
template<class StringType>
TextStream<StringType> & TextStream<StringType>::operator<<(const TextStream<StringType> & stream)
{
buffer.append(stream.buffer);
return *this;
}
template<class StringType>
template<typename arg_char_type, size_t arg_stack_size, size_t arg_heap_block_size>
TextStream<StringType> & TextStream<StringType>::operator<<(

View File

@ -107,7 +107,8 @@ void ThreadManager::Add(BaseThread * pbase, const wchar_t * thread_name)
data.model_connector.set_winix_session(nullptr);
data.model_connector.set_winix_locale(nullptr); // null for a moment, may will be changed
data.model_connector.set_winix_session_manager(nullptr);// null for a moment, may will be changed
data.model_connector.set_winix_time_zones(nullptr);// null for a moment, may will be changed
data.model_connector.set_winix_time_zones(nullptr); // null for a moment, may will be changed
data.model_connector.set_winix_pattern_cacher(nullptr); // null for a moment, may will be changed
item.object->set_model_connector(&data.model_connector);

View File

@ -67,12 +67,6 @@ void Cat::MakeGet()
}
cur->request->send_as_attachment = cur->request->IsParam(L"attachment");
// IMPROVEME this will be put by a generic method from winix
// if output is html
cur->request->models.Add(L"item", cur->request->item);
////////////////////////////////////////////////////////////
}

View File

@ -47,6 +47,7 @@ FunctionBase::FunctionBase()
template_index = size_t(-1);
need_ssl = false;
need_session = true;
register_default_models = true;
fun.item_content.user_id = -1;
fun.item_content.group_id = -1;

View File

@ -86,6 +86,11 @@ public:
// if false then a temporary session is used
bool need_session;
// true if the function allows to register default models such as 'request', 'item', etc.
// default: true
bool register_default_models;
virtual void Init();
virtual bool HasAccess();
virtual void MakePost();

View File

@ -102,16 +102,6 @@ void Ls::MakeGet()
cur->request->models.Add(L"items", item_tab);
cur->request->models.Add(L"child_dirs", dir_tab);
}
// IMPROVEME this will be put by a generic method from winix
// if output is html
cur->request->models.Add(L"request", cur->request);
if( cur->request->is_item )
{
cur->request->models.Add(L"item", cur->request->item);
}
////////////////////////////////////////////////////////////
}

View File

@ -38,6 +38,7 @@
#include "core/request.h"
#include "templates/templates.h"
#include "core/session.h"
#include "core/log.h"
@ -85,7 +86,10 @@ void Item::fields()
field(L"can_be_removed", &Item::can_be_removed);
field(L"has_read_access", &Item::has_read_access);
field(L"has_write_access", &Item::has_write_access);
field(L"has_read_write_access", &Item::has_read_write_access);
field(L"has_read_exec_access", &Item::has_read_exec_access);
field(L"execute", &Item::execute);
// may we should add a method setTypeFromInt(int t)?
@ -374,17 +378,27 @@ bool Item::can_be_removed() const
}
bool Item::has_read_access()
bool Item::has_read_access() const
{
return item_content.has_read_access();
}
bool Item::has_write_access()
bool Item::has_write_access() const
{
return item_content.has_write_access();
}
bool Item::has_read_write_access() const
{
return item_content.has_read_write_access();
}
bool Item::has_read_exec_access() const
{
return item_content.has_read_exec_access();
}
bool Item::type_is_symlink() const
{
@ -603,10 +617,43 @@ void Item::url_is(EzcEnv & env)
}
//bool Item::has_read_accessxx() const
//{
//
//}
void Item::execute(EzcEnv & env)
{
if( has_read_access() )
{
PatternCacher * pattern_cacher = get_pattern_cacher();
Request * request = get_request();
Config * config = get_config();
if( pattern_cacher && request && config )
{
HtmlTextStream item_run_content;
TemplatesFunctions::EzcGen ezc_generator;
Ezc::Pattern * p = pattern_cacher->GetPattern(*this);
TemplatesFunctions::InitGenerator(ezc_generator, request->models);
ezc_generator.SetPattern(*p);
if( config->allow_ezc_frames_in_executable_items )
ezc_generator.Generate(item_run_content, request->out_streams);
else
ezc_generator.Generate(item_run_content);
ItemContent::print_content(env.out, item_run_content.Str(), item_content.content_raw_type, config->html_filter);
}
}
else
{
Log * log = get_logger();
if( log )
{
(*log) << "Item::execute: permission denied, no read_exec access to item id: " << id << ", url: " << url << ", subject" << subject;
}
}
}

View File

@ -38,12 +38,6 @@
#include <string>
#include "winixmodel.h"
#include "itemcontent.h"
// temporary
#include "core/log.h"
#include "funinfo.h"
#include "templates/htmltextstream.h"
#include "templates/misc.h"
@ -189,8 +183,10 @@ public:
bool can_remove_child(long child_user_id) const;
bool can_be_removed() const;
bool has_read_access();
bool has_write_access();
bool has_read_access() const;
bool has_write_access() const;
bool has_read_write_access() const;
bool has_read_exec_access() const;
bool type_is_symlink() const;
bool type_is_file() const;
@ -202,7 +198,6 @@ public:
bool is_current_dir() const;
protected:
CalcItemsHelper calc_items_by_url(long parent_id, const std::wstring & url);
@ -216,9 +211,8 @@ protected:
void print_dir_without_slash(EzcEnv & env);
void dir_link(EzcEnv & env);
void link(EzcEnv & env);
void url_is(EzcEnv & env);
void execute(EzcEnv & env);
MORM_MEMBER_FIELD(Item)

View File

@ -209,6 +209,17 @@ TimeZones * WinixModel::get_time_zones()
}
PatternCacher * WinixModel::get_pattern_cacher()
{
WinixModelConnector * connector = get_winix_model_connector();
if( connector )
{
return connector->get_winix_pattern_cacher();
}
return nullptr;
}
@ -383,6 +394,19 @@ const TimeZones * WinixModel::get_time_zones() const
}
const PatternCacher * WinixModel::get_pattern_cacher() const
{
const WinixModelConnector * connector = get_winix_model_connector();
if( connector )
{
return connector->get_winix_pattern_cacher();
}
return nullptr;
}

View File

@ -55,7 +55,7 @@ class User;
class Locale;
class SessionManager;
class TimeZones;
class PatternCacher;
class WinixModel : public morm::Model
@ -75,6 +75,7 @@ public:
Locale * get_locale();
SessionManager * get_session_manager();
TimeZones * get_time_zones();
PatternCacher * get_pattern_cacher();
const Config * get_config() const;
const Request * get_request() const;
@ -89,6 +90,7 @@ public:
const Locale * get_locale() const;
const SessionManager * get_session_manager() const;
const TimeZones * get_time_zones() const;
const PatternCacher * get_pattern_cacher() const;

View File

@ -53,6 +53,7 @@ WinixModelConnector::WinixModelConnector()
locale = nullptr;
session_manager = nullptr;
time_zones = nullptr;
pattern_cacher = nullptr;
}
@ -127,6 +128,10 @@ TimeZones * WinixModelConnector::get_winix_time_zones()
return time_zones;
}
PatternCacher * WinixModelConnector::get_winix_pattern_cacher()
{
return pattern_cacher;
}
@ -207,6 +212,12 @@ const TimeZones * WinixModelConnector::get_winix_time_zones() const
}
const PatternCacher * WinixModelConnector::get_winix_pattern_cacher() const
{
return pattern_cacher;
}
void WinixModelConnector::set_winix_config(Config * config)
{
@ -280,6 +291,11 @@ void WinixModelConnector::set_winix_time_zones(TimeZones * time_zones)
}
void WinixModelConnector::set_winix_pattern_cacher(PatternCacher * pattern_cacher)
{
this->pattern_cacher = pattern_cacher;
}

View File

@ -52,6 +52,8 @@ class Session;
class Locale;
class SessionManager;
class TimeZones;
class PatternCacher;
class WinixModelConnector : public morm::ModelConnector
@ -72,6 +74,8 @@ public:
Locale * get_winix_locale();
SessionManager * get_winix_session_manager();
TimeZones * get_winix_time_zones();
PatternCacher * get_winix_pattern_cacher();
const Config * get_winix_config() const;
const Request * get_winix_request() const;
@ -85,6 +89,7 @@ public:
const Locale * get_winix_locale() const;
const SessionManager * get_winix_session_manager() const;
const TimeZones * get_winix_time_zones() const;
const PatternCacher * get_winix_pattern_cacher() const;
void set_winix_config(Config * config);
void set_winix_request(Request * request);
@ -98,6 +103,7 @@ public:
void set_winix_locale(Locale * locale);
void set_winix_session_manager(SessionManager * session_manager);
void set_winix_time_zones(TimeZones * time_zones);
void set_winix_pattern_cacher(PatternCacher * pattern_cacher);
protected:
@ -114,7 +120,7 @@ protected:
Locale * locale;
SessionManager * session_manager;
TimeZones * time_zones;
PatternCacher * pattern_cacher;
};

View File

@ -58,6 +58,13 @@ void HtmlTextStream::clear()
}
void HtmlTextStream::to_str(std::wstring & str)
{
str = TextStream<std::wstring>::Str();
}
/*
without escaping
@ -253,6 +260,11 @@ HtmlTextStream & HtmlTextStream::operator<<(RawText<pt::Date> raw)
}
HtmlTextStream & HtmlTextStream::operator<<(const HtmlTextStream & stream)
{
TextStream<std::wstring>::operator<<(stream.Str());
return *this;
}

View File

@ -5,7 +5,7 @@
*/
/*
* Copyright (c) 2010-2015, Tomasz Sowa
* Copyright (c) 2010-2021, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -87,6 +87,7 @@ public:
void Clear();
void clear(); // utf8 methods call clear(), in the future Clear() will be renamed to clear()
void to_str(std::wstring & str);
/*
a helper struct to select a proper operator<<
@ -151,6 +152,9 @@ public:
HtmlTextStream & operator<<(RawText<pt::TextStreamBase<arg_char_type, arg_stack_size, arg_heap_block_size> > raw);
// this method doesn't escape stream as there is no need for such behavior - stream should be already escaped
HtmlTextStream & operator<<(const HtmlTextStream & stream);
// 'write' don't escapes too
// with these methods you can write a zero character too

View File

@ -280,46 +280,46 @@ void item_dates_equal(Info & i)
void item_run(Info & i)
{
if( !cur->request->is_item )
{
i.out << "<!-- there is no an item to run -->";
return;
}
if( system->HasReadExecAccess(*cur->request->last_item) )
{
Ezc::Pattern * p = pattern_cacher.GetPattern(*cur->request->last_item);
item_run_content.Clear();
InitGenerator(ezc_generator, cur->request->models);
ezc_generator.SetPattern(*p);
if( config->allow_ezc_frames_in_executable_items )
ezc_generator.Generate(item_run_content, cur->request->out_streams);
else
ezc_generator.Generate(item_run_content);
ItemContent::print_content(i.out, item_run_content.Str(), cur->request->last_item->item_content.content_raw_type, config->html_filter);
}
else
{
i.out << "<!-- run: permission denied -->";
}
}
//void item_run(Info & i)
//{
// if( !cur->request->is_item )
// {
// i.out << "<!-- there is no an item to run -->";
// return;
// }
//
// if( system->HasReadExecAccess(*cur->request->last_item) )
// {
// Ezc::Pattern * p = pattern_cacher.GetPattern(*cur->request->last_item);
//
// item_run_content.Clear();
// InitGenerator(ezc_generator, cur->request->models);
// ezc_generator.SetPattern(*p);
//
// if( config->allow_ezc_frames_in_executable_items )
// ezc_generator.Generate(item_run_content, cur->request->out_streams);
// else
// ezc_generator.Generate(item_run_content);
//
// ItemContent::print_content(i.out, item_run_content.Str(), cur->request->last_item->item_content.content_raw_type, config->html_filter);
// }
// else
// {
// i.out << "<!-- run: permission denied -->";
// }
//}
void item_guest_name(Info & i)
{
i.out << cur->request->last_item->item_content.guest_name;
}
//void item_guest_name(Info & i)
//{
// i.out << cur->request->last_item->item_content.guest_name;
//}
void item_html_template(Info & i)
{
i.out << cur->request->last_item->html_template;
}
//void item_html_template(Info & i)
//{
// i.out << cur->request->last_item->html_template;
//}
void item_has_html_template(Info & i)

View File

@ -463,9 +463,9 @@ void Templates::CreateFunctions()
ezc_functions.Insert("item_date_creation_nice", item_date_creation_nice);
ezc_functions.Insert("item_date_modification_nice",item_date_modification_nice);
ezc_functions.Insert("item_dates_equal", item_dates_equal);
ezc_functions.Insert("item_run", item_run);
ezc_functions.Insert("item_guest_name", item_guest_name);
ezc_functions.Insert("item_html_template", item_html_template);
// ezc_functions.Insert("item_run", item_run);
// ezc_functions.Insert("item_guest_name", item_guest_name);
// ezc_functions.Insert("item_html_template", item_html_template);
ezc_functions.Insert("item_has_html_template", item_has_html_template);
// ezc_functions.Insert("item_type_is_dir", item_type_is_dir);
// ezc_functions.Insert("item_type_is_file", item_type_is_file);

View File

@ -353,9 +353,9 @@ namespace TemplatesFunctions
void item_date_creation_nice(Info & i);
void item_date_modification_nice(Info & i);
void item_dates_equal(Info & i);
void item_run(Info & i);
void item_guest_name(Info & i);
void item_html_template(Info & i);
//void item_run(Info & i);
//void item_guest_name(Info & i);
//void item_html_template(Info & i);
void item_has_html_template(Info & i);
//void item_type_is_dir(Info & i);
//void item_type_is_file(Info & i);