00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __PION_HTTPAUTH_HEADER__
00011 #define __PION_HTTPAUTH_HEADER__
00012
00013 #include <set>
00014 #include <boost/noncopyable.hpp>
00015 #include <boost/shared_ptr.hpp>
00016 #include <pion/PionConfig.hpp>
00017 #include <pion/PionLogger.hpp>
00018 #include <pion/PionException.hpp>
00019 #include <pion/net/PionUser.hpp>
00020 #include <pion/net/TCPConnection.hpp>
00021 #include <pion/net/HTTPRequest.hpp>
00022
00023
00024 namespace pion {
00025 namespace net {
00026
00030 class PION_NET_API HTTPAuth :
00031 private boost::noncopyable
00032 {
00033 public:
00034
00036 class UnknownOptionException : public PionException {
00037 public:
00038 UnknownOptionException(const std::string& name)
00039 : PionException("Option not recognized by authentication service: ", name) {}
00040 };
00041
00042
00044 HTTPAuth(PionUserManagerPtr userManager)
00045 : m_logger(PION_GET_LOGGER("pion.net.HTTPAuth")),
00046 m_user_manager(userManager)
00047 {}
00048
00050 virtual ~HTTPAuth() {}
00051
00064 virtual bool handleRequest(HTTPRequestPtr& request, TCPConnectionPtr& tcp_conn) = 0;
00065
00072 virtual void setOption(const std::string& name, const std::string& value) {
00073 throw UnknownOptionException(name);
00074 }
00075
00081 void addRestrict(const std::string& resource);
00082
00088 void addPermit(const std::string& resource);
00089
00095 virtual bool addUser(std::string const &username, std::string const &password) {
00096 return m_user_manager->addUser(username, password);
00097 }
00098
00104 virtual bool updateUser(std::string const &username, std::string const &password) {
00105 return m_user_manager->updateUser(username, password);
00106 }
00107
00113 virtual bool removeUser(std::string const &username) {
00114 return m_user_manager->removeUser(username);
00115 };
00116
00120 virtual PionUserPtr getUser(std::string const &username) {
00121 return m_user_manager->getUser(username);
00122 }
00123
00124
00125 protected:
00126
00128 typedef std::set<std::string> AuthResourceSet;
00129
00130
00136 bool needAuthentication(HTTPRequestPtr const& http_request) const;
00137
00146 bool findResource(const AuthResourceSet& resource_set,
00147 const std::string& resource) const;
00148
00150 inline void setLogger(PionLogger log_ptr) { m_logger = log_ptr; }
00151
00152
00154 mutable PionLogger m_logger;
00155
00157 PionUserManagerPtr m_user_manager;
00158
00160 AuthResourceSet m_restrict_list;
00161
00163 AuthResourceSet m_white_list;
00164
00166 mutable boost::mutex m_resource_mutex;
00167 };
00168
00170 typedef boost::shared_ptr<HTTPAuth> HTTPAuthPtr;
00171
00172
00173 }
00174 }
00175
00176 #endif