# net/include/pion/net/HTTPCookieAuth.hpp

    00001 // ------------------------------------------------------------------
    00002 // pion-net: a C++ framework for building lightweight HTTP interfaces
    00003 // ------------------------------------------------------------------
    00004 // Copyright (C) 2007-2008 Atomic Labs, Inc.  (http://www.atomiclabs.com)
    00005 //
    00006 // Distributed under the Boost Software License, Version 1.0.
    00007 // See http://www.boost.org/LICENSE_1_0.txt
    00008 //
    00009
    00010 #ifndef __PION_HTTPCOOKIEAUTH_HEADER__
    00011 #define __PION_HTTPCOOKIEAUTH_HEADER__
    00012
    00013 #include <map>
    00014 #include <string>
    00015 #include <boost/random.hpp>
    00016 #include <pion/PionConfig.hpp>
    00017 #include <pion/net/HTTPAuth.hpp>
    00018 #include <pion/PionDateTime.hpp>  // order important, otherwise compiling error under win32
    00019
    00020
    00021 namespace pion {    // begin namespace pion
    00022 namespace net {     // begin namespace net (Pion Network Library)
    00023
    00028 class PION_NET_API HTTPCookieAuth :
    00029     public HTTPAuth
    00030 {
    00031 public:
    00032
    00044     HTTPCookieAuth(PionUserManagerPtr userManager,
    00045         const std::string& login="/login",
    00046         const std::string& logout="/logout",
    00047         const std::string& redirect="");
    00048
    00050     virtual ~HTTPCookieAuth() {}
    00051
    00069     virtual bool handleRequest(HTTPRequestPtr& request, TCPConnectionPtr& tcp_conn);
    00070
    00084     virtual void setOption(const std::string& name, const std::string& value);
    00085
    00086
    00087 protected:
    00088
    00097     bool processLogin(HTTPRequestPtr& http_request, TCPConnectionPtr& tcp_conn);
    00098
    00105     void handleUnauthorized(HTTPRequestPtr& http_request, TCPConnectionPtr& tcp_conn);
    00106
    00113     void handleRedirection(HTTPRequestPtr& http_request, TCPConnectionPtr& tcp_conn,
    00114         const std::string &redirection_url, const std::string &new_cookie="", bool delete_cookie=false);
    00115
    00122     void handleOk(HTTPRequestPtr& http_request, TCPConnectionPtr& tcp_conn,
    00123         const std::string &new_cookie="", bool delete_cookie=false);
    00124
    00128     void expireCache(const PionDateTime &time_now);
    00129
    00130
    00131 private:
    00132
    00134     typedef std::map<std::string, std::pair<PionDateTime, PionUserPtr> >  PionUserCache;
    00135
    00137     static const unsigned int   CACHE_EXPIRATION;
    00138
    00140     static const unsigned int   RANDOM_COOKIE_BYTES;
    00141
    00143     static const std::string    AUTH_COOKIE_NAME;
    00144
    00146     std::string                 m_login;
    00147
    00149     std::string                 m_logout;
    00150
    00152     std::string                 m_redirect;
    00153
    00155     boost::mt19937              m_random_gen;
    00156
    00158     boost::uniform_int<>        m_random_range;
    00159
    00161     boost::variate_generator<boost::mt19937&, boost::uniform_int<> >    m_random_die;
    00162
    00164     PionDateTime                m_cache_cleanup_time;
    00165
    00167     PionUserCache               m_user_cache;
    00168
    00170     mutable boost::mutex        m_cache_mutex;
    00171 };
    00172
    00173
    00174 }   // end namespace net
    00175 }   // end namespace pion
    00176
    00177 #endif