00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __PION_HTTP_AUTH_HEADER__
00011 #define __PION_HTTP_AUTH_HEADER__
00012
00013 #include <set>
00014 #include <map>
00015 #include <boost/noncopyable.hpp>
00016 #include <boost/shared_ptr.hpp>
00017 #include <pion/config.hpp>
00018 #include <pion/error.hpp>
00019 #include <pion/logger.hpp>
00020 #include <pion/hash_map.hpp>
00021 #include <pion/tcp/connection.hpp>
00022 #include <pion/user.hpp>
00023 #include <pion/http/request.hpp>
00024 #include <boost/date_time/posix_time/posix_time.hpp>
00025
00026
00027 namespace pion {
00028 namespace http {
00029
00030
00034 class PION_API auth :
00035 private boost::noncopyable
00036 {
00037 public:
00038
00040 auth(user_manager_ptr userManager)
00041 : m_logger(PION_GET_LOGGER("pion.http.auth")),
00042 m_user_manager(userManager)
00043 {}
00044
00046 virtual ~auth() {}
00047
00060 virtual bool handle_request(http::request_ptr& http_request_ptr, tcp::connection_ptr& tcp_conn) = 0;
00061
00068 virtual void set_option(const std::string& name, const std::string& value) {
00069 BOOST_THROW_EXCEPTION( error::bad_arg() << error::errinfo_arg_name(name) );
00070 }
00071
00077 void add_restrict(const std::string& resource);
00078
00084 void add_permit(const std::string& resource);
00085
00091 virtual bool add_user(std::string const &username, std::string const &password) {
00092 return m_user_manager->add_user(username, password);
00093 }
00094
00100 virtual bool update_user(std::string const &username, std::string const &password) {
00101 return m_user_manager->update_user(username, password);
00102 }
00103
00109 virtual bool remove_user(std::string const &username) {
00110 return m_user_manager->remove_user(username);
00111 };
00112
00116 virtual user_ptr get_user(std::string const &username) {
00117 return m_user_manager->get_user(username);
00118 }
00119
00120
00121 protected:
00122
00124 typedef std::set<std::string> resource_set_type;
00125
00127 typedef std::map<std::string,std::pair<boost::posix_time::ptime,user_ptr> > user_cache_type;
00128
00129
00135 bool need_authentication(http::request_ptr const& http_request_ptr) const;
00136
00145 bool find_resource(const resource_set_type& resource_set,
00146 const std::string& resource) const;
00147
00149 inline void set_logger(logger log_ptr) { m_logger = log_ptr; }
00150
00151
00153 mutable logger m_logger;
00154
00156 user_manager_ptr m_user_manager;
00157
00159 resource_set_type m_restrict_list;
00160
00162 resource_set_type m_white_list;
00163
00165 mutable boost::mutex m_resource_mutex;
00166 };
00167
00169 typedef boost::shared_ptr<auth> auth_ptr;
00170
00171
00172 }
00173 }
00174
00175 #endif