Added manual control to matrix::session. raii is recommended, but manual login is a good backup if it fails

This commit is contained in:
rexy712 2019-07-19 12:19:34 -07:00
parent 572c9c1f69
commit ae5d41df7a
2 changed files with 55 additions and 8 deletions

View File

@ -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;

View File

@ -23,12 +23,17 @@
namespace matrix{
session::session(void):
connection(std::make_shared<internal::session_info>()){}
session::session(const auth_data& auth):
connection(std::make_shared<internal::session_info>())
{
_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) + "\"}");