diff --git a/include/matrix/session.hpp b/include/matrix/session.hpp index 85facfa..eeb84e3 100644 --- a/include/matrix/session.hpp +++ b/include/matrix/session.hpp @@ -31,12 +31,27 @@ namespace matrix{ class session : protected connection { + private: + bool m_valid = false; public: + session(void); session(const auth_data&); - //local setter + session(const session&) = default; + session(session&&) = default; + ~session(void); + + session& operator=(const session&) = default; + session& operator=(session&&) = default; + void set_useragent(const raii::string_base&); void set_useragent(raii::string&&); + void set_access_token(const raii::string_base&); + void set_access_token(raii::string&&); + void set_homeserver(const raii::string_base&); + void set_homeserver(raii::string&&); + bool login(void); + bool login(const raii::string_base& username, const raii::string_base& pass); bool valid(void)const; client spawn_client(void)const; @@ -44,6 +59,7 @@ namespace matrix{ void invalidate(void); private: + bool _do_login(const raii::string_base& username, const raii::string_base& pass); void _populate_session_info(const auth_data& a); raii::rjp_string _get_userid(void); raii::string _request_access_token(const raii::string_base& name, const raii::string_base& pass, const raii::string_base& loginurl)const; diff --git a/src/matrix/session.cpp b/src/matrix/session.cpp index 5ab0a77..5d4d7d1 100644 --- a/src/matrix/session.cpp +++ b/src/matrix/session.cpp @@ -23,12 +23,17 @@ namespace matrix{ + session::session(void): + connection(std::make_shared()){} session::session(const auth_data& auth): connection(std::make_shared()) { _populate_session_info(auth); _set_curl_defaults(m_ses->useragent); } + session::~session(void){ + invalidate(); + } void session::set_useragent(const raii::string_base& agent){ m_ses->useragent = agent; @@ -36,10 +41,28 @@ namespace matrix{ void session::set_useragent(raii::string&& agent){ m_ses->useragent = std::move(agent); } + void session::set_homeserver(const raii::string_base& hs){ + m_ses->homeserver = hs; + } + void session::set_homeserver(raii::string&& hs){ + m_ses->homeserver = std::move(hs); + } + void session::set_access_token(const raii::string_base& tok){ + m_ses->access_token = tok; + } + void session::set_access_token(raii::string&& tok){ + m_ses->access_token = std::move(tok); + } + bool session::login(void){ + return _do_login(raii::string(), raii::string()); + } + bool session::login(const raii::string_base& username, const raii::string_base& pass){ + return _do_login(username, pass); + } bool session::valid(void)const{ - return m_ses->access_token; + return m_valid; } client session::spawn_client(void)const{ return client(m_ses); @@ -55,26 +78,34 @@ namespace matrix{ m_ses->urls.invalidate_accesstoken(); } - void session::_populate_session_info(const auth_data& a){ - m_ses->useragent = a.useragent; - m_ses->homeserver = a.homeserver; - m_ses->access_token = a.access_token; + bool session::_do_login(const raii::string_base& username, const raii::string_base& pass){ auto reply = _get_curl(client_url_list::stat_whoami(m_ses->homeserver, m_ses->access_token)); if(!reply){ - auto [token, id] = _get_new_access_token(a.name, a.pass, client_url_list::login(m_ses->homeserver)); + if(!username || !pass){ + return (m_valid = false); + } + auto [token, id] = _get_new_access_token(username, pass, client_url_list::login(m_ses->homeserver)); if(token && id){ m_ses->access_token = std::move(token); m_ses->userid = std::move(id); m_ses->urls.repopulate(m_ses->homeserver, m_ses->access_token, m_ses->userid); + return (m_valid = true); }else{ - invalidate(); + return (m_valid = false); } }else{ m_ses->urls.repopulate_accesstoken(m_ses->homeserver, m_ses->access_token); m_ses->userid = _get_userid(); m_ses->urls.repopulate_userid(m_ses->homeserver, m_ses->access_token, m_ses->userid); + return (m_valid = true); } } + void session::_populate_session_info(const auth_data& a){ + m_ses->useragent = a.useragent; + m_ses->homeserver = a.homeserver; + m_ses->access_token = a.access_token; + _do_login(a.name, a.pass); + } raii::string session::_request_access_token(const raii::string_base& name, const raii::string_base& pass, const raii::string_base& loginurl)const{ CURLcode result; raii::string postdata("{\"type\":\"m.login.password\", \"user\":\"" + raii::json_escape(name) + "\", \"password\":\"" + raii::json_escape(pass) + "\"}");