6
6
#if !PURPLE_VERSION_CHECK(3, 0, 0)
7
7
#define purple_connection_error purple_connection_error_reason
8
8
#define purple_notify_user_info_add_pair_html purple_notify_user_info_add_pair
12
steam_account_get_access_token(SteamAccount *sa) {
14
if (sa->cached_access_token)
15
return sa->cached_access_token;
18
return purple_account_get_string(sa->account, "access_token", "");
23
steam_account_set_access_token(SteamAccount *sa, const gchar *access_token) {
25
if (access_token != NULL) {
26
g_free(sa->cached_access_token);
27
sa->cached_access_token = g_strdup(access_token);
29
gnome_keyring_store_password(GNOME_KEYRING_NETWORK_PASSWORD,
30
GNOME_KEYRING_DEFAULT,
31
_("Steam Mobile OAuth Token"),
34
"user", sa->account->username,
35
"server", "api.steamcommunity.com",
36
"protocol", "steammobile",
37
"domain", "libpurple",
40
g_free(sa->cached_access_token);
41
sa->cached_access_token = NULL;
43
gnome_keyring_delete_password(GNOME_KEYRING_NETWORK_PASSWORD,
45
"user", sa->account->username,
46
"server", "api.steamcommunity.com",
47
"protocol", "steammobile",
48
"domain", "libpurple",
52
purple_account_set_string(sa->account, "access_token", access_token);
11
56
static const gchar *
12
57
steam_personastate_to_statustype(gint64 state)
710
755
steam_login_cb(SteamAccount *sa, JsonObject *obj, gpointer user_data)
712
if(json_object_has_member(obj, "access_token"))
714
purple_account_set_string(sa->account, "access_token", json_object_get_string_member(obj, "access_token"));
715
steam_login_with_access_token(sa);
718
const gchar *x_errorcode = json_object_get_string_member(obj, "x_errorcode");
719
const gchar *error_description = json_object_get_string_member(obj, "error_description");
720
if (g_str_equal(x_errorcode, "steamguard_code_required"))
757
//{"success":true,"redirect_uri":"steammobile:\/\/mobileloginsucceeded","login_complete":true,"oauth":"{\"steamid\":\"id\",\"oauth_token\":\"oauthtoken\",\"webcookie\":\"webcookie\"}"}
758
//{"success":false,"captcha_needed":false,"captcha_gid":-1,"message":"Incorrect login"}
759
//{"success":false,"message":"SteamGuard","emailauth_needed":true,"emaildomain":"domain","emailsteamid":"id"}
760
//{"success":false,"message":"Error verifying humanity","captcha_needed":true,"captcha_gid":"1587796635006345822"}
761
if(json_object_get_boolean_member(obj, "success"))
763
JsonParser *parser = json_parser_new();
764
const gchar *oauthjson = json_object_get_string_member(obj, "oauth");
766
if (!json_parser_load_from_data(parser, oauthjson, strlen(oauthjson), NULL))
768
purple_debug_error("steam", "Error parsing response: %s\n", oauthjson);
769
purple_connection_error(sa->pc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, "JSON decoding error");
771
JsonNode *root = json_parser_get_root(parser);
772
JsonObject *oauthobj = json_node_get_object(root);
774
steam_account_set_access_token(sa, json_object_get_string_member(oauthobj, "oauth_token"));
775
steam_login_with_access_token(sa);
777
g_object_unref(parser);
780
const gchar *error_description = json_object_get_string_member(obj, "message");
781
if (json_object_get_boolean_member(obj, "emailauth_needed"))
722
783
purple_request_input(NULL, NULL, _("Set your Steam Guard Code"),
723
784
_("Copy the Steam Guard Code you will have received in your email"), NULL,
724
785
FALSE, FALSE, "Steam Guard Code", _("OK"),
725
786
G_CALLBACK(steam_set_steam_guard_token_cb), _("Cancel"),
726
787
NULL, sa->account, NULL, NULL, sa->account);
788
purple_connection_error(sa->pc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, error_description);
789
} else if (json_object_get_boolean_member(obj, "captcha_needed"))
791
const gchar *captcha_gid = json_object_get_string_member(obj, "captcha_gid");
792
//https://steamcommunity.com/public/captcha.php?gid=%s captcha_gid
727
794
purple_connection_error(sa->pc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, error_description);
728
} else if (g_str_equal(x_errorcode, "incorrect_login"))
730
797
purple_connection_error(sa->pc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, error_description);
732
purple_connection_error(sa->pc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_description);
802
#include "steam_rsa.c"
805
steam_login_got_rsakey(SteamAccount *sa, JsonObject *obj, gpointer user_data)
807
//{"success":true,"publickey_mod":"pubkeyhex","publickey_exp":"pubkeyhex","timestamp":"165685150000"}
808
GString *post = NULL;
809
gchar *encrypted_password;
810
PurpleAccount *account;
812
if(!json_object_get_boolean_member(obj, "success"))
814
purple_connection_error(sa->pc, PURPLE_CONNECTION_ERROR_INVALID_USERNAME, _("Invalid username"));
818
account = sa->account;
819
encrypted_password = steam_encrypt_password(
820
json_object_get_string_member(obj, "publickey_mod"),
821
json_object_get_string_member(obj, "publickey_exp"),
824
purple_debug_misc("steam", "Encrypted password is %s\n", encrypted_password);
826
if (!encrypted_password)
828
purple_connection_error(sa->pc,
829
PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR,
830
_("Unable to RSA encrypt the password"));
834
post = g_string_new(NULL);
835
g_string_append_printf(post, "password=%s&", purple_url_encode(encrypted_password));
836
g_string_append_printf(post, "username=%s&", purple_url_encode(account->username));
837
g_string_append_printf(post, "emailauth=%s&", purple_url_encode(purple_account_get_string(account, "steam_guard_code", "")));
838
g_string_append(post, "oauth_client_id=3638BFB1&");
839
g_string_append(post, "oauth_scope=read_profile write_profile read_client write_client&");
840
g_string_append(post, "captchagid=-1&");
841
g_string_append_printf(post, "rsatimestamp=%s", purple_url_encode(json_object_get_string_member(obj, "timestamp")));
843
purple_debug_misc("steam", "Postdata: %s\n", post->str);
845
steam_post_or_get(sa, STEAM_METHOD_POST | STEAM_METHOD_SSL, "steamcommunity.com", "/mobilelogin/dologin", post->str, steam_login_cb, NULL, TRUE);
846
g_string_free(post, TRUE);
848
g_free(encrypted_password);
853
steam_keyring_got_password(GnomeKeyringResult res, const gchar* access_token, gpointer user_data) {
854
SteamAccount *sa = user_data;
856
if (access_token && *access_token)
858
sa->cached_access_token = g_strdup(password);
860
steam_login_with_access_token(sa);
863
gchar *url = g_strdup_printf("/mobilelogin/getrsakey?username=%s", purple_url_encode(sa->account->username));
864
steam_post_or_get(sa, STEAM_METHOD_GET | STEAM_METHOD_SSL, "steamcommunity.com", url, NULL, steam_login_got_rsakey, NULL, TRUE);
738
871
steam_login(PurpleAccount *account)
756
889
sa->sent_messages_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
757
890
sa->waiting_conns = g_queue_new();
893
gnome_keyring_find_password(GNOME_KEYRING_NETWORK_PASSWORD,
894
steam_keyring_got_password, sa, NULL,
895
"user", account->username,
896
"server", "api.steamcommunity.com",
897
"protocol", "steammobile",
898
"domain", "libpurple",
760
901
if (purple_account_get_string(account, "access_token", NULL))
762
903
steam_login_with_access_token(sa);
765
GString *post = g_string_new(NULL);
766
g_string_append(post, "client_id=3638BFB1&");
767
g_string_append(post, "grant_type=password&");
768
g_string_append_printf(post, "username=%s&", purple_url_encode(account->username));
769
g_string_append_printf(post, "password=%s&", purple_url_encode(account->password));
770
g_string_append_printf(post, "x_emailauthcode=%s&", purple_url_encode(purple_account_get_string(account, "steam_guard_code", "")));
771
g_string_append(post, "x_webcookie=&");
772
g_string_append(post, "scope=read_profile write_profile read_client write_client");
773
steam_post_or_get(sa, STEAM_METHOD_POST | STEAM_METHOD_SSL, NULL, "/ISteamOAuth2/GetTokenWithCredentials/v0001", post->str, steam_login_cb, NULL, TRUE);
774
g_string_free(post, TRUE);
906
gchar *url = g_strdup_printf("/mobilelogin/getrsakey?username=%s", purple_url_encode(account->username));
907
steam_post_or_get(sa, STEAM_METHOD_GET | STEAM_METHOD_SSL, "steamcommunity.com", url, NULL, steam_login_got_rsakey, NULL, TRUE);
777
912
purple_connection_set_state(pc, PURPLE_CONNECTING);
778
913
purple_connection_update_progress(pc, _("Connecting"), 1, 3);