Compare commits

70 Commits

Author SHA1 Message Date
tomasz.sowa 8196fb77d1 changed: now we do not use std::string and char* in the Winix API
everywhere we are using std::wstring and wchar_t*
         (std::string and char* is used only locally in some places
         especially when creating a path to OS file system etc.)
added:   to the special thread when winix closes:
         a write function for curl: FetchPageOnExitCurlCallback()
         without this function the curl library will print
         the page's content to the standart output
changed: TextStream<> class from core can make
         UTF8<->wide strings conversions
removed: from config: utf8 option
         now winix expects UTF8 from the user's input (html forms, url-es)
         and outputs strings in the UTF8 format




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@965 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-09 20:44:56 +00:00
tomasz.sowa 4abf6642f7 setting a Winix Licence: 2 Clause BSD Licence
changed: version to 0.6.2



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@963 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-10-04 18:04:03 +00:00
tomasz.sowa e3284dcfbc fixed: winix incorrectly used config options: upload_dirs_chmod and upload_files_chmod
added: to config: upload_group
       a group name for newly uploaded files (and created necessary directories in the file system)




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@961 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-09-28 17:30:05 +00:00
tomasz.sowa f064ff6b3d added: htmltextstream escapes more characters now:
added characters:
          "  -> &#quot;
          '  -> &#39; (&apos; but IE8 has a problem with &apos;)
          10 -> &#10;
          13 -> &#13;
added: two ezc filters:
       fil_html_quote
          "  -> &#quot;
          '  -> &#39; (&apos; but IE8 has a problem with &apos;)
       fil_html_newline
          10 -> &#10;
          13 -> &#13;
changed: fun_subject.html uses <div class="winix_input_a"> now





