[next] telepathy-idle: IRC_Command: prevent user of sending commands for which we have proper API

Guillaume Desmottes gdesmott at kemper.freedesktop.org
Thu Jan 30 02:29:35 PST 2014


Module: telepathy-idle
Branch: next
Commit: 5d9b814f90e8db92d13874d276187213d3feabfd
URL:    http://cgit.freedesktop.org/telepathy/telepathy-idle/commit/?id=5d9b814f90e8db92d13874d276187213d3feabfd

Author: Guillaume Desmottes <guillaume.desmottes at collabora.co.uk>
Date:   Tue Oct 15 13:51:39 2013 -0400

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.</
       <tp:possible-errors>
         <tp:error name="org.freedesktop.Telepathy.Error.Disconnected"/>
         <tp:error name="org.freedesktop.Telepathy.Error.NetworkError"/>
+        <tp:error name="org.freedesktop.Telepathy.Error.InvalidArgument">
+          <tp:docstring>
+            The connection manager MAY raise this error for commands that
+            have a more appropriate D-Bus API.
+          </tp:docstring>
+        </tp:error>
       </tp:possible-errors>
     </method>
     <tp:docstring>
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__':



More information about the telepathy-commits mailing list