Added manual control to matrix::session. raii is recommended, but manual login is a good backup if it fails
This commit is contained in:
parent
572c9c1f69
commit
ae5d41df7a
@ -31,12 +31,27 @@
|
|||||||
namespace matrix{
|
namespace matrix{
|
||||||
class session : protected connection
|
class session : protected connection
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
bool m_valid = false;
|
||||||
public:
|
public:
|
||||||
|
session(void);
|
||||||
session(const auth_data&);
|
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(const raii::string_base&);
|
||||||
void set_useragent(raii::string&&);
|
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;
|
bool valid(void)const;
|
||||||
|
|
||||||
client spawn_client(void)const;
|
client spawn_client(void)const;
|
||||||
@ -44,6 +59,7 @@ namespace matrix{
|
|||||||
|
|
||||||
void invalidate(void);
|
void invalidate(void);
|
||||||
private:
|
private:
|
||||||
|
bool _do_login(const raii::string_base& username, const raii::string_base& pass);
|
||||||
void _populate_session_info(const auth_data& a);
|
void _populate_session_info(const auth_data& a);
|
||||||
raii::rjp_string _get_userid(void);
|
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;
|
raii::string _request_access_token(const raii::string_base& name, const raii::string_base& pass, const raii::string_base& loginurl)const;
|
||||||
|
|||||||
@ -23,12 +23,17 @@
|
|||||||
|
|
||||||
namespace matrix{
|
namespace matrix{
|
||||||
|
|
||||||
|
session::session(void):
|
||||||
|
connection(std::make_shared<internal::session_info>()){}
|
||||||
session::session(const auth_data& auth):
|
session::session(const auth_data& auth):
|
||||||
connection(std::make_shared<internal::session_info>())
|
connection(std::make_shared<internal::session_info>())
|
||||||
{
|
{
|
||||||
_populate_session_info(auth);
|
_populate_session_info(auth);
|
||||||
_set_curl_defaults(m_ses->useragent);
|
_set_curl_defaults(m_ses->useragent);
|
||||||
}
|
}
|
||||||
|
session::~session(void){
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
void session::set_useragent(const raii::string_base& agent){
|
void session::set_useragent(const raii::string_base& agent){
|
||||||
m_ses->useragent = agent;
|
m_ses->useragent = agent;
|
||||||
@ -36,10 +41,28 @@ namespace matrix{
|
|||||||
void session::set_useragent(raii::string&& agent){
|
void session::set_useragent(raii::string&& agent){
|
||||||
m_ses->useragent = std::move(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{
|
bool session::valid(void)const{
|
||||||
return m_ses->access_token;
|
return m_valid;
|
||||||
}
|
}
|
||||||
client session::spawn_client(void)const{
|
client session::spawn_client(void)const{
|
||||||
return client(m_ses);
|
return client(m_ses);
|
||||||
@ -55,26 +78,34 @@ namespace matrix{
|
|||||||
m_ses->urls.invalidate_accesstoken();
|
m_ses->urls.invalidate_accesstoken();
|
||||||
}
|
}
|
||||||
|
|
||||||
void session::_populate_session_info(const auth_data& a){
|
bool session::_do_login(const raii::string_base& username, const raii::string_base& pass){
|
||||||
m_ses->useragent = a.useragent;
|
|
||||||
m_ses->homeserver = a.homeserver;
|
|
||||||
m_ses->access_token = a.access_token;
|
|
||||||
auto reply = _get_curl(client_url_list::stat_whoami(m_ses->homeserver, m_ses->access_token));
|
auto reply = _get_curl(client_url_list::stat_whoami(m_ses->homeserver, m_ses->access_token));
|
||||||
if(!reply){
|
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){
|
if(token && id){
|
||||||
m_ses->access_token = std::move(token);
|
m_ses->access_token = std::move(token);
|
||||||
m_ses->userid = std::move(id);
|
m_ses->userid = std::move(id);
|
||||||
m_ses->urls.repopulate(m_ses->homeserver, m_ses->access_token, m_ses->userid);
|
m_ses->urls.repopulate(m_ses->homeserver, m_ses->access_token, m_ses->userid);
|
||||||
|
return (m_valid = true);
|
||||||
}else{
|
}else{
|
||||||
invalidate();
|
return (m_valid = false);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
m_ses->urls.repopulate_accesstoken(m_ses->homeserver, m_ses->access_token);
|
m_ses->urls.repopulate_accesstoken(m_ses->homeserver, m_ses->access_token);
|
||||||
m_ses->userid = _get_userid();
|
m_ses->userid = _get_userid();
|
||||||
m_ses->urls.repopulate_userid(m_ses->homeserver, m_ses->access_token, m_ses->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{
|
raii::string session::_request_access_token(const raii::string_base& name, const raii::string_base& pass, const raii::string_base& loginurl)const{
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
raii::string postdata("{\"type\":\"m.login.password\", \"user\":\"" + raii::json_escape(name) + "\", \"password\":\"" + raii::json_escape(pass) + "\"}");
|
raii::string postdata("{\"type\":\"m.login.password\", \"user\":\"" + raii::json_escape(name) + "\", \"password\":\"" + raii::json_escape(pass) + "\"}");
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user