00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __PION_HTTP_COOKIE_AUTH_HEADER__
00011 #define __PION_HTTP_COOKIE_AUTH_HEADER__
00012
00013 #include <map>
00014 #include <string>
00015 #include <boost/random.hpp>
00016 #include <pion/config.hpp>
00017 #include <pion/http/auth.hpp>
00018
00019
00020 namespace pion {
00021 namespace http {
00022
00023
00028 class PION_API cookie_auth :
00029 public http::auth
00030 {
00031 public:
00032
00044 cookie_auth(user_manager_ptr userManager,
00045 const std::string& login="/login",
00046 const std::string& logout="/logout",
00047 const std::string& redirect="");
00048
00050 virtual ~cookie_auth() {}
00051
00069 virtual bool handle_request(http::request_ptr& http_request_ptr, tcp::connection_ptr& tcp_conn);
00070
00084 virtual void set_option(const std::string& name, const std::string& value);
00085
00086
00087 protected:
00088
00097 bool process_login(http::request_ptr& http_request_ptr, tcp::connection_ptr& tcp_conn);
00098
00105 void handle_unauthorized(http::request_ptr& http_request_ptr, tcp::connection_ptr& tcp_conn);
00106
00113 void handle_redirection(http::request_ptr& http_request_ptr, tcp::connection_ptr& tcp_conn,
00114 const std::string &redirection_url, const std::string &new_cookie="", bool delete_cookie=false);
00115
00122 void handle_ok(http::request_ptr& http_request_ptr, tcp::connection_ptr& tcp_conn,
00123 const std::string &new_cookie="", bool delete_cookie=false);
00124
00128 void expire_cache(const boost::posix_time::ptime &time_now);
00129
00130
00131 private:
00132
00134 static const unsigned int CACHE_EXPIRATION;
00135
00137 static const unsigned int RANDOM_COOKIE_BYTES;
00138
00140 static const std::string AUTH_COOKIE_NAME;
00141
00143 std::string m_login;
00144
00146 std::string m_logout;
00147
00149 std::string m_redirect;
00150
00152 boost::mt19937 m_random_gen;
00153
00155 boost::uniform_int<> m_random_range;
00156
00158 boost::variate_generator<boost::mt19937&, boost::uniform_int<> > m_random_die;
00159
00161 boost::posix_time::ptime m_cache_cleanup_time;
00162
00164 user_cache_type m_user_cache;
00165
00167 mutable boost::mutex m_cache_mutex;
00168 };
00169
00170
00171 }
00172 }
00173
00174 #endif