1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-12-04 14:46:46 -05:00

Use server features for account muc service

issue #878
This commit is contained in:
James Booth 2016-11-20 02:09:34 +00:00
parent 44979ac754
commit 609d05366c
14 changed files with 133 additions and 112 deletions

View File

@ -360,6 +360,7 @@ cmd_ac_init(void)
autocomplete_add(account_clear_ac, "pgpkeyid"); autocomplete_add(account_clear_ac, "pgpkeyid");
autocomplete_add(account_clear_ac, "startscript"); autocomplete_add(account_clear_ac, "startscript");
autocomplete_add(account_clear_ac, "theme"); autocomplete_add(account_clear_ac, "theme");
autocomplete_add(account_clear_ac, "muc");
account_default_ac = autocomplete_new(); account_default_ac = autocomplete_new();
autocomplete_add(account_default_ac, "set"); autocomplete_add(account_default_ac, "set");

View File

@ -1989,7 +1989,8 @@ static struct cmd_t command_defs[] =
"/account clear <account> port", "/account clear <account> port",
"/account clear <account> otr", "/account clear <account> otr",
"/account clear <account> pgpkeyid", "/account clear <account> pgpkeyid",
"/account clear <account> startscript") "/account clear <account> startscript",
"/account clean <account> muc")
CMD_DESC( CMD_DESC(
"Commands for creating and managing accounts. " "Commands for creating and managing accounts. "
"Calling with no arguments will display information for the current account.") "Calling with no arguments will display information for the current account.")
@ -2012,7 +2013,7 @@ static struct cmd_t command_defs[] =
{ "set <account> resource <resource>", "The resource to be used for this account, defaults to 'profanity'." }, { "set <account> resource <resource>", "The resource to be used for this account, defaults to 'profanity'." },
{ "set <account> password <password>", "Password for the account, note this is currently stored in plaintext if set." }, { "set <account> password <password>", "Password for the account, note this is currently stored in plaintext if set." },
{ "set <account> eval_password <command>", "Shell command evaluated to retrieve password for the account. Can be used to retrieve password from keyring." }, { "set <account> eval_password <command>", "Shell command evaluated to retrieve password for the account. Can be used to retrieve password from keyring." },
{ "set <account> muc <service>", "The default MUC chat service to use, defaults to 'conference.<domainpart>' where the domain part is from the account JID." }, { "set <account> muc <service>", "The default MUC chat service to use, defaults to the servers disco info response." },
{ "set <account> nick <nick>", "The default nickname to use when joining chat rooms." }, { "set <account> nick <nick>", "The default nickname to use when joining chat rooms." },
{ "set <account> otr <policy>", "Override global OTR policy for this account, see /otr." }, { "set <account> otr <policy>", "Override global OTR policy for this account, see /otr." },
{ "set <account> pgpkeyid <pgpkeyid>", "Set the ID of the PGP key for this account, see /pgp." }, { "set <account> pgpkeyid <pgpkeyid>", "Set the ID of the PGP key for this account, see /pgp." },
@ -2028,7 +2029,8 @@ static struct cmd_t command_defs[] =
{ "clear <account> otr", "Remove the OTR policy setting for this account." }, { "clear <account> otr", "Remove the OTR policy setting for this account." },
{ "clear <account> pgpkeyid", "Remove pgpkeyid associated with this account." }, { "clear <account> pgpkeyid", "Remove pgpkeyid associated with this account." },
{ "clear <account> startscript", "Remove startscript associated with this account." }, { "clear <account> startscript", "Remove startscript associated with this account." },
{ "clear <account> theme", "Clear the theme setting for the account, the global theme will be used." }) { "clear <account> theme", "Clear the theme setting for the account, the global theme will be used." },
{ "clear <account> muc", "Remove the default MUC service setting."})
CMD_EXAMPLES( CMD_EXAMPLES(
"/account add me", "/account add me",
"/account set me jid me@chatty", "/account set me jid me@chatty",

View File

@ -959,6 +959,10 @@ cmd_account_clear(ProfWin *window, const char *const command, gchar **args)
accounts_clear_theme(account_name); accounts_clear_theme(account_name);
cons_show("Removed theme for account %s", account_name); cons_show("Removed theme for account %s", account_name);
cons_show(""); cons_show("");
} else if (strcmp(property, "muc") == 0) {
accounts_clear_muc(account_name);
cons_show("Removed MUC service for account %s", account_name);
cons_show("");
} else { } else {
cons_show("Invalid property: %s", property); cons_show("Invalid property: %s", property);
cons_show(""); cons_show("");
@ -3426,7 +3430,7 @@ cmd_join(ProfWin *window, const char *const command, gchar **args)
if (args[0] == NULL) { if (args[0] == NULL) {
char *account_name = session_get_account_name(); char *account_name = session_get_account_name();
ProfAccount *account = accounts_get_account(account_name); ProfAccount *account = accounts_get_account(account_name);
if (account->muc_service) {
GString *room_str = g_string_new(""); GString *room_str = g_string_new("");
char *uuid = connection_create_uuid(); char *uuid = connection_create_uuid();
g_string_append_printf(room_str, "private-chat-%s@%s", uuid, account->muc_service); g_string_append_printf(room_str, "private-chat-%s@%s", uuid, account->muc_service);
@ -3437,6 +3441,9 @@ cmd_join(ProfWin *window, const char *const command, gchar **args)
g_string_free(room_str, TRUE); g_string_free(room_str, TRUE);
account_free(account); account_free(account);
} else {
cons_show("Account MUC service property not found.");
}
return TRUE; return TRUE;
} }
@ -3451,7 +3458,6 @@ cmd_join(ProfWin *window, const char *const command, gchar **args)
char *room = NULL; char *room = NULL;
char *nick = NULL; char *nick = NULL;
char *passwd = NULL; char *passwd = NULL;
GString *room_str = g_string_new("");
char *account_name = session_get_account_name(); char *account_name = session_get_account_name();
ProfAccount *account = accounts_get_account(account_name); ProfAccount *account = accounts_get_account(account_name);
@ -3460,11 +3466,18 @@ cmd_join(ProfWin *window, const char *const command, gchar **args)
room = args[0]; room = args[0];
// server not supplied (room), use account preference // server not supplied (room), use account preference
} else { } else if (account->muc_service) {
GString *room_str = g_string_new("");
g_string_append(room_str, args[0]); g_string_append(room_str, args[0]);
g_string_append(room_str, "@"); g_string_append(room_str, "@");
g_string_append(room_str, account->muc_service); g_string_append(room_str, account->muc_service);
room = room_str->str; room = room_str->str;
g_string_free(room_str, FALSE);
// no account preference
} else {
cons_show("Account MUC service property not found.");
return TRUE;
} }
// Additional args supplied // Additional args supplied
@ -3502,7 +3515,6 @@ cmd_join(ProfWin *window, const char *const command, gchar **args)
} }
jid_destroy(room_arg); jid_destroy(room_arg);
g_string_free(room_str, TRUE);
account_free(account); account_free(account);
return TRUE; return TRUE;
@ -4307,14 +4319,19 @@ cmd_rooms(ProfWin *window, const char *const command, gchar **args)
return TRUE; return TRUE;
} }
if (args[0] == NULL) { if (args[0]) {
ProfAccount *account = accounts_get_account(session_get_account_name());
iq_room_list_request(account->muc_service);
account_free(account);
} else {
iq_room_list_request(args[0]); iq_room_list_request(args[0]);
return TRUE;
} }
ProfAccount *account = accounts_get_account(session_get_account_name());
if (account->muc_service) {
iq_room_list_request(account->muc_service);
} else {
cons_show("Account MUC service property not found.");
}
account_free(account);
return TRUE; return TRUE;
} }