git-svn-id: svn://ttmath.org/publicrep/winix/trunk@959 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-09-22 23:54:24 +00:00
tomasz.sowa bfa5d8cc05 changed: plugin jQuery File Upload has been updated to version 9.7.0
(changed 'upload' and 'rm' winix functions)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@958 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-08-06 20:14:10 +00:00
tomasz.sowa 6614919c13 added: possibility to save a pid file
new config option: pid_file (a full path to a pid file)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@957 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-08-04 21:11:14 +00:00
tomasz.sowa 8379acdb7f fixed: item content should not be escaped in 'raw' mode
(it was not escaped only when execute bits were set)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@956 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-08-03 18:33:07 +00:00
tomasz.sowa 160ddc258d added: to htmlfilter: the filter is able to recognize a special tag, default called: <nofilter>
content between <nofilter>...</nofilter> will not be filtered



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@955 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-06-18 23:18:28 +00:00
tomasz.sowa 01892d2766 added: flag has_pass to User structure
if false that means the user has not set a password yet 
       (this can be used by a plugins to create a new account without a password set)
       in order to login the user first has to set a new password
       (this can be done from a some kind of activation link send via email etc)
       



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@954 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-06-07 11:20:44 +00:00
tomasz.sowa 222955a2e7 fixed: in Synchro: we should have a table (map) of reference counters
each one for each thread
fixed: on Linux: pthread mutexes by default behaves differently than on FreeBSD
       we have to set PTHREAD_MUTEX_ERRORCHECK attribute 
       when creating a mutex
       



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@953 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-02-14 11:20:22 +00:00
tomasz.sowa 37b22c3559 added: some debug logs to export plugin
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@952 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-02-12 22:32:06 +00:00
tomasz.sowa afbd522362 fixed: in Makefile: 'cp' in Linux behaves differently
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@951 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-02-12 20:49:50 +00:00
tomasz.sowa a4bed3ab14 fixed: compiling on Debian with GCC 4.8
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@950 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-02-12 17:21:42 +00:00
tomasz.sowa 7468e7a36c added: namespace Winix over all *.h/*.cpp files
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@948 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-02-12 16:30:49 +00:00
tomasz.sowa 145445c713 changed: now we use curl to fetch a page from the special thread when winix quits
(before we were using BSD's fetch)
fixed:   we didn't use FCGX_Finish_r() on the request made from the special thread
         so the thread hangs (now we can use pthread_join correctly from the main thread)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@947 e52654a7-88a9-db11-a3e9-0013d4bc506e
2014-02-11 21:00:32 +00:00
tomasz.sowa 7fa9314c6b changed: in ClearOutputStreams() referencing 'config' only if not null
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@946 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-12-23 03:29:33 +00:00
tomasz.sowa 5d37b6c6ae fixed: winix incorrectly sent the binary stream
headers and cookies were not sent
       (instead of headers the content was sent, so the client's browser was unable to open it correctly)
added: standard http headers are added by winix only if there are not such headers already
       e.g. if a plugin adds "Content-Type" header then winix will not overwrite it 
       (headers names are case sensitive)


git-svn-id: svn://ttmath.org/publicrep/winix/trunk@945 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-12-19 17:19:47 +00:00
tomasz.sowa fe1f84e29d added: -O0 -g for CXXFLAGS for temporarily debugging
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@944 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-12-18 12:13:28 +00:00
tomasz.sowa 83e27a6653 fixed: problem with building
added #include <utility> to App (for std::move)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@943 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-12-09 16:03:45 +00:00
tomasz.sowa ee9c68b04e added: generating Content-Length header when text answer is sent to the client
added:   now we are able to use the html filter for the whole out_streams (when ajax is used the output is filtered too)
         splitted FilterCompressSend() function -- first we are making the filtering
         (after filtering we know the size of the content to send)
added:   to Compress:
         Compressing(const char * source, size_t source_len, BinaryPage & out_stream, int encoding);
changed: some refactoring in App




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@942 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-12-04 01:21:57 +00:00
tomasz.sowa c04874397b fixed: security vulnerability in 'ln' winix function
a user could create a hardlink to any file and the new link 
       had user_id, group_id and permissions the same as for new generated files,
       this allowes to overwrite any existing file in the filesystem,
       now user_id, group_id, permissions are the same as from the oryginal file



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@941 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-12-03 12:33:41 +00:00
tomasz.sowa 375604edd6 removed: Request::debug all stream used for debugging info
some environment variables were put there
removed: config variable: debug_info
removed: Request::role (responder, authorizer)
         now we have only one role: responder
added:   new config variables:
         log_env_variables (default false) - when true then fastcgi environment
         variables are logged to the log file
         log_http_answer_headers (default false) - when true all http headers
         created by winix ale logged (note that the www server can add/adjust other headers)
changed: some refactoring in Request struct
changed: CookieTab to std::map<std::wstring, std::wstring>
         beforehand std::string was used
         (changed CookieParser as well)
changed: Request::SetCookie() to AddCookie()
added:   Request::out_headers (a PT::Space struct)
         http headers (without cookies) send back to the client
added:   Request::out_cookies (a PT::Space struct)
         cookies send to the client
changed: App class to use Request::out_headers and Request::out_cookies
         some SendHeaders...() methods were renamed to PrepareHeaders...()
         and they create output in Request::out_headers first (and out_cookies)
         and later it is sent
added:   two plugin messages:
         // http headers (without cookies) were created and are ready to send
         // here you can make some changes to them
         // in p1 you have a pointer to the PT::Space (Request::out_headers)
         #define WINIX_PREPARE_TO_SEND_HTTP_HEADERS		31070

         // http cookies were created and are ready to send
         // here you can make some changes to them
         // in p1 you have a pointer to the PT::Space (Request::out_cookies)
         #define WINIX_PREPARE_TO_SEND_HTTP_COOKIES		31080
added:   config variable:
         // how many output streams do we have in Request class
         // default: 16 (64 maximum)
         size_t ezc_out_streams_size;




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@940 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-11-29 21:39:23 +00:00
tomasz.sowa 3e32f3784f removed: -O0 -g from production Makefile
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@939 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-11-25 23:44:01 +00:00
tomasz.sowa 5c4a54d998 added: -O0 -g to the production Makefile
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@938 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-11-25 23:37:52 +00:00
tomasz.sowa 3af3ac3f6f removed: ezn patterns for rawcontent and ajaxcontent:
index_rawcontent.html, index_ajaxcontent.html
         now we have out_streams in Request and some special
         keyword in ezc templates for sending content to the 
         specified streams
changed: the way how winix answers to the client's browsers:
         info from Request class:
	                                   winix answer send to the client's browser
	                                                       |
	                                                       |
	                                          depending on send_bin_stream
	                               -------------------------------------------------
	                               |                                               |
	                          text answer                                     binary answer
	                               |                                               |
	                   depending on return_json                          sending out_bin_stream
	             ------------------------------------
	             |                                  |
	       normal request                     ajax request
	             |                                  |
	   sending out_streams[0]           depending on return_info_only
	                              ------------------------------------------------------
	                              |                                                    |
	                 generating JSON object from:                   generating JSON object only from info
	                 out_streams and info, e.g.:                    e.g.:
	                 {                                              { info object serialized here }
	                  "stream_1": "some html content",
	                  "stream_2": "some other html content",
	                  "info": { info object serialized here }
	                 }
	                 note that out_streams[0] is not sent
	                 in JSON answers
	
	




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@937 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-11-14 20:59:23 +00:00
tomasz.sowa d801f53154 changed: now we are using the C++ 11 language (-std=c++11) and we are using
the clang compiler by default
changed: Makefile files have been a little cleaned
         the main Makefile now will not compile winix and winix.so if there
         were not any changes to source files (it's faster)
         (added Makefile.dep in the global directory with list of all source/header files)
changed: winix version to 0.5.5




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@933 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-10-15 21:57:51 +00:00
tomasz.sowa a6b06f82e9 fixed: compiling in the clang (new version of c++ std lib)
(added some header files)
added: three messsages in ticket plugin:
       // send by showtickets winix function when tickets are loaded (and sorted)
       // in p1 you have a pointer to the ticket tab: std::vector<Ticket::Ticket> (include "ticket.h")
       // in p2 you have a pointer to the sort tab:   std::vector<Item*>
       // those tables don't have to be equal in size (in the case when there is no some tickets in the database)
       #define WINIX_PL_TICKET_TICKETS_LOADED                 4106
       
       // a new ticket has been added
       // in p1 you have a pointer to the Ticket::Ticket structure (include "ticket.h")
       // in p2 you have a pointer to the Item structure
       #define WINIX_PL_TICKET_ADDED_NEW                              4107
       
       // a ticket has been changed
       // in p1 you have a pointer to the Ticket::Ticket structure (include "ticket.h")
       // in p2 you have a pointer to the Item structure
       #define WINIX_PL_TICKET_CHANGED                                        4108

added: two ezc functions for tickets:
       ticket_does_param_id_have_value()
       tickets_tab_does_param_id_have_value()
       (they take two integer arguments -- testing whether a specified param_id has the given value)
changed: some more minor additions in tickets templates




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@932 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-10-10 11:59:21 +00:00
tomasz.sowa b7f3f84080 changed: in 'showtickets' winix function
now tickets are sorted by the sort_index and then by date
changed: html in 'sort' winix function (added items' subjects to the item lists)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@931 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-07-08 14:42:14 +00:00
tomasz.sowa 26715bdd4c changed: html for 'upload' winix function
all static files (css/js) are downloaded from our server now



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@930 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-07-02 07:14:19 +00:00
tomasz.sowa 083fa7857f fixed: in notify/notify.cpp: a correct locale id should be taken
(we were not able to send: a mail with an activation link and 
        a mail with the reset password link when we didn't have a locale with id 0 loaded)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@929 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-05-16 21:02:17 +00:00
tomasz.sowa 9ffda3e070 changed: in passwd: a redirect make only if a password has been changed
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@928 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-05-16 20:11:27 +00:00
tomasz.sowa 81160dbbe9 fixed: a passwd winix function should allow a non loged person to reset his password (permission fix)
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@927 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-05-16 20:08:07 +00:00
tomasz.sowa 7c266b85e2 added: winix function 'account'
code for activating an account has been moved here from Pw
changed: the form for reseting a user's password has been moved
         to 'passwd' winix function (it was in Pw before)




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@926 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-05-16 19:26:44 +00:00
tomasz.sowa 48cdca7549 changed: in fun_gallery.html: added js code to get the proper image id from url
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@925 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-05-14 08:37:22 +00:00
tomasz.sowa 1c401eae3b added: to Rm function:
bool Rm::RemoveFileOrSymlink(long item_id, bool check_access)
added: in ticket plugin: possibility to remove a file/image
       (not finished yet)




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@924 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-05-06 07:23:44 +00:00
tomasz.sowa 0e9eb30b5d added: some ezc function to ticket plugin:
ticket_param_value_for_param_id
       tickets_tab_param_value_for_param_id
       tickets_tab_conf_tab_param_name
       tickets_tab_conf_tab_file_tab
       tickets_tab_conf_tab_file_tab_index
       tickets_tab_conf_tab_file_tab_path
       tickets_tab_conf_tab_file_tab_itemid
       tickets_tab_conf_tab_file_tab_meta




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@923 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-04-24 01:21:19 +00:00
tomasz.sowa c10c9393c0 changed: plugin 'export': export winix function
the checkbox is now selected when we want to export static files too 
         (default it is not checked)
         



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@922 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-04-17 00:37:39 +00:00
tomasz.sowa 8705b3437c fixed: imgcrop winix function should load only images
(when called in a directory)
added: to reload winix function:
       reloading (clearing) the cache from 'menu' plugin
added: to 'menu' plugin
       possibility to read 'meta' information from files 
       third argument 'withmeta' to menu_dir_tab ezc function
       e.g. [for menu_dir_tab "/directory" "..." "withmeta"]...[end]
       and some ezc functions to retrieve the meta values




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@921 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-04-16 09:51:36 +00:00
tomasz.sowa aed891764a added: to config: HasValue() methods
for checking if a value exists (useful for checking lists -- they don't have to be copied out)




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@920 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-04-02 22:24:30 +00:00
tomasz.sowa 495499d12f added: a new winix function: imgcrop
for cropping images (and thumbnails)
       www.domain.com/dir/file.jpg/imgcrop  -- crop an image
       www.domain.com/dir/file.jpg/imgcrop/thumb  -- crop an image's thumbnail
       www.domain.com/dir/file.jpg/imgcrop/newthumb  -- crop and create a new thumbnail (from an original image)
       www.domain.com/dir/imgcrop -- show images' list with above options
added: to Image class: some methods for cropping




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@919 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-03-29 22:03:28 +00:00
tomasz.sowa 8d9a021eab changed: when there is reqtype:json parameter and there is not set request.ajax_serializer
then we are using a generic json serializer
changed: we are sending the application/json header when returning an json string
added:   to config: log_server_answer (default false)
         when true we put the whole string (server's answer) to the log file
added:   to Request: use_200_status_for_not_found_and_permission_denied
         if this is true then if the server http code would be 403 or 404
         then we return 200 OK (useful when using ajax)
changed: System::RedirectTo() methods take as the last parameter: use_reqtype
         if this is true (default) then reqtype:type parameter is automatically added to the redirecting path
         




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@918 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-03-26 00:04:01 +00:00
tomasz.sowa be6e09c5af added: some ezc functions (item_tab_meta*)
added: some ezc functions (gallery_tab_meta*) to gallery plugin
added: to gallery plugin: a new gallery: Gallery version 1.2.9



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@917 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-02-26 11:49:22 +00:00
tomasz.sowa 293e426ed4 fixed: plugin 'group'
Groups::ReindexGroups incorrectly read a field from a PT::Space (it used 'table' object directly)
       but the value was in 'table_single' 
       now we are using GetValue method



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@916 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-02-01 21:14:56 +00:00
tomasz.sowa 60f2337b73 updated: paths in Makefile (prog subdirectory)
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@915 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-01-19 16:31:15 +00:00
tomasz.sowa ce8152de2f changed: added 'logsave' when we are waiting for the database to be ready
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@913 e52654a7-88a9-db11-a3e9-0013d4bc506e
2013-01-19 10:10:17 +00:00
tomasz.sowa 496a1979d2 fixed: in ticket plugin: editticket incorrectly used ticket_info->Clear() method
it was called after some objects were set consequently we were not allowed to edit a ticket



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@912 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-12-30 15:33:08 +00:00
tomasz.sowa fd698ca7b9 added: put the rebus answer into the log (when user has entered an incorrect answer)
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@911 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-12-26 23:08:57 +00:00
tomasz.sowa b4b368d324 changed: Makefile dep
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@910 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-11-17 01:10:00 +00:00
tomasz.sowa 825694c880 changed: in editticket: closing ticket is better to do via POST request
added:   a new message sent by editticket when closing a ticket:
         #define WINIX_PL_TICKET_CLOSED                                 4105
         // a ticket has been closed (closed button pressed)
         // in p1 you have a pointer to the Item struct
         // in p2 you have a pointer to the Ticket struct





git-svn-id: svn://ttmath.org/publicrep/winix/trunk@909 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-11-05 23:13:52 +00:00
tomasz.sowa 32750a7d50 changed: ticket plugin: redirect type in editticket winix function (when there is 'close' parameter)
fixed:   prototype doesn't work with jquery (in ticket winix function)
         (prototype was loaded for lightbox)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@908 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-11-04 22:39:02 +00:00
tomasz.sowa 0045c6c72c added: to Item struct: ameta (PT::Space)
admin meta information
added: option "a" to meta winix function
       editing admin meta information
changed: now if you don't have write access to an item
         you can't see the meta information
         previous if you had read access you could have seen them
added: in plugin ticket and thread
       support for 'closing' (ticket, thread)
       (this is only logic, we need some html yet)
added: some ezc function for getting meta/admin meta information
       (for the current item and the last directory)




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@907 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-11-04 21:01:02 +00:00
tomasz.sowa 4809016b78 changed: html (slog.html)
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@906 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-11-01 17:56:00 +00:00
tomasz.sowa 6e2ba65524 changed: added 'check_abuse' parameter to Login::LoginUser
bool Login::LoginUser(const std::wstring & login, const std::wstring & password, bool remember_me,
                               bool use_ses_log, bool check_abuse)
         default 'false' -- it test the time between GET and POST and the rebus (if exists)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@905 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-10-27 11:17:52 +00:00
tomasz.sowa 8033ac66c4 added: locales to fun_ipban.html
changed: cosmetic changes in IPBanContainer




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@904 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-10-27 10:14:07 +00:00
tomasz.sowa 9ef3736989 added: to 'ipban' winix function:
possibility to remove a ban (or all bans)
added: to SessionManager: sorting of the ban list (in the second thread)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@903 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-10-27 09:03:49 +00:00
tomasz.sowa 099dd55d0c added: IP ban mechanism (not finished yet -- we need a winix function to remove a ban)
now after some incorrent login attempts your IP can be banned or blocked
       (see new config variables)


git-svn-id: svn://ttmath.org/publicrep/winix/trunk@902 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-10-27 07:44:26 +00:00
tomasz.sowa 53b4175d00 added: plugin message: WINIX_CHECK_PLUGIN_ACCESS
this message is sent before calling MakePost() or MakeGet()
       if you return false (which is default) you can prevent the access
       to the resource
       



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@901 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-10-17 19:52:55 +00:00
tomasz.sowa 8aa6f08e08 updated: html (login and passwd)
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@900 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-10-17 06:48:48 +00:00
tomasz.sowa c5024598cb updated: html/css (added div.winix to templates)
now we have winix.css in common/winix directory
         it is automatically loaded by index_head_functions_add.html


git-svn-id: svn://ttmath.org/publicrep/winix/trunk@898 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-10-17 06:00:00 +00:00
tomasz.sowa dfcf6b29c0 added: to misc:
bool IsWhite(const wchar_t * str, bool treat_new_line_as_white)
       bool IsWhite(const std::wstring & str, bool treat_new_line_as_white)
       return true if the whole string is white (or an empty string)
added: global variable in admin environment for an user: "display_name"
       if defined it is used to display an user's name instead of its login
       it is used in: void print_user_name(Info & i, User & user);
       (tickets, threads, cat function etc)





git-svn-id: svn://ttmath.org/publicrep/winix/trunk@895 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-09-26 07:18:32 +00:00
tomasz.sowa 7f48d1eb2e fixed: the way we check whether we need make the redirect from SSL to non SSL (or vice versa)
beforehand we didn't take into accout default winix functions



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@894 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-09-24 20:31:01 +00:00
tomasz.sowa eaa97995d2 fixed: we should check cur.request->function is not null (in5D app when testing ssl/nossl redirect)
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@893 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-09-24 18:59:08 +00:00
tomasz.sowa 14f997b844 added: need_ssl flag to FunctionBase
// try to use SSL
       // if in the config 'use_ssl' is true and 'use_ssl_only_for_logged_users' is true
       // then ssl is used only for logged users but sometimes there is a need to use
       // SSL even if noone is logged (for example for such functions like 'login' or 'adduser')
       // default: false
       // (this option is ignored if 'use_ssl' in the config is false)
       bool need_ssl;




git-svn-id: svn://ttmath.org/publicrep/winix/trunk@892 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-09-24 18:38:35 +00:00
tomasz.sowa 26e87b20b1 changed: in Crypt:
renamed Hash() -> HashBin()
         HashBin() is using a binary output from OpenSSL now
	 previously we are using the hex output and with the new OpenSSL version
         the text has additional characters and causes some problems
	 added: HashHex() - it is using the HashBin() and then converts the output
	 to hex format itself
	 



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@891 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-09-19 23:17:10 +00:00
tomasz.sowa 5cdf6eff36 added: to ticket plugin:
some messges:
// 
#define WINIX_PL_TICKET_PREPARE_TO_ADD_TICKET  4103

// a next ticket will be displayed
// in p1 you have a pointer to the Item struct
// this is call from tickets_tab ezc function
#define WINIX_PL_TICKET_TICKETS_TAB_IS_NEXT            4104

methods:
void ticket_meta_value(Info & i)
void tickets_tab_meta_value(Info & i)






git-svn-id: svn://ttmath.org/publicrep/winix/trunk@890 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-09-15 23:34:25 +00:00
tomasz.sowa 4ed535a3b7 added: to plugin ticket: message WINIX_PL_TICKET_LOAD_TICKETS
someone can send this message with a directory id
       and tickets will be loaded from the directory
       (and to display them you can use ezc functions)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@889 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-09-14 23:48:39 +00:00
tomasz.sowa da15323c2f added: to plugin thread: message WINIX_PL_THREAD_CAN_MAKE_REDIRECT
(similar as for ticket)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@888 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-09-14 07:14:54 +00:00
tomasz.sowa bd1f717b4c added: some methods in Dystem::Dirs (takes wchar_t * as an argument, now only std::wstring were)
changed: in plugin ticket: added message: WINIX_PL_TICKET_CAN_MAKE_REDIRECT
         it is sent at the end of POST request (editticket, createticket)
         if we can make a redirect (useful with AJAX)





git-svn-id: svn://ttmath.org/publicrep/winix/trunk@887 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-09-13 23:12:48 +00:00
tomasz.sowa 72013046fc added: Lock class -- locking resources by using Synchro object
the destructor automatically calls Unlock()



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@886 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-09-11 23:46:00 +00:00
tomasz.sowa 14ae19143f added: new ezc filter: fil_new_line_to_br
added: PutChar() methods to HtmlTextFilter and TexTextFilter



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@885 e52654a7-88a9-db11-a3e9-0013d4bc506e
2012-09-11 21:41:10 +00:00
439 changed files with 26441 additions and 10307 deletions
+60 -30
View File
@@ -1,29 +1,51 @@
# Makefile for GNU make # Makefile for GNU make
include Makefile.dep
ifndef CXX
CXX = g++ ifeq ($(OSTYPE), FreeBSD)
CXX = clang++
else
CXX = g++-4.8
endif endif
ifndef CXXFLAGS ifndef CXXFLAGS
CXXFLAGS = -fPIC -Wall -O2 -pthread -I/usr/local/include -I/home/tomek/roboczy/winix -I/home/tomek/roboczy/ezc/src -I/home/tomek/roboczy/tito/src -I/home/tomek/roboczy/pikotools -DEZC_USE_WINIX_LOGGER -DEZC_HAS_SPECIAL_STREAM CXXFLAGS = -Wall -O0 -g -fPIC -pthread -std=c++11 -I/usr/local/include -I/usr/include/postgresql -DEZC_USE_WINIX_LOGGER -DEZC_HAS_SPECIAL_STREAM
endif
ifndef CXXWINIXINCLUDEFLAGS
# these flags are used for compiling and making dependencies (make depend)
# it's better to not using any system directories like -I/usr/local/include here
CXXWINIXINCLUDEFLAGS = -I../../winix -I../../../winix -I../../ezc/src -I../../../ezc/src -I../../tito/src -I../../../tito/src -I../../pikotools -I../../../pikotools
endif endif
ifndef LDFLAGS ifndef LDFLAGS
LDFLAGS = -L/usr/local/lib LDFLAGS = -L/usr/local/lib
endif endif
# this macro is used in ezc's Makefile
EZC_USE_WINIX_LOGGER = yes
# for make install
winix_install_dir = /usr/local/winix
export CXX export CXX
export CXXFLAGS export CXXFLAGS
export CXXWINIXINCLUDEFLAGS
export LDFLAGS export LDFLAGS
export EZC_USE_WINIX_LOGGER
all: winix.so plugins winix all: winix.so plugins winix
winix.so: FORCE winix.so: $(winix.src.files)
@cd core ; $(MAKE) -e @cd core ; $(MAKE) -e
@cd db ; $(MAKE) -e @cd db ; $(MAKE) -e
@cd functions ; $(MAKE) -e @cd functions ; $(MAKE) -e
@@ -32,13 +54,12 @@ winix.so: FORCE
@cd ../ezc/src ; $(MAKE) -e @cd ../ezc/src ; $(MAKE) -e
@cd ../tito/src ; $(MAKE) -e @cd ../tito/src ; $(MAKE) -e
@cd ../pikotools ; $(MAKE) -e @cd ../pikotools ; $(MAKE) -e
$(CXX) -shared -rdynamic -Wl,-whole-archive -o winix.so $(CXXFLAGS) core/*.o db/*.o functions/*.o templates/*.o notify/*.o ../ezc/src/ezc.a ../tito/src/tito.a ../pikotools/utf8/utf8.a ../pikotools/space/space.a ../pikotools/mainparser/mainparser.a ../pikotools/date/date.a $(LDFLAGS) -lfcgi -lpq -lz -lfetch -lpthread -Wl,-no-whole-archive $(CXX) -shared -rdynamic -Wl,-whole-archive -o winix.so $(CXXFLAGS) $(CXXWINIXINCLUDEFLAGS) core/*.o db/*.o functions/*.o templates/*.o notify/*.o ../ezc/src/ezc.a ../tito/src/tito.a ../pikotools/utf8/utf8.a ../pikotools/space/space.a ../pikotools/mainparser/mainparser.a ../pikotools/date/date.a $(LDFLAGS) -lfcgi -lpq -lz -lpthread -lcurl -Wl,-no-whole-archive
winix: winix.so FORCE winix: winix.so $(winix.src.files)
@cd main ; $(MAKE) -e @cd main ; $(MAKE) -e
# use the full path with winix.so $(CXX) -o winix $(CXXFLAGS) $(LDFLAGS) main/*.o winix.so -lfcgi
$(CXX) -o winix $(CXXFLAGS) $(LDFLAGS) main/*.o /home/tomek/roboczy/winix/winix.so
@@ -96,33 +117,42 @@ depend:
@cd ../tito/src ; $(MAKE) -e depend @cd ../tito/src ; $(MAKE) -e depend
@cd ../pikotools ; $(MAKE) -e depend @cd ../pikotools ; $(MAKE) -e depend
@cd main ; $(MAKE) -e depend @cd main ; $(MAKE) -e depend
echo -n "winix.src.files = " > Makefile.dep
find -E . -type f -regex ".*\.h|.*\.cpp" | xargs -I foo echo -n foo " " >> Makefile.dep
find -E ../ezc/src -type f -regex ".*\.h|.*\.cpp" | xargs -I foo echo -n foo " " >> Makefile.dep
find -E ../tito/src -type f -regex ".*\.h|.*\.cpp" | xargs -I foo echo -n foo " " >> Makefile.dep
find -E ../pikotools -type f -regex ".*\.h|.*\.cpp" | xargs -I foo echo -n foo " " >> Makefile.dep
install: all install: all
# binaries # installing binaries
mkdir -p /usr/local/winix/bin rm -Rf $(winix_install_dir)/bin
cp winix.so /usr/local/winix/bin mkdir -p $(winix_install_dir)/bin
# use the full path with winix.so (we have to recompile winix with a new path to winix.so) cp winix $(winix_install_dir)/bin
$(CXX) -o /usr/local/winix/bin/winix $(CXXFLAGS) main/*.o /usr/local/winix/bin/winix.so cp winix.so $(winix_install_dir)/bin
# etc configs # etc configs
mkdir -p /usr/local/winix/etc rm -Rf $(winix_install_dir)/etc
cp -rf etc/ /usr/local/winix/etc/ mkdir -p $(winix_install_dir)/etc
find /usr/local/winix/etc/ -type d -name ".svn" | xargs -I foo rm -fr foo cp -rf etc/* $(winix_install_dir)/etc/
# html templates # html templates
mkdir -p /usr/local/winix/html rm -Rf $(winix_install_dir)/html
cp -rf html/ /usr/local/winix/html/ mkdir -p $(winix_install_dir)/html
find /usr/local/winix/html/ -type d -name ".svn" | xargs -I foo rm -fr foo cp -rf html/* $(winix_install_dir)/html/
# txt templates # txt templates
mkdir -p /usr/local/winix/txt rm -Rf $(winix_install_dir)/txt
cp -rf txt/ /usr/local/winix/txt/ mkdir -p $(winix_install_dir)/txt
find /usr/local/winix/txt/ -type d -name ".svn" | xargs -I foo rm -fr foo cp -rf txt/* $(winix_install_dir)/txt/
# locales # locales
mkdir -p /usr/local/winix/locale rm -Rf $(winix_install_dir)/locale
cp -rf locale/ /usr/local/winix/locale/ mkdir -p $(winix_install_dir)/locale
find /usr/local/winix/locale/ -type d -name ".svn" | xargs -I foo rm -fr foo cp -rf locale/* $(winix_install_dir)/locale/
# plugins # plugins
mkdir -p /usr/local/winix/plugins rm -Rf $(winix_install_dir)/plugins
find plugins/ -name "*.so" | xargs -I foo cp foo /usr/local/winix/plugins/ mkdir -p $(winix_install_dir)/plugins
# removed provileges for others find plugins/ -name "*.so" | xargs -I foo cp foo $(winix_install_dir)/plugins/
find /usr/local/winix -exec chmod o-r,o-x,o-w "{}" "+" # deleting subversion directories
find $(winix_install_dir) -type d -name ".svn" | xargs -I foo rm -fr foo
# removing privileges for others
find $(winix_install_dir) -exec chmod o-r,o-x,o-w "{}" "+"
+1
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -5,11 +5,11 @@ all: $(o)
%.o: %.cpp %.o: %.cpp
$(CXX) -c $(CXXFLAGS) $< $(CXX) -c $(CXXFLAGS) $(CXXWINIXINCLUDEFLAGS) $<
depend: depend:
makedepend -Y. -I.. -I../../ezc/src -I../../pikotools -I../../tito/src -f- *.cpp > Makefile.dep makedepend -Y. $(CXXWINIXINCLUDEFLAGS) -f- *.cpp > Makefile.dep
echo -n "o = " > Makefile.o.dep echo -n "o = " > Makefile.o.dep
ls -1 *.cpp | xargs -I foo echo -n foo " " | sed -E "s/([^\.]*)\.cpp[ ]/\1\.o/g" >> Makefile.o.dep ls -1 *.cpp | xargs -I foo echo -n foo " " | sed -E "s/([^\.]*)\.cpp[ ]/\1\.o/g" >> Makefile.o.dep
+878 -626
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1 +1 @@
o = acceptbaseparser.o app.o basethread.o bbcodeparser.o compress.o config.o crypt.o dircontainer.o dirs.o groups.o htmlfilter.o httpsimpleparser.o image.o item.o job.o lastcontainer.o loadavg.o log.o misc.o mount.o mountparser.o mounts.o plugin.o plugindata.o postmultiparser.o rebus.o request.o run.o session.o sessioncontainer.o sessionmanager.o sessionparser.o slog.o synchro.o system.o threadmanager.o timezone.o timezones.o user.o users.o o = acceptbaseparser.o app.o basethread.o bbcodeparser.o compress.o config.o crypt.o dircontainer.o dirs.o groups.o htmlfilter.o httpsimpleparser.o image.o ipbancontainer.o item.o job.o lastcontainer.o loadavg.o lock.o log.o misc.o mount.o mountparser.o mounts.o plugin.o plugindata.o postmultiparser.o rebus.o request.o run.o session.o sessioncontainer.o sessionmanager.o sessionparser.o slog.o synchro.o system.o threadmanager.o timezone.o timezones.o user.o users.o
+49 -24
View File
@@ -1,13 +1,46 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2011, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <wchar.h>
#include "acceptbaseparser.h" #include "acceptbaseparser.h"
#include "misc.h"
namespace Winix
{
@@ -27,28 +60,11 @@ void AcceptBaseParser::SkipWhite()
} }
void AcceptBaseParser::RemoveWhiteFromEnd(std::string & str)
{
if( str.empty() )
return;
size_t i = str.size() - 1;
for( ; i!=0 && IsWhite(str[i]) ; --i);
if( !IsWhite(str[i]) )
++i;
if( i < str.size() )
str.erase(i); // erasing until the end of the string
}
void AcceptBaseParser::ReadParameter() void AcceptBaseParser::ReadParameter()
{ {
param.clear(); param.clear();
SkipWhite(); SkipWhite();
while( *text!=0 && *text!=',' && *text!=';' ) while( *text!=0 && *text!=',' && *text!=';' )
@@ -57,14 +73,13 @@ void AcceptBaseParser::ReadParameter()
++text; ++text;
} }
RemoveWhiteFromEnd(param); TrimWhite(param);
} }
void AcceptBaseParser::ReadQ() void AcceptBaseParser::ReadQ()
{ {
q = 1.0; q = 1.0;
SkipWhite(); SkipWhite();
if( *text != ';' ) if( *text != ';' )
@@ -82,7 +97,7 @@ void AcceptBaseParser::ReadQ()
++text; // skipping '=' ++text; // skipping '='
SkipWhite(); SkipWhite();
q = strtod(text, (char**)&text); q = wcstod(text, (wchar_t**)&text);
} }
@@ -96,7 +111,7 @@ void AcceptBaseParser::SkipParam()
void AcceptBaseParser::Parse(const char * str) void AcceptBaseParser::Parse(const wchar_t * str)
{ {
text = str; text = str;
Init(); Init();
@@ -111,3 +126,13 @@ void AcceptBaseParser::Parse(const char * str)
} }
void AcceptBaseParser::Parse(const std::wstring & str)
{
Parse(str.c_str());
}
} // namespace Winix
+42 -9
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2011, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_acceptbaseparser #ifndef headerfile_winix_core_acceptbaseparser
@@ -13,35 +38,43 @@
#include <string> #include <string>
namespace Winix
{
// sample (you must create your own class derived from this one): // sample (you must create your own class derived from this one):
// object.Parse(" text/html ; , ; q = 45, application / xhtml+xml ; q = 0.4 , application/xml ; q = 0.9 , */* ; q = 0.8 "); // object.Parse(L" text/html ; , ; q = 45, application / xhtml+xml ; q = 0.4 , application/xml ; q = 0.9 , */* ; q = 0.8 ");
class AcceptBaseParser class AcceptBaseParser
{ {
public: public:
void Parse(const char * str); void Parse(const wchar_t * str);
void Parse(const std::wstring & str);
private: private:
virtual void Init() {} ; virtual void Init() {} ;
virtual void Param(const std::string & param, double q) = 0; virtual void Param(const std::wstring & param, double q) = 0;
bool IsWhite(int c); bool IsWhite(int c);
void SkipWhite(); void SkipWhite();
void RemoveWhiteFromEnd(std::string & str);
void ReadParameter(); void ReadParameter();
void ReadQ(); void ReadQ();
void SkipParam(); void SkipParam();
const char * text; const wchar_t * text;
std::string param; std::wstring param;
double q; double q;
}; };
} // namespace Winix
#endif #endif
+46 -7
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2011, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_acceptencodingparser #ifndef headerfile_winix_core_acceptencodingparser
@@ -14,6 +39,11 @@
#include "log.h" #include "log.h"
namespace Winix
{
class AcceptEncodingParser : public AcceptBaseParser class AcceptEncodingParser : public AcceptBaseParser
{ {
public: public:
@@ -30,7 +60,7 @@ public:
} }
void ParseAndLog(const char * str) void ParseAndLog(const wchar_t * str)
{ {
Parse(str); Parse(str);
@@ -54,6 +84,12 @@ public:
} }
void ParseAndLog(const std::wstring & str)
{
ParseAndLog(str.c_str());
}
private: private:
void Init() void Init()
@@ -63,14 +99,14 @@ private:
} }
void Param(const std::string & param, double q) void Param(const std::wstring & param, double q)
{ {
if( param=="deflate" && q!=0.0 ) if( param == L"deflate" && q!=0.0 )
{ {
accept_deflate = true; accept_deflate = true;
} }
if( param=="gzip" && q!=0.0 ) if( param == L"gzip" && q!=0.0 )
{ {
accept_gzip = true; accept_gzip = true;
} }
@@ -82,4 +118,7 @@ private:
} // namespace Winix
#endif #endif
+707 -366
View File
File diff suppressed because it is too large Load Diff
+80 -30
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2012, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_app #ifndef headerfile_winix_core_app
@@ -37,6 +62,12 @@
namespace Winix
{
class App class App
{ {
public: public:
@@ -87,7 +118,7 @@ public:
Functions functions; Functions functions;
// false at the beginning // false at the beginning
// !! moze to do loggera dac? // !! IMPROVE ME moze to do loggera dac?
bool stdout_is_closed; bool stdout_is_closed;
@@ -112,82 +143,101 @@ private:
CookieParser cookie_parser; CookieParser cookie_parser;
AcceptEncodingParser accept_encoding_parser; AcceptEncodingParser accept_encoding_parser;
Compress compress; Compress compress;
std::wstring clean_html, html_with_debug;
FCGX_Request fcgi_request; FCGX_Request fcgi_request;
int fcgi_socket; int fcgi_socket;
Synchro synchro; Synchro synchro;
pthread_t signal_thread; pthread_t signal_thread;
std::string url_to_fetch_on_exit; std::string url_to_fetch_on_exit;
std::string source_a;
std::string sendh_t, sendh_t2, sendh_t3;
std::string sendfilea, sendfile2a;
std::string send_data_buf; std::string send_data_buf;
PT::SpaceToJSON json_generic_serializer;
TextStream<std::wstring> json_out_stream;
std::string aheader_name, aheader_value;
std::wstring html_filtered;
std::string output_8bit;
BinaryPage compressed_output;
bool InitFCGI(char * sock, char * sock_user, char * sock_group);
bool InitFCGIChmodChownSocket(char * sock, char * sock_user, char * sock_group);
bool DropPrivileges(char * user, char * group);
bool DropPrivileges(const char * user, uid_t uid, gid_t gid, bool additional_groups);
bool CheckAccessFromPlugins();
void ProcessRequestThrow(); void ProcessRequestThrow();
void ProcessRequest(); void ProcessRequest();
void BaseUrlRedirect(int code, bool add_subdomain); void BaseUrlRedirect(int code, bool add_subdomain);
bool BaseUrlRedirect(); bool BaseUrlRedirect();
bool ShouldUseSSL(); void CheckIfNeedSSLredirect();
bool ShouldNotUseSSL();
bool CheckSSLcorrectness();
void SetLocale(); void SetLocale();
void CheckPostRedirect(); void CheckPostRedirect();
void MakePage(); void MakePage();
void Make(); void Make();
void SaveSessionsIfNeeded(); // !! wywalic do menagera sesji?? void SaveSessionsIfNeeded(); // !! IMPROVE ME wywalic do menagera sesji??
void LogAccess(); void LogAccess();
void SendData(const BinaryPage & page, FCGX_Stream * out); void SendData(const BinaryPage & page, FCGX_Stream * out);
void CreateJSONAnswer();
void ReadRequest(); void ReadRequest();
void SendTextAnswer(); void SendTextAnswer();
void SendBinaryAnswer(); void SendBinaryAnswer();
void SendAnswer(); void SendAnswer();
void PrintEnv(); void LogEnvironmentVariables();
void SetEnv(const char * & env, const char * name); void SetEnv(const char * name, std::wstring & env);
void ReadEnvVariables(); void ReadEnvVariables();
void ReadGetPostVars(); void ReadEnvRemoteIP();
void ReadPostVars();
void CheckIE(); void CheckIE();
void CheckKonqueror(); void CheckKonqueror();
void CheckRequestMethod(); void CheckRequestMethod();
void CheckFCGIRole();
void CheckSSL(); void CheckSSL();
void SetSubdomain(); void SetSubdomain();
Header GetHTTPStatusCode();
void PrepareSessionCookie(); void PrepareSessionCookie();
void AddDebugInfo(std::wstring & out); void FilterContent();
void FilterCompressSend(bool compressing, int compress_encoding, const std::wstring & source_ref); void SendHeaders();
bool SendHeadersStaticCreateResource(); void SendCookies();
void SendHeadersStatic(); bool AddHeader(const wchar_t * name, const wchar_t * value);
void SendHeaderContentType(); bool AddHeader(const std::wstring & name, const std::wstring & value);
void SendHeadersForbidden(); bool AddHeader(const wchar_t * name, const PT::WTextStream & value);
void SendHeadersRedirect(); bool AddHeader(const std::wstring & name, const PT::WTextStream & value);
void SendHeadersSendFile(); bool PrepareHeadersStaticCreateResource(PT::WTextStream & out_path);
void SendHeadersCompression(int compress_encoding); void PrepareHeadersStatic();
void SendHeadersNormal(Header header); void PrepareHeaderContentType();
void SendHeaders(bool compressing, int compress_encoding, Header header); 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(); int SelectDeflateVersion();
void SelectCompression(size_t source_len, bool & compression_allowed, int & compression_encoding); void SelectCompression(size_t source_len, bool & compression_allowed, int & compression_encoding);
bool CanSendContent(Header header); bool CanSendContent();
void ClearAfterRequest();
void LogUser(const char * msg, uid_t id); void LogUser(const char * msg, uid_t id);
void LogGroup(const char * msg, gid_t id, bool put_logend = true); void LogGroup(const char * msg, gid_t id, bool put_logend = true);
void LogUsers(); void LogUsers();
void LogEffectiveGroups(std::vector<gid_t> & tab); void LogEffectiveGroups(std::vector<gid_t> & tab);
void LogGroups(); void LogGroups();
bool DropPrivileges(const std::string & user, uid_t uid, gid_t gid, bool additional_groups);
static void * SpecialThreadForSignals(void*); static void * SpecialThreadForSignals(void*);
static size_t FetchPageOnExitCurlCallback(char *ptr, size_t size, size_t nmemb, void *userdata);
void FetchPageOnExit(); void FetchPageOnExit();
void CreateStaticTree(); void CreateStaticTree();
// !! dodac do session managera? // !! IMPROVE ME
// !! move to the session manager?
time_t last_sessions_save; time_t last_sessions_save;
}; };
} // namespace Winix
#endif #endif
+35 -3
View File
@@ -1,16 +1,44 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2011, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <errno.h> #include <errno.h>
#include "basethread.h" #include "basethread.h"
namespace Winix
{
BaseThread::BaseThread() : thread_signal(PTHREAD_COND_INITIALIZER) BaseThread::BaseThread() : thread_signal(PTHREAD_COND_INITIALIZER)
{ {
@@ -237,3 +265,7 @@ pthread_attr_t attr;
return res == 0; return res == 0;
} }
} // namespace Winix
+36 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2012, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_basethread #ifndef headerfile_winix_core_basethread
@@ -14,6 +39,11 @@
#include "synchro.h" #include "synchro.h"
namespace Winix
{
class BaseThread class BaseThread
{ {
@@ -120,6 +150,9 @@ protected:
} // namespace Winix
#endif #endif
+37 -3
View File
@@ -1,15 +1,44 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2011, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "bbcodeparser.h" #include "bbcodeparser.h"
namespace Winix
{
bool BBCODEParser::Equal(const wchar_t * str1, const wchar_t * str2) bool BBCODEParser::Equal(const wchar_t * str1, const wchar_t * str2)
@@ -590,3 +619,8 @@ void BBCODEParser::Uninit()
if( has_open_ul_tag ) if( has_open_ul_tag )
(*out_string) += L"</ul>\n"; (*out_string) += L"</ul>\n";
} }
} // namespace Winix
+35 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2011, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_bbcodeparser #ifndef headerfile_winix_core_bbcodeparser
@@ -13,6 +38,9 @@
#include "htmlfilter.h" #include "htmlfilter.h"
namespace Winix
{
class BBCODEParser : public HTMLFilter class BBCODEParser : public HTMLFilter
@@ -90,4 +118,8 @@ class BBCODEParser : public HTMLFilter
bool has_open_li_tag; // has open html <li> tag bool has_open_li_tag; // has open html <li> tag
}; };
} // namespace Winix
#endif #endif
+47 -6
View File
@@ -1,16 +1,45 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "compress.h" #include "compress.h"
#include "log.h" #include "log.h"
namespace Winix
{
Compress::Compress() Compress::Compress()
@@ -153,7 +182,9 @@ return 0;
int Compress::MakeCompress(z_stream & strm, const char * source, size_t source_len, FCGX_Stream * out_stream, int encoding)
int Compress::MakeCompress(z_stream & strm, const char * source, size_t source_len, BinaryPage & out_stream, int encoding)
{ {
int ret, flush; int ret, flush;
size_t have; size_t have;
@@ -180,7 +211,7 @@ size_t have;
have = buffer_max_len - strm.avail_out; have = buffer_max_len - strm.avail_out;
last_out_size += have; last_out_size += have;
FCGX_PutStr(buffer_out, have, out_stream); out_stream.write(buffer_out, have);
} }
while( strm.avail_out == 0 ); while( strm.avail_out == 0 );
@@ -203,6 +234,7 @@ return 0;
} }
void Compress::CopyToInputBuffer(BinaryPage::const_iterator & i, size_t len) void Compress::CopyToInputBuffer(BinaryPage::const_iterator & i, size_t len)
{ {
for(size_t a=0 ; a<len ; ++a, ++i) for(size_t a=0 ; a<len ; ++a, ++i)
@@ -331,12 +363,13 @@ void Compress::PutLog(size_t source_len, int encoding)
3 - not inited (use Init() first) 3 - not inited (use Init() first)
100 - unknown 100 - unknown
*/ */
int Compress::CompressAndPut(const char * source, size_t source_len, FCGX_Stream * out_stream, int encoding) int Compress::Compressing(const char * source, size_t source_len, BinaryPage & out_stream, int encoding)
{ {
int ret; int ret;
z_stream * pstrm; z_stream * pstrm;
last_out_size = 0; last_out_size = 0;
out_stream.clear();
if( !ready_for_compress ) if( !ready_for_compress )
{ {
@@ -344,6 +377,8 @@ z_stream * pstrm;
return 3; return 3;
} }
// !! CHECK ME
// it is correct to immediately return? what about headers in the compressed page?
if( source_len == 0 ) if( source_len == 0 )
return 0; return 0;
@@ -379,6 +414,8 @@ z_stream * pstrm;
return 3; return 3;
} }
// !! CHECK ME
// it is correct to immediately return? what about headers in the compressed page?
if( in.empty() ) if( in.empty() )
return 0; return 0;
@@ -390,3 +427,7 @@ z_stream * pstrm;
return ret; return ret;
} }
} // namespace Winix
+37 -6
View File
@@ -1,21 +1,49 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_compress #ifndef headerfile_winix_core_compress
#define headerfile_winix_core_compress #define headerfile_winix_core_compress
#include <cstring> #include <cstring>
#include <fcgiapp.h>
#include <zlib.h> #include <zlib.h>
#include "requesttypes.h" #include "requesttypes.h"
namespace Winix
{
class Compress class Compress
{ {
@@ -34,7 +62,7 @@ public:
1 - deflate 1 - deflate
2 - gzip 2 - gzip
*/ */
int CompressAndPut(const char * source, size_t source_len, FCGX_Stream * out_stream, int encoding = 2); int Compressing(const char * source, size_t source_len, BinaryPage & out_stream, int encoding = 2);
int Compressing(const BinaryPage & in, BinaryPage & out, int encoding = 2); int Compressing(const BinaryPage & in, BinaryPage & out, int encoding = 2);
@@ -45,7 +73,7 @@ private:
bool InitDeflate(); bool InitDeflate();
bool InitGzip(); bool InitGzip();
int MakeCompress(z_stream & strm, const char * source, size_t source_len, FCGX_Stream * out_stream, int encoding); int MakeCompress(z_stream & strm, const char * source, size_t source_len, BinaryPage & out_stream, int encoding);
int MakeCompress(z_stream & strm, const BinaryPage & page, BinaryPage & out, int encoding); int MakeCompress(z_stream & strm, const BinaryPage & page, BinaryPage & out, int encoding);
z_stream * SelectStream(int encoding); z_stream * SelectStream(int encoding);
void ResetStream(z_stream * pstrm, int encoding); void ResetStream(z_stream * pstrm, int encoding);
@@ -67,4 +95,7 @@ private:
}; };
} // namespace Winix
#endif #endif
+95 -40
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "config.h" #include "config.h"
@@ -14,6 +39,10 @@
#include "crypt.h" #include "crypt.h"
namespace Winix
{
Config::Config() Config::Config()
{ {
@@ -41,14 +70,14 @@ void Config::ShowError()
case PT::SpaceParser::cant_open_file: case PT::SpaceParser::cant_open_file:
if( errors_to_stdout ) if( errors_to_stdout )
std::cout << "Config: cant open a config file: " << config_file << std::endl; std::wcout << L"Config: I cannot open a config file: " << config_file << std::endl;
log << log1 << "Config: cant open a config file: " << config_file << logend; log << log1 << "Config: cant open a config file: " << config_file << logend;
break; break;
case PT::SpaceParser::syntax_error: case PT::SpaceParser::syntax_error:
if( errors_to_stdout ) if( errors_to_stdout )
std::cout << "Config: syntax error, line: " << parser.line << std::endl; std::wcout << "Config: syntax error, line: " << parser.line << std::endl;
log << log1 << "Config: syntax error, line: " << parser.line << logend; log << log1 << "Config: syntax error, line: " << parser.line << logend;
break; break;
@@ -73,7 +102,6 @@ bool Config::ReadConfig(bool errors_to_stdout_, bool stdout_is_closed)
log << log2 << "Config: reading a config file" << logend; log << log2 << "Config: reading a config file" << logend;
parser.SplitSingle(true); parser.SplitSingle(true);
parser.UTF8(true); // config is always read in UTF-8
parser.SetSpace(space); parser.SetSpace(space);
PT::SpaceParser::Status status = parser.Parse(config_file); PT::SpaceParser::Status status = parser.Parse(config_file);
@@ -98,25 +126,29 @@ void Config::AssignValues(bool stdout_is_closed)
{ {
demonize = Bool(L"demonize", true); demonize = Bool(L"demonize", true);
user = AText(L"user"); user = Text(L"user");
group = AText(L"group"); group = Text(L"group");
additional_groups = Bool(L"additional_groups", true); additional_groups = Bool(L"additional_groups", true);
log_file = AText(L"log_file"); log_file = Text(L"log_file");
log_notify_file = AText(L"log_notify_file"); log_notify_file = Text(L"log_notify_file");
log_delimiter = Text(L"log_delimiter", L"---------------------------------------------------------------------------------"); log_delimiter = Text(L"log_delimiter", L"---------------------------------------------------------------------------------");
fcgi_socket = AText(L"fcgi_socket"); fcgi_socket = Text(L"fcgi_socket");
fcgi_socket_chmod = Int(L"fcgi_socket_chmod", 0770); fcgi_socket_chmod = Int(L"fcgi_socket_chmod", 0770);
fcgi_socket_user = AText(L"fcgi_socket_user"); fcgi_socket_user = Text(L"fcgi_socket_user");
fcgi_socket_group = AText(L"fcgi_socket_group"); fcgi_socket_group = Text(L"fcgi_socket_group");
fcgi_socket_listen = Int(L"fcgi_socket_listen", 100);
log_level = Int(L"log_level", 1); log_level = Int(L"log_level", 1);
log_request = Int(L"log_request", 1); log_request = Int(L"log_request", 1);
log_save_each_line = Bool(L"log_save_each_line", false); log_save_each_line = Bool(L"log_save_each_line", false);
log_time_zone_id = Size(L"log_time_zone_id", 34); log_time_zone_id = Size(L"log_time_zone_id", 34);
log_server_answer = Bool(L"log_server_answer", false);
log_stdout = Bool(L"log_stdout", false); log_stdout = Bool(L"log_stdout", false);
log_db_query = Bool(L"log_db_query", false); log_db_query = Bool(L"log_db_query", false);
log_plugin_call = Bool(L"log_plugin_call", false); log_plugin_call = Bool(L"log_plugin_call", false);
log_post_value_size = Size(L"log_post_value_size", 80); log_post_value_size = Size(L"log_post_value_size", 80);
log_env_variables = Bool(L"log_env_variables", false);
log_http_answer_headers = Bool(L"log_http_answer_headers", false);
post_file_max = Size(L"post_file_max", 8388608); // 8 MB post_file_max = Size(L"post_file_max", 8388608); // 8 MB
@@ -125,6 +157,7 @@ void Config::AssignValues(bool stdout_is_closed)
NoLastSlash(upload_dir); NoLastSlash(upload_dir);
NoLastSlash(common_dir); NoLastSlash(common_dir);
upload_group = Text(L"upload_group");
upload_dirs_chmod = Int(L"upload_dirs_chmod", 0750); upload_dirs_chmod = Int(L"upload_dirs_chmod", 0750);
upload_files_chmod = Int(L"upload_files_chmod", 0640); upload_files_chmod = Int(L"upload_files_chmod", 0640);
ListText(L"static_dirs", static_dirs); ListText(L"static_dirs", static_dirs);
@@ -150,10 +183,10 @@ void Config::AssignValues(bool stdout_is_closed)
templates_index = Text(L"templates_index", L"index.html"); templates_index = Text(L"templates_index", L"index.html");
template_only_root_use_template_fun = Bool(L"template_only_root_use_template_fun", false); template_only_root_use_template_fun = Bool(L"template_only_root_use_template_fun", false);
http_session_id_name = AText(L"http_session_id_name"); http_session_id_name = Text(L"http_session_id_name", L"session_id");
db_database = AText(L"db_database"); db_database = Text(L"db_database");
db_user = AText(L"db_user"); db_user = Text(L"db_user");
db_pass = AText(L"db_pass"); db_pass = Text(L"db_pass");
item_url_empty = Text(L"item_url_empty"); item_url_empty = Text(L"item_url_empty");
url_proto = Text(L"url_proto", L"http://"); url_proto = Text(L"url_proto", L"http://");
@@ -181,7 +214,7 @@ void Config::AssignValues(bool stdout_is_closed)
session_max_idle = Int(L"session_max_idle", 10800); // 3h session_max_idle = Int(L"session_max_idle", 10800); // 3h
session_remember_max_idle = Int(L"session_remember_max_idle", 16070400); // 3 months session_remember_max_idle = Int(L"session_remember_max_idle", 16070400); // 3 months
session_file = AText(L"session_file"); session_file = Text(L"session_file");
session_max = Size(L"session_max", 1000000); session_max = Size(L"session_max", 1000000);
compression = Bool(L"compression", true); compression = Bool(L"compression", true);
@@ -195,6 +228,7 @@ void Config::AssignValues(bool stdout_is_closed)
html_filter_tabs = Size(L"html_filter_tabs", 2); html_filter_tabs = Size(L"html_filter_tabs", 2);
html_filter_orphans = Bool(L"html_filter_orphans", true); html_filter_orphans = Bool(L"html_filter_orphans", true);
html_filter_orphans_mode_str = Text(L"html_filter_orphans_mode_str", L"nbsp"); html_filter_orphans_mode_str = Text(L"html_filter_orphans_mode_str", L"nbsp");
html_filter_nofilter_tag = Text(L"html_filter_nofilter_tag", L"nofilter");
locale_dir = Text(L"locale_dir"); locale_dir = Text(L"locale_dir");
locale_dir_default = Text(L"locale_dir_default"); locale_dir_default = Text(L"locale_dir_default");
@@ -205,7 +239,6 @@ void Config::AssignValues(bool stdout_is_closed)
title_separator = Text(L"title_separator", L" / "); title_separator = Text(L"title_separator", L" / ");
http_header_send_file = Text(L"http_header_send_file", L"X-LIGHTTPD-send-file"); http_header_send_file = Text(L"http_header_send_file", L"X-LIGHTTPD-send-file");
debug_info = Bool(L"debug_info", false);
editors_html_safe_mode = Bool(L"editors_html_safe_mode", true); editors_html_safe_mode = Bool(L"editors_html_safe_mode", true);
editors_html_safe_mode_skip_root = Bool(L"editors_html_safe_mode_skip_root", true); editors_html_safe_mode_skip_root = Bool(L"editors_html_safe_mode_skip_root", true);
@@ -214,7 +247,6 @@ void Config::AssignValues(bool stdout_is_closed)
NoLastSlash(plugins_dir); NoLastSlash(plugins_dir);
ListText(L"plugins", plugin_file); ListText(L"plugins", plugin_file);
utf8 = Bool(L"utf8", true);
symlinks_follow_max = Size(L"symlinks_follow_max", 20); symlinks_follow_max = Size(L"symlinks_follow_max", 20);
ticket_form_prefix = Text(L"ticket_form_prefix", L"ticketparam"); ticket_form_prefix = Text(L"ticket_form_prefix", L"ticketparam");
@@ -232,10 +264,11 @@ void Config::AssignValues(bool stdout_is_closed)
pattern_cacher_how_many_delete = Size(L"pattern_cacher_how_many_delete", 30); pattern_cacher_how_many_delete = Size(L"pattern_cacher_how_many_delete", 30);
content_type_header = Int(L"content_type_header", 0); content_type_header = Int(L"content_type_header", 0);
umask = Int(L"umask", 0222); umask = Int(L"umask", 0222);
ezc_max_elements = Size(L"ezc_max_elements", 50000); ezc_max_elements = Size(L"ezc_max_elements", 50000);
ezc_max_loop_elements = Size(L"ezc_max_loop_elements", 5000); ezc_max_loop_elements = Size(L"ezc_max_loop_elements", 5000);
ezc_out_streams_size = Size(L"ezc_out_streams_size", 16);
account_need_email_verification = Bool(L"account_need_email_verification", true); account_need_email_verification = Bool(L"account_need_email_verification", true);
reset_password_code_expiration_time = Long(L"reset_password_code_expiration_time", 86400); reset_password_code_expiration_time = Long(L"reset_password_code_expiration_time", 86400);
@@ -246,6 +279,20 @@ void Config::AssignValues(bool stdout_is_closed)
etc_dir = Text(L"etc_dir", L""); etc_dir = Text(L"etc_dir", L"");
time_zones_file = Text(L"time_zones_file", L"time_zones.conf"); time_zones_file = Text(L"time_zones_file", L"time_zones.conf");
use_ban_list = Bool(L"use_ban_list", true);
ban_list_soft_max_size = Size(L"ban_list_soft_max_size", 50000);
ban_list_max_size = Size(L"ban_list_max_size", 51000);
ban_level_1_delay = Size(L"ban_level_1_delay", 1800);
ban_level_2_delay = Size(L"ban_level_2_delay", 86400);
ban_level_3_delay = Size(L"ban_level_3_delay", 604800);
incorrect_login_min_time_between_get_post = Size(L"incorrect_login_min_time_between_get_post", 2);
incorrect_login_captcha_treshold = Size(L"incorrect_login_captcha_treshold", 3);
incorrect_login_cannot_login_mode = Int(L"incorrect_login_cannot_login_mode", 0);
incorrect_login_cannot_login_treshold = Size(L"incorrect_login_cannot_login_treshold", 20);
incorrect_login_cannot_login_delay = Size(L"incorrect_login_cannot_login_delay", 1800);
pid_file = Text(L"pid_file", L"");
} }
@@ -272,6 +319,8 @@ void Config::SetAdditionalVariables()
if( locale_files.empty() ) if( locale_files.empty() )
locale_files.push_back(L"en"); locale_files.push_back(L"en");
upload_group_int = GetGroupId(upload_group);
} }
@@ -318,25 +367,6 @@ std::wstring & Config::Text(const std::wstring & name, const wchar_t * def)
} }
std::string & Config::AText(const wchar_t * name)
{
return space.AText(name);
}
std::string & Config::AText(const wchar_t * name, const char * def)
{
return space.AText(name, def);
}
std::string & Config::AText(const std::wstring & name, const char * def)
{
return space.AText(name, def);
}
int Config::Int(const wchar_t * name) int Config::Int(const wchar_t * name)
{ {
return space.Int(name); return space.Int(name);
@@ -421,6 +451,28 @@ bool Config::ListText(const std::wstring & name, std::vector<std::wstring> & lis
} }
bool Config::HasValue(const wchar_t * name, const wchar_t * value)
{
return space.HasValue(name, value);
}
bool Config::HasValue(const wchar_t * name, const std::wstring & value)
{
return space.HasValue(name, value);
}
bool Config::HasValue(const std::wstring & name, const wchar_t * value)
{
return space.HasValue(name, value);
}
bool Config::HasValue(const std::wstring & name, const std::wstring & value)
{
return space.HasValue(name, value);
}
void Config::Print(std::wostream & out) void Config::Print(std::wostream & out)
{ {
space.Serialize(out); space.Serialize(out);
@@ -430,5 +482,8 @@ void Config::Print(std::wostream & out)
} // namespace Winix
+187 -47
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_config #ifndef headerfile_winix_core_config
@@ -15,6 +40,10 @@
#include "htmlfilter.h" #include "htmlfilter.h"
namespace Winix
{
@@ -24,19 +53,19 @@ public:
// name of the config file // name of the config file
// this is the parameter passed to winix programm // this is the parameter passed to winix programm
std::string config_file; std::wstring config_file;
// start as a demon (in the background) // start as a demon (in the background)
// default: true // default: true
bool demonize; bool demonize;
// system user name (to which drop privileges) // system user's name to whom winix should drop privileges
// used only if winix is started as the root // used only if winix is started as the root
std::string user; std::wstring user;
// system group name (to which drop privileges) // system group's name to which drop privileges
// used only if winix is started as the root // used only if winix is started as the root
std::string group; std::wstring group;
// setting additional effective groups from /etc/group // setting additional effective groups from /etc/group
// by using initgroups() // by using initgroups()
@@ -45,23 +74,25 @@ public:
bool additional_groups; bool additional_groups;
// log file name, log file name for notifications (sending emails, etc) // log file name, log file name for notifications (sending emails, etc)
std::string log_file, log_notify_file; std::wstring log_file, log_notify_file;
// the log level (how much info should be inserted to logs)
// 1 - minimum // 1 - minimum
// 2 - (default) // 2 - (default)
// 3 - maximum - all logs // 3 - maximum - all logs
int log_level; int log_level;
// logging to stdout too // logging to stdout too
// only if demonize is 'false' // this option is valid only if 'demonize' option is set to 'false'
// default: false // default: false
bool log_stdout; bool log_stdout;
// how many requests should be saved in the same time // how many requests should be saved in the same time
// if you have a very busy server you can incrase this value
// default: 1 // default: 1
int log_request; int log_request;
// whether to save each line of the config (use it for debug purposes) // whether to save each line of the config (used for debugging purposes)
// default: false // default: false
bool log_save_each_line; bool log_save_each_line;
@@ -71,7 +102,12 @@ public:
// default: 34 (Coordinated Universal Time UTC+00:00) // default: 34 (Coordinated Universal Time UTC+00:00)
size_t log_time_zone_id; size_t log_time_zone_id;
// put to log what server is sending back to the client (html/json etc)
// default: false
bool log_server_answer;
// logging db queries // logging db queries
// warning: use it only on a developer's server as it logs the hashes of passwords too
// default: false // default: false
bool log_db_query; bool log_db_query;
@@ -81,23 +117,39 @@ public:
// how many characters in values should be logged from POST parameters // how many characters in values should be logged from POST parameters
// default: 80 // default: 80
// set to 0 to turn off // set to 0 to turn it off
size_t log_post_value_size; size_t log_post_value_size;
// request delimiter in the log file, default "---------" // request delimiter in the log file, default "---------"
std::wstring log_delimiter; std::wstring log_delimiter;
// log environment variables (fastcgi environment)
bool log_env_variables;
// log headers (+cookies) which are returned to the client
// this is what winix has generated -- the web server can change or add other headers
// default: false
bool log_http_answer_headers;
// fast cgi: socket (unix domain) // fast cgi: socket (unix domain)
std::string fcgi_socket; std::wstring fcgi_socket;
// fast cgi: socket permissions // fast cgi: socket permissions
// chmod and chown of the socket are set before winix drops privileges
int fcgi_socket_chmod; int fcgi_socket_chmod;
// fast cgi: owner of the socket // fast cgi: owner of the socket
std::string fcgi_socket_user; // chmod and chown of the socket are set before winix drops privileges
std::wstring fcgi_socket_user;
// fast cgi: group of the socket // fast cgi: group of the socket
std::string fcgi_socket_group; // chmod and chown of the socket are set before winix drops privileges
std::wstring fcgi_socket_group;
// fcgi_socket_listen is the listen queue depth used in the listen() call
// when creating a FastCGI socket for the web server
// default: 100
int fcgi_socket_listen;
std::wstring templates_dir; std::wstring templates_dir;
std::wstring templates_dir_default; // html templates from winix std::wstring templates_dir_default; // html templates from winix
@@ -116,39 +168,46 @@ public:
// default: index.html // default: index.html
std::wstring templates_index; std::wstring templates_index;
// if true then only root can use 'template' function // if true then only root can use 'template' winix function
// default: false // default: false
bool template_only_root_use_template_fun; bool template_only_root_use_template_fun;
std::string db_database; // the database name, user name and a password for the PostgreSQL database
std::string db_user; std::wstring db_database;
std::string db_pass; std::wstring db_user;
std::wstring db_pass;
std::string http_session_id_name; // the name of the cookie which has the session identifier
std::wstring http_session_id_name;
// string used in a place where is a user (or group) selected // string used in a place where is a user (or group) selected
// !! IMPROVE ME should be moved to locales
std::wstring priv_no_user; std::wstring priv_no_user;
std::wstring priv_no_group; std::wstring priv_no_group;
// time in seconds when the user will be automatically logged out (iddle time) // time in seconds when a user will be automatically logged out (iddle time)
// default: 10800 = 3 hours
int session_max_idle; int session_max_idle;
// time in seconds when the user will be automatically logged out (when he selected 'remember me' option) // time in seconds when a user will be automatically logged out
// when he has selected the 'remember me' option when logging in
// this time is usually greater than session_max_idle // this time is usually greater than session_max_idle
// default: 16070400 = 3 months
int session_remember_max_idle; int session_remember_max_idle;
// this file is used when the program is starting and ending // a file to which winix stores sessions info
std::string session_file; // it is used when winix starts (boots) and quits
std::wstring session_file;
// how many sessions can be (zero turn off this checking) // how many sessions can be (zero turn off this checking)
// default: 1000000 (one milion) // default: 1000000 (one milion)
size_t session_max; size_t session_max;
// allow the html output to be compressed // allow the winix output to be compressed
// default: true // default: true
bool compression; bool compression;
// if the output is shorter than this value then it will not be compressed // compress only if the output is greater or equal to this value
// default: 512 bytes // default: 512 bytes
size_t compression_page_min_size; size_t compression_page_min_size;
@@ -175,12 +234,12 @@ public:
bool html_filter_trim_white; bool html_filter_trim_white;
// when long words should be broken (a space will be inserted) // when long words should be broken (a space will be inserted)
// default: after 60 non white characters will be put a space // default: after 60 non white characters there will be put a space
// set zero to turn off // set zero to turn off
size_t html_filter_break_word; size_t html_filter_break_word;
// when long lines should be broken (a new line character will be inserted) // when long lines should be broken (a new line character will be inserted)
// default: 80 // default: 110
// set zero to turn off // set zero to turn off
size_t html_filter_wrap_line; size_t html_filter_wrap_line;
@@ -198,10 +257,18 @@ public:
std::wstring html_filter_orphans_mode_str; std::wstring html_filter_orphans_mode_str;
HTMLFilter::OrphanMode html_filter_orphans_mode; HTMLFilter::OrphanMode html_filter_orphans_mode;
// the html nofilter tag
// content betweeng these tags (opening and closing) will not be filtered
// and this tag will not be included in the html output
// default: nofilter
std::wstring html_filter_nofilter_tag;
// the url of a new empty item (if there is not the subject too) // the url of a new empty item (if there is not the subject too)
// !! IMPROVE ME should be moved to locale
std::wstring item_url_empty; std::wstring item_url_empty;
// maximum length of a file send by post multipart form // maximum length of a file send by post multipart form
// default: 8388608 - 8MB
// 0 - not used // 0 - not used
size_t post_file_max; size_t post_file_max;
@@ -234,6 +301,14 @@ public:
// default: empty // default: empty
std::wstring common_dir; std::wstring common_dir;
// system group's name for new uploaded files (created directories in the file system)
// it can be empty (it is not used then)
std::wstring upload_group;
// this value will be set based on upload_group
// will be -1 if upload_group is empty or if it is invalid
int upload_group_int;
// chmod of newly created directories (under upload_dir) // chmod of newly created directories (under upload_dir)
// default: 0750 // default: 0750
int upload_dirs_chmod; int upload_dirs_chmod;
@@ -385,9 +460,6 @@ public:
// default: X-LIGHTTPD-send-file // default: X-LIGHTTPD-send-file
std::wstring http_header_send_file; std::wstring http_header_send_file;
// prints additional information (in the end of the html page as a commentary)
bool debug_info;
// in editors (emacs, ckeditor,...) the html will be filtered and unsafe tags // in editors (emacs, ckeditor,...) the html will be filtered and unsafe tags
// will be dropped (script, frame, etc.) // will be dropped (script, frame, etc.)
// default: true; // default: true;
@@ -398,11 +470,6 @@ public:
// (if true the html code for root is not filtered) // (if true the html code for root is not filtered)
bool editors_html_safe_mode_skip_root; bool editors_html_safe_mode_skip_root;
// charset used in templates, locales, logs etc.
// default: true (UTF-8)
// if false it means 8-bit ASCII
bool utf8;
// how many maximum symlinks can be followed // how many maximum symlinks can be followed
// (symlinks on directories as well) // (symlinks on directories as well)
// default: 20 // default: 20
@@ -481,6 +548,10 @@ public:
// default: 5000 (from ezc generator) // default: 5000 (from ezc generator)
size_t ezc_max_loop_elements; size_t ezc_max_loop_elements;
// how many output streams do we have in Request class
// default: 16 (64 maximum)
size_t ezc_out_streams_size;
// when true then when a user want to create a new account // when true then when a user want to create a new account
// he has to provide his email and a message will be sent back to him // he has to provide his email and a message will be sent back to him
// with a link to activate the account // with a link to activate the account
@@ -523,6 +594,73 @@ public:
// each time zone is in a seperate space // each time zone is in a seperate space
std::wstring time_zones_file; std::wstring time_zones_file;
// turn on the IP ban mechanizm
// we have got three levels of bans (level 1, level 2, and the highest level 3)
// default: true
bool use_ban_list;
// the so called 'soft' max size
// read below description for explanation
// this is introduced to avoid deleting only one record from the ban list
// default: 50000
size_t ban_list_soft_max_size;
// this is the 'hard' max size of an IP's ban list
// if there are more records than this value
// then some of them will be removed (until the size will be ban_list_soft_max_size equal)
// this value should be a little larger from ban_list_soft_max_size
// default: 51000
size_t ban_list_max_size;
// delay in seconds of the first level ban
// default: 1800 (30 minutes)
// it means withing the next 30 minutes you see only 'you are banned...' message on your webbrowser
size_t ban_level_1_delay;
// delay in seconds of the second level ban
// default: 86400 (24 hours)
size_t ban_level_2_delay;
// delay in seconds of the third level ban
// default: 604800 (7 days)
size_t ban_level_3_delay;
// the minimum time in seconds which has to pass between the first GET request
// (showing your the login form) and the second POST request (which sends the
// login and password to the server)
// if the time is shorter then the login attempt is treated as incorrect
// (the same as if you provide incorrect user/password)
// default: 2
size_t incorrect_login_min_time_between_get_post;
// how many incorrect logins there must have been passed to display a captcha
// next to the login form
// default: 3
size_t incorrect_login_captcha_treshold;
// the way how we prevent to login if there are too many incorrect login attempts
// 0 - 'block logging' - do not show the login form in 'login' winix function
// (instead a warning message will be printed)
// 1 - add to ban list (warning: people from this IP will not be able to see your site and do anything)
// default: 0
int incorrect_login_cannot_login_mode;
// after how many incorrect login attempts we do the incorrect_login_cannot_login_mode action
// default: 20
size_t incorrect_login_cannot_login_treshold;
// used when incorrect_login_cannot_login_mode is zero
// it is the time which should be passed to allow logging
// default: 1800 (30 minutes)
// if incorrect_login_cannot_login_mode is one then ban_level_X_delay times
// will be taken accordingly
size_t incorrect_login_cannot_login_delay;
// pid file (a full path to a pid file)
// default: empty which means there is not a pid file used
// pid file is saved after winix has dropped privileges
std::wstring pid_file;
Config(); Config();
@@ -531,9 +669,6 @@ public:
std::wstring & Text(const wchar_t * name); std::wstring & Text(const wchar_t * name);
std::wstring & Text(const wchar_t * name, const wchar_t * def); std::wstring & Text(const wchar_t * name, const wchar_t * def);
std::wstring & Text(const std::wstring & name, const wchar_t * def); std::wstring & Text(const std::wstring & name, const wchar_t * def);
std::string & AText(const wchar_t * name);
std::string & AText(const wchar_t * name, const char * def);
std::string & AText(const std::wstring & name, const char * def);
int Int(const wchar_t *); int Int(const wchar_t *);
int Int(const wchar_t * name, int def); int Int(const wchar_t * name, int def);
@@ -550,31 +685,36 @@ public:
bool ListText(const wchar_t * name, std::vector<std::wstring> & list); bool ListText(const wchar_t * name, std::vector<std::wstring> & list);
bool ListText(const std::wstring & name, std::vector<std::wstring> & list); bool ListText(const std::wstring & name, std::vector<std::wstring> & list);
bool HasValue(const wchar_t * name, const wchar_t * value);
bool HasValue(const wchar_t * name, const std::wstring & value);
bool HasValue(const std::wstring & name, const wchar_t * value);
bool HasValue(const std::wstring & name, const std::wstring & value);
// for debug // for debug
void Print(std::wostream & out); void Print(std::wostream & out);
// raw access to the config // raw access to the config
PT::Space space; PT::Space space;
private: private:
PT::SpaceParser parser;
bool errors_to_stdout;
void ShowError(); void ShowError();
void AssignValues(bool stdout_is_closed); void AssignValues(bool stdout_is_closed);
void SetAdditionalVariables(); void SetAdditionalVariables();
void CheckPasswd(); void CheckPasswd();
PT::SpaceParser parser;
std::string default_str;
int default_int;
bool default_bool;
bool errors_to_stdout;
}; };
} // namespace Winix
#endif #endif
+52 -14
View File
@@ -1,26 +1,54 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2010, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_cookieparser #ifndef headerfile_winix_core_cookieparser
#define headerfile_winix_core_cookieparser #define headerfile_winix_core_cookieparser
#include <fcgiapp.h>
#include "httpsimpleparser.h" #include "httpsimpleparser.h"
#include "requesttypes.h" #include "requesttypes.h"
#include "log.h" #include "log.h"
namespace Winix
{
class CookieParser : public HttpSimpleParser class CookieParser : public HttpSimpleParser
{ {
const char * cookie_string; const wchar_t * cookie_string;
CookieTab * cookie_tab; CookieTab * cookie_tab;
@@ -32,17 +60,18 @@ protected:
if( !cookie_string || *cookie_string == 0 ) if( !cookie_string || *cookie_string == 0 )
return -1; return -1;
return (int)(unsigned char)*(cookie_string++); return (int)*(cookie_string++);
} }
virtual void Parameter(std::string & name, std::string & value)
virtual void Parameter(std::wstring & name, std::wstring & value)
{ {
// Cookie names are case insensitive according to section 3.1 of RFC 2965 // Cookie names are case insensitive according to section 3.1 of RFC 2965
// (we don't use locale here)
ToLower(name); ToLower(name);
std::pair<CookieTab::iterator, bool> res = cookie_tab->insert( std::make_pair(name, value) ); std::pair<CookieTab::iterator, bool> res = cookie_tab->insert( std::make_pair(name, value) );
log << log2 << "Cookie, name: \"" << name << "\", value: \"" << value << "\""; log << log2 << "Cookie, name: \"" << name << "\", value: \"" << value << "\"";
if( res.second == false ) if( res.second == false )
@@ -60,24 +89,33 @@ public:
CookieParser() CookieParser()
{ {
HttpSimpleParser::separator = ';'; HttpSimpleParser::separator = ';';
HttpSimpleParser::value_can_be_quoted = true; HttpSimpleParser::value_can_be_quoted = true;
HttpSimpleParser::skip_white_chars = true; HttpSimpleParser::skip_white_chars = true;
HttpSimpleParser::recognize_special_chars = false; HttpSimpleParser::recognize_special_chars = false;
HttpSimpleParser::getchar_returns_utf8_chars = false;
} }
// cookie_string can be null // cookie_string can be null
void Parse(const char * cookie_string_, CookieTab & cookie_tab_) void Parse(const wchar_t * cookie_string_, CookieTab & cookie_tab_)
{ {
cookie_string = cookie_string_; cookie_string = cookie_string_;
cookie_tab = &cookie_tab_; cookie_tab = &cookie_tab_;
HttpSimpleParser::Parse(); HttpSimpleParser::Parse();
} }
void Parse(const std::wstring & cookie_string_, CookieTab & cookie_tab_)
{
Parse(cookie_string_.c_str(), cookie_tab_);
}
}; };
} // namespace Winix
#endif #endif
+110 -35
View File
@@ -1,42 +1,68 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2011-2012, Tomasz Sowa */
/*
* Copyright (c) 2011-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <cstring> #include <cstring>
#include "crypt.h" #include "crypt.h"
#include "utf8/utf8.h" #include "utf8/utf8.h"
#include "misc.h"
#include "log.h" #include "log.h"
namespace Winix
{
void Crypt::SetConfig(Config * pconfig) void Crypt::SetConfig(Config * pconfig)
{ {
config = pconfig; config = pconfig;
} }
void Crypt::TrimLastWhite(std::string & str)
char Crypt::ConvertToHexForm(int val)
{ {
if( str.empty() ) if( val < 10 )
return; return val + '0';
size_t i = str.size(); return val - 10 + 'a';
while( i > 0 && (IsWhite(str[i-1]) || str[i-1]==10) )
i -= 1;
if( i < str.size() )
str.erase(i);
} }
bool Crypt::Hash(int hash, const char * in, size_t inlen, std::string & out)
bool Crypt::HashBin(int hash, const char * in, size_t inlen, std::string & out)
{ {
out.clear(); out.clear();
@@ -47,6 +73,7 @@ bool Crypt::Hash(int hash, const char * in, size_t inlen, std::string & out)
PT::WideToUTF8(config->opensll_path, command); PT::WideToUTF8(config->opensll_path, command);
run.Cmd(command); run.Cmd(command);
run.Par("dgst"); run.Par("dgst");
run.Par("-binary");
switch(hash) switch(hash)
{ {
@@ -62,52 +89,96 @@ bool Crypt::Hash(int hash, const char * in, size_t inlen, std::string & out)
return false; return false;
} }
bool result = run.Go(in, inlen, out) == 0; return run.Go(in, inlen, out) == 0;
TrimLastWhite(out);
return result;
} }
bool Crypt::Hash(int hash, const char * in, std::string & out) bool Crypt::HashBin(int hash, const char * in, std::string & out)
{ {
size_t len = strlen(in); size_t len = strlen(in);
return Hash(hash, in, len, out); return HashBin(hash, in, len, out);
} }
bool Crypt::Hash(int hash, const std::string & in, std::string & out) bool Crypt::HashBin(int hash, const std::string & in, std::string & out)
{ {
return Hash(hash, in.c_str(), in.size(), out); return HashBin(hash, in.c_str(), in.size(), out);
} }
bool Crypt::Hash(int hash, const wchar_t * in, size_t inlen, std::wstring & out) bool Crypt::HashBin(int hash, const wchar_t * in, size_t inlen, std::string & out)
{ {
PT::WideToUTF8(in, inlen, bufina); PT::WideToUTF8(in, inlen, bufina);
int res = Hash(hash, bufina.c_str(), bufina.size(), bufouta); int res = HashBin(hash, bufina.c_str(), bufina.size(), out);
bufina.clear();
// the output hash is not a UTF8 string
// it consists only from ascii letters
AssignString(bufouta, out);
return res; return res;
} }
bool Crypt::Hash(int hash, const wchar_t * in, std::wstring & out) bool Crypt::HashBin(int hash, const wchar_t * in, std::string & out)
{ {
size_t len = wcslen(in); size_t len = wcslen(in);
return Hash(hash, in, len, out); return HashBin(hash, in, len, out);
} }
bool Crypt::Hash(int hash, const std::wstring & in, std::wstring & out)
bool Crypt::HashBin(int hash, const std::wstring & in, std::string & out)
{ {
return Hash(hash, in.c_str(), in.size(), out); return HashBin(hash, in.c_str(), in.size(), out);
}
bool Crypt::HashHex(int hash, const char * in, size_t inlen, std::string & out)
{
int res = HashBin(hash, in, inlen, out_temp);
ConvertToHexForm(out_temp, out);
out_temp.clear();
return res;
}
bool Crypt::HashHex(int hash, const char * in, std::string & out)
{
size_t len = strlen(in);
return HashHex(hash, in, len, out);
}
bool Crypt::HashHex(int hash, const std::string & in, std::string & out)
{
return HashHex(hash, in.c_str(), in.size(), out);
}
bool Crypt::HashHex(int hash, const wchar_t * in, size_t inlen, std::wstring & out)
{
int res = HashBin(hash, in, inlen, out_temp);
ConvertToHexForm(out_temp, out);
out_temp.clear();
return res;
}
bool Crypt::HashHex(int hash, const wchar_t * in, std::wstring & out)
{
size_t len = wcslen(in);
return HashHex(hash, in, len, out);
}
bool Crypt::HashHex(int hash, const std::wstring & in, std::wstring & out)
{
return HashHex(hash, in.c_str(), in.size(), out);
} }
@@ -199,7 +270,7 @@ bool Crypt::PassHash(const std::wstring & salt, UserPass & up)
pass_salted = up.pass; pass_salted = up.pass;
pass_salted += salt; pass_salted += salt;
if( Hash(up.pass_type, pass_salted, up.pass) ) if( HashHex(up.pass_type, pass_salted, up.pass) )
{ {
if( !salt.empty() ) if( !salt.empty() )
up.pass_hash_salted = true; up.pass_hash_salted = true;
@@ -271,3 +342,7 @@ void Crypt::PassHashCrypt(UserPass & up)
PassCrypt(config->pass_rsa_private_key, up); PassCrypt(config->pass_rsa_private_key, up);
} }
} // namespace Winix
+103 -18
View File
@@ -1,22 +1,51 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2011, Tomasz Sowa */
/*
* Copyright (c) 2011-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_crypt #ifndef headerfile_winix_core_crypt
#define headerfile_winix_core_crypt #define headerfile_winix_core_crypt
#include <string> #include <string>
#include "run.h" #include "run.h"
#include "config.h" #include "config.h"
#include "user.h" #include "user.h"
namespace Winix
{
/* /*
the kind of hashes we are able to obtain in winix the kind of hashes we are able to obtain in winix
*/ */
@@ -50,11 +79,11 @@ public:
in - input buffer in - input buffer
inlen - the length of the buffer inlen - the length of the buffer
output: output:
out - the hash out - the hash in binary form
*/ */
bool Hash(int hash, const char * in, size_t inlen, std::string & out); bool HashBin(int hash, const char * in, size_t inlen, std::string & out);
bool Hash(int hash, const char * in, std::string & out); bool HashBin(int hash, const char * in, std::string & out);
bool Hash(int hash, const std::string & in, std::string & out); bool HashBin(int hash, const std::string & in, std::string & out);
/* /*
@@ -66,11 +95,43 @@ public:
in - input buffer in - input buffer
inlen - the length of the buffer inlen - the length of the buffer
output: output:
out - the hash out - the hash in binary form
*/ */
bool Hash(int hash, const wchar_t * in, size_t inlen, std::wstring & out); bool HashBin(int hash, const wchar_t * in, size_t inlen, std::string & out);
bool Hash(int hash, const wchar_t * in, std::wstring & out); bool HashBin(int hash, const wchar_t * in, std::string & out);
bool Hash(int hash, const std::wstring & in, std::wstring & out); bool HashBin(int hash, const std::wstring & in, std::string & out);
/*
calculating a hash from a given input
input:
hash - the kind of the hash - WINIX_CRYPT_HASH_*
in - input buffer
inlen - the length of the buffer
output:
out - the hash in the hex form (one byte is saved as two hex digits)
*/
bool HashHex(int hash, const char * in, size_t inlen, std::string & out);
bool HashHex(int hash, const char * in, std::string & out);
bool HashHex(int hash, const std::string & in, std::string & out);
/*
calculating a hash from a given input
the input string is first changed to UTF8 and then hash is calculated
input:
hash - the kind of the hash - WINIX_CRYPT_HASH_*
in - input buffer
inlen - the length of the buffer
output:
out - the hash in the hex form (one byte is saved as two hex digits)
the 'out' here is std::wstring (not std::string like beforehand)
*/
bool HashHex(int hash, const wchar_t * in, size_t inlen, std::wstring & out);
bool HashHex(int hash, const wchar_t * in, std::wstring & out);
bool HashHex(int hash, const std::wstring & in, std::wstring & out);
/* /*
@@ -83,7 +144,7 @@ public:
inlen - the size of the buffer inlen - the size of the buffer
output: output:
out - encrypted or decrypted buffer out - encrypted or decrypted buffer (always binary)
*/ */
bool RSA(bool encrypt, const char * keypath, const char * in, size_t inlen, std::string & out); bool RSA(bool encrypt, const char * keypath, const char * in, size_t inlen, std::string & out);
bool RSA(bool encrypt, const char * keypath, const std::string & in, std::string & out); bool RSA(bool encrypt, const char * keypath, const std::string & in, std::string & out);
@@ -179,22 +240,27 @@ public:
private: private:
void TrimLastWhite(std::string & str);
Config * config; Config * config;
Run run; Run run;
std::string command, bufina, bufouta, keypatha; std::string command, bufina, keypatha;
//std::wstring pass_salted;//, pass_hashed; //std::wstring pass_salted;//, pass_hashed;
//std::string pass_hasheda, pass_encrypteda; //std::string pass_hasheda, pass_encrypteda;
std::wstring pass_salted, pass_org; std::wstring pass_salted, pass_org;
std::string passa; std::string passa, out_temp;
std::wstring empty; std::wstring empty;
template<typename StringType>
void ConvertToHexForm(const std::string & in, StringType & out);
char ConvertToHexForm(int val);
}; };
template<class StringType> template<typename StringType>
void Crypt::ClearString(StringType & str) void Crypt::ClearString(StringType & str)
{ {
for(size_t i=0 ; i<str.size() ; ++i) for(size_t i=0 ; i<str.size() ; ++i)
@@ -204,6 +270,25 @@ void Crypt::ClearString(StringType & str)
} }
template<typename StringType>
void Crypt::ConvertToHexForm(const std::string & in, StringType & out)
{
out.clear();
if( in.size() * 2 > out.capacity() )
out.reserve(in.size() * 2);
for(size_t i=0 ; i<in.size() ; ++i)
{
out += ConvertToHexForm(((unsigned char)in[i]) >> 4);
out += ConvertToHexForm(((unsigned char)in[i]) & 0x0f);
}
}
} // namespace Winix
#endif #endif
+35 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2011, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_cur #ifndef headerfile_winix_core_cur
@@ -15,6 +40,11 @@
#include "mount.h" #include "mount.h"
namespace Winix
{
/* /*
current request and session current request and session
*/ */
@@ -31,6 +61,8 @@ struct Cur
} // namespace Winix
#endif #endif
+38 -3
View File
@@ -1,16 +1,46 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2010, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "dircontainer.h" #include "dircontainer.h"
#include "log.h" #include "log.h"
namespace Winix
{
std::wstring DirContainer::dir_etc = L"etc"; std::wstring DirContainer::dir_etc = L"etc";
std::wstring DirContainer::dir_var = L"var"; std::wstring DirContainer::dir_var = L"var";
@@ -328,3 +358,8 @@ bool DirContainer::DelById(long id)
return true; return true;
} }
} // namespace Winix
+36 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_dircontainer #ifndef headerfile_winix_core_dircontainer
@@ -15,6 +40,10 @@
#include "item.h" #include "item.h"
namespace Winix
{
class DirContainer class DirContainer
{ {
@@ -92,4 +121,8 @@ private:
}; };
} // namespace Winix
#endif #endif
+57 -9
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "dirs.h" #include "dirs.h"
@@ -12,6 +37,9 @@
#include "log.h" #include "log.h"
namespace Winix
{
void Dirs::SetDb(Db * pdb) void Dirs::SetDb(Db * pdb)
@@ -351,7 +379,7 @@ return &(*etc);
} }
Item * Dirs::GetDir(const std::wstring & name, long parent) Item * Dirs::GetDir(const wchar_t * name, long parent)
{ {
DirContainer::ParentIterator i = dir_tab.FindFirstChild(parent); DirContainer::ParentIterator i = dir_tab.FindFirstChild(parent);
@@ -363,10 +391,16 @@ return 0;
} }
Item * Dirs::GetDir(const std::wstring & name, long parent)
Item * Dirs::GetDir(const std::wstring & path)
{ {
if( path.empty() ) return GetDir(name.c_str(), parent);
}
Item * Dirs::GetDir(const wchar_t * path)
{
if( *path == 0 )
return 0; return 0;
DirContainer::Iterator root = dir_tab.GetRoot(); DirContainer::Iterator root = dir_tab.GetRoot();
@@ -376,7 +410,7 @@ Item * Dirs::GetDir(const std::wstring & path)
return 0; return 0;
Item * pitem = &(*root); Item * pitem = &(*root);
const wchar_t * s = path.c_str(); const wchar_t * s = path;
while( ExtractName(s, get_dir_temp) ) while( ExtractName(s, get_dir_temp) )
{ {
@@ -390,6 +424,13 @@ return pitem;
} }
Item * Dirs::GetDir(const std::wstring & path)
{
return GetDir(path.c_str());
}
Item * Dirs::GetDir(long id) Item * Dirs::GetDir(long id)
{ {
DirContainer::Iterator i = dir_tab.FindId(id); DirContainer::Iterator i = dir_tab.FindId(id);
@@ -504,7 +545,11 @@ void Dirs::CopyDirTab(const std::vector<Item*> & in, std::vector<Item*> & out)
/*
!! IMPROVE ME
may dir_tab can be empty when link_to is not relative?
and now the algorith doesn't check if link_to is not relative (it only uses dir_tab)
*/
bool Dirs::AnalyzeDir(std::vector<Item*> & dir_tab, const std::wstring & link_to, size_t & i) bool Dirs::AnalyzeDir(std::vector<Item*> & dir_tab, const std::wstring & link_to, size_t & i)
{ {
size_t old_i; size_t old_i;
@@ -739,3 +784,6 @@ void Dirs::LogDir(const std::vector<Item*> & dir_tab)
} // namespace Winix
+40 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_dirs #ifndef headerfile_winix_core_dirs
@@ -22,7 +47,13 @@
#include "notify/notify.h" #include "notify/notify.h"
namespace Winix
{
// !! IMPROVE ME
// we do not support '..' in a path (for simplicity and security reasons) // we do not support '..' in a path (for simplicity and security reasons)
// (we will support '..' in the future)
class Dirs class Dirs
@@ -67,7 +98,10 @@ public:
Item * GetRootDir(); Item * GetRootDir();
Item * GetEtcDir(); Item * GetEtcDir();
Item * GetVarDir(); Item * GetVarDir();
Item * GetDir(const wchar_t * name, long parent);
Item * GetDir(const std::wstring & name, long parent); Item * GetDir(const std::wstring & name, long parent);
Item * GetDir(const wchar_t * path);
Item * GetDir(const std::wstring & path); Item * GetDir(const std::wstring & path);
Item * GetDir(long id); Item * GetDir(long id);
Item * AddDir(const Item & item); Item * AddDir(const Item & item);
@@ -112,4 +146,7 @@ private:
}; };
} // namespace Winix
#endif #endif
+34 -3
View File
@@ -1,16 +1,44 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2011, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_error #ifndef headerfile_winix_core_error
#define headerfile_winix_core_error #define headerfile_winix_core_error
namespace Winix
{
#define WINIX_ERR_OK 0 #define WINIX_ERR_OK 0
@@ -77,4 +105,7 @@ typedef int Error;
} // namespace Winix
#endif #endif
+34 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2010, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_group #ifndef headerfile_winix_core_group
@@ -14,6 +39,10 @@
#include <vector> #include <vector>
namespace Winix
{
struct Group struct Group
{ {
@@ -38,6 +67,8 @@ struct Group
} // namespace Winix
#endif #endif
+32 -22
View File
@@ -1,15 +1,43 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "groups.h" #include "groups.h"
namespace Winix
{
Groups::Groups() Groups::Groups()
@@ -94,23 +122,5 @@ bool Groups::Remove(long group_id)
} // namespace Winix
+33 -5
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_groups #ifndef headerfile_winix_core_groups
@@ -17,6 +42,10 @@
#include "db/db.h" #include "db/db.h"
namespace Winix
{
class Groups class Groups
{ {
@@ -45,8 +74,7 @@ public:
} // namespace Winix
+145 -21
View File
@@ -1,16 +1,47 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2011, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "htmlfilter.h" #include "htmlfilter.h"
namespace Winix
{
void HTMLFilter::Item::Clear() void HTMLFilter::Item::Clear()
{ {
name.clear(); name.clear();
@@ -193,6 +224,13 @@ void HTMLFilter::SafeMode(bool safe_mode_)
} }
void HTMLFilter::SetNoFilterTag(const std::wstring & tag_name)
{
no_filter_tag = tag_name;
}
HTMLFilter::Item & HTMLFilter::GetItem(size_t i) HTMLFilter::Item & HTMLFilter::GetItem(size_t i)
{ {
@@ -340,7 +378,6 @@ void HTMLFilter::PutLastTagWithClosingTag()
{ {
const wchar_t * start = pchar; const wchar_t * start = pchar;
while( *pchar != 0 ) while( *pchar != 0 )
{ {
if( IsOpeningTagMark() ) if( IsOpeningTagMark() )
@@ -362,6 +399,31 @@ const wchar_t * start = pchar;
} }
// used with <nofilter> </nofilter> tags
void HTMLFilter::PutTextBetweenLastTagWithClosingTag()
{
const wchar_t * start = pchar, * end = pchar;
while( *pchar != 0 )
{
if( IsOpeningTagMark() )
{
if( IsClosingTagForLastItem() )
{
PopStack();
CheckNewLine();
break;
}
}
else
{
pchar += 1;
end = pchar;
}
}
Put(start, end);
}
@@ -444,16 +506,34 @@ void HTMLFilter::ReadItemAttrValue(bool has_quote)
{ {
size_t i; size_t i;
// sprawdzic to wszedzie bo teraz jest tablica
attr_value.clear(); attr_value.clear();
attr_value_temp.clear();
// !! moze dodac obsluge escepowania cudzyslowu? sprawdzic czy to jest dostepne w htmlu // !! dodac obsluge pojedynczego cudzyslowu
for( i=0 ; *pchar && *pchar != '\"' && !IsClosingTagMark() && (has_quote || (*pchar!=10 && !IsWhite(*pchar)) ); ++i )
for(i=0 ; *pchar && *pchar != '\"' && !IsClosingTagMark() && (has_quote || (*pchar!=10 && !IsWhite(*pchar)) ); ++i )
{ {
if( *pchar==10 || IsWhite(*pchar) )
{
if( !attr_value_temp.empty() )
{
attr_value.push_back(attr_value_temp);
attr_value_temp.clear();
}
}
else
if( i < WINIX_HTMLFILTER_ATTR_VALUE_MAXLEN ) if( i < WINIX_HTMLFILTER_ATTR_VALUE_MAXLEN )
attr_value += *pchar; attr_value_temp += *pchar;
++pchar; ++pchar;
} }
if( !attr_value_temp.empty() )
{
attr_value.push_back(attr_value_temp);
attr_value_temp.clear();
}
} }
@@ -715,14 +795,22 @@ void HTMLFilter::PutClosingTagMark()
// !! zmienic na lepsza nazwe
// bo to nie zwraca true jesli tag jest safe
bool HTMLFilter::IsTagSafe(const wchar_t * tag) bool HTMLFilter::IsTagSafe(const wchar_t * tag)
{ {
if( !safe_mode ) if( !safe_mode )
return true; return true;
if( IsNameEqual(tag, no_filter_tag.c_str()) )
return false;
static const wchar_t * unsafe_tags[] = { static const wchar_t * unsafe_tags[] = {
L"script", L"iframe", L"frame", L"frameset", L"applet", L"base", L"body",
L"applet", L"head", L"meta", L"html", L"link", L"body" L"embed", L"head", L"html",
L"frame", L"frameset",L"iframe",
L"link", L"meta", L"param"
L"object", L"script"
}; };
size_t len = sizeof(unsafe_tags) / sizeof(const wchar_t*); size_t len = sizeof(unsafe_tags) / sizeof(const wchar_t*);
@@ -750,7 +838,8 @@ bool HTMLFilter::IsTagSafe(const std::wstring & tag)
bool HTMLFilter::PutOpeningTag() bool HTMLFilter::PutOpeningTag()
{ {
if( !IsTagSafe(LastItem().name) ) if( !IsTagSafe(LastItem().name) )
// dodac tutaj skipniecie calego tagu // !! IMPROVE ME
// !! dodac tutaj skipniecie calego tagu
return false; return false;
PutOpeningTagMark(); PutOpeningTagMark();
@@ -940,6 +1029,9 @@ const wchar_t * last_non_white = pchar;
bool HTMLFilter::PrintOpeningItem() bool HTMLFilter::PrintOpeningItem()
{ {
if( IsNameEqual(no_filter_tag, LastItem().name) )
return true;
if( last_new_line ) if( last_new_line )
{ {
PutNewLine(); PutNewLine();
@@ -976,6 +1068,8 @@ bool HTMLFilter::ReadItemAttr()
pchar += 1; // skipping '=' pchar += 1; // skipping '='
SkipWhiteLines(); SkipWhiteLines();
// !! dodac obsluge pojedynczego cudzyslowu
bool has_quote = (*pchar == '\"'); bool has_quote = (*pchar == '\"');
if( has_quote ) if( has_quote )
@@ -996,28 +1090,46 @@ bool HTMLFilter::CheckItemAttr()
if( attr_has_value && IsNameEqual(L"lang", attr_name) ) if( attr_has_value && IsNameEqual(L"lang", attr_name) )
{ {
LastItem().porphans = 0; LastItem().porphans = 0;
attr_value_lower = attr_value;
ToLower(attr_value_lower);
OrphansTab::iterator i = orphans_tab.find(attr_value_lower); if( !attr_value.empty() )
{
// we are taking the first value only
attr_value_lower = attr_value[0];
ToLower(attr_value_lower);
if( i != orphans_tab.end() ) OrphansTab::iterator i = orphans_tab.find(attr_value_lower);
LastItem().porphans = &i->second;
if( i != orphans_tab.end() )
LastItem().porphans = &i->second;
}
} }
return true; return true;
} }
void HTMLFilter::PrinItemAttr() void HTMLFilter::PrintItemAttr()
{ {
size_t i;
if( IsNameEqual(no_filter_tag, LastItem().name) )
return;
Put(' '); Put(' ');
Put(attr_name); Put(attr_name);
if( attr_has_value ) if( attr_has_value )
{ {
Put(L"=\""); Put(L"=\"");
Put(attr_value);
for(i=0 ; i<attr_value.size() ; ++i)
{
Put(attr_value[i]);
if( i + 1 < attr_value.size() )
Put(' ');
}
Put('\"'); Put('\"');
} }
} }
@@ -1059,15 +1171,18 @@ void HTMLFilter::ReadItemOpening()
while( ReadItemAttr() ) while( ReadItemAttr() )
{ {
if( CheckItemAttr() ) if( CheckItemAttr() )
PrinItemAttr(); PrintItemAttr();
} }
SkipAndCheckClosingTag(); // here LastItem().type can be changed to 'simple' SkipAndCheckClosingTag(); // here LastItem().type can be changed to 'simple'
if( LastItem().type == Item::simple ) if( !IsNameEqual(no_filter_tag, LastItem().name) )
Put(L" /"); {
if( LastItem().type == Item::simple )
Put(L" /");
PutClosingTagMark(); PutClosingTagMark();
}
} }
} }
@@ -1191,6 +1306,11 @@ bool HTMLFilter::IsLastTag(const wchar_t * name)
} }
bool HTMLFilter::IsLastTag(const std::wstring & name)
{
return IsNameEqual(name, LastItem().name);
}
// checking exceptions for opening tags // checking exceptions for opening tags
void HTMLFilter::CheckExceptions() void HTMLFilter::CheckExceptions()
@@ -1217,6 +1337,9 @@ void HTMLFilter::CheckExceptions()
if( IsLastTag(L"pre") || IsLastTag(L"textarea") ) if( IsLastTag(L"pre") || IsLastTag(L"textarea") )
PutLastTagWithClosingTag(); PutLastTagWithClosingTag();
if( IsLastTag(no_filter_tag) )
PutTextBetweenLastTagWithClosingTag();
if( IsLastTag(L"body") ) if( IsLastTag(L"body") )
LastItem().has_body_tag = true; LastItem().has_body_tag = true;
} }
@@ -1397,4 +1520,5 @@ void HTMLFilter::Read()
} // namespace Winix
+52 -5
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2011, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_htmlfilter #ifndef headerfile_winix_core_htmlfilter
@@ -16,6 +41,10 @@
#include <algorithm> #include <algorithm>
namespace Winix
{
// max length of a name of a html tag (with terminating null) // max length of a name of a html tag (with terminating null)
@@ -106,6 +135,11 @@ public:
void InsertTabs(size_t tabsize); void InsertTabs(size_t tabsize);
// set a name of a html tag which will be used as 'nofilter' tag
// elements between such tags are not filtered (similarly as in <pre> and <textarea>)
// these tags (opening and closing) will no be placed in the html output
void SetNoFilterTag(const std::wstring & tag_name);
// orphans are checked only in 'body' tag // orphans are checked only in 'body' tag
void AssignOrphans(const wchar_t * lang_code, const std::vector<std::wstring> & otab); void AssignOrphans(const wchar_t * lang_code, const std::vector<std::wstring> & otab);
void AssignOrphans(const std::wstring & lang_code, const std::vector<std::wstring> & otab); void AssignOrphans(const std::wstring & lang_code, const std::vector<std::wstring> & otab);
@@ -139,6 +173,9 @@ protected:
typedef std::map<std::wstring, Orphans> OrphansTab; typedef std::map<std::wstring, Orphans> OrphansTab;
OrphansTab orphans_tab; OrphansTab orphans_tab;
// html <nofilter> tag name
std::wstring no_filter_tag;
struct Item struct Item
{ {
@@ -169,6 +206,10 @@ protected:
}; };
/* /*
virtual methods virtual methods
*/ */
@@ -219,6 +260,7 @@ protected:
bool IsNameEqual(const std::wstring & name1, const std::wstring & name2, size_t len); bool IsNameEqual(const std::wstring & name1, const std::wstring & name2, size_t len);
bool IsLastTag(const wchar_t * name); bool IsLastTag(const wchar_t * name);
bool IsLastTag(const std::wstring & name);
bool IsTagSafe(const wchar_t * tag); bool IsTagSafe(const wchar_t * tag);
bool IsTagSafe(const std::wstring & tag); bool IsTagSafe(const std::wstring & tag);
@@ -250,7 +292,7 @@ protected:
bool ReadItemAttr(); bool ReadItemAttr();
bool CheckItemAttr(); bool CheckItemAttr();
void PrinItemAttr(); void PrintItemAttr();
void ReadItemClosing(); void ReadItemClosing();
void ReadItemSpecial(); void ReadItemSpecial();
@@ -266,6 +308,7 @@ protected:
void PutNormalNonWhite(const wchar_t * & str, const wchar_t * end); void PutNormalNonWhite(const wchar_t * & str, const wchar_t * end);
void PutNormalWhite(const wchar_t * & str, const wchar_t * end); void PutNormalWhite(const wchar_t * & str, const wchar_t * end);
void PutLastTagWithClosingTag(); void PutLastTagWithClosingTag();
void PutTextBetweenLastTagWithClosingTag();
void PutTabs(size_t len); void PutTabs(size_t len);
void PutNonBreakingSpace(); void PutNonBreakingSpace();
void PutNewLine(); void PutNewLine();
@@ -284,7 +327,8 @@ protected:
size_t tab_size; size_t tab_size;
OrphanMode orphan_mode; OrphanMode orphan_mode;
std::wstring attr_name; std::wstring attr_name;
std::wstring attr_value; std::vector<std::wstring> attr_value;
std::wstring attr_value_temp;
std::wstring attr_value_lower; std::wstring attr_value_lower;
bool attr_has_value; bool attr_has_value;
std::wstring lang_code_lower; std::wstring lang_code_lower;
@@ -295,5 +339,8 @@ protected:
} // namespace Winix
#endif #endif
+107 -69
View File
@@ -1,23 +1,55 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2010, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "httpsimpleparser.h" #include "httpsimpleparser.h"
#include "misc.h"
#include "utf8/utf8.h"
void HttpSimpleParser::ToLower(std::string & s)
namespace Winix
{ {
std::string::iterator i;
for(i=s.begin() ; i!= s.end() ; ++i)
void HttpSimpleParser::ToLower(std::wstring & s)
{
for(wchar_t & c : s)
{ {
if( *i>='A' && *i<='Z' ) if( c>='A' && c<='Z' )
*i = *i - 'A' + 'a'; c = c - 'A' + 'a';
} }
} }
@@ -39,38 +71,6 @@ void HttpSimpleParser::SkipWhiteChars()
void HttpSimpleParser::TrimWhiteChars(std::string & s)
{
if( s.empty() )
return;
std::string::size_type i;
for(i = 0 ; i<s.size() && IsWhite(s[i]) ; ++i);
if( i == s.size() )
{
// all characters are white
s.clear();
return;
}
if( i > 0 )
// there are some white characters at the beginning
s.erase(0, i);
// s is not empty now (i was not equal s.size())
// and we have some non white characters
// we stops at the last non white character
for(i = s.size()-1 ; i>0 && IsWhite(s[i]) ; --i);
if( i != s.size()-1 )
// there are some white characters at the end
// we're starting from i+1 even when i==0 (there are some non white characters)
s.erase(i+1, s.size() - i - 1);
}
int HttpSimpleParser::ParseHalfHex(int c) int HttpSimpleParser::ParseHalfHex(int c)
@@ -121,33 +121,42 @@ void HttpSimpleParser::CheckSpecialChar()
void HttpSimpleParser::ReadName() void HttpSimpleParser::ReadName()
{ {
// we're checking 'separator' and '=' because the string is allowed not having '=' (the value is optional) // we're checking 'separator' and '=' because the string is allowed not having '=' (the value is optional)
utf8_token.clear();
last_name.clear();
for( ; last_c!=-1 && last_c!=separator && last_c!='=' ; last_c = GetChar() ) for( ; last_c!=-1 && last_c!=separator && last_c!='=' ; last_c = GetChar() )
{ {
if( recognize_special_chars ) if( recognize_special_chars )
CheckSpecialChar(); CheckSpecialChar();
if( last_c != -1 ) if( last_c != -1 )
last_name += last_c; {
if( getchar_returns_utf8_chars )
utf8_token += last_c;
else
last_name += last_c;
}
} }
if( getchar_returns_utf8_chars )
PT::UTF8ToWide(utf8_token, last_name);
if( last_c == '=' ) if( last_c == '=' )
last_c = GetChar(); last_c = GetChar();
} }
void HttpSimpleParser::ReadQuotedValue() void HttpSimpleParser::ReadQuotedValue()
{ {
// skipping '"' // skipping '"'
last_c = GetChar(); last_c = GetChar();
utf8_token.clear();
last_value.clear();
for( ; last_c!=-1 && last_c!='"' ; last_c = GetChar() ) for( ; last_c!=-1 && last_c!='"' ; last_c = GetChar() )
{ {
@@ -155,9 +164,16 @@ void HttpSimpleParser::ReadQuotedValue()
CheckSpecialChar(); CheckSpecialChar();
if( last_c != -1 ) if( last_c != -1 )
last_value += last_c; {
if( getchar_returns_utf8_chars )
utf8_token += last_c;
else
last_value += last_c;
}
} }
if( getchar_returns_utf8_chars )
PT::UTF8ToWide(utf8_token, last_value);
if( last_c == '"' ) if( last_c == '"' )
last_c = GetChar(); last_c = GetChar();
@@ -168,26 +184,39 @@ void HttpSimpleParser::ReadQuotedValue()
} }
void HttpSimpleParser::ReadNormalValue()
{
utf8_token.clear();
last_value.clear();
for( ; last_c!=-1 && last_c!=separator ; last_c = GetChar() )
{
if( recognize_special_chars )
CheckSpecialChar();
if( last_c != -1 )
{
if( getchar_returns_utf8_chars )
utf8_token += last_c;
else
last_value += last_c;
}
}
if( getchar_returns_utf8_chars )
PT::UTF8ToWide(utf8_token, last_value);
}
void HttpSimpleParser::ReadValue() void HttpSimpleParser::ReadValue()
{ {
if( skip_white_chars ) if( skip_white_chars )
SkipWhiteChars(); SkipWhiteChars();
if( value_can_be_quoted && last_c == '"' ) if( value_can_be_quoted && last_c == '"' )
{
ReadQuotedValue(); ReadQuotedValue();
}
else else
{ ReadNormalValue();
for( ; last_c!=-1 && last_c!=separator ; last_c = GetChar() )
{
if( recognize_special_chars )
CheckSpecialChar();
if( last_c != -1 )
last_value += last_c;
}
}
if( last_c == separator ) if( last_c == separator )
@@ -197,6 +226,21 @@ void HttpSimpleParser::ReadValue()
/*
* there can be some important values like passwords so its better
* to clear them now
*/
void HttpSimpleParser::Clear()
{
Overwrite(last_name);
Overwrite(last_value);
Overwrite(utf8_token);
last_name.clear();
last_value.clear();
utf8_token.clear();
}
void HttpSimpleParser::Parse() void HttpSimpleParser::Parse()
{ {
for( last_c = GetChar() ; last_c != -1 ; ) for( last_c = GetChar() ; last_c != -1 ; )
@@ -211,25 +255,19 @@ void HttpSimpleParser::Parse()
if( skip_white_chars ) if( skip_white_chars )
{ {
TrimWhiteChars(last_name); TrimWhite(last_name);
TrimWhiteChars(last_value); TrimWhite(last_value);
} }
Parameter(last_name, last_value); // user definied function Parameter(last_name, last_value); // user definied function
} }
Clear();
} }
} // namespace Winix
+52 -13
View File
@@ -1,19 +1,47 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2010, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_httpsimpleparser #ifndef headerfile_winix_core_httpsimpleparser
#define headerfile_winix_core_httpsimpleparser #define headerfile_winix_core_httpsimpleparser
#include <string> #include <string>
namespace Winix
{
class HttpSimpleParser class HttpSimpleParser
{ {
@@ -24,26 +52,33 @@ protected:
bool skip_white_chars; bool skip_white_chars;
bool recognize_special_chars; bool recognize_special_chars;
int ParseHalfHex(int c); // if false then GetChar() returns wide characters (converted to int)
// if true then GetChar() returns utf8 characters (we have to convert them from utf8 to wide chars)
bool getchar_returns_utf8_chars;
int ParseHalfHex(int c);
void ReadName(); void ReadName();
void ReadQuotedValue(); void ReadQuotedValue();
void ReadNormalValue();
void ReadValue(); void ReadValue();
void Clear();
std::string last_name; std::wstring last_name;
std::string last_value; std::wstring last_value;
std::string utf8_token;
int last_c; int last_c;
int separator; int separator;
// '-1' means end (eof) // '-1' means end (eof)
// when there is an eof this method can be called more than once (it should always return -1 in such a case)
virtual int GetChar() = 0; virtual int GetChar() = 0;
virtual void Parameter(std::string & last_name, std::string & last_value) = 0; virtual void Parameter(std::wstring & last_name, std::wstring & last_value) = 0;
void ToLower(std::string & s); void ToLower(std::wstring & s);
bool IsWhite(int c); bool IsWhite(int c);
void SkipWhiteChars(); void SkipWhiteChars();
void TrimWhiteChars(std::string & s);
void CheckSpecialChar(); void CheckSpecialChar();
void Parse(); void Parse();
@@ -56,13 +91,17 @@ public:
{ {
separator = '&'; separator = '&';
read_name = true; read_name = true;
value_can_be_quoted = false; value_can_be_quoted = false;
skip_white_chars = false; skip_white_chars = false;
recognize_special_chars = true; recognize_special_chars = true;
getchar_returns_utf8_chars = false;
} }
}; };
} // namespace Winix
#endif #endif
+323 -107
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2012, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <ctime> #include <ctime>
@@ -13,6 +38,12 @@
#include "log.h" #include "log.h"
#include "system.h" #include "system.h"
#include "plugin.h" #include "plugin.h"
#include "lock.h"
namespace Winix
{
@@ -35,15 +66,91 @@ void Image::SetSystem(System * psystem)
} }
// first thread (objects locked) // first thread (objects locked)
void Image::Resize(const Item & item, size_t cx, size_t cy, int aspect_mode, int quality) Image::Scale Image::GetImageScale(long dir_id)
{ {
item_temp.type = WINIX_IMAGE_TYPE_RESIZE; Scale scale;
item_temp.file = item;
item_temp.cx = cx; Mount * m = system->mounts.CalcMount(dir_id);
item_temp.cy = cy; scale.cx = config->image_cx;
item_temp.aspect_mode = aspect_mode; scale.cy = config->image_cy;
item_temp.quality = quality; scale.aspect_mode = config->image_mode;
scale.quality = config->image_quality;
// reading width and height from the mount point (if exists)
int index = system->mounts.MountParImageSize();
if( m && m->param[index].defined && m->param[index].arg.size() == 2 )
{
scale.cx = Tol(m->param[index].arg[0]);
scale.cy = Tol(m->param[index].arg[1]);
}
// reading image mode from the mount point (if exists)
index = system->mounts.MountParImageMode();
if( m && m->param[index].defined && m->param[index].arg.size() == 1 )
scale.aspect_mode = Toi(m->param[index].arg[0]);
// reading image quality from the mount point (if exists)
index = system->mounts.MountParImageQuality();
if( m && m->param[index].defined && m->param[index].arg.size() == 1 )
scale.quality = Toi(m->param[index].arg[0]);
return scale;
}
// first thread (objects locked)
Image::Scale Image::GetThumbScale(long dir_id)
{
Scale scale;
Mount * m = system->mounts.CalcMount(dir_id);
scale.cx = config->thumb_cx;
scale.cy = config->thumb_cy;
scale.aspect_mode = config->thumb_mode;
scale.quality = config->thumb_quality;
// reading width and height from the mount point (if exists)
int index = system->mounts.MountParThumbSize();
if( m && m->param[index].defined && m->param[index].arg.size() == 2 )
{
scale.cx = Tol(m->param[index].arg[0]);
scale.cy = Tol(m->param[index].arg[1]);
}
// reading thumb mode from the mount point (if exists)
index = system->mounts.MountParThumbMode();
if( m && m->param[index].defined && m->param[index].arg.size() == 1 )
scale.aspect_mode = Toi(m->param[index].arg[0]);
// reading image quality from the mount point (if exists)
index = system->mounts.MountParThumbQuality();
if( m && m->param[index].defined && m->param[index].arg.size() == 1 )
scale.quality = Toi(m->param[index].arg[0]);
return scale;
}
// first thread (objects locked)
void Image::Resize(long file_id, size_t cx, size_t cy, int aspect_mode, int quality)
{
item_temp.type = WINIX_IMAGE_TYPE_RESIZE;
item_temp.file_id = file_id;
item_temp.cx = cx;
item_temp.cy = cy;
item_temp.aspect_mode = aspect_mode;
item_temp.quality = quality;
CheckParam(item_temp); CheckParam(item_temp);
image_tab.insert(image_tab.end(), item_temp); image_tab.insert(image_tab.end(), item_temp);
@@ -51,15 +158,16 @@ void Image::Resize(const Item & item, size_t cx, size_t cy, int aspect_mode, int
} }
// first thread (objects locked) // first thread (objects locked)
void Image::CreateThumb(const Item & item, size_t cx, size_t cy, int aspect_mode, int quality) void Image::CreateThumb(long file_id, size_t thumb_cx, size_t thumb_cy, int aspect_mode, int quality)
{ {
item_temp.type = WINIX_IMAGE_TYPE_CREATE_THUMB; item_temp.type = WINIX_IMAGE_TYPE_CREATE_THUMB;
item_temp.file = item; item_temp.file_id = file_id;
item_temp.cx = cx; item_temp.thumb_cx = thumb_cx;
item_temp.cy = cy; item_temp.thumb_cy = thumb_cy;
item_temp.aspect_mode = aspect_mode; item_temp.aspect_mode = aspect_mode;
item_temp.quality = quality; item_temp.quality = quality;
CheckParam(item_temp); CheckParam(item_temp);
image_tab.insert(image_tab.end(), item_temp); image_tab.insert(image_tab.end(), item_temp);
@@ -68,31 +176,75 @@ void Image::CreateThumb(const Item & item, size_t cx, size_t cy, int aspect_mode
// first thread (objects locked)
void Image::Crop(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy, int quality)
{
item_temp.type = WINIX_IMAGE_TYPE_CROP;
item_temp.file_id = file_id;
item_temp.xoffset = xoffset;
item_temp.yoffset = yoffset;
item_temp.cx = cx;
item_temp.cy = cy;
item_temp.quality = quality;
CheckParam(item_temp);
image_tab.insert(image_tab.end(), item_temp);
WakeUpThread();
}
// first thread (objects locked)
void Image::CropThumb(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy, int quality)
{
item_temp.type = WINIX_IMAGE_TYPE_CROP_THUMB;
item_temp.file_id = file_id;
item_temp.xoffset = xoffset;
item_temp.yoffset = yoffset;
item_temp.cx = cx;
item_temp.cy = cy;
item_temp.quality = quality;
CheckParam(item_temp);
image_tab.insert(image_tab.end(), item_temp);
WakeUpThread();
}
// first thread (objects locked)
void Image::CropNewThumb(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy,
size_t thumb_cx, size_t thumb_cy, int aspect_mode, int quality)
{
item_temp.type = WINIX_IMAGE_TYPE_CREATE_CROP_NEW_THUMB;
item_temp.file_id = file_id;
item_temp.xoffset = xoffset;
item_temp.yoffset = yoffset;
item_temp.cx = cx;
item_temp.cy = cy;
item_temp.thumb_cx = thumb_cx;
item_temp.thumb_cy = thumb_cy;
item_temp.aspect_mode = aspect_mode;
item_temp.quality = quality;
CheckParam(item_temp);
image_tab.insert(image_tab.end(), item_temp);
WakeUpThread();
}
void Image::CheckParam(ImageItem & item) void Image::CheckParam(ImageItem & item)
{ {
if( item.aspect_mode < 1 ) SetMinMax(item.aspect_mode, 1, 7);
item.aspect_mode = 1; SetMinMax(item.quality, 0, 100);
SetMinMax(item.cx, 1, 30000);
if( item.aspect_mode > 7 ) SetMinMax(item.cy, 1, 30000);
item.aspect_mode = 7; SetMinMax(item.thumb_cx, 1, 30000);
SetMinMax(item.thumb_cy, 1, 30000);
if( item.quality < 0 ) SetMinMax(item.xoffset, 0, 30000);
item.quality = 0; SetMinMax(item.yoffset, 0, 30000);
if( item.quality > 100 )
item.quality = 100;
if( item_temp.cx < 5 )
item_temp.cx = 5;
if( item_temp.cy < 5 )
item_temp.cy = 5;
if( item_temp.cx > 10000 )
item_temp.cx = 10000;
if( item_temp.cy > 10000 )
item_temp.cy = 10000;
} }
@@ -117,7 +269,7 @@ bool end;
do do
{ {
Lock(); class Lock lock_object(synchro);
if( i != image_tab.end() ) if( i != image_tab.end() )
{ {
@@ -130,7 +282,7 @@ bool end;
end = true; end = true;
} }
Unlock(); lock_object.Unlock();
if( !end ) if( !end )
CreateImage(); CreateImage();
@@ -163,7 +315,8 @@ void Image::EscapePath(const std::string & path, TextStream<std::string> & out,
if( path[i] == '"' ) if( path[i] == '"' )
out << '\\'; out << '\\';
out << path[i]; if( path[i] != 0 )
out << path[i];
} }
out << '\"'; out << '\"';
@@ -184,37 +337,37 @@ widthxheight! Width and height emphatically given, original aspect ratio ignor
widthxheight> Change as per widthxheight but only if an image dimension exceeds a specified dimension. widthxheight> Change as per widthxheight but only if an image dimension exceeds a specified dimension.
widthxheight< Change dimensions only if both image dimensions exceed specified dimensions. widthxheight< Change dimensions only if both image dimensions exceed specified dimensions.
*/ */
void Image::SelectAspect() void Image::SelectAspect(size_t cx, size_t cy)
{ {
switch( item_work.aspect_mode ) switch( item_work.aspect_mode )
{ {
case WINIX_IMAGE_MODE_1: case WINIX_IMAGE_MODE_1:
command << item_work.cx; command << cx;
break; break;
case WINIX_IMAGE_MODE_3: case WINIX_IMAGE_MODE_3:
command << item_work.cx << "x" << item_work.cy; command << cx << "x" << cy;
break; break;
case WINIX_IMAGE_MODE_4: case WINIX_IMAGE_MODE_4:
command << '"' << item_work.cx << "x" << item_work.cy << "^\""; command << '"' << cx << "x" << cy << "^\"";
break; break;
case WINIX_IMAGE_MODE_5: case WINIX_IMAGE_MODE_5:
command << '"' << item_work.cx << "x" << item_work.cy << "!\""; command << '"' << cx << "x" << cy << "!\"";
break; break;
case WINIX_IMAGE_MODE_6: case WINIX_IMAGE_MODE_6:
command << '"' << item_work.cx << "x" << item_work.cy << ">\""; command << '"' << cx << "x" << cy << ">\"";
break; break;
case WINIX_IMAGE_MODE_7: case WINIX_IMAGE_MODE_7:
command << '"' << item_work.cx << "x" << item_work.cy << "<\""; command << '"' << cx << "x" << cy << "<\"";
break; break;
case WINIX_IMAGE_MODE_2: case WINIX_IMAGE_MODE_2:
default: default:
command << "x" << item_work.cy; command << "x" << cy;
break; break;
} }
} }
@@ -224,7 +377,17 @@ void Image::SelectAspect()
// second thread (objects locked) // second thread (objects locked)
bool Image::CreateInputFileName() bool Image::CreateInputFileName()
{ {
if( system->MakeFilePath(item_work.file, src_path) ) bool thumb = (item_work.type == WINIX_IMAGE_TYPE_CROP_THUMB);
if( thumb && !file_work.has_thumb )
{
log << log1 << "Image: file id: " << file_work.id << ", url: " << file_work.url
<< " doesn't have a thumbnail yet (skipping)" << logend;
return false;
}
if( system->MakeFilePath(file_work, src_path, thumb) )
{ {
PT::WideToUTF8(src_path, input_file_name); PT::WideToUTF8(src_path, input_file_name);
return true; return true;
@@ -237,6 +400,7 @@ bool Image::CreateInputFileName()
} }
// second thread (objects locked) // second thread (objects locked)
void Image::CreateTmpFileName() void Image::CreateTmpFileName()
{ {
@@ -250,26 +414,17 @@ void Image::CreateTmpFileName()
// second thread (objects are not locked) // second thread (objects are not locked)
bool Image::CreateCommand() bool Image::CreateCommand()
{ {
Lock(); class Lock lock_object(synchro);
iq.SetAll(true, false); iq.SetAll(true, false);
iq.WhereId(item_work.file.id); iq.WhereId(item_work.file_id);
// !! skoro teraz i tak wczytujemy caly obiekt
// to teraz w kolejce wystarczy zapamietywac tylko samo item.id (a nie caly obiekt item)
// the file could have been changed especially when there is a long queue of files // the file could have been changed especially when there is a long queue of files
if( db->GetItem(item_work.file, iq) != WINIX_ERR_OK ) if( db->GetItem(file_work, iq) != WINIX_ERR_OK )
{
Unlock();
return false; return false;
}
if( !CreateInputFileName() ) if( !CreateInputFileName() )
{
Unlock();
return false; return false;
}
command.Clear(); command.Clear();
Add(config->convert_cmd, command); Add(config->convert_cmd, command);
@@ -279,11 +434,38 @@ bool Image::CreateCommand()
command << " -quiet -quality " << item_work.quality; command << " -quiet -quality " << item_work.quality;
if( item_work.type == WINIX_IMAGE_TYPE_RESIZE ) if( item_work.type == WINIX_IMAGE_TYPE_RESIZE )
{
command << " -resize "; command << " -resize ";
SelectAspect(item_work.cx, item_work.cy);
}
else else
if( item_work.type == WINIX_IMAGE_TYPE_CREATE_THUMB )
{
command << " -strip -thumbnail "; command << " -strip -thumbnail ";
SelectAspect(item_work.thumb_cx, item_work.thumb_cy);
}
else
if( item_work.type == WINIX_IMAGE_TYPE_CROP )
{
command << " -crop " << item_work.cx << "x" << item_work.cy
<< "+" << item_work.xoffset << "+" << item_work.yoffset << " +repage ";
}
else
if( item_work.type == WINIX_IMAGE_TYPE_CROP_THUMB )
{
command << " -strip -crop " << item_work.cx << "x" << item_work.cy
<< "+" << item_work.xoffset << "+" << item_work.yoffset
<< " +repage ";
}
else
if( item_work.type == WINIX_IMAGE_TYPE_CREATE_CROP_NEW_THUMB )
{
command << " -strip -crop " << item_work.cx << "x" << item_work.cy
<< "+" << item_work.xoffset << "+" << item_work.yoffset
<< " +repage -thumbnail ";
SelectAspect(item_work.thumb_cx, item_work.thumb_cy);
}
SelectAspect();
CreateTmpFileName(); CreateTmpFileName();
command << " "; command << " ";
@@ -291,7 +473,6 @@ bool Image::CreateCommand()
log << log4 << "Image: running: " << command.Str() << logend; log << log4 << "Image: running: " << command.Str() << logend;
Unlock();
return true; return true;
} }
@@ -299,43 +480,80 @@ return true;
// second thread (objects are locked)
void Image::ImageSavedCorrectly()
{
if( item_work.type == WINIX_IMAGE_TYPE_CREATE_THUMB )
{
if( !file_work.has_thumb )
{
file_work.has_thumb = true;
db->EditHasThumbById(true, file_work.id);
}
log << log3 << "Image: generated a thumbnail: " << dst_path << logend;
plugin.Call((Session*)0, WINIX_CREATED_THUMB, &file_work);
}
else
if( item_work.type == WINIX_IMAGE_TYPE_RESIZE )
{
log << log3 << "Image: image resized: " << dst_path << logend;
plugin.Call((Session*)0, WINIX_IMAGE_RESIZED, &file_work);
}
else
if( item_work.type == WINIX_IMAGE_TYPE_CROP )
{
log << log3 << "Image: image cropped: " << dst_path << logend;
// !! IMPROVE ME add a correct message
//plugin.Call((Session*)0, WINIX_IMAGE_RESIZED, &file_work);
}
else
if( item_work.type == WINIX_IMAGE_TYPE_CROP_THUMB )
{
log << log3 << "Image: image thumbnail cropped: " << dst_path << logend;
// !! IMPROVE ME add a correct message
//plugin.Call((Session*)0, WINIX_IMAGE_RESIZED, &file_work);
}
else
if( item_work.type == WINIX_IMAGE_TYPE_CREATE_CROP_NEW_THUMB )
{
log << log3 << "Image: a new thumbnail from an original image was cropped: " << dst_path << logend;
// !! IMPROVE ME add a correct message
//plugin.Call((Session*)0, WINIX_IMAGE_RESIZED, &file_work);
}
}
// second thread (objects are not locked) // second thread (objects are not locked)
void Image::SaveImage() void Image::SaveImage()
{ {
bool moved = false; class Lock lock_object(synchro);
Lock();
// the file could have been changed especially when creating the image lasted too long // the file could have been changed especially when creating the image lasted too long
iq.SetAll(true, false); iq.SetAll(true, false);
iq.WhereId(item_work.file.id); iq.WhereId(item_work.file_id);
if( db->GetItem(item_work.file, iq) == WINIX_ERR_OK ) if( db->GetItem(file_work, iq) == WINIX_ERR_OK )
{ {
bool thumb = (item_work.type == WINIX_IMAGE_TYPE_CREATE_THUMB); bool thumb = (item_work.type == WINIX_IMAGE_TYPE_CREATE_THUMB ||
item_work.type == WINIX_IMAGE_TYPE_CROP_THUMB ||
item_work.type == WINIX_IMAGE_TYPE_CREATE_CROP_NEW_THUMB );
if( system->MakeFilePath(item_work.file, dst_path, thumb, true, config->upload_dirs_chmod) ) if( system->MakeFilePath(file_work, dst_path, thumb, true, config->upload_dirs_chmod, config->upload_group_int) )
{ {
if( RenameFile(stream_tmp_path.Str(), dst_path) ) if( RenameFile(stream_tmp_path.Str(), dst_path) )
{ {
if( thumb ) // it doesn't matter for us if there is an error when chmod/chown on a file
{ // the admin (root) will correct it
item_work.file.has_thumb = true; SetPriv(dst_path, config->upload_files_chmod, config->upload_group_int);
db->EditHasThumbById(true, item_work.file.id); ImageSavedCorrectly();
log << log3 << "Image: generated a thumbnail: " << dst_path << logend;
plugin.Call((Session*)0, WINIX_CREATED_THUMB, &item_work.file);
}
else
{
log << log3 << "Image: image resized: " << dst_path << logend;
plugin.Call((Session*)0, WINIX_IMAGE_RESIZED, &item_work.file);
}
moved = true;
} }
else else
{ {
log << log1 << "Image: cannot move a temporary file: " << stream_tmp_path.Str() << ", to: " << dst_path << logend; log << log1 << "Image: cannot move a temporary file: " << stream_tmp_path.Str()
<< ", to: " << dst_path << logend;
Winix::RemoveFile(stream_tmp_path.Str());
} }
} }
else else
@@ -343,11 +561,6 @@ bool moved = false;
log << log1 << "Image: cannot create a destination path" << logend; log << log1 << "Image: cannot create a destination path" << logend;
} }
} }
if( !moved )
::RemoveFile(stream_tmp_path.Str());
Unlock();
} }
@@ -355,21 +568,20 @@ bool moved = false;
// second thread (objects are not locked) // second thread (objects are not locked)
void Image::CreateImage() void Image::CreateImage()
{ {
if( !CreateCommand() ) if( CreateCommand() )
return;
int res = std::system(command.CStr());
if( res == 0 )
{ {
SaveImage(); int res = std::system(command.CStr());
}
else if( res == 0 )
{ {
Lock(); SaveImage();
log << log3 << "Image: some problems with creating an image" }
<< ", 'convert' process returned: " << res << logend; else
Unlock(); {
class Lock lock_object(synchro);
log << log3 << "Image: some problems with creating an image"
<< ", 'convert' process returned: " << res << logend;
}
} }
} }
@@ -413,3 +625,7 @@ void Image::CreateThumbnail()
*/ */
} // namespace Winix
+109 -8
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2011, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_image #ifndef headerfile_winix_core_image
@@ -19,10 +44,15 @@
#include "core/config.h" #include "core/config.h"
namespace Winix
{
class System; class System;
// aspect modes:
// Width given, height automagically selected to preserve aspect ratio. // Width given, height automagically selected to preserve aspect ratio.
#define WINIX_IMAGE_MODE_1 1 #define WINIX_IMAGE_MODE_1 1
@@ -45,25 +75,74 @@ class System;
#define WINIX_IMAGE_MODE_7 7 #define WINIX_IMAGE_MODE_7 7
// resizing // resizing
#define WINIX_IMAGE_TYPE_RESIZE 1 #define WINIX_IMAGE_TYPE_RESIZE 1
// generating a thumbnail // generating a thumbnail
#define WINIX_IMAGE_TYPE_CREATE_THUMB 2 #define WINIX_IMAGE_TYPE_CREATE_THUMB 2
// cropping an image
#define WINIX_IMAGE_TYPE_CROP 3
// cropping an thumbnail
#define WINIX_IMAGE_TYPE_CROP_THUMB 4
// creating by cropping a new thumbnail (from an original image)
#define WINIX_IMAGE_TYPE_CREATE_CROP_NEW_THUMB 5
/*
*/
class Image : public BaseThread class Image : public BaseThread
{ {
public: public:
struct Scale
{
size_t cx;
size_t cy;
int aspect_mode;
int quality;
Scale()
{
cx = cy = 1;
aspect_mode = 2;
quality = 100;
};
};
void SetDb(Db * pdb); void SetDb(Db * pdb);
void SetConfig(Config * pconfig); void SetConfig(Config * pconfig);
void SetSystem(System * psystem); void SetSystem(System * psystem);
void Resize(const Item & item, size_t cx, size_t cy, int aspect_mode, int quality);
void CreateThumb(const Item & item, size_t cx, size_t cy, int aspect_mode, int quality); // returning scale info for a directory
Scale GetImageScale(long dir_id);
// returning scale info (for thumbnails) for a directory
Scale GetThumbScale(long dir_id);
void Resize(long file_id, size_t cx, size_t cy, int aspect_mode, int quality);
// creating a new thumbnail from an original image
void CreateThumb(long file_id, size_t thumb_cx, size_t thumb_cy, int aspect_mode, int quality);
// cropping an image (the thumbnail is not changed)
void Crop(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy, int quality);
// cropping an existing thumbnail
void CropThumb(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy, int quality);
// creating and cropping a new thumbnail (from an original image)
void CropNewThumb(long file_id, size_t xoffset, size_t yoffset, size_t cx, size_t cy,
size_t thumb_cx, size_t thumb_cy, int aspect_mode, int quality);
private: private:
@@ -75,13 +154,29 @@ private:
struct ImageItem struct ImageItem
{ {
int type; // WINIX_IMAGE_TYPE_* int type; // WINIX_IMAGE_TYPE_*
Item file; long file_id;
size_t cx; size_t cx;
size_t cy; size_t cy;
size_t xoffset; // xoffset and yoffset are used when cropping
size_t yoffset;
size_t thumb_cx;
size_t thumb_cy;
int aspect_mode; int aspect_mode;
int quality; int quality;
}; };
template<typename int_type>
void SetMinMax(int_type & var, int var_min, int var_max)
{
if( static_cast<int>(var) < var_min )
var = var_min;
if( static_cast<int>(var) > var_max )
var = var_max;
}
// queue of thumbnails to create // queue of thumbnails to create
typedef std::list<ImageItem> ImageTab; typedef std::list<ImageItem> ImageTab;
ImageTab image_tab; ImageTab image_tab;
@@ -96,6 +191,7 @@ private:
std::string add_tempa; std::string add_tempa;
std::string input_file_name; std::string input_file_name;
std::string tmp_file_name; std::string tmp_file_name;
Item file_work;
virtual bool SignalReceived(); virtual bool SignalReceived();
virtual void Do(); virtual void Do();
@@ -104,11 +200,16 @@ private:
void CreateTmpFileName(); void CreateTmpFileName();
void SaveImage(); void SaveImage();
void CreateImage(); void CreateImage();
void SelectAspect(); void SelectAspect(size_t cx, size_t cy);
void EscapePath(const std::string & path, TextStream<std::string> & out, bool clear_stream = true); void EscapePath(const std::string & path, TextStream<std::string> & out, bool clear_stream = true);
void CheckParam(ImageItem & item); void CheckParam(ImageItem & item);
void Add(const std::wstring & in, TextStream<std::string> & out); void Add(const std::wstring & in, TextStream<std::string> & out);
void ImageSavedCorrectly();
}; };
} // namespace Winix
#endif #endif
+185
View File
@@ -0,0 +1,185 @@
/*
* This file is a part of Winix
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_winix_core_ipban
#define headerfile_winix_core_ipban
#include <ctime>
namespace Winix
{
// telling if the IPBan record is active
// we have two records: active and non active
// non active records is something like a history
// it is used to remember the last ban level
// so based on this in the future a next greater ban can be calculated
#define WINIX_IPBAN_FLAG_ACTIVE 1
// current ban level
// (if one of these flag is set and the record is active then it means the IP is banned at the moment)
// level 1: banned for short time
// level 2: can be set after level 1 has expired and the attacker still have not given up
// banned for some longer time in level 1
// level 3: can be set after level 2
// banned for much more time
#define WINIX_IPBAN_FLAG_BAN_LEVEL1 2
#define WINIX_IPBAN_FLAG_BAN_LEVEL2 4
#define WINIX_IPBAN_FLAG_BAN_LEVEL3 8
/*
struct defining some restrictions to an IP address
*/
struct IPBan
{
// at the moment only IPv4 are supported
int ip;
// one or more flags from WINIX_IPBAN_FLAG_*
int flags;
// when this record was last used
time_t last_used;
// when the restrictions (ban) should be removed
// valid only if some of WINIX_IPBAN_FLAG_BAN_LEVELX flags are set
// actually we do not remove the record but unsets WINIX_IPBAN_FLAG_ACTIVE flag
// so in the future we can check whether we need to change
// the ban level to a greater value
time_t expires;
// how many incorrect login attempts there are
unsigned int incorrect_login_events;
// in the future there can be more *_events fields
bool HasFlag(int flag) const
{
return (flags & flag) != 0;
}
void SetFlag(int flag)
{
flags = flags | flag;
}
void ClearFlag(int flag)
{
flags = flags & (~flag);
}
bool IsIPBanned() const
{
if( !HasFlag(WINIX_IPBAN_FLAG_ACTIVE) )
return false;
return HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL1) ||
HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL2) ||
HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL3);
}
void AddNextBanLevel(time_t level1_expires, time_t level2_expires, time_t level3_expires)
{
if( HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL3) )
{
expires = level3_expires;
return;
}
else
if( HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL2) )
{
SetFlag(WINIX_IPBAN_FLAG_BAN_LEVEL3);
expires = level3_expires;
return;
}
else
if( HasFlag(WINIX_IPBAN_FLAG_BAN_LEVEL1) )
{
SetFlag(WINIX_IPBAN_FLAG_BAN_LEVEL2);
expires = level2_expires;
return;
}
else
{
SetFlag(WINIX_IPBAN_FLAG_BAN_LEVEL1);
expires = level1_expires;
}
}
IPBan()
{
Clear();
}
void Clear()
{
ip = 0;
flags = 0;
last_used = 0;
expires = 0;
incorrect_login_events = 0;
}
void ClearAfterRemovingBan()
{
ClearFlag(WINIX_IPBAN_FLAG_ACTIVE);
incorrect_login_events = 0;
expires = 0;
}
};
} // namespace Winix
#endif
+253
View File
@@ -0,0 +1,253 @@
/*
* This file is a part of Winix
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <algorithm>
#include "ipbancontainer.h"
#include "log.h"
#include "date/date.h"
namespace Winix
{
IPBanContainer::IPBanContainer()
{
is_ipban_tab_sorted = true; // an empty list is sorted
soft_max_size = 100;
max_size = 110;
}
void IPBanContainer::SetMaxSize(size_t soft_size, size_t size)
{
soft_max_size = soft_size;
max_size = size;
if( max_size < soft_max_size )
max_size = soft_max_size + 1;
ipban_tab.reserve(max_size);
sort_helper_tab.reserve(max_size);
}
// returning a reference to the added (or existed) record
IPBan & IPBanContainer::AddIP(int ip)
{
IPBan * old_ip_ban = FindIP(ip);
if( !old_ip_ban )
{
IPBan ip_ban;
ip_ban.ip = ip;
if( ipban_tab.size() >= max_size )
RemoveOldRecords();
ipban_tab.push_back(ip_ban);
is_ipban_tab_sorted = false;
return ipban_tab.back();
}
else
{
return *old_ip_ban;
}
}
void IPBanContainer::RemoveIP(int ip)
{
IPBan * ipban = FindIP(ip);
if( ipban )
{
size_t index = ipban - &ipban_tab[0];
ipban_tab.erase(ipban_tab.begin() + index);
}
}
bool IPBanContainer::IsSorted()
{
return is_ipban_tab_sorted;
}
void IPBanContainer::Clear()
{
ipban_tab.clear();
is_ipban_tab_sorted = true;
}
// we need to remove some old records for the size of the container
// to be less or equal to soft_max_size
void IPBanContainer::RemoveOldRecords()
{
size_t to_remove = 0;
if( ipban_tab.size() >= soft_max_size )
to_remove = ipban_tab.size() - soft_max_size;
if( to_remove > 0 )
{
sort_helper_tab.resize(ipban_tab.size());
for(size_t i=0 ; i<ipban_tab.size() ; ++i)
sort_helper_tab[i] = i;
std::sort(sort_helper_tab.begin(), sort_helper_tab.end(), SortByLastUsedHelper(this));
sort_helper_tab.resize(to_remove);
std::sort(sort_helper_tab.begin(), sort_helper_tab.end());
while( to_remove-- > 0 )
ipban_tab.erase(ipban_tab.begin() + sort_helper_tab[to_remove]);
}
}
// for debug purposes
void IPBanContainer::PrintTab()
{
log << log4 << "ipban_tab (size: " << ipban_tab.size() << ")" << logend;
for(size_t i=0 ; i<ipban_tab.size() ; ++i)
{
log << log4 << i << ": ip: " << ipban_tab[i].ip << ", flags: " << ipban_tab[i].flags << ", last_used: ";
PT::Date date(ipban_tab[i].last_used);
log << date << ", expires: ";
date = ipban_tab[i].expires;
log << date << logend;
}
}
// for debug purposes
void IPBanContainer::PrintTab2()
{
log << log4 << "sort_helper_tab (size: " << sort_helper_tab.size() << ")" << logend;
for(size_t i=0 ; i<sort_helper_tab.size() ; ++i)
{
IPBan & ipban = ipban_tab[sort_helper_tab[i]];
log << log4 << i << ": ip: " << ipban.ip << ", flags: " << ipban.flags << ", last_used: ";
PT::Date date(ipban.last_used);
log << date << ", expires: ";
date = ipban.expires;
log << date << logend;
}
}
bool IPBanContainer::SortByLastUsedHelper::operator()(size_t index1, size_t index2)
{
if( index1 < container->ipban_tab.size() &&
index2 < container->ipban_tab.size() )
{
IPBan & ip1 = container->ipban_tab[index1];
IPBan & ip2 = container->ipban_tab[index2];
// prefer to select records which do not have WINIX_IPBAN_FLAG_ACTIVE
if( ip1.HasFlag(WINIX_IPBAN_FLAG_ACTIVE) !=
ip2.HasFlag(WINIX_IPBAN_FLAG_ACTIVE) )
{
return ip2.HasFlag(WINIX_IPBAN_FLAG_ACTIVE);
}
return ip1.last_used < ip2.last_used;
}
return false;
}
IPBan * IPBanContainer::FindIP(int ip)
{
// !! IMPROVE ME add binary search if is_ipban_tab_sorted is true
for(size_t i=0 ; i<ipban_tab.size() ; ++i)
{
if( ipban_tab[i].ip == ip )
{
return &ipban_tab[i];
}
}
return 0;
}
IPBan & IPBanContainer::GetIPBan(size_t index)
{
return ipban_tab[index];
}
void IPBanContainer::Sort()
{
std::sort(ipban_tab.begin(), ipban_tab.end(), SortIPBansFunction);
is_ipban_tab_sorted = true;
}
size_t IPBanContainer::Size()
{
return ipban_tab.size();
}
bool IPBanContainer::SortIPBansFunction(const IPBan & ip1, const IPBan & ip2)
{
return ip1.ip < ip2.ip;
}
} // namespace Winix
+90
View File
@@ -0,0 +1,90 @@
/*
* This file is a part of Winix
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_winix_core_ipbancontainer
#define headerfile_winix_core_ipbancontainer
#include <vector>
#include "ipban.h"
namespace Winix
{
class IPBanContainer
{
public:
IPBanContainer();
IPBan & AddIP(int ip);
IPBan * FindIP(int ip);
void Sort();
size_t Size();
IPBan & GetIPBan(size_t index);
void SetMaxSize(size_t soft_size, size_t size);
void RemoveIP(int ip);
void Clear();
bool IsSorted();
private:
std::vector<IPBan> ipban_tab;
bool is_ipban_tab_sorted;
size_t soft_max_size, max_size;
std::vector<size_t> sort_helper_tab;
static bool SortIPBansFunction(const IPBan & ip1, const IPBan & ip2);
void RemoveOldRecords();
void PrintTab();
void PrintTab2();
struct SortByLastUsedHelper
{
IPBanContainer * container;
SortByLastUsedHelper(IPBanContainer * c) : container(c) {}
bool operator()(size_t index1, size_t index2);
};
};
} // namespace Winix
#endif
+37 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2012, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "item.h" #include "item.h"
@@ -12,6 +37,11 @@
#include "crypt.h" #include "crypt.h"
namespace Winix
{
Item::Item() Item::Item()
{ {
@@ -74,8 +104,12 @@ void Item::Clear()
html_template.clear(); html_template.clear();
sort_index = 0; sort_index = 0;
meta.Clear(); meta.Clear();
ameta.Clear();
SetDateToNow(); SetDateToNow();
} }
} // namespace Winix
+36 -4
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_item #ifndef headerfile_winix_core_item
@@ -15,6 +40,9 @@
#include "date/date.h" #include "date/date.h"
namespace Winix
{
#define WINIX_ITEM_FILETYPE_NONE 0 #define WINIX_ITEM_FILETYPE_NONE 0
#define WINIX_ITEM_FILETYPE_IMAGE 1 #define WINIX_ITEM_FILETYPE_IMAGE 1
@@ -76,7 +104,7 @@ struct Item
// used when type is symlink or to a directory too (function 'default') // used when type is symlink or to a directory too (function 'default')
std::wstring link_to; std::wstring link_to;
int link_redirect; int link_redirect; // !! IMPROVE ME should it be 'bool'?
// static file (if exists) // static file (if exists)
@@ -98,6 +126,7 @@ struct Item
// meta information // meta information
PT::Space meta; PT::Space meta;
PT::Space ameta;
// methods // methods
@@ -117,5 +146,8 @@ friend struct DbItemColumns;
}; };
} // namespace Winix
#endif #endif
+36 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2012, Tomasz Sowa */
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "job.h" #include "job.h"
@@ -12,6 +37,11 @@
#include "log.h" #include "log.h"
namespace Winix
{
Job::Job() Job::Job()
{ {
@@ -162,4 +192,7 @@ void Job::DoWinixJob(PT::Space & job)
} // namespace Winix
+36 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2012, Tomasz Sowa */
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_jobs #ifndef headerfile_winix_core_jobs
@@ -16,6 +41,10 @@
#include "space/space.h" #include "space/space.h"
namespace Winix
{
#define WINIX_JOBS_HOW_MANY_PRIORITIES 32 #define WINIX_JOBS_HOW_MANY_PRIORITIES 32
@@ -78,5 +107,9 @@ private:
}; };
} // namespace Winix
#endif #endif
+39 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2009, Tomasz Sowa */
/*
* Copyright (c) 2009-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
@@ -13,6 +38,12 @@
#include "misc.h" #include "misc.h"
namespace Winix
{
LastItem::LastItem() LastItem::LastItem()
{ {
user_id = 0; user_id = 0;
@@ -106,3 +137,8 @@ LastTab::iterator i = FindNotLoggedOut(user_id, session_id);
<< user_id << " ses_id: " << session_id << logend; << user_id << " ses_id: " << session_id << logend;
} }
} }
} // namespace Winix
+37 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2009, Tomasz Sowa */
/*
* Copyright (c) 2009-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_lastcontainer #ifndef headerfile_winix_core_lastcontainer
@@ -18,6 +43,11 @@
namespace Winix
{
// how many items we store in the 'last' function // how many items we store in the 'last' function
#define WINIX_LASTCONTAINER_TABLE_SIZE 100 #define WINIX_LASTCONTAINER_TABLE_SIZE 100
@@ -75,4 +105,8 @@ private:
}; };
} // namespace Winix
#endif #endif
+37 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2010, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
@@ -12,6 +37,10 @@
#include "log.h" #include "log.h"
namespace Winix
{
LoadAvg::LoadAvg() LoadAvg::LoadAvg()
{ {
@@ -370,3 +399,8 @@ double LoadAvg::ReqPerSec15()
return cache_req_per_sec15; return cache_req_per_sec15;
} }
} // namespace Winix
+35 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2010, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_loadavg #ifndef headerfile_winix_core_loadavg
@@ -13,6 +38,10 @@
#include <ctime> #include <ctime>
namespace Winix
{
// in seconds // in seconds
@@ -110,5 +139,8 @@ private:
} // namespace Winix
#endif #endif
Executable
+82
View File
@@ -0,0 +1,82 @@
/*
* This file is a part of Winix
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "lock.h"
namespace Winix
{
Lock::Lock()
{
synchro = 0;
}
Lock::Lock(Synchro * synchro_)
{
synchro = synchro_;
synchro->Lock();
}
Lock::Lock(Synchro & synchro_)
{
synchro = &synchro_;
synchro->Lock();
}
Lock::~Lock()
{
Unlock();
}
void Lock::Unlock()
{
if( synchro )
{
synchro->Unlock();
synchro = 0;
}
}
} // namespace Winix
Executable
+71
View File
@@ -0,0 +1,71 @@
/*
* This file is a part of Winix
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_winix_core_lock
#define headerfile_winix_core_lock
#include "synchro.h"
namespace Winix
{
class Lock
{
public:
Lock(Synchro * synchro_);
Lock(Synchro & synchro_);
~Lock();
void Unlock();
private:
Synchro * synchro;
Lock();
};
} // namespace Winix
#endif
+36 -29
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "log.h" #include "log.h"
@@ -14,6 +39,11 @@
#include "timezones.h" #include "timezones.h"
namespace Winix
{
Log::Log() Log::Log()
{ {
log_level = 1; log_level = 1;
@@ -48,14 +78,14 @@ int Log::LogLevel()
void Log::Init(int log_level_, bool save_each_line_, const std::string & log_file_, bool log_std, int log_max_requests) void Log::Init(int log_level_, bool save_each_line_, const std::wstring & log_file_, bool log_std, int log_max_requests)
{ {
log_level = log_level_; log_level = log_level_;
log_file = log_file_;
log_stdout = log_std; log_stdout = log_std;
max_requests = log_max_requests; max_requests = log_max_requests;
save_each_line = save_each_line_; save_each_line = save_each_line_;
PT::WideToUTF8(log_file_, log_file);
// don't open the file here // don't open the file here
// because it would be created with the root as an owner // because it would be created with the root as an owner
} }
@@ -453,28 +483,5 @@ void Log::SaveLog()
} // namespace Winix
+42 -14
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_log #ifndef headerfile_winix_core_log
@@ -20,6 +45,11 @@
#include "textstream/textstream.h" #include "textstream/textstream.h"
namespace Winix
{
class TimeZones; class TimeZones;
@@ -32,7 +62,7 @@ public:
~Log(); ~Log();
void SetTimeZones(TimeZones * ptime_zones); void SetTimeZones(TimeZones * ptime_zones);
void Init(int log_level_, bool save_each_line_, const std::string & log_file_, bool log_std, int log_max_requests); void Init(int log_level_, bool save_each_line_, const std::wstring & log_file_, bool log_std, int log_max_requests);
Log & operator<<(const void * s); Log & operator<<(const void * s);
Log & operator<<(const char * s); Log & operator<<(const char * s);
@@ -142,16 +172,8 @@ size_t min_size = value.size() < max_size ? value.size() : max_size;
template<typename char_type, size_t stack_size, size_t heap_block_size> template<typename char_type, size_t stack_size, size_t heap_block_size>
Log & Log::operator<<(const PT::TextStreamBase<char_type, stack_size, heap_block_size> & buf) Log & Log::operator<<(const PT::TextStreamBase<char_type, stack_size, heap_block_size> & buf)
{ {
if( current_level > log_level ) if( current_level <= log_level )
return *this; buffer << buf;
typename PT::TextStreamBase<char_type, stack_size, heap_block_size>::const_iterator i = buf.begin();
// in the future we change buffer to PT::TextStreamBuffer
// so then there'll be << operator
for( ; i != buf.end() ; ++i)
buffer << *i;
return *this; return *this;
} }
@@ -163,6 +185,12 @@ return *this;
extern Log log; extern Log log;
extern Log nlog; extern Log nlog;
} // namespace Winix
// for convenience, we have to use only #include "log.h" in the winix // for convenience, we have to use only #include "log.h" in the winix
#include "slog.h" #include "slog.h"
+38 -3
View File
@@ -1,16 +1,47 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2011, Tomasz Sowa */
/*
* Copyright (c) 2011-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_logmanipulators #ifndef headerfile_winix_core_logmanipulators
#define headerfile_winix_core_logmanipulators #define headerfile_winix_core_logmanipulators
namespace Winix
{
/* /*
log1 - the first level log1 - the first level
log2 log2
@@ -44,5 +75,9 @@ enum LogManipulators
}; };
} // namespace Winix
#endif #endif
+350 -193
View File
@@ -1,20 +1,52 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <grp.h>
#include <fstream> #include <fstream>
#include <cstdlib>
#include "misc.h" #include "misc.h"
#include "log.h" #include "log.h"
#include "templates/templates.h" #include "templates/templates.h"
namespace Winix
{
namespace misc_private namespace misc_private
{ {
@@ -25,9 +57,6 @@ namespace misc_private
0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x2028, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x2028,
0x2029, 0x202F, 0x205F, 0x3000 }; 0x2029, 0x202F, 0x205F, 0x3000 };
std::ifstream get_file_content;
std::string get_file_content_ansi;
PT::WTextStream tmp_qencode; PT::WTextStream tmp_qencode;
} }
@@ -77,6 +106,34 @@ long Tol(const wchar_t * str, int base)
double Tod(const std::string & str)
{
return strtod(str.c_str(), 0);
}
double Tod(const std::wstring & str)
{
return wcstold(str.c_str(), 0);
}
double Tod(const char * str)
{
return strtod(str, 0);
}
double Tod(const wchar_t * str)
{
return wcstold(str, 0);
}
const wchar_t * Toa(unsigned int value, int base) const wchar_t * Toa(unsigned int value, int base)
{ {
@@ -117,7 +174,7 @@ return buffer;
void Toa(int value, std::string & res, int base, bool clear) void Toa(int value, std::string & res, int base, bool clear)
{ {
static char buffer[50]; static char buffer[50]; // !! IMPROVE ME this 'static' is not needed here?
size_t len = sizeof(buffer) / sizeof(char); size_t len = sizeof(buffer) / sizeof(char);
if( clear ) if( clear )
@@ -130,7 +187,7 @@ size_t len = sizeof(buffer) / sizeof(char);
void Toa(long value, std::string & res, int base, bool clear) void Toa(long value, std::string & res, int base, bool clear)
{ {
static char buffer[50]; static char buffer[50]; // !! IMPROVE ME the same as above
size_t len = sizeof(buffer) / sizeof(char); size_t len = sizeof(buffer) / sizeof(char);
if( clear ) if( clear )
@@ -143,7 +200,7 @@ size_t len = sizeof(buffer) / sizeof(char);
void Toa(int value, std::wstring & res, int base, bool clear) void Toa(int value, std::wstring & res, int base, bool clear)
{ {
static wchar_t buffer[50]; static wchar_t buffer[50]; // !!
size_t len = sizeof(buffer) / sizeof(wchar_t); size_t len = sizeof(buffer) / sizeof(wchar_t);
if( clear ) if( clear )
@@ -156,7 +213,7 @@ size_t len = sizeof(buffer) / sizeof(wchar_t);
void Toa(long value, std::wstring & res, int base, bool clear) void Toa(long value, std::wstring & res, int base, bool clear)
{ {
static wchar_t buffer[50]; static wchar_t buffer[50]; // !!
size_t len = sizeof(buffer) / sizeof(wchar_t); size_t len = sizeof(buffer) / sizeof(wchar_t);
if( clear ) if( clear )
@@ -171,142 +228,6 @@ size_t len = sizeof(buffer) / sizeof(wchar_t);
void AssignString(const char * src, size_t len, std::wstring & dst, bool clear)
{
if( clear )
dst.clear();
if( dst.capacity() < dst.size() + len )
dst.reserve(dst.size() + len + 128);
for(size_t i=0 ; i<len ; ++i )
dst += static_cast<unsigned char>(src[i]);
}
void AssignString(const char * src, std::wstring & dst, bool clear)
{
size_t len;
for(len=0 ; src[len] ; ++len){}
AssignString(src, len, dst, clear);
}
void AssignString(const std::string & src, std::wstring & dst, bool clear)
{
AssignString(src.c_str(), src.size(), dst, clear);
}
void AssignString(const wchar_t * src, size_t len, std::string & dst, bool clear)
{
if( clear )
dst.clear();
if( dst.capacity() < dst.size() + len )
dst.reserve(dst.size() + len + 128);
for(size_t i=0 ; i<len ; ++i)
dst += static_cast<char>(src[i]);
}
void AssignString(const wchar_t * src, std::string & dst, bool clear)
{
size_t len;
for(len=0 ; src[len] ; ++len){}
AssignString(src, len, dst, clear);
}
void AssignString(const std::wstring & src, std::string & dst, bool clear)
{
AssignString(src.c_str(), src.size(), dst, clear);
}
void AssignString(const char * src, size_t len, std::string & dst, bool clear)
{
if( clear )
dst.clear();
// we suppose that append is smart enough and we don't have to use reserve()
dst.append(src, len);
}
void AssignString(const char * src, std::string & dst, bool clear)
{
size_t len;
for(len=0 ; src[len] ; ++len){}
AssignString(src, len, dst, clear);
}
void AssignString(const std::string & src, std::string & dst, bool clear)
{
if( clear )
dst.clear();
dst.append(src);
}
void AssignString(const wchar_t * src, size_t len, std::wstring & dst, bool clear)
{
if( clear )
dst.clear();
// we suppose that append is smart enough and we don't have to use reserve()
dst.append(src, len);
}
void AssignString(const wchar_t * src, std::wstring & dst, bool clear)
{
size_t len;
for(len=0 ; src[len] ; ++len){}
AssignString(src, len, dst, clear);
}
void AssignString(const std::wstring & src, std::wstring & dst, bool clear)
{
if( clear )
dst.clear();
dst.append(src);
}
bool CorrectUrlChar(wchar_t c) bool CorrectUrlChar(wchar_t c)
{ {
return (c >= 'a' && c <='z') || return (c >= 'a' && c <='z') ||
@@ -526,6 +447,29 @@ return buffer;
PT::WTextStream IPToStr(unsigned int ip)
{
PT::WTextStream buf;
for(int i=0 ; i<4 ; ++i, ip >>= 8)
{
buf << (ip & 0xff);
if( i<3 )
buf << '.';
}
return buf;
}
PT::WTextStream IPToStr(int ip)
{
return IPToStr(static_cast<unsigned int>(ip));
}
/* /*
we do not treat a new line character (10) as a white character we do not treat a new line character (10) as a white character
*/ */
@@ -561,6 +505,40 @@ return false;
/*
return true if the whole string has only white characters
an empty string is treated as white
*/
bool IsWhite(const wchar_t * str, bool treat_new_line_as_white)
{
for( ; *str != 0 ; ++str )
{
if( *str == '\n' )
{
if( !treat_new_line_as_white )
return false;
}
else
if( !IsWhite(*str) )
return false;
}
return true;
}
/*
return true if the whole string has only white characters
*/
bool IsWhite(const std::wstring & str, bool treat_new_line_as_white)
{
return IsWhite(str.c_str(), treat_new_line_as_white);
}
bool IsLastSlash(const std::wstring & path) bool IsLastSlash(const std::wstring & path)
{ {
@@ -572,6 +550,18 @@ return path[path.size()-1] == '/';
void Overwrite(std::string & str)
{
for(char & c : str)
c = 0;
}
void Overwrite(std::wstring & str)
{
for(wchar_t & c : str)
c = 0;
}
const char * SkipWhite(const char * s) const char * SkipWhite(const char * s)
@@ -675,11 +665,12 @@ bool ValidateEmail(const std::wstring & email)
bool IsFile(const wchar_t * file) bool IsFile(const wchar_t * file)
{ {
struct stat sb; struct stat sb;
static std::string afile; char file_name[WINIX_OS_PATH_SIZE];
PT::WideToUTF8(file, afile); if( !WideToUTF8(file, file_name, WINIX_OS_PATH_SIZE) )
return false;
return (stat(afile.c_str(), &sb) == 0); return (stat(file_name, &sb) == 0);
} }
@@ -689,37 +680,43 @@ bool IsFile(const std::wstring & file)
} }
bool CreateDir(const wchar_t * dir, int priv) /*
* group can be -1 (it is not used then)
*/
bool CreateDir(const wchar_t * dir, int priv, int group)
{ {
static std::string adir; char dir_name[WINIX_OS_PATH_SIZE];
if( !IsFile(dir) ) if( !IsFile(dir) )
{ {
PT::WideToUTF8(dir, adir); if( !WideToUTF8(dir, dir_name, WINIX_OS_PATH_SIZE) )
return false;
if( mkdir(adir.c_str(), priv) < 0 ) if( mkdir(dir_name, 0777) < 0 )
{ {
log << log1 << "Can't create a directory on fs: " << adir << logend; log << log1 << "Can't create a directory on fs: " << dir << logend;
return false; return false;
} }
return SetPriv(dir, priv, group);
} }
return true; return true;
} }
bool CreateDir(const std::wstring & dir, int priv) bool CreateDir(const std::wstring & dir, int priv, int group)
{ {
return CreateDir(dir.c_str(), priv); return CreateDir(dir.c_str(), priv, group);
} }
// creating directories (can be more than one) // creating directories (can be more than one)
// 'dirs' can begin with a slash (will be skipped) // 'dirs' can begin with a slash (will be skipped)
bool CreateDirs(const wchar_t * base_dir, const wchar_t * dirs, int priv, bool skip_last) bool CreateDirs(const wchar_t * base_dir, const wchar_t * dirs, int priv, int group, bool skip_last)
{ {
static std::wstring temp; static std::wstring temp; // !! IMPROVE ME change to char[WINIX_OS_PATH_SIZE] or just remove 'static'
const wchar_t * p = dirs; const wchar_t * p = dirs;
temp = base_dir; // we start creating from 'base_dir' temp = base_dir; // we start creating from 'base_dir'
@@ -743,7 +740,7 @@ const wchar_t * p = dirs;
temp += *p; temp += *p;
if( !skip_last || *p!=0 ) if( !skip_last || *p!=0 )
if( !CreateDir(temp.c_str(), priv) ) if( !CreateDir(temp.c_str(), priv, group) )
return false; return false;
temp += '/'; temp += '/';
@@ -754,9 +751,82 @@ return true;
bool CreateDirs(const std::wstring & base_dir, const std::wstring & dirs, int priv, bool skip_last) bool CreateDirs(const std::wstring & base_dir, const std::wstring & dirs, int priv, int group, bool skip_last)
{ {
return CreateDirs(base_dir.c_str(), dirs.c_str(), priv, skip_last); return CreateDirs(base_dir.c_str(), dirs.c_str(), priv, group, skip_last);
}
int GetGroupId(const wchar_t * name)
{
struct group gr;
struct group * result;
char group_name[WINIX_OS_USERNAME_SIZE];
char buffer[512];
if( !WideToUTF8(name, group_name, WINIX_OS_USERNAME_SIZE) )
return -1;
if( getgrnam_r(group_name, &gr, buffer, sizeof(buffer)/sizeof(char), &result) != 0 )
{
log << log1 << "Misc: I cannot get the group_id for group name: " << name << logend;
return -1;
}
/*
* there is no such a group in /etc/group
*/
if( result == 0 )
{
log << log1 << "Misc: There is no a group with name: " << name << logend;
return -1;
}
return gr.gr_gid;
}
int GetGroupId(const std::wstring & name)
{
return GetGroupId(name.c_str());
}
/*
* setting priveleges and a group id on a file or on a directory
* group can be -1 (it is not used then)
*/
bool SetPriv(const wchar_t * name, int priv, int group)
{
char file_name[WINIX_OS_PATH_SIZE];
if( !WideToUTF8(name, file_name, WINIX_OS_PATH_SIZE) )
return false;
if( chmod(file_name, priv) < 0 )
{
log << log1 << "Misc: Can't set proper fs privileges on: " << name << logend;
return false;
}
if( group != -1 )
{
if( chown(file_name, geteuid(), group) < 0 )
{
log << log1 << "Can't set proper fs group on: " << name
<< ", group id was: " << group << logend;
return false;
}
}
return true;
}
bool SetPriv(const std::wstring & name, int priv, int group)
{
return SetPriv(name.c_str(), priv, group);
} }
@@ -785,18 +855,22 @@ return true;
bool CopyFile(const wchar_t * src, const wchar_t * dst) bool CopyFile(const wchar_t * src, const wchar_t * dst)
{ {
static std::string asrc, adst; char src_name[WINIX_OS_PATH_SIZE];
char dst_name[WINIX_OS_PATH_SIZE];
FILE * in, * out; FILE * in, * out;
PT::WideToUTF8(src, asrc); if( !WideToUTF8(src, src_name, WINIX_OS_PATH_SIZE) )
PT::WideToUTF8(dst, adst); return false;
in = fopen(asrc.c_str(), "rb"); if( !WideToUTF8(dst, dst_name, WINIX_OS_PATH_SIZE) )
return false;
in = fopen(src_name, "rb");
if( !in ) if( !in )
return false; return false;
out = fopen(adst.c_str(), "wb"); out = fopen(dst_name, "wb");
if( !out ) if( !out )
{ {
@@ -813,7 +887,7 @@ FILE * in, * out;
res = false; res = false;
if( !res ) if( !res )
remove(adst.c_str()); remove(dst_name);
return res; return res;
} }
@@ -828,11 +902,12 @@ bool CopyFile(const std::wstring & src, const std::wstring & dst)
bool RemoveFile(const wchar_t * file) bool RemoveFile(const wchar_t * file)
{ {
static std::string afile; char file_name[WINIX_OS_PATH_SIZE];
PT::WideToUTF8(file, afile); if( !WideToUTF8(file, file_name, WINIX_OS_PATH_SIZE) )
return false;
return unlink(afile.c_str()) == 0; return unlink(file_name) == 0;
} }
@@ -845,12 +920,16 @@ bool RemoveFile(const std::wstring & file)
bool RenameFile(const wchar_t * from, const wchar_t * to) bool RenameFile(const wchar_t * from, const wchar_t * to)
{ {
static std::string afrom, ato; char from_name[WINIX_OS_PATH_SIZE];
char to_name[WINIX_OS_PATH_SIZE];
PT::WideToUTF8(from, afrom); if( !WideToUTF8(from, from_name, WINIX_OS_PATH_SIZE) )
PT::WideToUTF8(to, ato); return false;
return rename(afrom.c_str(), ato.c_str()) == 0; if( !WideToUTF8(to, to_name, WINIX_OS_PATH_SIZE) )
return false;
return rename(from_name, to_name) == 0;
} }
@@ -863,19 +942,25 @@ bool RenameFile(const std::wstring & from, const std::wstring & to)
bool GetUTF8File(const char * file_path, std::wstring & content, bool clear_content) bool GetUTF8File(const wchar_t * file_path, std::wstring & content, bool clear_content)
{ {
using namespace misc_private; char file[WINIX_OS_PATH_SIZE];
std::ifstream get_file_content;
if( clear_content ) if( clear_content )
content.clear(); content.clear();
get_file_content.clear(); if( !WideToUTF8(file_path, file, WINIX_OS_PATH_SIZE) )
get_file_content.open(file_path, std::ios_base::in | std::ios_base::binary); return false;
get_file_content.open(file, std::ios_base::in | std::ios_base::binary);
if( !get_file_content ) if( !get_file_content )
return false; return false;
/*
* we don't report any errors when converting from UTF8 to wide characters here
*/
PT::UTF8ToWide(get_file_content, content); PT::UTF8ToWide(get_file_content, content);
get_file_content.close(); get_file_content.close();
@@ -883,21 +968,6 @@ return true;
} }
bool GetUTF8File(const wchar_t * file_path, std::wstring & content, bool clear_content)
{
using namespace misc_private;
PT::WideToUTF8(file_path, get_file_content_ansi);
return GetUTF8File(get_file_content_ansi.c_str(), content, clear_content);
}
bool GetUTF8File(const std::string & file_path, std::wstring & content, bool clear_content)
{
return GetUTF8File(file_path.c_str(), content, clear_content);
}
bool GetUTF8File(const std::wstring & file_path, std::wstring & content, bool clear_content) bool GetUTF8File(const std::wstring & file_path, std::wstring & content, bool clear_content)
{ {
return GetUTF8File(file_path.c_str(), content, clear_content); return GetUTF8File(file_path.c_str(), content, clear_content);
@@ -1037,6 +1107,69 @@ void UrlEncode(const std::wstring & in, std::wstring & out, bool clear_out)
bool UrlDecodeFromHex(int c, int & out)
{
if( c>='0' && c<='9' )
{
out = c - '0';
return true;
}
else
if( c>='a' && c<='f' )
{
out = c - 'a' + 10;
return true;
}
else
if( c>='A' && c<='F' )
{
out = c - 'A' + 10;
return true;
}
out = 0;
return false;
}
bool UrlDecode(const char * url, std::wstring & out, bool clear_out)
{
char url_utf8[WINIX_URL_MAX_SIZE];
size_t index = 0;
int c1, c2;
if( clear_out )
out.clear();
while( *url && index < WINIX_URL_MAX_SIZE-1 )
{
if( *url == '%' && *(url+1) && *(url+2) &&
UrlDecodeFromHex(*(url+1), c1) && UrlDecodeFromHex(*(url+2), c2) )
{
url_utf8[index++] = (c1 << 4) + c2;
url += 3;
}
else
{
url_utf8[index++] = *url;
url += 1;
}
}
url_utf8[index] = 0;
return PT::UTF8ToWide(url_utf8, out, false);
}
bool UrlDecode(const std::string & url, std::wstring & out, bool clear_out)
{
return UrlDecode(url.c_str(), out, clear_out);
}
void QEncode(const std::wstring & in, std::string & out, bool clear) void QEncode(const std::wstring & in, std::string & out, bool clear)
{ {
@@ -1069,4 +1202,28 @@ void RemovePostFileTmp(PostFileTab & post_file_tab)
} }
bool WideToUTF8(const wchar_t * wide_string, char * utf8, size_t utf8_size)
{
bool res = PT::WideToUTF8(wide_string, utf8, utf8_size);
if( !res )
{
/*
* either the 'utf8' buffer is too small or there was an error when converting
*/
log << log1 << "Misc: I cannot convert from a wide string to an UTF-8 string, original string was: "
<< wide_string << logend;
}
return res;
}
bool WideToUTF8(const std::wstring & wide_string, char * utf8, size_t utf8_size)
{
return WideToUTF8(wide_string.c_str(), utf8, utf8_size);
}
} // namespace Winix
+169 -48
View File
@@ -1,16 +1,40 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_misc #ifndef headerfile_winix_core_misc
#define headerfile_winix_core_misc #define headerfile_winix_core_misc
#include <string> #include <string>
#include <sstream> #include <sstream>
#include <ctime> #include <ctime>
@@ -20,6 +44,13 @@
#include "date/date.h" #include "date/date.h"
#include "textstream/textstream.h" #include "textstream/textstream.h"
#include "utf8/utf8.h" #include "utf8/utf8.h"
#include "winix_const.h"
namespace Winix
{
@@ -38,6 +69,11 @@ long Tol(const std::wstring & str, int base = 10);
long Tol(const char * str, int base = 10); long Tol(const char * str, int base = 10);
long Tol(const wchar_t * str, int base = 10); long Tol(const wchar_t * str, int base = 10);
double Tod(const std::string & str);
double Tod(const std::wstring & str);
double Tod(const char * str);
double Tod(const wchar_t * str);
// if the buffer is too small it will be terminated at the beginning (empty string) // if the buffer is too small it will be terminated at the beginning (empty string)
// and the function returns false // and the function returns false
@@ -179,34 +215,6 @@ void Toa(long value, std::wstring & res, int base = 10, bool clear = true);
/*
conversions between ascii text and wide characters
(destination is always std::string or std::wstring)
characters are copied as they are without any locales checking
*/
void AssignString(const char * src, size_t len, std::wstring & dst, bool clear = true);
void AssignString(const char * src, std::wstring & dst, bool clear = true);
void AssignString(const std::string & src, std::wstring & dst, bool clear = true);
void AssignString(const wchar_t * src, size_t len, std::string & dst, bool clear = true);
void AssignString(const wchar_t * src, std::string & dst, bool clear = true);
void AssignString(const std::wstring & src, std::string & dst, bool clear = true);
void AssignString(const char * src, size_t len, std::string & dst, bool clear = true);
void AssignString(const char * src, std::string & dst, bool clear = true);
void AssignString(const std::string & src, std::string & dst, bool clear = true);
void AssignString(const wchar_t * src, size_t len, std::wstring & dst, bool clear = true);
void AssignString(const wchar_t * src, std::wstring & dst, bool clear = true);
void AssignString(const std::wstring & src, std::wstring & dst, bool clear = true);
bool CorrectUrlChar(wchar_t c); bool CorrectUrlChar(wchar_t c);
void CorrectUrlDots(std::wstring & url); void CorrectUrlDots(std::wstring & url);
void CorrectUrlChars(std::wstring & url); void CorrectUrlChars(std::wstring & url);
@@ -224,9 +232,20 @@ const char * DateToStrCookie(int year, int month, int day, int hour, int min, in
const char * DateToStrCookie(const PT::Date & d); const char * DateToStrCookie(const PT::Date & d);
const char * DateToStrCookie(time_t t); const char * DateToStrCookie(time_t t);
// depracated
// not thread safe
const wchar_t * IpToStr(unsigned int ip_); const wchar_t * IpToStr(unsigned int ip_);
// in a new code we can use WTextStream in such a way
// DateToStr() etc can use it too
PT::WTextStream IPToStr(unsigned int ip);
PT::WTextStream IPToStr(int ip);
bool IsWhite(wchar_t s); bool IsWhite(wchar_t s);
bool IsWhite(const wchar_t * str, bool treat_new_line_as_white = false);
bool IsWhite(const std::wstring & str, bool treat_new_line_as_white = false);
bool IsLastSlash(const std::wstring & path); bool IsLastSlash(const std::wstring & path);
template<class StringType> template<class StringType>
@@ -261,7 +280,24 @@ typename StringType::size_type i;
template<class StringType> template<class StringType>
void Trim(StringType & s, wchar_t c) void TrimFirst(StringType & s, wchar_t c)
{
typename StringType::size_type i;
if( s.empty() )
return;
// looking for the 'c' characters at the beginning
for(i=0 ; i<s.size() && s[i]==c ; ++i);
// deleting the 'c' characters at the beginning
if( i != 0 )
s.erase(0, i);
}
template<class StringType>
void TrimLast(StringType & s, wchar_t c)
{ {
typename StringType::size_type i; typename StringType::size_type i;
@@ -281,16 +317,27 @@ typename StringType::size_type i;
// deleting 'c' characters at the end // deleting 'c' characters at the end
if( i != s.size() - 1 ) if( i != s.size() - 1 )
s.erase(i+1, StringType::npos); s.erase(i+1, StringType::npos);
// looking for the 'c' characters at the beginning
for(i=0 ; i<s.size() && s[i]==c ; ++i);
// deleting the 'c' characters at the beginning
if( i != 0 )
s.erase(0, i);
} }
template<class StringType>
void Trim(StringType & s, wchar_t c)
{
if( s.empty() )
return;
TrimLast(s, c);
TrimFirst(s, c);
}
void Overwrite(std::string & str);
void Overwrite(std::wstring & str);
template<class StringType> template<class StringType>
void MaxSize(StringType & str, size_t max_size) void MaxSize(StringType & str, size_t max_size)
{ {
@@ -680,27 +727,31 @@ bool ValidateEmail(const std::wstring & email);
bool IsFile(const wchar_t * file); bool IsFile(const wchar_t * file);
bool IsFile(const std::wstring & file); bool IsFile(const std::wstring & file);
bool CreateDir(const wchar_t * dir, int priv); bool CreateDir(const wchar_t * dir, int priv, int group = -1);
bool CreateDir(const std::wstring & dir, int priv); bool CreateDir(const std::wstring & dir, int priv, int group = -1);
// creating directories (dirs) under base_dir (base_dir must exist) // creating directories (dirs) under base_dir (base_dir must exist)
// if skip_last == true then last part from dir is treated as a file (the last directory is not created) // if skip_last == true then last part from dir is treated as a file (the last directory is not created)
bool CreateDirs(const wchar_t * base_dir, const wchar_t * dirs, int priv = 0755, bool skip_last = false); bool CreateDirs(const wchar_t * base_dir, const wchar_t * dirs, int priv = 0755, int group = -1, bool skip_last = false);
bool CreateDirs(const std::wstring & base_dir, const std::wstring & dirs, int priv = 0755, bool skip_last = false); bool CreateDirs(const std::wstring & base_dir, const std::wstring & dirs, int priv = 0755, int group = -1, bool skip_last = false);
int GetGroupId(const wchar_t * name);
int GetGroupId(const std::wstring & name);
bool SetPriv(const wchar_t * name, int priv, int group = -1);
bool SetPriv(const std::wstring & name, int priv, int group = -1);
bool CopyFile(FILE * in, FILE * out); bool CopyFile(FILE * in, FILE * out);
bool CopyFile(const wchar_t * src, const wchar_t * dst); bool CopyFile(const wchar_t * src, const wchar_t * dst);
bool CopyFile(const std::wstring & src, const std::wstring & dst); bool CopyFile(const std::wstring & src, const std::wstring & dst);
bool RemoveFile(const wchar_t * file); bool RemoveFile(const wchar_t * file);
bool RemoveFile(const std::wstring & file); bool RemoveFile(const std::wstring & file);
bool RenameFile(const wchar_t * from, const wchar_t * to); bool RenameFile(const wchar_t * from, const wchar_t * to);
bool RenameFile(const std::wstring & from, const std::wstring & to); bool RenameFile(const std::wstring & from, const std::wstring & to);
bool GetUTF8File(const char * file_path, std::wstring & content, bool clear_content = true);
bool GetUTF8File(const wchar_t * file_path, std::wstring & content, bool clear_content = true); bool GetUTF8File(const wchar_t * file_path, std::wstring & content, bool clear_content = true);
bool GetUTF8File(const std::string & file_path, std::wstring & content, bool clear_content = true);
bool GetUTF8File(const std::wstring & file_path, std::wstring & content, bool clear_content = true); bool GetUTF8File(const std::wstring & file_path, std::wstring & content, bool clear_content = true);
@@ -823,6 +874,19 @@ void UrlEncode(const std::wstring & in, std::wstring & out, bool clear_out = tru
/*
* decoding a URL
*
* return false is the url is too long (longer than WINIX_URL_MAX_SIZE)
* or it cannot be correctly converted from UTF8 to wide characters
*
*/
bool UrlDecode(const char * url, std::wstring & out, bool clear_out = true);
bool UrlDecode(const std::string & url, std::wstring & out, bool clear_out = true);
template<typename char_type, size_t stack_size, size_t heap_block_size> template<typename char_type, size_t stack_size, size_t heap_block_size>
void QEncodeAddChar(char_type c, PT::TextStreamBase<char_type, stack_size, heap_block_size> & out) void QEncodeAddChar(char_type c, PT::TextStreamBase<char_type, stack_size, heap_block_size> & out)
@@ -960,4 +1024,61 @@ size_t i1, i2;
template<typename IntType>
void SetMinMax(IntType & val, IntType min_val, IntType max_val)
{
if( val < min_val )
val = min_val;
if( val > max_val )
val = max_val;
}
template<class Stream, class StringType>
void JSONescape(Stream & out, const StringType & str)
{
// !! IMPROVE ME (optimizing)
// it is better to not write one by one character
// but use write method insted
for(size_t i=0 ; i<str.size() ; ++i)
{
switch(str[i])
{
case 0: out << '\\'; out << '0'; break;
case '\r': out << '\\'; out << 'r'; break;
case '\n': out << '\\'; out << 'n'; break;
case '\t': out << '\\'; out << 't'; break;
case 0x08: out << '\\'; out << 'b'; break;
case 0x0c: out << '\\'; out << 'f'; break;
case '\\': out << '\\'; out << '\\'; break;
//case '/': out << '\\'; out << '/'; break; // slash doesn't have to be escaped
case '"': out << '\\'; out << '\"'; break;
default:
out << str[i];
}
}
}
/*
* converting from a wide string to an UTF-8 string
* and puts a log if the conversion fails
*
* it uses PT::WideToUTF8()
*/
bool WideToUTF8(const wchar_t * wide_string, char * utf8, size_t utf8_size);
bool WideToUTF8(const std::wstring & wide_string, char * utf8, size_t utf8_size);
} // namespace Winix
#endif #endif
+37 -3
View File
@@ -1,16 +1,46 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2009-2010, Tomasz Sowa */
/*
* Copyright (c) 2009-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "mount.h" #include "mount.h"
#include "misc.h" #include "misc.h"
namespace Winix
{
Mount::Mount() Mount::Mount()
{ {
@@ -109,3 +139,7 @@ const std::wstring & Mount::FirstArg(int code) const
return Arg(code, 0); return Arg(code, 0);
} }
} // namespace Winix
+35 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2009-2010, Tomasz Sowa */
/*
* Copyright (c) 2009-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
@@ -16,6 +41,10 @@
#include <vector> #include <vector>
namespace Winix
{
class Mount class Mount
{ {
@@ -67,5 +96,8 @@ private:
} // namespace Winix
#endif #endif
+34 -8
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2011, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "mountparser.h" #include "mountparser.h"
@@ -12,6 +37,11 @@
#include "misc.h" #include "misc.h"
namespace Winix
{
MountParser::MountParser() MountParser::MountParser()
{ {
dirs = 0; dirs = 0;
@@ -494,9 +524,5 @@ void MountParser::Parse(const std::wstring & input, std::map<long, Mount> & outp
} // namespace Winix
+37 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2011, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_mountparser #ifndef headerfile_winix_core_mountparser
@@ -22,6 +47,11 @@
namespace Winix
{
class MountParser class MountParser
{ {
public: public:
@@ -82,4 +112,8 @@ private:
}; };
} // namespace Winix
#endif #endif
+37 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2009-2012, Tomasz Sowa */
/*
* Copyright (c) 2009-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "mounts.h" #include "mounts.h"
@@ -15,6 +40,10 @@
namespace Winix
{
Mounts::Mounts() Mounts::Mounts()
{ {
@@ -321,3 +350,8 @@ Mount * Mounts::GetEmptyMount()
{ {
return &empty_mount; return &empty_mount;
} }
} // namespace Winix
+36 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2009-2012, Tomasz Sowa */
/*
* Copyright (c) 2009-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
@@ -23,6 +48,11 @@
#include "mountparser.h" #include "mountparser.h"
namespace Winix
{
class Mounts class Mounts
{ {
@@ -165,5 +195,8 @@ private:
}; };
} // namespace Winix
#endif #endif
+45 -19
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <dlfcn.h> #include <dlfcn.h>
@@ -14,6 +39,9 @@
#include "misc.h" #include "misc.h"
namespace Winix
{
void Plugin::UnloadPlugins() void Plugin::UnloadPlugins()
@@ -158,17 +186,18 @@ void Plugin::LoadPlugins(const std::wstring & plugins_dir, const std::vector<std
} }
void Plugin::LoadPlugin(const std::string & filename)
{
LoadPlugin(filename.c_str());
}
// we don't have to use Lock() here because plusings are read // we don't have to use Lock() here because plugins are read
// before threads are started // before threads are started
void * Plugin::LoadInitFun(const char * filename, Fun1 & fun_init) void * Plugin::LoadInitFun(const wchar_t * filename, Fun1 & fun_init)
{ {
void * p = dlopen(filename, RTLD_NOW | RTLD_LOCAL); char file[WINIX_OS_PATH_SIZE];
if( !WideToUTF8(filename, file, WINIX_OS_PATH_SIZE) )
return 0;
void * p = dlopen(file, RTLD_NOW | RTLD_LOCAL);
if( !p ) if( !p )
{ {
@@ -177,7 +206,7 @@ void * Plugin::LoadInitFun(const char * filename, Fun1 & fun_init)
return 0; return 0;
} }
fun_init = (Fun1)dlfunc(p, "Init"); fun_init = (Fun1)dlsym(p, "Init");
if( !fun_init ) if( !fun_init )
{ {
@@ -197,7 +226,7 @@ return p;
void Plugin::LoadPlugin(const char * filename) void Plugin::LoadPlugin(const wchar_t * filename)
{ {
Fun1 fun_init; Fun1 fun_init;
void * plugin_handle; void * plugin_handle;
@@ -227,19 +256,13 @@ PluginInfo info;
} }
void Plugin::LoadPlugin(const wchar_t * filename)
{
AssignString(filename, afilename);
LoadPlugin(afilename.c_str());
}
void Plugin::LoadPlugin(const std::wstring & filename) void Plugin::LoadPlugin(const std::wstring & filename)
{ {
LoadPlugin(filename.c_str()); LoadPlugin(filename.c_str());
} }
bool Plugin::HasPlugin(const wchar_t * name) bool Plugin::HasPlugin(const wchar_t * name)
{ {
if( *name == 0 ) if( *name == 0 )
@@ -500,3 +523,6 @@ const Plugin::Plugins * Plugin::GetPlugins()
return &plugins; return &plugins;
} }
} // namespace Winix
+41 -10
View File
@@ -1,12 +1,36 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa
* All rights reserved.
*
*/ */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_winix_core_plugin #ifndef headerfile_winix_core_plugin
#define headerfile_winix_core_plugin #define headerfile_winix_core_plugin
@@ -26,6 +50,12 @@
#include "templates/templates.h" #include "templates/templates.h"
namespace Winix
{
/* /*
all your plugin functions can have signature either: all your plugin functions can have signature either:
void my_function(PluginInfo & info); or void my_function(PluginInfo & info); or
@@ -36,7 +66,7 @@
in the Init you can add your own functions by using plugin.Assign() method in the Init you can add your own functions by using plugin.Assign() method
and you can set the name of the plugin by setting info.p1 pointer and you can set the name of the plugin by setting info.p1 pointer
to a string buffer (const char *) to a string buffer (const wchar_t *)
(this buffer will not be copied so it should not be destroyed after Init finishes) (this buffer will not be copied so it should not be destroyed after Init finishes)
also in Init you can only use logger (log) info.config and info.db objects also in Init you can only use logger (log) info.config and info.db objects
(the rest winix objects are not initialized yet) (the rest winix objects are not initialized yet)
@@ -171,8 +201,6 @@ public:
void SetSynchro(Synchro * psynchro); void SetSynchro(Synchro * psynchro);
void SetSessionManager(SessionManager * psession_manager); void SetSessionManager(SessionManager * psession_manager);
void LoadPlugin(const char * filename);
void LoadPlugin(const std::string & filename);
void LoadPlugin(const wchar_t * filename); void LoadPlugin(const wchar_t * filename);
void LoadPlugin(const std::wstring & filename); void LoadPlugin(const std::wstring & filename);
@@ -226,14 +254,13 @@ private:
SessionManager * session_manager; SessionManager * session_manager;
std::wstring temp_path; // used when loading plugins std::wstring temp_path; // used when loading plugins
std::string afilename;
Plugins plugins; Plugins plugins;
typedef std::multimap<int, Slot> Slots; typedef std::multimap<int, Slot> Slots;
Slots slots; Slots slots;
void * LoadInitFun(const char * filename, Fun1 & fun_init); void * LoadInitFun(const wchar_t * filename, Fun1 & fun_init);
void Call(Session * ses, int message, Slots::iterator & slot, PluginInfo & info); void Call(Session * ses, int message, Slots::iterator & slot, PluginInfo & info);
bool SetPointers(PluginInfo & info); bool SetPointers(PluginInfo & info);
@@ -246,5 +273,9 @@ private:
extern Plugin plugin; extern Plugin plugin;
} // namespace Winix
#endif #endif
+37 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "plugindata.h" #include "plugindata.h"
@@ -13,6 +38,10 @@
#include "session.h" #include "session.h"
namespace Winix
{
PluginData::PluginData() PluginData::PluginData()
@@ -153,3 +182,8 @@ size_t old_size = table.size();
for(size_t i = old_size ; i<new_size ; ++i) for(size_t i = old_size ; i<new_size ; ++i)
table[i] = 0; table[i] = 0;
} }
} // namespace Winix
+36 -3
View File
@@ -1,16 +1,46 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_plugindata #ifndef headerfile_winix_core_plugindata
#define headerfile_winix_core_plugindata #define headerfile_winix_core_plugindata
#include <vector> #include <vector>
#include <cstddef>
namespace Winix
{
struct Session; struct Session;
@@ -65,5 +95,8 @@ private:
} // namespace Winix
#endif #endif
+55 -6
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
@@ -12,6 +37,12 @@
#define headerfile_winix_core_pluginmsg #define headerfile_winix_core_pluginmsg
namespace Winix
{
// here you can add your own EZC functions ([function]) // here you can add your own EZC functions ([function])
// PluginInfo.p1 is a pointer to Ezc::Functions object // PluginInfo.p1 is a pointer to Ezc::Functions object
// session pointer is null // session pointer is null
@@ -237,8 +268,8 @@
#define WINIX_BASE_URL_REDIRECT 31030 #define WINIX_BASE_URL_REDIRECT 31030
// raw POST parameters // raw POST parameters
// in p1 there is a pointer to std::string meaning a parameter's name // in p1 there is a pointer to std::wstring meaning a parameter's name
// in p2 there is a pointer to std::string value // in p2 there is a pointer to std::wstring value
// this is sent only from PostParser // this is sent only from PostParser
// PostMultiParser (multipart/form-data html forms) doesn't send this messsage // PostMultiParser (multipart/form-data html forms) doesn't send this messsage
// there is no a session set (session pointer is null) // there is no a session set (session pointer is null)
@@ -246,11 +277,25 @@
// //
#define WINIX_POST_PARAMS 31040 #define WINIX_POST_PARAMS 31040
// this is the raw string sent in POST method // this is the raw string sent in POST method
// in p1 there is a pointer to std::string object // in p1 there is a pointer to std::string object
#define WINIX_RAW_POST_STRING 31050 #define WINIX_RAW_POST_STRING 31050
// this message is sent before calling MakePost() or MakeGet()
// if you return false (which is default) you can prevent the access
// to the resource
#define WINIX_CHECK_PLUGIN_ACCESS 31060
// http headers (without cookies) were created and are ready to send
// here you can make some changes to them
// in p1 you have a pointer to the PT::Space (Request::out_headers)
#define WINIX_PREPARE_TO_SEND_HTTP_HEADERS 31070
// http cookies were created and are ready to send
// here you can make some changes to them
// in p1 you have a pointer to the PT::Space (Request::out_cookies)
#define WINIX_PREPARE_TO_SEND_HTTP_COOKIES 31080
/* /*
messages sent from other threads messages sent from other threads
@@ -278,5 +323,9 @@
// see plugins/ticket/pluginmsg.h // see plugins/ticket/pluginmsg.h
} // namespace Winix
#endif #endif
+44 -9
View File
@@ -1,18 +1,51 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <sys/types.h>
#include <unistd.h>
#include "postmultiparser.h" #include "postmultiparser.h"
#include "log.h" #include "log.h"
#include "utf8/utf8.h" #include "utf8/utf8.h"
namespace Winix
{
PostMultiParser::PostMultiParser() PostMultiParser::PostMultiParser()
{ {
in_buffer = new unsigned char[WINIX_POSTMULTI_INPUT_BUFFER]; in_buffer = new unsigned char[WINIX_POSTMULTI_INPUT_BUFFER];
@@ -355,10 +388,7 @@ void PostMultiParser::ReadContent()
void PostMultiParser::ConvStr(const std::string & src, std::wstring & dst) void PostMultiParser::ConvStr(const std::string & src, std::wstring & dst)
{ {
if( config->utf8 ) PT::UTF8ToWide(src, dst);
PT::UTF8ToWide(src, dst);
else
AssignString(src, dst);
} }
@@ -451,7 +481,7 @@ void PostMultiParser::CheckBoundaryEnd()
void PostMultiParser::CreateTmpFile() void PostMultiParser::CreateTmpFile()
{ {
wchar_t buf[1024]; wchar_t buf[WINIX_OS_PATH_SIZE];
size_t buf_len = sizeof(buf)/sizeof(wchar_t); size_t buf_len = sizeof(buf)/sizeof(wchar_t);
if( config->upload_dir.empty() ) if( config->upload_dir.empty() )
@@ -468,7 +498,7 @@ size_t buf_len = sizeof(buf)/sizeof(wchar_t);
PT::WideToUTF8(tmp_filename, atmp_filename); PT::WideToUTF8(tmp_filename, atmp_filename);
tmp_file.open(atmp_filename.c_str(), std::ios_base::binary | std::ios_base::out); tmp_file.open(atmp_filename.c_str(), std::ios_base::binary | std::ios_base::out);
// !! dodac ustawienie chmod config.upload_files_chmod dla tymczasowego pliku // !! IMPROVE ME dodac ustawienie chmod config.upload_files_chmod dla tymczasowego pliku
if( !tmp_file ) if( !tmp_file )
{ {
@@ -584,3 +614,8 @@ Error PostMultiParser::Parse(FCGX_Stream * in_, PostTab & post_tab_, PostFileTab
return err; return err;
} }
} // namespace Winix
+36 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2011, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_postmultiparser #ifndef headerfile_winix_core_postmultiparser
@@ -19,6 +44,11 @@
#include "misc.h" #include "misc.h"
namespace Winix
{
// 2 MB // 2 MB
#define WINIX_POSTMULTI_INPUT_BUFFER 2097152 #define WINIX_POSTMULTI_INPUT_BUFFER 2097152
#define WINIX_POSTMULTI_OUTPUT_BUFFER 2097152 #define WINIX_POSTMULTI_OUTPUT_BUFFER 2097152
@@ -128,5 +158,8 @@ return added;
} // namespace Winix
#endif #endif
+49 -37
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_postparser #ifndef headerfile_winix_core_postparser
@@ -17,25 +42,24 @@
#include "misc.h" #include "misc.h"
#include "utf8/utf8.h" #include "utf8/utf8.h"
#include "log.h" #include "log.h"
#include "config.h"
#include "plugin.h" #include "plugin.h"
namespace Winix
{
class PostParser : public HttpSimpleParser class PostParser : public HttpSimpleParser
{ {
FCGX_Stream * in; FCGX_Stream * in;
PostTab * post_tab; PostTab * post_tab;
std::wstring temp_name, temp_value;
bool input_as_utf8;
size_t log_value_size; size_t log_value_size;
int var_index; int var_index;
bool has_winix_post_params_msg; bool has_winix_post_params_msg;
bool has_winix_raw_post_msg; bool has_winix_raw_post_msg;
std::string raw_post; std::string raw_post;
protected: protected:
@@ -50,20 +74,20 @@ protected:
} }
void CreateLog(bool param_added) void CreateLog(bool param_added, const std::wstring & name, const std::wstring & value)
{ {
log << log2 << "Method POST, name: \"" << temp_name << "\""; log << log2 << "Method POST, name: \"" << name << "\"";
if( log_value_size > 0 && !IsSubStringNoCase(L"pass", temp_name.c_str()) ) if( log_value_size > 0 && !IsSubStringNoCase(L"pass", name.c_str()) )
{ {
log << ", value: "; log << ", value: ";
if( temp_value.size() > log_value_size ) if( value.size() > log_value_size )
log << "(first " << log_value_size << " characters) "; log << "(first " << log_value_size << " characters) ";
log << "\""; log << "\"";
log.LogString(temp_value, log_value_size); log.LogString(value, log_value_size);
log << "\" (size: " << temp_value.size() << ")"; log << "\" (size: " << value.size() << ")";
} }
if( param_added == false ) if( param_added == false )
@@ -73,16 +97,8 @@ protected:
} }
void ConvStr(const std::string & src, std::wstring & dst)
{
if( input_as_utf8 )
PT::UTF8ToWide(src, dst);
else
AssignString(src, dst);
}
virtual void Parameter(std::wstring & name, std::wstring & value)
virtual void Parameter(std::string & name, std::string & value)
{ {
bool added; bool added;
std::pair<PostTab::iterator, bool> res; std::pair<PostTab::iterator, bool> res;
@@ -90,22 +106,19 @@ protected:
if( has_winix_post_params_msg ) if( has_winix_post_params_msg )
plugin.Call(0, WINIX_POST_PARAMS, &name, &value); plugin.Call(0, WINIX_POST_PARAMS, &name, &value);
ConvStr(name, temp_name); res = post_tab->insert( std::make_pair(name, value) );
ConvStr(value, temp_value);
res = post_tab->insert( std::make_pair(temp_name, temp_value) );
added = res.second; added = res.second;
if( !added ) if( !added )
{ {
temp_name += L"_inc"; name += L"_inc";
temp_name += Toa(var_index); name += Toa(var_index);
res = post_tab->insert( std::make_pair(temp_name, temp_value) ); res = post_tab->insert( std::make_pair(name, value) );
added = res.second; added = res.second;
var_index += 1; var_index += 1;
} }
CreateLog(added); CreateLog(added, name, value);
} }
@@ -113,13 +126,8 @@ public:
PostParser() PostParser()
{ {
input_as_utf8 = false;
log_value_size = 0; log_value_size = 0;
} HttpSimpleParser::getchar_returns_utf8_chars = true;
void UTF8(bool utf)
{
input_as_utf8 = utf;
} }
void LogValueSize(size_t s) void LogValueSize(size_t s)
@@ -148,4 +156,8 @@ public:
}; };
} // namespace Winix
#endif #endif
+37 -9
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2010, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <cstdlib> #include <cstdlib>
@@ -15,6 +40,11 @@
#include "cur.h" #include "cur.h"
namespace Winix
{
void Rebus::SetCur(Cur * pcur) void Rebus::SetCur(Cur * pcur)
{ {
@@ -149,7 +179,9 @@ bool Rebus::CheckRebus()
if( IsAnswerOk(cur->session->rebus_item, cur->request->PostVar(L"rebus")) ) if( IsAnswerOk(cur->session->rebus_item, cur->request->PostVar(L"rebus")) )
return true; return true;
log << log1 << "Rebus: rebus has an incorrect answer" << logend; log << log1 << "Rebus: rebus has an incorrect answer, expected: "
<< cur->session->rebus_item->answer << logend;
// don't add cur->session->spam_score when the rebus has incorrect answer // don't add cur->session->spam_score when the rebus has incorrect answer
// a user could have made a mistake // a user could have made a mistake
@@ -160,9 +192,5 @@ return false;
} // namespace Winix
+38 -4
View File
@@ -1,20 +1,49 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2010, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_rebus #ifndef headerfile_winix_core_rebus
#define headerfile_winix_core_rebus #define headerfile_winix_core_rebus
#include <string> #include <string>
#include <vector> #include <vector>
namespace Winix
{
struct Cur; struct Cur;
@@ -48,4 +77,9 @@ private:
}; };
} // namespace Winix
#endif #endif
+73 -84
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "request.h" #include "request.h"
@@ -14,13 +39,17 @@
namespace Winix
{
Request::Request() : char_empty(0)
Request::Request()
{ {
id = 0; id = 0;
config = 0;
} }
@@ -30,36 +59,29 @@ void Request::SetConfig(Config * pconfig)
} }
void Request::ClearAjax()
void Request::ClearOutputStreams()
{ {
size_t i = ajax.spaces.size(); size_t len = 16;
while( i-- > 0 ) if( config )
ajax.RemoveSpace(i); len = config->ezc_out_streams_size;
ajax.table.clear(); if( len < 1 || len > 64 )
len = 16;
PT::Space::TableSingle::iterator s = ajax.table_single.begin(); out_streams.resize(len);
use_html_filter.resize(len);
while( s != ajax.table_single.end() ) for(size_t i=0 ; i<out_streams.size() ; ++i)
{ {
if( s->first != L"content" && s->first != L"http_status" ) out_streams[i].Clear();
{ use_html_filter[i] = true;
ajax.table_single.erase(s++);
}
else
{
// small optimization when deleting
// the memory for "content" and "http_status" will be reused
s->second.clear();
++s;
}
} }
} }
void Request::Clear() void Request::Clear()
{ {
// id is never 0 // id is never 0
@@ -67,39 +89,36 @@ void Request::Clear()
++id; ++id;
RemovePostFileTmp(post_file_tab); RemovePostFileTmp(post_file_tab);
ClearOutputStreams();
post_tab.clear(); post_tab.clear();
post_file_tab.clear(); post_file_tab.clear();
cookie_tab.clear(); cookie_tab.clear();
method = none; method = unknown_method;
role = responder;
headers.Clear(); out_headers.Clear();
page.Clear(); out_cookies.Clear();
ajaxpage.Clear();
debug.Clear();
page_generated = false; page_generated = false;
use_html_filter = true;
env_request_method = &char_empty; env_request_method.clear();
env_request_uri = &char_empty; env_request_uri.clear();
env_http_cookie = &char_empty; env_http_cookie.clear();
env_remote_addr = &char_empty; env_remote_addr.clear();
env_http_host = &char_empty; env_http_host.clear();
env_http_user_agent = &char_empty; env_http_user_agent.clear();
env_fcgi_role = &char_empty; env_http_accept_encoding.clear();
env_content_type = &char_empty; env_fcgi_role.clear();
env_http_accept_encoding = &char_empty; env_content_type.clear();
env_https = &char_empty; env_https.clear();
item_tab.clear(); item_tab.clear();
item.Clear(); item.Clear();
dir_tab.clear(); dir_tab.clear();
last_item = &item; last_item = &item;
is_item = false; is_item = false;
function = 0; // !! dodac jakas empty funkcje function = 0;
param_tab.clear(); param_tab.clear();
anchor.clear(); anchor.clear();
@@ -117,16 +136,20 @@ void Request::Clear()
start_date.Clear(); start_date.Clear();
subdomain.clear(); subdomain.clear();
ClearAjax(); return_info_only = false;
ajax_serializer = 0; info.Clear();
info_serializer = 0;
return_json = false;
binary_page.clear(); out_bin_stream.clear();
compressed_page.clear(); send_bin_stream = false;
use_text_page = true;
gen_trim_white = false; gen_trim_white = false;
gen_skip_new_line = false; gen_skip_new_line = false;
gen_use_special_chars = false; gen_use_special_chars = false;
ip = 0;
use_200_status_for_not_found_and_permission_denied = false;
} }
@@ -142,43 +165,6 @@ void Request::RequestStarts()
// value can be null
void Request::SetCookie(const char * name, const char * value, PT::Date * expires)
{
headers << "Set-Cookie: " << name << "=";
if( value && value[0]!=0 )
headers << value;
else
headers << "\"\"";
if( expires )
headers << "; expires=" << DateToStrCookie(*expires) << " GMT";
headers << "; path=/; domain=" << config->base_url << "\r\n";
/*
don't use '; secure' flag if you are using both sites (with SSL
and without SSL) -- with secure flag the cookie is sent only through
SSL and if you accidentally open a new window without SSL (http://)
then winix will create a new session for you and the previous session (https://)
will be lost (cookie is overwritten on the client browser)
*/
}
void Request::SetCookie(const char * name, long value, PT::Date * expires)
{
headers << "Set-Cookie: " << name << "=" << value;
if( expires )
headers << "; expires=" << DateToStrCookie(*expires) << " GMT";
headers << "; path=/; domain=" << config->base_url << "\r\n";
}
bool Request::IsPostVar(const wchar_t * var) bool Request::IsPostVar(const wchar_t * var)
{ {
@@ -349,4 +335,7 @@ const std::wstring & Request::ParamValue(const std::wstring & param_name)
} // namespace Winix
+284 -82
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_request #ifndef headerfile_winix_core_request
@@ -22,6 +47,12 @@
#include "date/date.h" #include "date/date.h"
#include "space/space.h" #include "space/space.h"
#include "space/spacetojson.h" #include "space/spacetojson.h"
#include "textstream/textstream.h"
namespace Winix
{
@@ -32,62 +63,80 @@ class FunctionBase;
struct Request struct Request
{ {
// request id /*
// is incremented for each request and is never 0 request id
// (from -1 will be incremented twice) is incremented for each request and is never 0
// it's used for some optimalizations e.g. in templates (from -1 will be incremented to one)
it's used for some optimizations e.g. in templates
*/
size_t id; size_t id;
// !! moze pozbyc sie tego none?
enum Method { get, post, head, none } method;
enum Role { responder, authorizer } role;
// headers, page and debug /*
//std::ostringstream headers, page, debug; request start time
TextStream<std::string> headers; Time() methods are very slow so it is better to directly use those two values
HtmlTextStream page, debug; they are set when a request starts
TextStream<std::wstring> ajaxpage; */
time_t start_time;
PT::Date start_date;
// binary page
BinaryPage binary_page;
// a compressed page ready to send to the client
BinaryPage compressed_page;
// if true then either page or ajaxpage will be sent to the client /*
// if false then binary_page is sent *
// default: true *
bool use_text_page; *
* variables representing input from client's browser
*
*
*
*/
// if set to true then the standard template system will not be generated /*
// default: false the HTTP method
bool page_generated; !! IMPROVE ME add the rest methods here
*/
enum Method { get, post, head, unknown_method } method;
// whether or not the html filter should be used
// default: true
bool use_html_filter;
// raw parameters /*
subdomain
subdomain = HTTP_HOST environment variable - config->base_url
*/
std::wstring subdomain;
/*
raw parameters
!! CHECK ME may post_tab and cookie_tab should be changed to PT::Space now?
or may change the name to cookie_in? or in_cookie?
*/
PostTab post_tab; PostTab post_tab;
PostFileTab post_file_tab; PostFileTab post_file_tab;
CookieTab cookie_tab; CookieTab cookie_tab;
// html anchor (those part of URI after '#' character)
/*
html anchor (those part of URI after '#' character)
*/
std::wstring anchor; std::wstring anchor;
// environment variables // environment variables
// they are not null -- when the server doesn't have such a variable std::wstring env_request_method;
// it will be pointing into 'char_empty' which is default '\0' std::wstring env_request_uri;
const char * env_request_method; std::wstring env_http_cookie;
const char * env_request_uri; std::wstring env_remote_addr;
const char * env_http_cookie; std::wstring env_http_host;
const char * env_remote_addr; std::wstring env_http_user_agent;
const char * env_http_host; std::wstring env_http_accept_encoding;
const char * env_http_user_agent; std::wstring env_fcgi_role;
const char * env_http_accept_encoding; std::wstring env_content_type;
const char * env_fcgi_role; std::wstring env_https;
const char * env_content_type;
const char * env_https; // current IP address of the remote host (read from REMOTE_ADDR environment variable)
// (at the moment only IPv4 are supported)
int ip;
// true if the browser is Microsoft Internet Explorer // true if the browser is Microsoft Internet Explorer
bool browser_msie; bool browser_msie;
@@ -95,16 +144,21 @@ struct Request
// true if the browser is Konqueror // true if the browser is Konqueror
bool browser_konqueror; bool browser_konqueror;
// true if we are using encrypted connection (SSL) // true if we are using an encrypted connection (SSL)
bool using_ssl; bool using_ssl;
/*
request input variables representing the winix filesystem
*/
// current directory // current directory
std::vector<Item*> dir_tab; std::vector<Item*> dir_tab;
// true if a file exists // true if a file exists
bool is_item; bool is_item;
// current file (if exists) // current file (valid if is_item is true)
Item item; Item item;
// current winix function // current winix function
@@ -114,16 +168,30 @@ struct Request
// parameters (name:value) // parameters (name:value)
ParamTab param_tab; ParamTab param_tab;
// request status // this is a pointer either to the item (if exists) or to the last directory
Error status; Item * last_item;
// usually items in the current directory (depends on the function)
std::vector<Item> item_tab;
/*
*
*
*
* variables for generating output to the client's browser
*
*
*
*/
// request status
// !! CHANGE ME it'll be better to use ordinary http result codes
Error status;
// if not empty means an address for redirecting to // if not empty means an address for redirecting to
// it should be url-encoded // it should be url-encoded
std::wstring redirect_to; std::wstring redirect_to;
std::string aredirect_to;
// a redirect type // a redirect type
// following redirect types are supported: // following redirect types are supported:
@@ -137,30 +205,108 @@ struct Request
// send header X-LIGHTTPD-send-file with path to a file // send header X-LIGHTTPD-send-file with path to a file
std::wstring x_sendfile; std::wstring x_sendfile;
// send as attachment (causes header: content-disposition: attachment) // send as attachment (causes generating header: content-disposition: attachment)
bool send_as_attachment; bool send_as_attachment;
// this is a pointer either to the item (if exists) or to the last directory // headers send to the client (without cookies)
Item * last_item; PT::Space out_headers;
// request start time // cookies send to the client
// Time() methods are very slow so it is better to directly use those two values // a value can be either a cookie value or the whole cookie string (with domain, date etc)
// they are set when a request starts PT::Space out_cookies;
time_t start_time;
PT::Date start_date;
// a subdomain // winix can return either a text answer or a binary answer
// subdomain = HTTP_HOST environment variable - config->base_url // if send_bin_stream is true then the binary answer is sent (out_bin_stream)
std::wstring subdomain; // or if send_bin_stream is false then the text answer is sent
// default: false
//
//
// winix answer send to the client's browser
// |
// |
// depending on send_bin_stream
// (if false) ------------------------------------------------- (if true)
// | |
// text answer binary answer
// | |
// depending on return_json sending out_bin_stream
// (if false) ------------------------------------ (if true)
// | |
// normal request ajax request
// | |
// sending out_streams[0] |
// |
// |
// depending on return_info_only
// (if false) ------------------------------------------------------ (if true)
// | |
// generating JSON object from: generating JSON object only from info
// out_streams and info, e.g.: e.g.:
// { { info object serialized here }
// "stream_1": "some html content",
// "stream_2": "some other html content",
// "info": { info object serialized here }
// }
// note that out_streams[0] is not sent
// in JSON answers
//
//
bool send_bin_stream;
// used as a JSON output (when ajax_serializer is defined) // binary page sent to the client if send_bin_stream is true
// it will be serialized and have at least: BinaryPage out_bin_stream;
// 'content' string - the whole html content
// 'http_status' integer - http status code (e.g. 200)
PT::Space ajax;
// if not null then the request will have a JSON as an output // when returning the text answer we can either return the whole html page (normal requests)
PT::SpaceToJSON * ajax_serializer; // or a JSON object (for requests generated from AJAX)
// if return_json is false then we return the whole html page (which is in out_streams[0])
// if return_json is true we are creating an JSON object from out_streams
// (zero stream is ignored) and from info space (see above picture)
// (or just only from info if return_info_only is true)
// default: false
// return_json is set to true by App at the beginning of a request
// if reqtype:json parameter is present (in the url)
// note: return_json is only valid if send_bin_stream is false
bool return_json;
// main text output streams where the html otput is generated from ezc templates
// the zero stream (out_streams[0]) is used as the main stream
// to which the whole html page (with doctype, head, body) is generated
// the rest streams can be only used in ajax requests (send in JSON format to the client)
// in ezc templates you can use [ezc stream ...] keyword
// to switch between streams e.g. [ezc stream "0" "2"]
std::vector<HtmlTextStream> out_streams;
// if true the JSON object is generated only from info (out_streams are not used)
// default: false
bool return_info_only;
// additional info added when sending the JSON answer
PT::Space info;
// info serializer
// if not set then the json_generic_serializer from App will be used
// default: null (json_generic_serializer used)
PT::SpaceToJSON * info_serializer;
// if set to true then the standard template system will not be used
// default: false
bool page_generated;
// whether or not the html filter should be used
// the size of the table is the same as out_streams
// default: all items true
std::vector<bool> use_html_filter;
// if this variable is true then winix always return 200 OK header
// when the status would be 404 (not found) or 403 (permission denied)
// default: false
bool use_200_status_for_not_found_and_permission_denied;
// options used by ezc generators // options used by ezc generators
bool gen_trim_white; bool gen_trim_white;
@@ -168,8 +314,27 @@ struct Request
bool gen_use_special_chars; bool gen_use_special_chars;
/*
additional variables used for common uses
*/
// usually items in the current directory (depends on the function)
std::vector<Item> item_tab;
Request(); Request();
void SetConfig(Config * pconfig); void SetConfig(Config * pconfig);
void RequestStarts(); void RequestStarts();
void Clear(); void Clear();
@@ -177,50 +342,87 @@ struct Request
bool IsParam(const wchar_t * param_name); bool IsParam(const wchar_t * param_name);
bool IsParam(const std::wstring & param_name); bool IsParam(const std::wstring & param_name);
const std::wstring & ParamValue(const wchar_t * param_name); // returns an empty string if there is no such a parameter const std::wstring & ParamValue(const wchar_t * param_name); // returns an empty string if there is no such a parameter
const std::wstring & ParamValue(const std::wstring & param_name); // returns an empty string if there is no such a parameter const std::wstring & ParamValue(const std::wstring & param_name); // returns an empty string if there is no such a parameter
void SetCookie(const char * name, const char * value, PT::Date * expires = 0);
void SetCookie(const char * name, long value, PT::Date * expires = 0);
bool IsPostVar(const wchar_t * var); bool IsPostVar(const wchar_t * var);
bool IsPostVar(const std::wstring & var); bool IsPostVar(const std::wstring & var);
const std::wstring & PostVar(const wchar_t * var); // returns an empty string if there is no such a parameter const std::wstring & PostVar(const wchar_t * var); // returns an empty string if there is no such a parameter
const std::wstring & PostVar(const std::wstring & var); // returns an empty string if there is no such a parameter const std::wstring & PostVar(const std::wstring & var); // returns an empty string if there is no such a parameter
bool PostVar(const wchar_t * var, std::wstring & result); bool PostVar(const wchar_t * var, std::wstring & result);
bool PostVar(const std::wstring & var, std::wstring & result); bool PostVar(const std::wstring & var, std::wstring & result);
std::wstring * PostVarp(const wchar_t * var); std::wstring * PostVarp(const wchar_t * var);
std::wstring * PostVarp(const std::wstring & var); std::wstring * PostVarp(const std::wstring & var);
bool AllPostVarEmpty(); // returning true if all post vars are empty bool AllPostVarEmpty(); // returning true if all post vars are empty
void SendAll();
// setting a cookie
// name - cookie name (either const wchar_t, or std::wstring or PT::WTextStream)
// value - cookie value (can be everything which can be put to PT::WTextStream stream)
// the return std::wstring reference is a reference to the cookie inserted value (in out_cookies structure)
template<typename NameType, typename ValueType>
std::wstring & AddCookie(const NameType & name, const ValueType & value, PT::Date * expires = 0);
template<typename NameType, typename ValueType>
std::wstring & AddCookie(const NameType & name, const ValueType & value, PT::Date & expires);
private: private:
Config * config; Config * config;
// contains '\0'
// used to set env_* pointers to the empty value
const char char_empty;
// used in ParamValue() and PostVar() when there is no such a param // used in ParamValue() and PostVar() when there is no such a param
const std::wstring str_empty; const std::wstring str_empty;
void ClearAjax(); void ClearOutputStreams();
}; };
template<typename NameType, typename ValueType>
std::wstring & Request::AddCookie(const NameType & name, const ValueType & value, PT::Date * expires)
{
PT::WTextStream cookie;
cookie << value;
if( cookie.empty() )
cookie << L"\"\""; // cookie empty value
if( expires )
cookie << L"; expires=" << DateToStrCookie(*expires) << L" GMT";
cookie << L"; path=/; domain=" << config->base_url;
/*
!! IMPROVE ME add an option to the config
don't use '; secure' flag if you are using both sites (with SSL
and without SSL) -- with secure flag the cookie is sent only through
SSL and if you accidentally open a new window without SSL (http://)
then winix will create a new session for you and the previous session (https://)
will be lost (the session cookie will be overwritten in the client's browser)
*/
return out_cookies.Add(name, cookie);
}
template<typename NameType, typename ValueType>
std::wstring & Request::AddCookie(const NameType & name, const ValueType & value, PT::Date & expires)
{
return AddCookie(name, value, &expires);
}
} // namespace Winix
#endif #endif
+39 -4
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2011, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_requesttypes #ifndef headerfile_winix_core_requesttypes
@@ -16,6 +41,12 @@
#include "textstream/textstream.h" #include "textstream/textstream.h"
namespace Winix
{
// !! IMPROVE ME
// !! narazie uzywane tylko w post multi parserze // !! narazie uzywane tylko w post multi parserze
// dodac do zwyklego parsera post // dodac do zwyklego parsera post
#define WINIX_POSTTABLE_MAXSIZE 50 #define WINIX_POSTTABLE_MAXSIZE 50
@@ -43,10 +74,14 @@ typedef std::map<std::wstring, std::wstring> PostTab;
typedef std::map<std::wstring, PostFile> PostFileTab; typedef std::map<std::wstring, PostFile> PostFileTab;
typedef std::vector<Param> ParamTab; typedef std::vector<Param> ParamTab;
typedef std::map<std::string, std::string> CookieTab; typedef std::map<std::wstring, std::wstring> CookieTab;
typedef PT::TextStreamBase<char, 1, 4096> BinaryPage; typedef PT::TextStreamBase<char, 1, 4096> BinaryPage;
} // namespace Winix
#endif #endif
+37 -3
View File
@@ -1,21 +1,52 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2011, Tomasz Sowa */
/*
* Copyright (c) 2011-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <sys/types.h> #include <sys/types.h>
#include <sys/uio.h> #include <sys/uio.h>
#include <unistd.h> #include <unistd.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <cstring>
#include "run.h" #include "run.h"
#include "log.h" #include "log.h"
namespace Winix
{
Run::Run() Run::Run()
{ {
@@ -384,3 +415,6 @@ int Run::Go(std::string & out)
} }
} // namespace Winix
+38 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2011, Tomasz Sowa */
/*
* Copyright (c) 2011-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_run #ifndef headerfile_winix_core_run
@@ -12,6 +37,12 @@
#include <string> #include <string>
#include <cstdio> #include <cstdio>
#include <unistd.h>
namespace Winix
{
/* /*
@@ -159,5 +190,9 @@ private:
}; };
} // namespace Winix
#endif #endif
+43 -3
View File
@@ -1,16 +1,44 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "session.h" #include "session.h"
#include "misc.h" #include "misc.h"
namespace Winix
{
Session::Session() Session::Session()
@@ -78,9 +106,21 @@ void Session::Clear(bool clear_plugin_data)
log_buffer.Clear(); log_buffer.Clear();
last_css.clear(); last_css.clear();
ip_ban = 0;
if( clear_plugin_data ) if( clear_plugin_data )
plugin_data.Resize(0); plugin_data.Resize(0);
} }
// clearing some variables when a request is ended (just for safety)
void Session::ClearAfterRequest()
{
// ip_ban list can be sorted by SessionManager (in the special thread)
ip_ban = 0;
}
} // namespace Winix
+45 -4
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_session #ifndef headerfile_winix_core_session
@@ -20,6 +45,11 @@
#include "rebus.h" #include "rebus.h"
#include "textstream.h" #include "textstream.h"
#include "date/date.h" #include "date/date.h"
#include "ipban.h"
namespace Winix
{
@@ -31,6 +61,7 @@ struct Session
void SetTimesTo(time_t time); void SetTimesTo(time_t time);
void Clear(bool clear_plugin_data = true); void Clear(bool clear_plugin_data = true);
void ClearAfterRequest();
// 0 - means that there is a temporary session // 0 - means that there is a temporary session
@@ -50,7 +81,7 @@ struct Session
PT::Date last_date; PT::Date last_date;
// when there was a last get request // when there was a last get request
// (used to calculate spam) // (used to calculate spam or invalid login attempts etc.)
time_t last_time_get; time_t last_time_get;
@@ -78,14 +109,24 @@ struct Session
// buffer for the session log // buffer for the session log
TextStream<std::wstring> log_buffer; TextStream<std::wstring> log_buffer;
// !! IMPROVE ME it is still needed?
// css cannot be taken directly from the mountpoint?
// table with css files // table with css files
// used by some javascript wysiwyg editors (ckeditor, tinymce) // used by some javascript wysiwyg editors (ckeditor, tinymce)
std::vector<std::wstring> last_css; std::vector<std::wstring> last_css;
// pointer to IPBan struct if exists for this IP
// many sessions can pointer to the same IPBan struct
// (it can be null)
IPBan * ip_ban;
}; };
} // namespace Winix
#endif #endif
+36 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "sessioncontainer.h" #include "sessioncontainer.h"
@@ -12,6 +37,11 @@
#include "misc.h" #include "misc.h"
namespace Winix
{
SessionContainer::SessionContainer() SessionContainer::SessionContainer()
{ {
@@ -207,5 +237,8 @@ return false;
} // namespace Winix
+37 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_sessioncontainer #ifndef headerfile_winix_core_sessioncontainer
@@ -19,6 +44,11 @@
#include "config.h" #include "config.h"
namespace Winix
{
class SessionContainer class SessionContainer
{ {
@@ -71,4 +101,8 @@ private:
}; };
} // namespace Winix
#endif #endif
+118 -11
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <sys/stat.h> #include <sys/stat.h>
@@ -17,6 +42,9 @@
namespace Winix
{
@@ -57,6 +85,11 @@ void SessionManager::SetLastContainer(LastContainer * plast_container)
} }
void SessionManager::InitBanList()
{
ban_tab.SetMaxSize(config->ban_list_soft_max_size, config->ban_list_max_size);
}
size_t SessionManager::Size() size_t SessionManager::Size()
{ {
@@ -84,7 +117,7 @@ long id;
{ {
if( sizeof(long) == 8 ) if( sizeof(long) == 8 )
{ {
id = ((unsigned long)std::rand()) << 32 + std::rand(); id = (((unsigned long)std::rand()) << 32) + std::rand();
} }
else else
{ {
@@ -136,18 +169,23 @@ SessionContainer::Iterator i = session_tab.End();
{ {
// there is a problem with generating a new session id // there is a problem with generating a new session id
// we do not set a session cookie // we do not set a session cookie
session = &temporary_session;
session->Clear(false);
session->SetTimesTo(cur->request->start_time);
session->new_session = false; // temporary session was initialized at the beginning
log << log1 << "SM: cannot create a session id (temporary used: with id 0)" << logend; log << log1 << "SM: cannot create a session id (temporary used: with id 0)" << logend;
SetTemporarySession();
} }
} }
void SessionManager::SetTemporarySession()
{
session = &temporary_session;
session->Clear(false);
session->SetTimesTo(cur->request->start_time);
session->new_session = false; // temporary session was initialized at the beginning
}
bool SessionManager::SetSessionFromCookie(const std::string & cookie)
bool SessionManager::SetSessionFromCookie(const std::wstring & cookie)
{ {
long id = Tol(cookie.c_str()); long id = Tol(cookie.c_str());
SessionContainer::Iterator s = session_tab.FindById(id); SessionContainer::Iterator s = session_tab.FindById(id);
@@ -178,6 +216,24 @@ return true;
void SessionManager::SetSession() void SessionManager::SetSession()
{ {
current_ip_ban = ban_tab.FindIP(cur->request->ip);
if( current_ip_ban && current_ip_ban->IsIPBanned() )
{
if( current_ip_ban->expires != 0 && cur->request->start_time >= current_ip_ban->expires )
{
log << log2 << "SM: removing a ban from this IP and resetting events counter" << logend;
current_ip_ban->ClearAfterRemovingBan();
}
else
{
log << log2 << "SM: this ip is bannned, using a temporary session" << logend;
SetTemporarySession();
session->ip_ban = current_ip_ban;
return;
}
}
CookieTab::iterator i = cur->request->cookie_tab.find(config->http_session_id_name); CookieTab::iterator i = cur->request->cookie_tab.find(config->http_session_id_name);
if( i == cur->request->cookie_tab.end() ) if( i == cur->request->cookie_tab.end() )
@@ -196,9 +252,12 @@ void SessionManager::SetSession()
CreateSession(); CreateSession();
} }
} }
session->ip_ban = current_ip_ban;
} }
Session * SessionManager::FindSession(long id) Session * SessionManager::FindSession(long id)
{ {
SessionContainer::Iterator i = session_tab.FindById(id); SessionContainer::Iterator i = session_tab.FindById(id);
@@ -341,10 +400,15 @@ SessionContainer::Iterator i;
void SessionManager::SaveSessions() void SessionManager::SaveSessions()
{ {
char file_path[WINIX_OS_PATH_SIZE];
if( config->session_file.empty() ) if( config->session_file.empty() )
return; return;
std::ofstream file(config->session_file.c_str()); if( !WideToUTF8(config->session_file, file_path, WINIX_OS_PATH_SIZE) )
return;
std::ofstream file(file_path);
if( !file ) if( !file )
{ {
@@ -369,7 +433,7 @@ void SessionManager::SaveSessions()
} }
file.close(); file.close();
chmod(config->session_file.c_str(), 0600); chmod(file_path, 0600);
log << log2 << "SM: saved " << len << " session(s)" << logend; log << log2 << "SM: saved " << len << " session(s)" << logend;
} }
@@ -411,6 +475,34 @@ return how_many;
} }
IPBan & SessionManager::AddIPToBanList(int ip)
{
return ban_tab.AddIP(ip);
}
size_t SessionManager::BanListSize()
{
return ban_tab.Size();
}
IPBan & SessionManager::GetIPBan(size_t index)
{
return ban_tab.GetIPBan(index);
}
void SessionManager::RemoveIPBan(int ip)
{
ban_tab.RemoveIP(ip);
}
void SessionManager::ClearIPBanList()
{
ban_tab.Clear();
}
/* /*
@@ -437,6 +529,7 @@ SessionContainer::Iterator i;
{ {
Lock(); Lock();
CheckWheterIPListIsSorted();
CheckSession(i); CheckSession(i);
exit = synchro->was_stop_signal; exit = synchro->was_stop_signal;
@@ -445,6 +538,17 @@ SessionContainer::Iterator i;
} }
// objects locked
void SessionManager::CheckWheterIPListIsSorted()
{
if( !ban_tab.IsSorted() )
{
log << log4 << "SM: sorting the ban list" << logend;
ban_tab.Sort();
}
}
// it's called from the other thread (with Lock and Unlock) // it's called from the other thread (with Lock and Unlock)
void SessionManager::CheckSession(SessionContainer::Iterator & i) void SessionManager::CheckSession(SessionContainer::Iterator & i)
{ {
@@ -532,3 +636,6 @@ void SessionManager::DeleteSession(Session * del_session)
} // namespace Winix
+51 -5
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_sessionmanager #ifndef headerfile_winix_core_sessionmanager
@@ -14,6 +39,7 @@
#include <ctime> #include <ctime>
#include "sessioncontainer.h" #include "sessioncontainer.h"
#include "ipbancontainer.h"
#include "config.h" #include "config.h"
#include "request.h" #include "request.h"
#include "lastcontainer.h" #include "lastcontainer.h"
@@ -23,6 +49,11 @@
namespace Winix
{
class SessionManager : public BaseThread class SessionManager : public BaseThread
{ {
public: public:
@@ -34,6 +65,7 @@ public:
void SetSystem(System * psystem); void SetSystem(System * psystem);
void SetLastContainer(LastContainer * plast_container); void SetLastContainer(LastContainer * plast_container);
// can return a null pointer // can return a null pointer
Session * FindSession(long id); Session * FindSession(long id);
@@ -41,6 +73,7 @@ public:
void DeleteSessions(); // deleting all sessions void DeleteSessions(); // deleting all sessions
bool ChangeSessionId(long old_id); bool ChangeSessionId(long old_id);
void InitBanList();
void InitTmpSession(); void InitTmpSession();
void UninitTmpSession(); void UninitTmpSession();
@@ -56,6 +89,12 @@ public:
size_t Size(); size_t Size();
size_t MarkAllSessionsToRemove(long user_id); size_t MarkAllSessionsToRemove(long user_id);
IPBan & AddIPToBanList(int ip);
size_t BanListSize();
IPBan & GetIPBan(size_t index);
void RemoveIPBan(int ip);
void ClearIPBanList();
private: private:
Config * config; Config * config;
@@ -68,6 +107,9 @@ private:
Session * session; Session * session;
SessionContainer session_tab; SessionContainer session_tab;
IPBanContainer ban_tab;
IPBan * current_ip_ban;
// session with id 0 // session with id 0
Session temporary_session; Session temporary_session;
@@ -76,8 +118,8 @@ private:
long CreateSessionId(); long CreateSessionId();
void CreateSession(); void CreateSession();
bool SetSessionFromCookie(const std::string & cookie); bool SetSessionFromCookie(const std::wstring & cookie);
void SetTemporarySession();
// second thread // second thread
int deleted; int deleted;
@@ -85,8 +127,12 @@ private:
void CheckSession(SessionContainer::Iterator & i); void CheckSession(SessionContainer::Iterator & i);
bool IsSessionOutdated(const Session & s) const; bool IsSessionOutdated(const Session & s) const;
void DeleteSession(Session * del_session); void DeleteSession(Session * del_session);
void CheckWheterIPListIsSorted();
}; };
} // namespace Winix
#endif #endif
+45 -6
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2010, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "sessionparser.h" #include "sessionparser.h"
@@ -12,8 +37,12 @@
#include "misc.h" #include "misc.h"
namespace Winix
{
bool SessionParser::Parse(const std::string & path, SessionContainer & container)
bool SessionParser::Parse(const std::wstring & path, SessionContainer & container)
{ {
return Parse(path.c_str(), container); return Parse(path.c_str(), container);
} }
@@ -25,10 +54,16 @@ void SessionParser::SetUsers(Users * pusers)
} }
bool SessionParser::Parse(const char * path, SessionContainer & container) bool SessionParser::Parse(const wchar_t * path, SessionContainer & container)
{ {
char file_path[WINIX_OS_PATH_SIZE];
container.Clear(); container.Clear();
file.open(path, std::ios_base::in | std::ios_base::binary);
if( !WideToUTF8(path, file_path, WINIX_OS_PATH_SIZE) )
return false;
file.open(file_path, std::ios_base::in | std::ios_base::binary);
if( !file ) if( !file )
{ {
@@ -166,3 +201,7 @@ bool is_sign = false;
return res; return res;
} }
} // namespace Winix
+38 -5
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2010, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_sessionparser #ifndef headerfile_winix_core_sessionparser
@@ -17,13 +42,17 @@
#include "users.h" #include "users.h"
namespace Winix
{
class SessionParser class SessionParser
{ {
public: public:
bool Parse(const char * path, SessionContainer & container); bool Parse(const wchar_t * path, SessionContainer & container);
bool Parse(const std::string & path, SessionContainer & container); bool Parse(const std::wstring & path, SessionContainer & container);
void SetUsers(Users * pusers); void SetUsers(Users * pusers);
private: private:
@@ -46,5 +75,9 @@ private:
}; };
} // namespace Winix
#endif #endif
+44 -4
View File
@@ -1,13 +1,43 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2011, Tomasz Sowa */
/*
* Copyright (c) 2011-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "slog.h" #include "slog.h"
#include "utf8/utf8.h"
namespace Winix
{
@@ -114,6 +144,13 @@ SLog & SLog::operator<<(double s)
} }
SLog & SLog::operator<<(const PT::Date & date)
{
return PutLog(date);
}
SLog & SLog::operator<<(LogManipulators m) SLog & SLog::operator<<(LogManipulators m)
{ {
if( cur && cur->session ) if( cur && cur->session )
@@ -152,7 +189,7 @@ return *this;
SLog & SLog::TranslateText(const char * str) SLog & SLog::TranslateText(const char * str)
{ {
AssignString(str, key_temp); PT::UTF8ToWide(str, key_temp);
return TranslateText(key_temp.c_str()); return TranslateText(key_temp.c_str());
} }
@@ -215,3 +252,6 @@ SLog & SLog::operator<<(TranslateTextHelper<std::wstring> raw)
} // namespace Winix
+52 -5
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2011, Tomasz Sowa */
/*
* Copyright (c) 2011-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_slog #ifndef headerfile_winix_core_slog
@@ -13,6 +38,12 @@
#include "cur.h" #include "cur.h"
#include "logmanipulators.h" #include "logmanipulators.h"
#include "templates/locale.h" #include "templates/locale.h"
#include "textstream/textstream.h"
namespace Winix
{
#define WINIX_SLOG_MAX_LOG_SIZE 10240 #define WINIX_SLOG_MAX_LOG_SIZE 10240
@@ -68,6 +99,11 @@ public:
SLog & operator<<(size_t s); SLog & operator<<(size_t s);
SLog & operator<<(double s); SLog & operator<<(double s);
SLog & operator<<(LogManipulators m); SLog & operator<<(LogManipulators m);
SLog & operator<<(const PT::Date & date);
template<typename char_type, size_t stack_size, size_t heap_block_size>
SLog & operator<<(const PT::TextStreamBase<char_type, stack_size, heap_block_size> & buf);
SLog & TranslateText(const char * str); SLog & TranslateText(const char * str);
SLog & TranslateText(const wchar_t * str); SLog & TranslateText(const wchar_t * str);
@@ -95,7 +131,7 @@ public:
private: private:
template<class LogParam> template<class LogParam>
SLog & PutLog(LogParam par); SLog & PutLog(const LogParam & par);
Cur * cur; Cur * cur;
Locale * locale; Locale * locale;
@@ -111,8 +147,15 @@ SLog::TranslateTextHelper<RawType> T(const RawType & par)
} }
template<typename char_type, size_t stack_size, size_t heap_block_size>
SLog & SLog::operator<<(const PT::TextStreamBase<char_type, stack_size, heap_block_size> & buf)
{
return PutLog(buf);
}
template<class LogParam> template<class LogParam>
SLog & SLog::PutLog(LogParam par) SLog & SLog::PutLog(const LogParam & par)
{ {
if( cur && cur->session ) if( cur && cur->session )
cur->session->log_buffer << par; cur->session->log_buffer << par;
@@ -124,5 +167,9 @@ return *this;
extern SLog slog; extern SLog slog;
} // namespace Winix
#endif #endif
+62 -12
View File
@@ -1,20 +1,64 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2012, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <errno.h> #include <errno.h>
#include "synchro.h" #include "synchro.h"
Synchro::Synchro() : mutex(PTHREAD_MUTEX_INITIALIZER)
namespace Winix
{
Synchro::Synchro()
{ {
was_stop_signal = false; was_stop_signal = false;
ref = 0;
#ifdef __FreeBSD__
/*
* on FreeBSD a pthread's pthread_mutex_lock() is checking for deadlocks by default
*/
mutex = PTHREAD_MUTEX_INITIALIZER;
#else
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
pthread_mutex_init(&mutex, &attr);
pthread_mutexattr_destroy(&attr);
#endif
} }
@@ -23,29 +67,34 @@ bool Synchro::Lock()
{ {
int res = pthread_mutex_lock(&mutex); int res = pthread_mutex_lock(&mutex);
if( res == EDEADLK ) if( res == 0 )
{ {
// Lock() method in this thread was called before ref[pthread_self()] = 1;
ref += 1;
return true; return true;
} }
else else
if( res == EDEADLK )
{ {
ref = 0; // Lock() method in this thread was called before
ref[pthread_self()] += 1;
return true;
} }
return res == 0; return false;
} }
void Synchro::Unlock() void Synchro::Unlock()
{ {
if( ref > 0 ) int & r = ref[pthread_self()];
if( r > 1 )
{ {
ref -= 1; r -= 1;
} }
else else
if( r == 1 )
{ {
pthread_mutex_unlock(&mutex); pthread_mutex_unlock(&mutex);
} }
@@ -54,4 +103,5 @@ void Synchro::Unlock()
} // namespace Winix
+38 -5
View File
@@ -1,16 +1,46 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2012, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_synchro #ifndef headerfile_winix_core_synchro
#define headerfile_winix_core_synchro #define headerfile_winix_core_synchro
#include <pthread.h> #include <pthread.h>
#include <map>
namespace Winix
{
@@ -31,13 +61,16 @@ struct Synchro
private: private:
// deadlock counter // deadlock counter for each thread
// we can call Lock() more than one in the same thread // we can call Lock() more than one in the same thread
int ref; std::map<pthread_t, int> ref;
}; };
} // namespace Winix
#endif #endif
+128 -16
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2012, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "system.h" #include "system.h"
@@ -16,6 +41,12 @@
namespace Winix
{
void System::SetCur(Cur * pcur) void System::SetCur(Cur * pcur)
{ {
cur = pcur; cur = pcur;
@@ -132,8 +163,7 @@ bool ssl = false;
{ {
if( !config->use_ssl_only_for_logged_users || if( !config->use_ssl_only_for_logged_users ||
cur->session->puser || cur->session->puser ||
cur->request->function == &functions->fun_login || (cur->request->function && cur->request->function->need_ssl) )
cur->request->function == &functions->fun_adduser)
{ {
str += config->url_ssl_proto; str += config->url_ssl_proto;
ssl = true; ssl = true;
@@ -145,13 +175,37 @@ bool ssl = false;
} }
void System::CreateItemLink(long parent_id, const std::wstring & url, const std::wstring & subdomain,
std::wstring & link, bool clear_str)
{
PutUrlProto(config->use_ssl, link, clear_str);
if( !subdomain.empty() )
{
link += subdomain;
link += '.';
}
link += config->base_url;
dirs.MakePath(parent_id, link, false); // !! IMPROVE ME may some kind of error checks here?
link += url;
}
void System::CreateItemLink(const Item & item, std::wstring & link, bool clear_str)
{
CreateItemLink(item.parent_id, item.url, cur->request->subdomain, link, clear_str);
}
// !! IMPROVE ME // !! IMPROVE ME
// !! mozna zrobic jakas obsluge kiedy nie mozemy sie redirectnac, np gdy wystapil blad // !! mozna zrobic jakas obsluge kiedy nie mozemy sie redirectnac, np gdy wystapil blad
// !! moze zwracac jakas wartosc? // !! moze zwracac jakas wartosc?
/* /*
postfix will not be UrlEncoded postfix will not be UrlEncoded
*/ */
void System::RedirectTo(const Item & item, const wchar_t * postfix) void System::RedirectTo(const Item & item, const wchar_t * postfix, bool use_reqtype)
{ {
PutUrlProto(config->use_ssl, cur->request->redirect_to); PutUrlProto(config->use_ssl, cur->request->redirect_to);
@@ -177,6 +231,12 @@ void System::RedirectTo(const Item & item, const wchar_t * postfix)
if( postfix ) if( postfix )
cur->request->redirect_to += postfix; cur->request->redirect_to += postfix;
if( use_reqtype && cur->request->IsParam(L"reqtype") )
{
cur->request->redirect_to += L"/-/reqtype:";
cur->request->redirect_to += cur->request->ParamValue(L"reqtype");
}
} }
@@ -184,7 +244,7 @@ void System::RedirectTo(const Item & item, const wchar_t * postfix)
/* /*
postfix will not be UrlEncoded postfix will not be UrlEncoded
*/ */
void System::RedirectTo(long item_id, const wchar_t * postfix) void System::RedirectTo(long item_id, const wchar_t * postfix, bool use_reqtype)
{ {
PutUrlProto(config->use_ssl, cur->request->redirect_to); PutUrlProto(config->use_ssl, cur->request->redirect_to);
@@ -225,6 +285,12 @@ void System::RedirectTo(long item_id, const wchar_t * postfix)
if( postfix ) if( postfix )
cur->request->redirect_to += postfix; cur->request->redirect_to += postfix;
if( use_reqtype && cur->request->IsParam(L"reqtype") )
{
cur->request->redirect_to += L"/-/reqtype:";
cur->request->redirect_to += cur->request->ParamValue(L"reqtype");
}
} }
@@ -232,7 +298,7 @@ void System::RedirectTo(long item_id, const wchar_t * postfix)
/* /*
url will not be UrlEncoded url will not be UrlEncoded
*/ */
void System::RedirectTo(const wchar_t * url) void System::RedirectTo(const wchar_t * url, bool use_reqtype)
{ {
PutUrlProto(config->use_ssl, cur->request->redirect_to); PutUrlProto(config->use_ssl, cur->request->redirect_to);
@@ -263,15 +329,21 @@ void System::RedirectTo(const wchar_t * url)
cur->request->redirect_to += url; cur->request->redirect_to += url;
} }
} }
if( use_reqtype && cur->request->IsParam(L"reqtype") )
{
cur->request->redirect_to += L"/-/reqtype:";
cur->request->redirect_to += cur->request->ParamValue(L"reqtype");
}
} }
/* /*
url will not be UrlEncoded url will not be UrlEncoded
*/ */
void System::RedirectTo(const std::wstring & url) void System::RedirectTo(const std::wstring & url, bool use_reqtype)
{ {
RedirectTo(url.c_str()); RedirectTo(url.c_str(), use_reqtype);
} }
@@ -325,20 +397,54 @@ void System::RedirectWithFunctionAndParamsTo(const std::wstring & url)
} }
void System::RedirectToLastDir() void System::RedirectToLastDir(const wchar_t * postfix, bool use_reqtype)
{ {
if( !cur->request->dir_tab.empty() ) if( !cur->request->dir_tab.empty() )
RedirectTo( *cur->request->dir_tab.back() ); RedirectTo( *cur->request->dir_tab.back(), postfix, use_reqtype);
} }
void System::RedirectToLastItem() void System::RedirectToLastItem(const wchar_t * postfix, bool use_reqtype)
{ {
if( cur->request->last_item ) if( cur->request->last_item )
RedirectTo( *cur->request->last_item ); RedirectTo( *cur->request->last_item, postfix, use_reqtype );
} }
void System::RedirectToLastFunction(const wchar_t * postfix, bool use_reqtype)
{
RedirectToLastDir(0, false);
TrimLast(cur->request->redirect_to, '/');
if( cur->request->is_item )
{
cur->request->redirect_to += '/';
cur->request->redirect_to += cur->request->item.url;
}
if( cur->request->function )
{
cur->request->redirect_to += '/';
cur->request->redirect_to += cur->request->function->fun.url;
}
if( postfix )
{
cur->request->redirect_to += '/';
cur->request->redirect_to += postfix;
}
if( use_reqtype && cur->request->IsParam(L"reqtype") )
{
if( !cur->request->function && !postfix )
cur->request->redirect_to += L"/-";
cur->request->redirect_to += L"/reqtype:";
cur->request->redirect_to += cur->request->ParamValue(L"reqtype");
}
}
bool System::CanChangeUser(const Item & item, long new_user_id) bool System::CanChangeUser(const Item & item, long new_user_id)
{ {
@@ -771,7 +877,7 @@ return res;
// making a global file path (in the unix file system) // making a global file path (in the unix file system)
// you should call CreateNewFile before // you should call CreateNewFile before
bool System::MakeFilePath(const Item & item, std::wstring & path, bool thumb, bool create_dir, int chmod) bool System::MakeFilePath(const Item & item, std::wstring & path, bool thumb, bool create_dir, int chmod, int group)
{ {
path.clear(); path.clear();
@@ -801,7 +907,7 @@ bool System::MakeFilePath(const Item & item, std::wstring & path, bool thumb, bo
path += L"/normal"; path += L"/normal";
if( create_dir && !CreateDirs(path, item.file_path, chmod, true) ) if( create_dir && !CreateDirs(path, item.file_path, chmod, group, true) )
return false; return false;
path += '/'; path += '/';
@@ -1132,6 +1238,8 @@ int System::FollowAllLinks(const std::vector<Item*> & current_dir_tab, const std
} }
else else
{ {
// !! CHECK ME
// FollowLink is using link_to_temp temporary variable too
res = FollowLink(current_dir_tab, link_to_temp, out_dir_tab, out_item); res = FollowLink(current_dir_tab, link_to_temp, out_dir_tab, out_item);
link_to_temp.clear(); link_to_temp.clear();
@@ -1292,3 +1400,7 @@ bool System::AddCommonFileToVar(const wchar_t * file_path, const wchar_t * url,
return AddFile(file_content_item, false) == WINIX_ERR_OK; return AddFile(file_content_item, false) == WINIX_ERR_OK;
} }
} // namespace Winix
+53 -10
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2012, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_system #ifndef headerfile_winix_core_system
@@ -29,6 +54,11 @@
#include "timezones.h" #include "timezones.h"
namespace Winix
{
class Functions; class Functions;
class SessionManager; class SessionManager;
@@ -90,14 +120,16 @@ public:
void AddParams(const ParamTab & param_tab, std::wstring & str, bool clear_str = true); void AddParams(const ParamTab & param_tab, std::wstring & str, bool clear_str = true);
void PutUrlProto(bool can_use_ssl, std::wstring & str, bool clear_str = true); void PutUrlProto(bool can_use_ssl, std::wstring & str, bool clear_str = true);
void RedirectTo(const Item & item, const wchar_t * postfix = 0); void RedirectTo(const Item & item, const wchar_t * postfix = 0, bool use_reqtype = true);
void RedirectTo(long item_id, const wchar_t * postfix = 0); void RedirectTo(long item_id, const wchar_t * postfix = 0, bool use_reqtype = true);
void RedirectTo(const wchar_t * url); void RedirectTo(const wchar_t * url, bool use_reqtype = true);
void RedirectTo(const std::wstring & url); void RedirectTo(const std::wstring & url, bool use_reqtype = true);
void RedirectWithFunctionAndParamsTo(const wchar_t * url); void RedirectWithFunctionAndParamsTo(const wchar_t * url);
void RedirectWithFunctionAndParamsTo(const std::wstring & url); void RedirectWithFunctionAndParamsTo(const std::wstring & url);
void RedirectToLastDir(); void RedirectToLastDir(const wchar_t * postfix = 0, bool use_reqtype = true);
void RedirectToLastItem(); // redirect to an item if exists or to the last directory void RedirectToLastItem(const wchar_t * postfix = 0, bool use_reqtype = true); // redirect to an item if exists or to the last directory
void RedirectToLastFunction(const wchar_t * postfix = 0, bool use_reqtype = true);
bool CanChangeUser(const Item & item, long new_user_id); bool CanChangeUser(const Item & item, long new_user_id);
bool CanChangeGroup(const Item & item, long new_group_id); bool CanChangeGroup(const Item & item, long new_group_id);
@@ -132,7 +164,7 @@ public:
// creating item.file_path and item.file_fs (the mountpoint where the item is located) // creating item.file_path and item.file_fs (the mountpoint where the item is located)
bool CreateNewFile(Item & item); bool CreateNewFile(Item & item);
bool MakeFilePath(const Item & item, std::wstring & path, bool thumb = false, bool create_dir = false, int chmod = 0755); bool MakeFilePath(const Item & item, std::wstring & path, bool thumb = false, bool create_dir = false, int chmod = 0755, int group = -1);
bool MakePath(const Item & item, std::wstring & path, bool clear_path = true); bool MakePath(const Item & item, std::wstring & path, bool clear_path = true);
@@ -169,6 +201,13 @@ public:
// reloading time zones // reloading time zones
void ReadTimeZones(); void ReadTimeZones();
void CreateItemLink(long parent_id, const std::wstring & url, const std::wstring & subdomain,
std::wstring & link, bool clear_str = true);
void CreateItemLink(const Item & item, std::wstring & link, bool clear_str = true);
private: private:
Cur * cur; Cur * cur;
@@ -202,5 +241,9 @@ private:
}; };
} // namespace Winix
#endif #endif
+246 -22
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2010-2012, Tomasz Sowa */
/*
* Copyright (c) 2010-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_textstream #ifndef headerfile_winix_core_textstream
@@ -15,6 +40,13 @@
#include "misc.h" #include "misc.h"
#include "space/space.h" #include "space/space.h"
#include "date/date.h" #include "date/date.h"
#include "textstream/textstream.h"
#include "utf8/utf8.h"
namespace Winix
{
@@ -23,7 +55,17 @@
similar to std::ostringstream similar to std::ostringstream
StringType can be either std::string or std::wstring StringType can be either std::string or std::wstring
this class doesn't use UTF-8 in any kind
this class uses UTF-8 <-> wide characters conversions:
if StringType is std::string:
operator<<(const char*) only copies the input string
operator<<(const wchar_t*) converts from wide characters to UTF-8
(similary for an operator with std::string and std::wstring)
if StringType is std::wstring:
operator<<(const char*) converts from UTF-8 to wide characters
operator<<(const wchar_t*) only copies the input string
(similary for an operator with std::string and std::wstring)
*/ */
template<class StringType> template<class StringType>
class TextStream class TextStream
@@ -41,6 +83,9 @@ public:
const StringType & Str() const; const StringType & Str() const;
const CharType * CStr() const; const CharType * CStr() const;
void Str(const StringType & str);
void Str(const StringType && str);
CharType operator[](size_t index); CharType operator[](size_t index);
TextStream & operator<<(const char * str); TextStream & operator<<(const char * str);
@@ -62,15 +107,38 @@ public:
TextStream & operator<<(const PT::Space & space); TextStream & operator<<(const PT::Space & space);
TextStream & operator<<(const PT::Date & date); TextStream & operator<<(const PT::Date & date);
TextStream & Write(const char * buf, size_t len); 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);
TextStream & Write(const char * buf, size_t len);
TextStream & Write(const wchar_t * buf, size_t len); TextStream & Write(const wchar_t * buf, size_t len);
TextStream & write(const char * buf, size_t len); // for compatibility with standard library (Ezc uses it) TextStream & write(const char * buf, size_t len); // for compatibility with standard library (Ezc uses it)
TextStream & write(const wchar_t * buf, size_t len); TextStream & write(const wchar_t * buf, size_t len);
protected: protected:
StringType buffer; StringType buffer;
std::wstring space_str; // for using with spaces
void Convert(wchar_t c, std::string & dst);
void Convert(wchar_t c, std::wstring & dst);
void Convert(const char * src, size_t len, std::wstring & dst);
void Convert(const char * src, std::wstring & dst);
void Convert(const std::string & src, std::wstring & dst);
void Convert(const wchar_t * src, size_t len, std::string & dst);
void Convert(const wchar_t * src, std::string & dst);
void Convert(const std::wstring & src, std::string & dst);
void Convert(const char * src, size_t len, std::string & dst);
void Convert(const char * src, std::string & dst);
void Convert(const std::string & src, std::string & dst);
void Convert(const wchar_t * src, size_t len, std::wstring & dst);
void Convert(const wchar_t * src, std::wstring & dst);
void Convert(const std::wstring & src, std::wstring & dst);
}; };
@@ -114,6 +182,21 @@ const typename TextStream<StringType>::CharType * TextStream<StringType>::CStr()
} }
template<class StringType>
void TextStream<StringType>::Str(const StringType & str)
{
buffer = str;
}
template<class StringType>
void TextStream<StringType>::Str(const StringType && str)
{
buffer = str;
}
template<class StringType> template<class StringType>
typename TextStream<StringType>::CharType TextStream<StringType>::operator[](size_t index) typename TextStream<StringType>::CharType TextStream<StringType>::operator[](size_t index)
{ {
@@ -125,7 +208,7 @@ typename TextStream<StringType>::CharType TextStream<StringType>::operator[](siz
template<class StringType> template<class StringType>
TextStream<StringType> & TextStream<StringType>::operator<<(const char * str) TextStream<StringType> & TextStream<StringType>::operator<<(const char * str)
{ {
AssignString(str, buffer, false); Convert(str, buffer);
return *this; return *this;
} }
@@ -134,7 +217,7 @@ return *this;
template<class StringType> template<class StringType>
TextStream<StringType> & TextStream<StringType>::operator<<(const std::string * str) TextStream<StringType> & TextStream<StringType>::operator<<(const std::string * str)
{ {
AssignString(*str, buffer, false); Convert(*str, buffer);
return *this; return *this;
} }
@@ -143,7 +226,7 @@ return *this;
template<class StringType> template<class StringType>
TextStream<StringType> & TextStream<StringType>::operator<<(const std::string & str) TextStream<StringType> & TextStream<StringType>::operator<<(const std::string & str)
{ {
AssignString(str, buffer, false); Convert(str, buffer);
return *this; return *this;
} }
@@ -153,7 +236,7 @@ return *this;
template<class StringType> template<class StringType>
TextStream<StringType> & TextStream<StringType>::operator<<(const wchar_t * str) TextStream<StringType> & TextStream<StringType>::operator<<(const wchar_t * str)
{ {
AssignString(str, buffer, false); Convert(str, buffer);
return *this; return *this;
} }
@@ -162,7 +245,7 @@ return *this;
template<class StringType> template<class StringType>
TextStream<StringType> & TextStream<StringType>::operator<<(const std::wstring * str) TextStream<StringType> & TextStream<StringType>::operator<<(const std::wstring * str)
{ {
AssignString(*str, buffer, false); Convert(*str, buffer);
return *this; return *this;
} }
@@ -171,7 +254,7 @@ return *this;
template<class StringType> template<class StringType>
TextStream<StringType> & TextStream<StringType>::operator<<(const std::wstring & str) TextStream<StringType> & TextStream<StringType>::operator<<(const std::wstring & str)
{ {
AssignString(str, buffer, false); Convert(str, buffer);
return *this; return *this;
} }
@@ -181,6 +264,10 @@ return *this;
template<class StringType> template<class StringType>
TextStream<StringType> & TextStream<StringType>::operator<<(char v) TextStream<StringType> & TextStream<StringType>::operator<<(char v)
{ {
/*
* there is no any possibility to treat 'v' as UTF-8 character if we have got
* only one character so we only copy it
*/
buffer += v; buffer += v;
return *this; return *this;
@@ -190,7 +277,7 @@ return *this;
template<class StringType> template<class StringType>
TextStream<StringType> & TextStream<StringType>::operator<<(wchar_t v) TextStream<StringType> & TextStream<StringType>::operator<<(wchar_t v)
{ {
buffer += static_cast<CharType>(v); Convert(v, buffer);
return *this; return *this;
} }
@@ -203,7 +290,7 @@ wchar_t buf[50];
size_t len = sizeof(buf) / sizeof(wchar_t); size_t len = sizeof(buf) / sizeof(wchar_t);
Toa(v, buf, len); Toa(v, buf, len);
AssignString(buf, buffer, false); Convert(buf, buffer);
return *this; return *this;
} }
@@ -216,7 +303,7 @@ wchar_t buf[50];
size_t len = sizeof(buf) / sizeof(wchar_t); size_t len = sizeof(buf) / sizeof(wchar_t);
Toa(v, buf, len); Toa(v, buf, len);
AssignString(buf, buffer, false); Convert(buf, buffer);
return *this; return *this;
} }
@@ -229,7 +316,7 @@ wchar_t buf[50];
size_t len = sizeof(buf) / sizeof(wchar_t); size_t len = sizeof(buf) / sizeof(wchar_t);
Toa(v, buf, len); Toa(v, buf, len);
AssignString(buf, buffer, false); Convert(buf, buffer);
return *this; return *this;
} }
@@ -242,7 +329,7 @@ wchar_t buf[50];
size_t len = sizeof(buf) / sizeof(wchar_t); size_t len = sizeof(buf) / sizeof(wchar_t);
Toa(v, buf, len); Toa(v, buf, len);
AssignString(buf, buffer, false); Convert(buf, buffer);
return *this; return *this;
} }
@@ -254,7 +341,7 @@ TextStream<StringType> & TextStream<StringType>::operator<<(double v)
char buf[50]; char buf[50];
sprintf(buf, "%f", v); sprintf(buf, "%f", v);
AssignString(buf, buffer, false); Convert(buf, buffer);
return *this; return *this;
} }
@@ -270,7 +357,7 @@ size_t len = sizeof(buf) / sizeof(wchar_t);
buf[1] = 'x'; buf[1] = 'x';
Toa(reinterpret_cast<unsigned long>(v), buf+2, len-2, 16); Toa(reinterpret_cast<unsigned long>(v), buf+2, len-2, 16);
AssignString(buf, buffer, false); Convert(buf, buffer);
return *this; return *this;
} }
@@ -279,7 +366,7 @@ return *this;
template<class StringType> template<class StringType>
TextStream<StringType> & TextStream<StringType>::Write(const char * buf, size_t len) TextStream<StringType> & TextStream<StringType>::Write(const char * buf, size_t len)
{ {
AssignString(buf, len, buffer, false); Convert(buf, len, buffer);
return *this; return *this;
} }
@@ -295,7 +382,7 @@ TextStream<StringType> & TextStream<StringType>::write(const char * buf, size_t
template<class StringType> template<class StringType>
TextStream<StringType> & TextStream<StringType>::Write(const wchar_t * buf, size_t len) TextStream<StringType> & TextStream<StringType>::Write(const wchar_t * buf, size_t len)
{ {
AssignString(buf, len, buffer, false); Convert(buf, len, buffer);
return *this; return *this;
} }
@@ -327,6 +414,143 @@ 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<<(
const PT::TextStreamBase<arg_char_type, arg_stack_size, arg_heap_block_size> & arg)
{
typename PT::TextStreamBase<arg_char_type, arg_stack_size, arg_heap_block_size>::const_iterator i;
for(i=arg.begin() ; i != arg.end() ; ++i)
buffer += static_cast<char_type>(*i);
return *this;
}
template<class StringType>
void TextStream<StringType>::Convert(wchar_t c, std::string & dst)
{
PT::IntToUTF8((int)c, dst, false);
}
template<class StringType>
void TextStream<StringType>::Convert(wchar_t c, std::wstring & dst)
{
dst += c;
}
template<class StringType>
void TextStream<StringType>::Convert(const char * src, size_t len, std::wstring & dst)
{
PT::UTF8ToWide(src, len, dst, false);
}
template<class StringType>
void TextStream<StringType>::Convert(const char * src, std::wstring & dst)
{
PT::UTF8ToWide(src, dst, false);
}
template<class StringType>
void TextStream<StringType>::Convert(const std::string & src, std::wstring & dst)
{
PT::UTF8ToWide(src, dst, false);
}
template<class StringType>
void TextStream<StringType>::Convert(const wchar_t * src, size_t len, std::string & dst)
{
PT::WideToUTF8(src, len, dst, false);
}
template<class StringType>
void TextStream<StringType>::Convert(const wchar_t * src, std::string & dst)
{
PT::WideToUTF8(src, dst, false);
}
template<class StringType>
void TextStream<StringType>::Convert(const std::wstring & src, std::string & dst)
{
PT::WideToUTF8(src, dst, false);
}
template<class StringType>
void TextStream<StringType>::Convert(const char * src, size_t len, std::string & dst)
{
// we suppose that append is smart enough and we don't have to use reserve()
dst.append(src, len);
}
template<class StringType>
void TextStream<StringType>::Convert(const char * src, std::string & dst)
{
size_t len;
for(len=0 ; src[len] ; ++len){}
Convert(src, len, dst);
}
template<class StringType>
void TextStream<StringType>::Convert(const std::string & src, std::string & dst)
{
dst.append(src);
}
template<class StringType>
void TextStream<StringType>::Convert(const wchar_t * src, size_t len, std::wstring & dst)
{
// we suppose that append is smart enough and we don't have to use reserve()
dst.append(src, len);
}
template<class StringType>
void TextStream<StringType>::Convert(const wchar_t * src, std::wstring & dst)
{
size_t len;
for(len=0 ; src[len] ; ++len){}
Convert(src, len, dst);
}
template<class StringType>
void TextStream<StringType>::Convert(const std::wstring & src, std::wstring & dst)
{
dst.append(src);
}
} // namespace Winix
#endif #endif
+37 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2011-2012, Tomasz Sowa */
/*
* Copyright (c) 2011-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <signal.h> #include <signal.h>
@@ -12,6 +37,12 @@
#include "log.h" #include "log.h"
namespace Winix
{
ThreadManager::ThreadManager() ThreadManager::ThreadManager()
{ {
were_started = false; were_started = false;
@@ -134,3 +165,6 @@ void ThreadManager::StopAll()
} // namespace Winix
+37 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2011-2012, Tomasz Sowa */
/*
* Copyright (c) 2011-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_threadmanager #ifndef headerfile_winix_core_threadmanager
@@ -16,6 +41,11 @@
#include "synchro.h" #include "synchro.h"
namespace Winix
{
class ThreadManager class ThreadManager
{ {
@@ -61,5 +91,9 @@ private:
}; };
} // namespace Winix
#endif #endif
+36 -3
View File
@@ -1,16 +1,45 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2012, Tomasz Sowa */
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "timezone.h" #include "timezone.h"
#include "misc.h" #include "misc.h"
namespace Winix
{
TimeZone::Dst::Dst() TimeZone::Dst::Dst()
@@ -287,3 +316,7 @@ return result;
} }
} // namespace Winix
+35 -7
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2012, Tomasz Sowa */
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_timezone #ifndef headerfile_winix_core_timezone
@@ -17,6 +42,12 @@
namespace Winix
{
class TimeZone class TimeZone
{ {
public: public:
@@ -132,10 +163,7 @@ private:
} // namespace Winix
+33 -5
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2012, Tomasz Sowa */
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "timezones.h" #include "timezones.h"
@@ -12,6 +37,10 @@
#include "log.h" #include "log.h"
namespace Winix
{
TimeZones::TimeZones() TimeZones::TimeZones()
{ {
@@ -135,7 +164,6 @@ void TimeZones::ParseZones()
// just space by space (not implemented in Space at the moment) // just space by space (not implemented in Space at the moment)
bool TimeZones::ReadTimeZones(const wchar_t * path) bool TimeZones::ReadTimeZones(const wchar_t * path)
{ {
parser.UTF8(true);
parser.SetSpace(temp_space); parser.SetSpace(temp_space);
zone_tab.clear(); zone_tab.clear();
temp_space.Clear(); temp_space.Clear();
@@ -174,5 +202,5 @@ bool TimeZones::ReadTimeZones(const std::wstring & path)
} // namespace Winix
+36 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2012, Tomasz Sowa */
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_timezones #ifndef headerfile_winix_core_timezones
@@ -16,6 +41,11 @@
#include "space/spaceparser.h" #include "space/spaceparser.h"
namespace Winix
{
class TimeZones class TimeZones
{ {
@@ -77,5 +107,8 @@ private:
} // namespace Winix
#endif #endif
+36 -3
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_ugcontainer #ifndef headerfile_winix_core_ugcontainer
@@ -15,6 +40,10 @@
#include "log.h" #include "log.h"
namespace Winix
{
template<class Type> template<class Type>
class UGContainer class UGContainer
@@ -274,4 +303,8 @@ return result;
} }
} // namespace Winix
#endif #endif
+35 -17
View File
@@ -1,15 +1,45 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2012, Tomasz Sowa */
/*
* Copyright (c) 2012-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include "user.h" #include "user.h"
namespace Winix
{
User::User() User::User()
{ {
Clear(); Clear();
@@ -32,6 +62,7 @@ void User::Clear()
} }
bool User::IsMemberOf(long group) bool User::IsMemberOf(long group)
{ {
std::vector<long>::iterator i; std::vector<long>::iterator i;
@@ -47,19 +78,6 @@ return false;
} // namespace Winix
+42 -5
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifndef headerfile_winix_core_user #ifndef headerfile_winix_core_user
@@ -16,6 +41,11 @@
#include "date/date.h" #include "date/date.h"
namespace Winix
{
#define WINIX_ACCOUNT_MAX_LOGIN_SIZE 250 #define WINIX_ACCOUNT_MAX_LOGIN_SIZE 250
#define WINIX_ACCOUNT_MAX_PASSWORD_SIZE 250 #define WINIX_ACCOUNT_MAX_PASSWORD_SIZE 250
#define WINIX_ACCOUNT_MAX_EMAIL_SIZE 250 #define WINIX_ACCOUNT_MAX_EMAIL_SIZE 250
@@ -27,6 +57,7 @@
#define WINIX_ACCOUNT_NOT_ACTIVATED 1 #define WINIX_ACCOUNT_NOT_ACTIVATED 1
// 2 - a user clicked on the link in the mail and now can normally use his account // 2 - a user clicked on the link in the mail and now can normally use his account
// (if has a password set too)
#define WINIX_ACCOUNT_READY 2 #define WINIX_ACCOUNT_READY 2
// 3 - account was suspended // 3 - account was suspended
@@ -36,6 +67,9 @@
#define WINIX_ACCOUNT_BLOCKED 4 #define WINIX_ACCOUNT_BLOCKED 4
/* /*
a user can login only to an account which status is equal to WINIX_ACCOUNT_READY a user can login only to an account which status is equal to WINIX_ACCOUNT_READY
@@ -57,6 +91,8 @@
*/ */
struct UserPass struct UserPass
{ {
bool has_pass; // true if the user has a password set
// if false the user cannot login
int pass_type; // the kind of hash (WINIX_CRYPT_HASH_* see crypt.h) int pass_type; // the kind of hash (WINIX_CRYPT_HASH_* see crypt.h)
std::wstring pass; // password hashed or plain text if pass_type==0 std::wstring pass; // password hashed or plain text if pass_type==0
std::string pass_encrypted; // password encrypted std::string pass_encrypted; // password encrypted
@@ -74,7 +110,6 @@ struct User
std::wstring email; std::wstring email;
int notify; int notify;
// environment variables which can be set by this user // environment variables which can be set by this user
// use 'env' winix function // use 'env' winix function
PT::Space env; PT::Space env;
@@ -94,7 +129,6 @@ struct User
// time zone identifier // time zone identifier
size_t time_zone_id; size_t time_zone_id;
User(); User();
void Clear(); void Clear();
@@ -105,4 +139,7 @@ struct User
}; };
} // namespace Winix
#endif #endif
+36 -4
View File
@@ -1,10 +1,35 @@
/* /*
* This file is a part of Winix * This file is a part of Winix
* and is not publicly distributed * and is distributed under the 2-Clause BSD licence.
* * Author: Tomasz Sowa <t.sowa@ttmath.org>
* Copyright (c) 2008-2012, Tomasz Sowa */
/*
* Copyright (c) 2008-2014, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#include <arpa/inet.h> #include <arpa/inet.h>
@@ -13,6 +38,10 @@
#include "plugin.h" #include "plugin.h"
namespace Winix
{
Users::Users() Users::Users()
{ {
@@ -226,7 +255,7 @@ bool Users::LoginUser(long user_id, bool remember_me, bool use_ses_log)
if( !cur->session->new_session ) if( !cur->session->new_session )
session_manager->ChangeSessionId(cur->session->id); session_manager->ChangeSessionId(cur->session->id);
last.UserLogin(user_id, cur->session->puser->name, inet_addr(cur->request->env_remote_addr), cur->session->id); last.UserLogin(user_id, cur->session->puser->name, cur->request->ip, cur->session->id);
how_many_logged += 1; how_many_logged += 1;
log << log2 << "Users: user " << cur->session->puser->name << " (id: " << user_id << ") logged" << logend; log << log2 << "Users: user " << cur->session->puser->name << " (id: " << user_id << ") logged" << logend;
@@ -292,3 +321,6 @@ long Users::HowManyLogged()
} // namespace Winix

Some files were not shown because too many files have changed in this diff Show More