diff --git a/winixd/core/app.cpp b/winixd/core/app.cpp index a333cf4..1658d68 100644 --- a/winixd/core/app.cpp +++ b/winixd/core/app.cpp @@ -402,21 +402,26 @@ void App::ProcessRequestThrow() // and then BaseUrlRedirect() will be called (for performance) if( !BaseUrlRedirect() ) { - session_manager.SetSession(); - cur.session = session_manager.GetCurSession(); - SetLocale(); - - if( cur.session->new_session ) - { - cur.session->plugin_data.Resize(plugin.Size()); - plugin.Call(WINIX_SESSION_CREATED); - } - - plugin.Call(WINIX_SESSION_CHANGED); - if( cur.request->env_request_uri.size() <= WINIX_URL_MAX_SIZE ) { functions.Parse(); // parsing directories, files, functions and parameters + + if( !cur.request->dir_tab.empty() ) + { + functions.CheckFunctionAndSymlink(); // CHECK ME it is correct now? + + session_manager.SetSession(); + cur.session = session_manager.GetCurSession(); + SetLocale(); + + if( cur.session->new_session ) + { + cur.session->plugin_data.Resize(plugin.Size()); + plugin.Call(WINIX_SESSION_CREATED); + } + + plugin.Call(WINIX_SESSION_CHANGED); + } } else { @@ -436,6 +441,18 @@ void App::ProcessRequestThrow() log << log1 << "App: the URL is too long: " << cur.request->env_request_uri.size() << logend; } + if( cur.request->dir_tab.empty() ) + { + log << log1 << "App: there is no a root dir (dir_tab is empty), adding a root dir" << logend; + Item * root_dir = system.dirs.GetRootDir(); + + if( root_dir ) + { + cur.request->dir_tab.push_back(root_dir); + cur.request->last_item = cur.request->dir_tab.back(); + } + } + cur.mount = system.mounts.CalcCurMount(); if( cur.mount->type != system.mounts.MountTypeStatic() ) @@ -659,8 +676,8 @@ void App::Make() if( cur.request->status == WINIX_ERR_OK ) plugin.Call(WINIX_PREPARE_REQUEST); - if( cur.request->status == WINIX_ERR_OK ) - functions.CheckFunctionAndSymlink(); +// if( cur.request->status == WINIX_ERR_OK ) +// functions.CheckFunctionAndSymlink(); CheckAccessFromPlugins(); diff --git a/winixd/core/sessionmanager.cpp b/winixd/core/sessionmanager.cpp index 42eee1b..896b1f2 100644 --- a/winixd/core/sessionmanager.cpp +++ b/winixd/core/sessionmanager.cpp @@ -460,16 +460,23 @@ void SessionManager::SetSession() if( !IsIPBanned() ) { - CookieTab::iterator i = cur->request->cookie_tab.find(config->http_session_id_name); - - if( i != cur->request->cookie_tab.end() ) + if( cur->request->function && cur->request->function->need_session ) { - if( !SetSessionFromCookie(i->second) ) - cur->request->cookie_tab.erase(i); + CookieTab::iterator i = cur->request->cookie_tab.find(config->http_session_id_name); + + if( i != cur->request->cookie_tab.end() ) + { + if( !SetSessionFromCookie(i->second) ) + cur->request->cookie_tab.erase(i); + } + else + { + NoSessionCookieCheckBan(); + } } else { - NoSessionCookieCheckBan(); + SetTemporarySession(); } } diff --git a/winixd/functions/functionbase.cpp b/winixd/functions/functionbase.cpp index c458530..04b2aa7 100644 --- a/winixd/functions/functionbase.cpp +++ b/winixd/functions/functionbase.cpp @@ -45,6 +45,7 @@ FunctionBase::FunctionBase() follow_symlinks = true; template_index = size_t(-1); need_ssl = false; + need_session = true; fun.user_id = -1; fun.group_id = -1; diff --git a/winixd/functions/functionbase.h b/winixd/functions/functionbase.h index 7a9f347..92849b0 100644 --- a/winixd/functions/functionbase.h +++ b/winixd/functions/functionbase.h @@ -80,6 +80,10 @@ public: // (this option is ignored if 'use_ssl' in the config is false) bool need_ssl; + // true if the function need a session object + // if false then a temporary session is used + bool need_session; + virtual void Init(); virtual bool HasAccess(); virtual void MakePost();