120 lines
3.9 KiB
Vala
120 lines
3.9 KiB
Vala
using GLib;
|
|
|
|
public class Tootle.AccountManager : Object{
|
|
|
|
public abstract signal void switched(Account? account);
|
|
public abstract signal void added(Account account);
|
|
public abstract signal void removed(Account account);
|
|
|
|
public Account? current;
|
|
|
|
public AccountManager(){
|
|
Object();
|
|
}
|
|
|
|
public bool has_client_tokens(){
|
|
var client_id = Tootle.settings.client_id;
|
|
var client_secret = Tootle.settings.client_secret;
|
|
|
|
return !(client_id == "null" || client_secret == "null");
|
|
}
|
|
|
|
public bool has_access_token (){
|
|
return Tootle.settings.access_token != "null";
|
|
}
|
|
|
|
public void request_auth_code (string client_id){
|
|
var pars = "?scope=read%20write%20follow";
|
|
pars += "&response_type=code";
|
|
pars += "&redirect_uri=urn:ietf:wg:oauth:2.0:oob";
|
|
pars += "&client_id=" +client_id;
|
|
|
|
try {
|
|
AppInfo.launch_default_for_uri ("%s/oauth/authorize%s".printf (Tootle.settings.instance_url, pars), null);
|
|
}
|
|
catch (GLib.Error e){
|
|
warning (e.message);
|
|
}
|
|
}
|
|
|
|
public Soup.Message request_client_tokens(){
|
|
var pars = "?client_name=Tootle";
|
|
pars += "&redirect_uris=urn:ietf:wg:oauth:2.0:oob";
|
|
pars += "&website=https://github.com/bleakgrey/tootle";
|
|
pars += "&scopes=read%20write%20follow";
|
|
|
|
var msg = new Soup.Message("POST", "%s/api/v1/apps%s".printf (Tootle.settings.instance_url, pars));
|
|
Tootle.network.queue(msg, (sess, mess) => {
|
|
try{
|
|
var root = Tootle.network.parse (mess);
|
|
var client_id = root.get_string_member ("client_id");
|
|
var client_secret = root.get_string_member ("client_secret");
|
|
Tootle.settings.client_id = client_id;
|
|
Tootle.settings.client_secret = client_secret;
|
|
debug ("Received tokens");
|
|
|
|
request_auth_code (client_id);
|
|
}
|
|
catch (GLib.Error e) {
|
|
warning ("Can't request client secret.");
|
|
warning (e.message);
|
|
}
|
|
});
|
|
return msg;
|
|
}
|
|
|
|
public Soup.Message try_auth (string code){
|
|
var pars = "?client_id=" + Tootle.settings.client_id;
|
|
pars += "&client_secret=" + Tootle.settings.client_secret;
|
|
pars += "&redirect_uri=urn:ietf:wg:oauth:2.0:oob";
|
|
pars += "&grant_type=authorization_code";
|
|
pars += "&code=" + code;
|
|
|
|
var msg = new Soup.Message("POST", "%s/oauth/token%s".printf (Tootle.settings.instance_url, pars));
|
|
Tootle.network.queue(msg, (sess, mess) => {
|
|
try{
|
|
var root = Tootle.network.parse (mess);
|
|
var access_token = root.get_string_member ("access_token");
|
|
Tootle.settings.access_token = access_token;
|
|
debug ("Got access token");
|
|
request_current ();
|
|
}
|
|
catch (GLib.Error e) {
|
|
warning ("Can't get access token");
|
|
warning (e.message);
|
|
}
|
|
});
|
|
return msg;
|
|
}
|
|
|
|
public Soup.Message request_current (){
|
|
var msg = new Soup.Message("GET", "%s/api/v1/accounts/verify_credentials".printf (Tootle.settings.instance_url));
|
|
Tootle.network.queue(msg, (sess, mess) => {
|
|
try{
|
|
var root = Tootle.network.parse (mess);
|
|
current = Account.parse(root);
|
|
switched (current);
|
|
}
|
|
catch (GLib.Error e) {
|
|
warning ("Can't get current user");
|
|
warning (e.message);
|
|
}
|
|
});
|
|
return msg;
|
|
}
|
|
|
|
public void logout (){
|
|
current = null;
|
|
Tootle.settings.access_token = "null";
|
|
switched (null);
|
|
}
|
|
|
|
public void init (){
|
|
if(has_access_token())
|
|
request_current ();
|
|
else
|
|
switched (null);
|
|
}
|
|
|
|
}
|