From 5d9b814f90e8db92d13874d276187213d3feabfd Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 15 Oct 2013 13:51:39 -0400 Subject: [PATCH 4/4] IRC_Command: prevent user of sending commands for which we have proper API --- extensions/Connection_Interface_IRC_Command1.xml | 6 +++ src/idle-connection.c | 53 ++++++++++++++++++++++++ tests/twisted/irc-command.py | 5 +++ 3 files changed, 64 insertions(+) diff --git a/extensions/Connection_Interface_IRC_Command1.xml b/extensions/Connection_Interface_IRC_Command1.xml index 0d75a4d..2166fc9 100644 --- a/extensions/Connection_Interface_IRC_Command1.xml +++ b/extensions/Connection_Interface_IRC_Command1.xml @@ -39,6 +39,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + The connection manager MAY raise this error for commands that + have a more appropriate D-Bus API. + + diff --git a/src/idle-connection.c b/src/idle-connection.c index 46fb3d6..d99ed91 100644 --- a/src/idle-connection.c +++ b/src/idle-connection.c @@ -1571,12 +1571,65 @@ static void _renaming_iface_init(gpointer g_iface, gpointer iface_data) { #undef IMPLEMENT } +typedef struct +{ + const gchar *command; + const gchar *error_msg; +} IrcCommandCheck; + +static const IrcCommandCheck commands[] = { + { "INVITE", "Use the Group API on room channels" }, + { "JOIN", "Use the Group API on room channels" }, + { "KICK", "Use the Group API on room channels" }, + { "PART", "Use the Group API on room channels" }, + { "PRIVMSG", "Use text channels" }, + { "QUIT", "Disconnect the connection" }, + { "TOPIC", "Use the Subject API on room channels" }, + { NULL, NULL } +}; + +/* Return FALSE and set @error if @command is not meant to be used with + * IRC_Command.Send() as we have proper Telepathy API for it. */ +static gboolean +check_irc_command (IdleConnection *self, + const gchar *full_command, + GError **error) +{ + gchar **splitted; + guint i; + + splitted = g_strsplit (full_command, " ", 0); + + for (i = 0; commands[i].command != NULL; i++) + { + if (g_ascii_strcasecmp (splitted[0], commands[i].command) == 0) + { + g_set_error_literal (error, TP_ERROR, TP_ERROR_INVALID_ARGUMENT, + commands[i].error_msg); + + g_strfreev (splitted); + return FALSE; + } + } + + g_strfreev (splitted); + return TRUE; +} + static void idle_connection_irc_command_send (IdleSvcConnectionInterfaceIRCCommand1 *iface, const gchar *command, DBusGMethodInvocation *context) { IdleConnection *self = IDLE_CONNECTION(iface); + GError *error = NULL; + + if (!check_irc_command (self, command, &error)) + { + dbus_g_method_return_error (context, error); + g_error_free (error); + return; + } _send_with_priority (self, command, SERVER_CMD_NORMAL_PRIORITY); diff --git a/tests/twisted/irc-command.py b/tests/twisted/irc-command.py index f27dbb1..6ec27da 100644 --- a/tests/twisted/irc-command.py +++ b/tests/twisted/irc-command.py @@ -20,6 +20,11 @@ def test(q, bus, conn, stream): q.expect('dbus-return', method='Send') + # We are not supposed to use this API to send messages + call_async(q, irc_cmd, 'Send', 'PRIVMSG badger :oh hi') + + q.expect('dbus-error', method='Send', name=cs.INVALID_ARGUMENT) + call_async(q, conn, 'Disconnect') if __name__ == '__main__': -- 1.8.3.1