/* * This file is a part of Winix * and is not publicly distributed * * Copyright (c) 2010-2013, Tomasz Sowa * All rights reserved. * */ #ifndef headerfile_winix_core_app #define headerfile_winix_core_app #include #include #include #include #include #include #include #include #include #include "config.h" #include "system.h" #include "mounts.h" #include "request.h" #include "synchro.h" #include "sessionmanager.h" #include "db/db.h" #include "functions/functions.h" #include "templates/templates.h" #include "compress.h" #include "postparser.h" #include "cookieparser.h" #include "postmultiparser.h" #include "acceptencodingparser.h" class App { public: App(); bool InitFCGI(); bool DropPrivileges(); bool Init(); void Start(); void Close(); void LogUserGroups(); bool Demonize(); void SetStopSignal(); bool WasStopSignal(); bool Lock(); void Unlock(); void StartThreads(); void WaitForThreads(); // configuration read from a config file Config config; // pointers to the current request and a session Cur cur; // temporary one request object // current request Request req; // users sessions SessionManager session_manager; // database Db db; DbConn db_conn; /* model */ // ... System system; // functions (ls, cat, emacs, ...) Functions functions; // false at the beginning // !! IMPROVE ME moze to do loggera dac? bool stdout_is_closed; /* view */ Templates templates; private: enum Header { h_200, h_404, h_403 }; PostParser post_parser; PostMultiParser post_multi_parser; CookieParser cookie_parser; AcceptEncodingParser accept_encoding_parser; Compress compress; FCGX_Request fcgi_request; int fcgi_socket; Synchro synchro; pthread_t signal_thread; std::string url_to_fetch_on_exit; std::string send_data_buf; PT::SpaceToJSON json_generic_serializer; TextStream json_out_stream; std::string aheader_name, aheader_value; std::wstring html_filtered; std::string output_8bit; BinaryPage compressed_output; bool CheckAccessFromPlugins(); void ProcessRequestThrow(); void ProcessRequest(); void BaseUrlRedirect(int code, bool add_subdomain); bool BaseUrlRedirect(); void CheckIfNeedSSLredirect(); void SetLocale(); void CheckPostRedirect(); void MakePage(); void Make(); void SaveSessionsIfNeeded(); // !! IMPROVE ME wywalic do menagera sesji?? void LogAccess(); void SendData(const BinaryPage & page, FCGX_Stream * out); void CreateJSONAnswer(); void ReadRequest(); void SendTextAnswer(); void SendBinaryAnswer(); void SendAnswer(); void LogEnvironmentVariables(); void SetEnv(const char * & env, const char * name); void ReadEnvVariables(); void ReadGetPostVars(); void CheckIE(); void CheckKonqueror(); void CheckRequestMethod(); void CheckSSL(); void SetSubdomain(); Header GetHTTPStatusCode(); void PrepareSessionCookie(); void FilterContent(); void SendHeaders(); void SendCookies(); bool PrepareHeadersStaticCreateResource(PT::WTextStream & out_path); void PrepareHeadersStatic(); void PrepareHeaderContentType(); void PrepareHeadersForbidden(); void PrepareHeadersRedirect(); void PrepareHeadersSendFile(); void PrepareHeadersCompression(int compress_encoding); void PrepareHeadersNormal(Header header, size_t output_size); void PrepareHeaders(bool compressing, int compress_encoding, Header header, size_t output_size); int SelectDeflateVersion(); void SelectCompression(size_t source_len, bool & compression_allowed, int & compression_encoding); bool CanSendContent(); void ClearAfterRequest(); void LogUser(const char * msg, uid_t id); void LogGroup(const char * msg, gid_t id, bool put_logend = true); void LogUsers(); void LogEffectiveGroups(std::vector & tab); void LogGroups(); bool DropPrivileges(const std::string & user, uid_t uid, gid_t gid, bool additional_groups); static void * SpecialThreadForSignals(void*); void FetchPageOnExit(); void CreateStaticTree(); // !! IMPROVE ME // !! move to the session manager? time_t last_sessions_save; }; #endif