about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2014-03-05 20:29:41 +0000
committerJames Booth <boothj5@gmail.com>2014-03-05 20:29:41 +0000
commit65432c8d64b48791301ca7188a9562729d441165 (patch)
treee84fe7ab03b5294a6349dc95171736708337921c /src
parentd68c5941503e7bbc1a6dbaf56a5ad83d1c9ba744 (diff)
parent7c6755b62cf35deac7a98e30d91765fad3ca2d7f (diff)
downloadprofani-tty-65432c8d64b48791301ca7188a9562729d441165.tar.gz
Merge remote-tracking branch 'kmwhite/adding_support_for_private_confs'
Diffstat (limited to 'src')
-rw-r--r--src/command/command.c9
-rw-r--r--src/command/commands.c44
-rw-r--r--src/xmpp/bookmark.c2
-rw-r--r--src/xmpp/presence.c4
-rw-r--r--src/xmpp/stanza.c15
-rw-r--r--src/xmpp/stanza.h2
-rw-r--r--src/xmpp/xmpp.h2
7 files changed, 62 insertions, 16 deletions
diff --git a/src/command/command.c b/src/command/command.c
index d8f55205..5a1960ad 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -235,9 +235,9 @@ static struct cmd_t command_defs[] =
           NULL } } },
 
     { "/join",
-        cmd_join, parse_args_with_freetext, 1, 2, NULL,
-        { "/join room[@server] [nick]", "Join a chat room.",
-        { "/join room[@server] [nick]",
+        cmd_join, parse_args, 1, 5, NULL,
+        { "/join room[@server] [nick value] [passwd value]", "Join a chat room.",
+        { "/join room[@server] [nick value] [passwd value]",
           "--------------------------",
           "Join a chat room at the conference server.",
           "If nick is specified you will join with this nickname.",
@@ -246,7 +246,8 @@ static struct cmd_t command_defs[] =
           "If the room doesn't exist, and the server allows it, a new one will be created.",
           "",
           "Example : /join jdev@conference.jabber.org",
-          "Example : /join jdev@conference.jabber.org mynick",
+          "Example : /join jdev@conference.jabber.org nick mynick",
+          "Example : /join private@conference.jabber.org nick mynick passwd mypassword",
           "Example : /join jdev (as user@jabber.org will join jdev@conference.jabber.org)",
           NULL } } },
 
diff --git a/src/command/commands.c b/src/command/commands.c
index da360da8..9f4882fa 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -1594,6 +1594,7 @@ cmd_join(gchar **args, struct cmd_help_t help)
     int num_args = g_strv_length(args);
     char *room = NULL;
     char *nick = NULL;
+    char *passwd = NULL;
     GString *room_str = g_string_new("");
     Jid *my_jid = jid_create(jabber_get_fulljid());
 
@@ -1609,19 +1610,50 @@ cmd_join(gchar **args, struct cmd_help_t help)
         room = room_str->str;
     }
 
-    // nick supplied
-    if (num_args == 2) {
-        nick = args[1];
+    // Additional args supplied
+    if (num_args > 1) {
+        char *opt1 = args[1];
+        char *opt1val = args[2];
+        char *opt2 = args[3];
+        char *opt2val = args[4];
+        if (opt1 != NULL) {
+            if (opt1val == NULL) {
+                cons_show("Usage: %s", help.usage);
+                cons_show("");
+                return TRUE;
+            }
+            if (strcmp(opt1, "nick") == 0) {
+                nick = opt1val;
+            } else if (strcmp(opt1, "passwd") == 0) {
+                passwd = opt1val;
+            } else {
+                cons_show("Usage: %s", help.usage);
+                cons_show("");
+                return TRUE;
+            }
+            if (opt2 != NULL) {
+                if (strcmp(opt2, "nick") == 0) {
+                    nick = opt2val;
+                } else if (strcmp(opt2, "passwd") == 0) {
+                    passwd = opt2val;
+                } else {
+                    cons_show("Usage: %s", help.usage);
+                    cons_show("");
+                    return TRUE;
+                }
+            }
+        }
+    }
 
-    // otherwise use account preference
-    } else {
+    // In the case that a nick wasn't provided by the optional args...
+    if (nick == NULL) {
         nick = account->muc_nick;
     }
 
     Jid *room_jid = jid_create_from_bare_and_resource(room, nick);
 
     if (!muc_room_is_active(room_jid)) {
-        presence_join_room(room_jid);
+        presence_join_room(room_jid, passwd);
     }
     ui_room_join(room_jid);
     muc_remove_invite(room);
diff --git a/src/xmpp/bookmark.c b/src/xmpp/bookmark.c
index 1bc102a3..27a768be 100644
--- a/src/xmpp/bookmark.c
+++ b/src/xmpp/bookmark.c
@@ -301,7 +301,7 @@ _bookmark_handle_result(xmpp_conn_t * const conn,
                 log_debug("Autojoin %s with nick=%s", jid, name);
                 room_jid = jid_create_from_bare_and_resource(jid, name);
                 if (!muc_room_is_active(room_jid)) {
-                    presence_join_room(room_jid);
+                    presence_join_room(room_jid, NULL);
                     /* TODO: this should be removed after fixing #195 */
                     ui_room_join(room_jid);
                 }
diff --git a/src/xmpp/presence.c b/src/xmpp/presence.c
index ae392ad9..3098e6e4 100644
--- a/src/xmpp/presence.c
+++ b/src/xmpp/presence.c
@@ -260,7 +260,7 @@ _send_room_presence(xmpp_conn_t *conn, xmpp_stanza_t *presence)
 }
 
 static void
-_presence_join_room(Jid *jid)
+_presence_join_room(Jid *jid, char * passwd)
 {
     assert(jid != NULL);
     assert(jid->fulljid != NULL);
@@ -275,7 +275,7 @@ _presence_join_room(Jid *jid)
     int pri = accounts_get_priority_for_presence_type(jabber_get_account_name(),
         presence_type);
 
-    xmpp_stanza_t *presence = stanza_create_room_join_presence(ctx, jid->fulljid);
+    xmpp_stanza_t *presence = stanza_create_room_join_presence(ctx, jid->fulljid, passwd);
     stanza_attach_show(ctx, presence, show);
     stanza_attach_status(ctx, presence, status);
     stanza_attach_priority(ctx, presence, pri);
diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c
index c37ab124..965b1671 100644
--- a/src/xmpp/stanza.c
+++ b/src/xmpp/stanza.c
@@ -249,7 +249,7 @@ stanza_create_invite(xmpp_ctx_t *ctx, const char * const room,
 
 xmpp_stanza_t *
 stanza_create_room_join_presence(xmpp_ctx_t * const ctx,
-    const char * const full_room_jid)
+    const char * const full_room_jid, const char * const passwd)
 {
     xmpp_stanza_t *presence = xmpp_stanza_new(ctx);
     xmpp_stanza_set_name(presence, STANZA_NAME_PRESENCE);
@@ -260,6 +260,19 @@ stanza_create_room_join_presence(xmpp_ctx_t * const ctx,
     xmpp_stanza_t *x = xmpp_stanza_new(ctx);
     xmpp_stanza_set_name(x, STANZA_NAME_X);
     xmpp_stanza_set_ns(x, STANZA_NS_MUC);
+
+    // if a password was given
+    if (passwd != NULL) {
+        xmpp_stanza_t *pass = xmpp_stanza_new(ctx);
+        xmpp_stanza_set_name(pass, "password");
+        xmpp_stanza_t *text = xmpp_stanza_new(ctx);
+        xmpp_stanza_set_text(text, strdup(passwd));
+        xmpp_stanza_add_child(pass, text);
+        xmpp_stanza_add_child(x, pass);
+        xmpp_stanza_release(text);
+        xmpp_stanza_release(pass);
+    }
+
     xmpp_stanza_add_child(presence, x);
     xmpp_stanza_release(x);
 
diff --git a/src/xmpp/stanza.h b/src/xmpp/stanza.h
index 471a9f76..28f12a32 100644
--- a/src/xmpp/stanza.h
+++ b/src/xmpp/stanza.h
@@ -158,7 +158,7 @@ xmpp_stanza_t* stanza_create_message(xmpp_ctx_t *ctx,
     const char * const message, const char * const state);
 
 xmpp_stanza_t* stanza_create_room_join_presence(xmpp_ctx_t * const ctx,
-    const char * const full_room_jid);
+    const char * const full_room_jid, const char * const passwd);
 
 xmpp_stanza_t* stanza_create_room_newnick_presence(xmpp_ctx_t *ctx,
     const char * const full_room_jid);
diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h
index fdbcb500..3ef9c93c 100644
--- a/src/xmpp/xmpp.h
+++ b/src/xmpp/xmpp.h
@@ -114,7 +114,7 @@ GSList* (*presence_get_subscription_requests)(void);
 gint (*presence_sub_request_count)(void);
 void (*presence_reset_sub_request_search)(void);
 char * (*presence_sub_request_find)(char * search_str);
-void (*presence_join_room)(Jid *jid);
+void (*presence_join_room)(Jid *jid, char * passwd);
 void (*presence_change_room_nick)(const char * const room, const char * const nick);
 void (*presence_leave_chat_room)(const char * const room_jid);
 void (*presence_update)(resource_presence_t status, const char * const msg,