View File

@ -115,17 +115,10 @@ account_new(const gchar *const name, const gchar *const jid,
new_account->priority_xa = priority_xa; new_account->priority_xa = priority_xa;
new_account->priority_dnd = priority_dnd; new_account->priority_dnd = priority_dnd;
if (muc_service == NULL) { if (muc_service) {
GString *g_muc_service = g_string_new("conference.");
Jid *jidp = jid_create(new_account->jid);
g_string_append(g_muc_service, jidp->domainpart);
new_account->muc_service = g_muc_service->str;
g_string_free(g_muc_service, FALSE);
jid_destroy(jidp);
} else {
new_account->muc_service = strdup(muc_service); new_account->muc_service = strdup(muc_service);
} else {
new_account->muc_service = NULL;
} }
if (muc_nick == NULL) { if (muc_nick == NULL) {
@ -224,7 +217,10 @@ account_eval_password(ProfAccount *account)
void void
account_free(ProfAccount *account) account_free(ProfAccount *account)
{ {
if (account) { if (account == NULL) {
return;
}
free(account->name); free(account->name);
free(account->jid); free(account->jid);
free(account->password); free(account->password);
@ -245,4 +241,3 @@ account_free(ProfAccount *account)
g_list_free_full(account->otr_always, g_free); g_list_free_full(account->otr_always, g_free);
free(account); free(account);
} }
}

View File

@ -133,8 +133,11 @@ accounts_add(const char *account_name, const char *altdomain, const int port, co
} }
} }
// doesn't yet exist if (g_key_file_has_group(accounts, account_name)) {
if (!g_key_file_has_group(accounts, account_name)) { jid_destroy(jid);
return;
}
g_key_file_set_boolean(accounts, account_name, "enabled", TRUE); g_key_file_set_boolean(accounts, account_name, "enabled", TRUE);
g_key_file_set_string(accounts, account_name, "jid", barejid); g_key_file_set_string(accounts, account_name, "jid", barejid);
g_key_file_set_string(accounts, account_name, "resource", resource); g_key_file_set_string(accounts, account_name, "resource", resource);
@ -149,15 +152,13 @@ accounts_add(const char *account_name, const char *altdomain, const int port, co
} }
Jid *jidp = jid_create(barejid); Jid *jidp = jid_create(barejid);
GString *muc_service = g_string_new("conference.");
g_string_append(muc_service, jidp->domainpart);
g_key_file_set_string(accounts, account_name, "muc.service", muc_service->str);
g_string_free(muc_service, TRUE);
if (jidp->localpart == NULL) { if (jidp->localpart == NULL) {
g_key_file_set_string(accounts, account_name, "muc.nick", jidp->domainpart); g_key_file_set_string(accounts, account_name, "muc.nick", jidp->domainpart);
} else { } else {
g_key_file_set_string(accounts, account_name, "muc.nick", jidp->localpart); g_key_file_set_string(accounts, account_name, "muc.nick", jidp->localpart);
} }
jid_destroy(jidp); jid_destroy(jidp);
g_key_file_set_string(accounts, account_name, "presence.last", "online"); g_key_file_set_string(accounts, account_name, "presence.last", "online");
@ -171,7 +172,6 @@ accounts_add(const char *account_name, const char *altdomain, const int port, co
_save_accounts(); _save_accounts();
autocomplete_add(all_ac, account_name); autocomplete_add(all_ac, account_name);
autocomplete_add(enabled_ac, account_name); autocomplete_add(enabled_ac, account_name);
}
jid_destroy(jid); jid_destroy(jid);
} }
@ -223,7 +223,18 @@ accounts_get_account(const char *const name)
int priority_xa = g_key_file_get_integer(accounts, name, "priority.xa", NULL); int priority_xa = g_key_file_get_integer(accounts, name, "priority.xa", NULL);
int priority_dnd = g_key_file_get_integer(accounts, name, "priority.dnd", NULL); int priority_dnd = g_key_file_get_integer(accounts, name, "priority.dnd", NULL);
gchar *muc_service = g_key_file_get_string(accounts, name, "muc.service", NULL); gchar *muc_service = NULL;
if (g_key_file_has_key(accounts, name, "muc.service", NULL)) {
muc_service = g_key_file_get_string(accounts, name, "muc.service", NULL);
} else {
jabber_conn_status_t conn_status = connection_get_status();
if (conn_status == JABBER_CONNECTED) {
char* conf_jid = connection_jid_for_feature(XMPP_FEATURE_MUC);
if (conf_jid) {
muc_service = strdup(conf_jid);
}
}
}
gchar *muc_nick = g_key_file_get_string(accounts, name, "muc.nick", NULL); gchar *muc_nick = g_key_file_get_string(accounts, name, "muc.nick", NULL);
gchar *otr_policy = NULL; gchar *otr_policy = NULL;
@ -416,10 +427,6 @@ accounts_set_jid(const char *const account_name, const char *const value)
g_key_file_set_string(accounts, account_name, "resource", jid->resourcepart); g_key_file_set_string(accounts, account_name, "resource", jid->resourcepart);
} }
GString *muc_service = g_string_new("conference.");
g_string_append(muc_service, jid->domainpart);
g_key_file_set_string(accounts, account_name, "muc.service", muc_service->str);
g_string_free(muc_service, TRUE);
if (jid->localpart == NULL) { if (jid->localpart == NULL) {
g_key_file_set_string(accounts, account_name, "muc.nick", jid->domainpart); g_key_file_set_string(accounts, account_name, "muc.nick", jid->domainpart);
} else { } else {
@ -568,6 +575,15 @@ accounts_clear_theme(const char *const account_name)
} }
} }
void
accounts_clear_muc(const char *const account_name)
{
if (accounts_account_exists(account_name)) {
g_key_file_remove_key(accounts, account_name, "muc.service", NULL);
_save_accounts();
}
}
void void
accounts_clear_otr(const char *const account_name) accounts_clear_otr(const char *const account_name)
{ {

View File

@ -93,6 +93,7 @@ void accounts_clear_otr(const char *const account_name);
void accounts_clear_pgp_keyid(const char *const account_name); void accounts_clear_pgp_keyid(const char *const account_name);
void accounts_clear_script_start(const char *const account_name); void accounts_clear_script_start(const char *const account_name);
void accounts_clear_theme(const char *const account_name); void accounts_clear_theme(const char *const account_name);
void accounts_clear_muc(const char *const account_name);
void accounts_add_otr_policy(const char *const account_name, const char *const contact_jid, const char *const policy); void accounts_add_otr_policy(const char *const account_name, const char *const contact_jid, const char *const policy);
#endif #endif

View File

@ -290,6 +290,10 @@ connection_supports(const char *const feature)
char* char*
connection_jid_for_feature(const char *const feature) connection_jid_for_feature(const char *const feature)
{ {
if (conn.features_by_jid == NULL) {
return NULL;
}
GList *jids = g_hash_table_get_keys(conn.features_by_jid); GList *jids = g_hash_table_get_keys(conn.features_by_jid);
GList *curr = jids; GList *curr = jids;

View File

@ -54,7 +54,6 @@ void connection_set_disco_items(GSList *items);
xmpp_conn_t* connection_get_conn(void); xmpp_conn_t* connection_get_conn(void);
xmpp_ctx_t* connection_get_ctx(void); xmpp_ctx_t* connection_get_ctx(void);
char *connection_get_domain(void); char *connection_get_domain(void);
char* connection_jid_for_feature(const char *const feature);
GHashTable* connection_get_features(const char *const jid); GHashTable* connection_get_features(const char *const jid);
void connection_clear_data(void); void connection_clear_data(void);

View File

@ -58,6 +58,7 @@
#define XMPP_FEATURE_BLOCKING "urn:xmpp:blocking" #define XMPP_FEATURE_BLOCKING "urn:xmpp:blocking"
#define XMPP_FEATURE_RECEIPTS "urn:xmpp:receipts" #define XMPP_FEATURE_RECEIPTS "urn:xmpp:receipts"
#define XMPP_FEATURE_LASTACTIVITY "jabber:iq:last" #define XMPP_FEATURE_LASTACTIVITY "jabber:iq:last"
#define XMPP_FEATURE_MUC "http://jabber.org/protocol/muc"
typedef enum { typedef enum {
JABBER_CONNECTING, JABBER_CONNECTING,
@ -129,6 +130,7 @@ gboolean connection_is_secured(void);
gboolean connection_send_stanza(const char *const stanza); gboolean connection_send_stanza(const char *const stanza);
GList* connection_get_available_resources(void); GList* connection_get_available_resources(void);
gboolean connection_supports(const char *const feature); gboolean connection_supports(const char *const feature);
char* connection_jid_for_feature(const char *const feature);
char* message_send_chat(const char *const barejid, const char *const msg, const char *const oob_url, char* message_send_chat(const char *const barejid, const char *const msg, const char *const oob_url,
gboolean request_receipt); gboolean request_receipt);

View File

@ -89,7 +89,6 @@ int main(int argc, char* argv[]) {
PROF_FUNC_TEST(display_software_version_result_in_chat), PROF_FUNC_TEST(display_software_version_result_in_chat),
PROF_FUNC_TEST(sends_room_join), PROF_FUNC_TEST(sends_room_join),
PROF_FUNC_TEST(sends_room_join_with_default_muc_service),
PROF_FUNC_TEST(sends_room_join_with_nick), PROF_FUNC_TEST(sends_room_join_with_nick),
PROF_FUNC_TEST(sends_room_join_with_password), PROF_FUNC_TEST(sends_room_join_with_password),
PROF_FUNC_TEST(sends_room_join_with_nick_and_password), PROF_FUNC_TEST(sends_room_join_with_nick_and_password),

View File

@ -26,21 +26,6 @@ sends_room_join(void **state)
)); ));
} }
void
sends_room_join_with_default_muc_service(void **state)
{
prof_connect();
prof_input("/join testroom");
assert_true(stbbr_last_received(
"<presence id='*' to='testroom@conference.localhost/stabber'>"
"<x xmlns='http://jabber.org/protocol/muc'/>"
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://www.profanity.im'/>"
"</presence>"
));
}
void void
sends_room_join_with_nick(void **state) sends_room_join_with_nick(void **state)
{ {

View File

@ -1,5 +1,4 @@
void sends_room_join(void **state); void sends_room_join(void **state);
void sends_room_join_with_default_muc_service(void **state);
void sends_room_join_with_nick(void **state); void sends_room_join_with_nick(void **state);
void sends_room_join_with_password(void **state); void sends_room_join_with_password(void **state);
void sends_room_join_with_nick_and_password(void **state); void sends_room_join_with_nick_and_password(void **state);

View File

@ -25,7 +25,7 @@ rooms_query(void **state)
prof_connect(); prof_connect();
prof_input("/rooms"); prof_input("/rooms conference.localhost");
assert_true(prof_output_exact("chatroom@conference.localhost, (A chat room)")); assert_true(prof_output_exact("chatroom@conference.localhost, (A chat room)"));
assert_true(prof_output_exact("hangout@conference.localhost, (Another chat room)")); assert_true(prof_output_exact("hangout@conference.localhost, (Another chat room)"));

View File

@ -196,6 +196,7 @@ void accounts_clear_otr(const char * const account_name) {}
void accounts_clear_pgp_keyid(const char * const account_name) {} void accounts_clear_pgp_keyid(const char * const account_name) {}
void accounts_clear_script_start(const char * const account_name) {} void accounts_clear_script_start(const char * const account_name) {}
void accounts_clear_theme(const char * const account_name) {} void accounts_clear_theme(const char * const account_name) {}
void accounts_clear_muc(const char * const account_name) {}
void accounts_add_otr_policy(const char * const account_name, const char * const contact_jid, const char * const policy) {} void accounts_add_otr_policy(const char * const account_name, const char * const contact_jid, const char * const policy) {}
char* accounts_get_last_activity(const char *const account_name) char* accounts_get_last_activity(const char *const account_name)
{ {