use-otr-v4.diff
changeset 87 78238d26911a
parent 86 ac5fed257211
child 88 0a87df8ad9c1
--- a/use-otr-v4.diff	Wed May 15 13:32:42 2013 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,604 +0,0 @@
-# HG changeset patch
-# Parent 1b31bdb72d83850b146a0e1e135eba35bad73d29
-Switch to libotr v4 API
-
-diff -r 1b31bdb72d83 mcabber/configure.ac
---- a/mcabber/configure.ac	Sun Jan 13 04:35:32 2013 +0200
-+++ b/mcabber/configure.ac	Fri Jan 18 11:23:47 2013 +0200
-@@ -183,16 +183,26 @@
- 
- # Check for otr
- AC_ARG_ENABLE(otr,
--              AC_HELP_STRING([--enable-otr],
--                             [enable OTR (Off-the-Record) messaging support]),
--              enable_otr=$enableval, otr="")
-+    AC_HELP_STRING([--enable-otr],
-+                   [enable OTR (Off-the-Record) messaging support]),
-+    enable_otr=$enableval,
-+    otr="")
- if test "x$enable_otr" = "xyes"; then
--  # Look for libgcrypt and libotr
--  AM_PATH_LIBGCRYPT(1.2.2, [
--          AM_PATH_LIBOTR(3.1.0, ,
--                         AC_MSG_ERROR(libotr 3.1.0 or newer is required.))
--      ], AC_MSG_ERROR(libgcrypt 1.2.2 or newer is required.)
--  )
-+    # Look for libgcrypt and libotr
-+    AM_PATH_LIBGCRYPT(1.2.2, [
-+        AM_PATH_LIBOTR(4.0.0, [
-+            AC_DEFINE([HAVE_LIBOTR], 1, [Define if you use libotr])
-+        ], [
-+            AM_PATH_LIBOTR(3.1.0, [
-+                AC_DEFINE([HAVE_LIBOTR], 1, [Define if you use libotr])
-+                AC_DEFINE([HAVE_LIBOTR3], 1, [Define if you use libotr v3])
-+            ], [
-+                AC_MSG_ERROR(libotr 3.1.0 or newer is required.)
-+            ])
-+        ])
-+    ], [
-+        AC_MSG_ERROR(libgcrypt 1.2.2 or newer is required.)
-+    ])
- fi
- 
- # Check for Enchant stuff
-@@ -289,3 +299,4 @@
-                  mcabber.pc
-                  Makefile])
- AC_OUTPUT
-+dnl vim: set expandtab cindent cinoptions=>2\:2(0 sw=2 ts=2:  For Vim users...
-diff -r 1b31bdb72d83 mcabber/mcabber/otr.c
---- a/mcabber/mcabber/otr.c	Sun Jan 13 04:35:32 2013 +0200
-+++ b/mcabber/mcabber/otr.c	Fri Jan 18 11:23:47 2013 +0200
-@@ -56,6 +56,20 @@
-                                          const char *protocol,
-                                          const char *recipient,
-                                          const char *message);
-+static void       cb_update_context_list(void *opdata);
-+static void       cb_new_fingerprint    (void *opdata, OtrlUserState us,
-+                                         const char *accountname,
-+                                         const char *protocol,
-+                                         const char *username,
-+                                         unsigned char fingerprint[20]);
-+static void       cb_write_fingerprints (void *opdata);
-+static void       cb_gone_secure        (void *opdata, ConnContext *context);
-+static void       cb_gone_insecure      (void *opdata, ConnContext *context);
-+static void       cb_still_secure       (void *opdata, ConnContext *context,
-+                                         int is_reply);
-+static int        cb_max_message_size   (void *opdata, ConnContext *context);
-+
-+#ifdef HAVE_LIBOTR3
- static void       cb_notify             (void *opdata,
-                                          OtrlNotifyLevel level,
-                                          const char *accountname,
-@@ -69,22 +83,26 @@
-                                          const char *protocol,
-                                          const char *username,
-                                          const char *msg);
--static void       cb_update_context_list(void *opdata);
- static const char *cb_protocol_name     (void *opdata, const char *protocol);
- static void       cb_protocol_name_free (void *opdata,
-                                          const char *protocol_name);
--static void       cb_new_fingerprint    (void *opdata, OtrlUserState us,
--                                         const char *accountname,
--                                         const char *protocol,
--                                         const char *username,
--                                         unsigned char fingerprint[20]);
--static void       cb_write_fingerprints (void *opdata);
--static void       cb_gone_secure        (void *opdata, ConnContext *context);
--static void       cb_gone_insecure      (void *opdata, ConnContext *context);
--static void       cb_still_secure       (void *opdata, ConnContext *context,
--                                         int is_reply);
- static void       cb_log_message        (void *opdata, const char *message);
--static int        cb_max_message_size   (void *opdata, ConnContext *context);
-+
-+static void       otr_handle_smp_tlvs   (OtrlTLV *tlvs, ConnContext *ctx);
-+#else /* HAVE_LIBOTR3 */
-+static char *tagfile = NULL;
-+static guint otr_timer_source = 0;
-+
-+static void       cb_handle_smp_event   (void *opdata, OtrlSMPEvent event,
-+                                         ConnContext *context, unsigned short percent,
-+                                         char *question);
-+static void       cb_handle_msg_event   (void *opdata, OtrlMessageEvent event,
-+                                         ConnContext *context, const char *message,
-+                                         gcry_error_t err);
-+static void       cb_create_instag      (void *opdata, const char *accountname,
-+                                         const char *protocol);
-+static void       cb_timer_control      (void *opdata, unsigned int interval);
-+#endif /* HAVE_LIBOTR3 */
- 
- static OtrlMessageAppOps ops =
- {
-@@ -92,26 +110,44 @@
-   cb_create_privkey,
-   cb_is_logged_in,
-   cb_inject_message,
-+#ifdef HAVE_LIBOTR3
-   cb_notify,
-   cb_display_otr_message,
-+#endif
-   cb_update_context_list,
-+#ifdef HAVE_LIBOTR3
-   cb_protocol_name,
-   cb_protocol_name_free,
-+#endif
-   cb_new_fingerprint,
-   cb_write_fingerprints,
-   cb_gone_secure,
-   cb_gone_insecure,
-   cb_still_secure,
-+#ifdef HAVE_LIBOTR3
-   cb_log_message,
-+#endif
-   cb_max_message_size,
--  NULL, /*account_name*/
--  NULL  /*account_name_free*/
-+  NULL, /* account_name */
-+  NULL, /* account_name_free */
-+#ifndef HAVE_LIBOTR3
-+  NULL, /* received_symkey */
-+  NULL, /* otr_error_message */
-+  NULL, /* otr_error_message_free */
-+  NULL, /* resent_msg_prefix */
-+  NULL, /* resent_msg_prefix_free */
-+  cb_handle_smp_event,
-+  cb_handle_msg_event,
-+  cb_create_instag,
-+  NULL, /* convert_msg */
-+  NULL, /* convert_free */
-+  cb_timer_control,
-+#endif
- };
- 
- static void otr_message_disconnect(ConnContext *ctx);
- static ConnContext *otr_get_context(const char *buddy);
- static void otr_startstop(const char *buddy, int start);
--static void otr_handle_smp_tlvs(OtrlTLV *tlvs, ConnContext *ctx);
- 
- static char *otr_get_dir(void);
- 
-@@ -135,7 +171,6 @@
-   account = jidtodisp(fjid);
-   keyfile = g_strdup_printf("%s%s.key", root, account);
-   fprfile = g_strdup_printf("%s%s.fpr", root, account);
--  g_free(root);
- 
-   if (otrl_privkey_read(userstate, keyfile)){
-     scr_LogPrint(LPRINT_LOGNORM, "Could not read OTR key from %s", keyfile);
-@@ -145,6 +180,14 @@
-     scr_LogPrint(LPRINT_LOGNORM, "Could not read OTR fingerprints from %s",
-                  fprfile);
-   }
-+#ifndef HAVE_LIBOTR3
-+  tagfile = g_strdup_printf("%s%s.tag", root, account);
-+  if (otrl_instag_read(userstate, tagfile)) {
-+    scr_LogPrint(LPRINT_LOGNORM, "Could not read OTR instance tag from %s", tagfile);
-+    cb_create_instag(NULL, account, OTR_PROTOCOL_NAME);
-+  }
-+#endif
-+  g_free(root);
- }
- 
- void otr_terminate(void)
-@@ -154,6 +197,13 @@
-   if (!otr_is_enabled)
-     return;
- 
-+#ifndef HAVE_LIBOTR3
-+  if (otr_timer_source > 0) {
-+    g_source_remove (otr_timer_source);
-+    otr_timer_source = 0;
-+  }
-+#endif
-+
-   for (ctx = userstate->context_root; ctx; ctx = ctx->next)
-     if (ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED)
-       otr_message_disconnect(ctx);
-@@ -175,6 +225,12 @@
-   userstate = NULL;
-   g_free(keyfile);
-   keyfile = NULL;
-+  g_free(fprfile);
-+  fprfile = NULL;
-+#ifndef HAVE_LIBOTR3
-+  g_free(tagfile);
-+  tagfile = NULL;
-+#endif
- }
- 
- static char *otr_get_dir(void)
-@@ -206,7 +262,12 @@
- 
-   mc_strtolower(lowcasebuddy);
-   ctx = otrl_context_find(userstate, lowcasebuddy, account, OTR_PROTOCOL_NAME,
-+#ifdef HAVE_LIBOTR3
-                           1, &null, NULL, NULL);
-+#else
-+                          // INSTAG XXX
-+                          OTRL_INSTAG_BEST, 1, &null, NULL, NULL);
-+#endif
-   g_free(lowcasebuddy);
-   return ctx;
- }
-@@ -216,7 +277,12 @@
-   if (ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED)
-     cb_gone_insecure(NULL, ctx);
-   otrl_message_disconnect(userstate, &ops, NULL, ctx->accountname,
-+#ifdef HAVE_LIBOTR3
-                           ctx->protocol, ctx->username);
-+#else
-+                          // INSTAG XXX
-+                          ctx->protocol, ctx->username, OTRL_INSTAG_BEST);
-+#endif
- }
- 
- static void otr_startstop(const char *buddy, int start)
-@@ -283,6 +349,8 @@
-   cb_write_fingerprints(NULL);
- }
- 
-+#ifdef HAVE_LIBOTR3
-+
- static void otr_handle_smp_tlvs(OtrlTLV *tlvs, ConnContext *ctx)
- {
-   OtrlTLV *tlv = NULL;
-@@ -354,6 +422,130 @@
-   }
- }
- 
-+#else /* HAVE_LIBOTR3 */
-+
-+static void cb_handle_smp_event(void *opdata, OtrlSMPEvent event,
-+                                ConnContext *context, unsigned short percent,
-+                                char *question)
-+{
-+  const char *msg = NULL;
-+  char *freeme = NULL;
-+  switch (event) {
-+    case OTRL_SMPEVENT_ASK_FOR_SECRET:
-+      msg = freeme = g_strdup_printf("OTR: Socialist Millionaires' Protocol: "
-+                                     "Received SMP Initiation.\n"
-+                                     "Answer with /otr smpr %s $secret",
-+                                     context->username);
-+      break;
-+    case OTRL_SMPEVENT_ASK_FOR_ANSWER:
-+      msg = freeme = g_strdup_printf("OTR: Socialist Millionaires' Protocol: "
-+                                     "Received SMP Initiation.\n"
-+                                     "Answer with /otr smpr %s $secret\n"
-+                                     "Question: %s", context->username,
-+                                     question);
-+      break;
-+    case OTRL_SMPEVENT_CHEATED:
-+      msg = "OTR: Socialist Millionaires' Protocol: Correspondent cancelled negotiation!";
-+      otrl_message_abort_smp(userstate, &ops, opdata, context);
-+      break;
-+    case OTRL_SMPEVENT_IN_PROGRESS:
-+      scr_log_print(LPRINT_DEBUG, "OTR: Socialist Millionaires' Protocol: "
-+                                  "Negotiation is in pogress...");
-+      break;
-+    case OTRL_SMPEVENT_SUCCESS:
-+      msg = "OTR: Socialist Millionaires' Protocol: Success!";
-+      break;
-+    case OTRL_SMPEVENT_FAILURE:
-+      msg = "OTR: Socialist Millionaires' Protocol: Failure.";
-+      break;
-+    case OTRL_SMPEVENT_ABORT:
-+      msg = "OTR: Socialist Millionaires' Protocol: Aborted.";
-+      break;
-+    case OTRL_SMPEVENT_ERROR:
-+      msg = "OTR: Socialist Millionaires' Protocol: Error occured, aborting negotiations!";
-+      otrl_message_abort_smp(userstate, &ops, opdata, context);
-+      break;
-+    default:
-+      break;
-+  }
-+
-+  if (msg) {
-+    scr_WriteIncomingMessage(context->username, msg, 0, HBB_PREFIX_INFO, 0);
-+    g_free(freeme);
-+  }
-+}
-+
-+static void cb_handle_msg_event(void *opdata, OtrlMessageEvent event,
-+                                ConnContext *context, const char *message,
-+                                gcry_error_t err)
-+{
-+  const char *msg = NULL;
-+  char *freeme = NULL;
-+  switch (event) {
-+    case OTRL_MSGEVENT_ENCRYPTION_REQUIRED:
-+      msg = "OTR: Policy requires encryption on message!";
-+      break;
-+    case OTRL_MSGEVENT_ENCRYPTION_ERROR:
-+      msg = "OTR: Encryption error! Message not sent.";
-+      break;
-+    case OTRL_MSGEVENT_CONNECTION_ENDED:
-+      msg = "OTR: Connection closed by remote end, message lost. "
-+            "Close or refresh connection.";
-+      break;
-+    case OTRL_MSGEVENT_SETUP_ERROR:
-+      // FIXME
-+      msg = freeme = g_strdup_printf("OTR: Error setting up private conversation: %u",
-+                                     err);
-+      break;
-+    case OTRL_MSGEVENT_MSG_REFLECTED:
-+      msg = "OTR: Received own OTR message!";
-+      break;
-+    case OTRL_MSGEVENT_MSG_RESENT:
-+      msg = "OTR: Previous message was resent.";
-+      break;
-+    case OTRL_MSGEVENT_RCVDMSG_NOT_IN_PRIVATE:
-+      msg = "OTR: Received encrypted message, but connection is not established " \
-+            "yet! Message lost.";
-+      break;
-+    case OTRL_MSGEVENT_RCVDMSG_UNREADABLE:
-+      msg = "OTR: Unable to read incoming message!";
-+      break;
-+    case OTRL_MSGEVENT_RCVDMSG_MALFORMED:
-+      msg = "OTR: Malformed incoming message!";
-+      break;
-+    case OTRL_MSGEVENT_LOG_HEARTBEAT_RCVD:
-+      scr_log_print(LPRINT_DEBUG, "OTR: Received heartbeat.");
-+      break;
-+    case OTRL_MSGEVENT_LOG_HEARTBEAT_SENT:
-+      scr_log_print(LPRINT_DEBUG, "OTR: Sent heartbeat.");
-+      break;
-+    case OTRL_MSGEVENT_RCVDMSG_GENERAL_ERR:
-+      msg = freeme = g_strdup_printf("OTR: Received general otr error: %s",
-+                                     message);
-+      break;
-+    case OTRL_MSGEVENT_RCVDMSG_UNENCRYPTED:
-+      msg = freeme = g_strdup_printf("OTR: Received unencrypted message: %s",
-+                                     message);
-+      break;
-+    case OTRL_MSGEVENT_RCVDMSG_UNRECOGNIZED:
-+      msg = "OTR: Unable to determine type of received OTR message!";
-+      break;
-+    case OTRL_MSGEVENT_RCVDMSG_FOR_OTHER_INSTANCE:
-+      // XXX
-+      scr_log_print(LPRINT_DEBUG, "OTR: Received message for other instance.");
-+      break;
-+    default:
-+      break;
-+  }
-+
-+  if (msg) {
-+    scr_WriteIncomingMessage(context->username, msg, 0, HBB_PREFIX_INFO, 0);
-+    g_free(freeme);
-+  }
-+}
-+
-+#endif /* HAVE_LIBOTR3 */
-+
- /*
-  * returns whether a otr_message was received
-  * sets *otr_data to NULL, when it was an internal otr message
-@@ -362,8 +554,10 @@
- {
-   int ignore_message;
-   char *newmessage = NULL;
-+#ifdef HAVE_LIBOTR3
-   OtrlTLV *tlvs = NULL;
-   OtrlTLV *tlv = NULL;
-+#endif
-   ConnContext *ctx;
- 
-   ctx = otr_get_context(buddy);
-@@ -371,8 +565,8 @@
-   ignore_message = otrl_message_receiving(userstate, &ops, NULL,
-                                           ctx->accountname, ctx->protocol,
-                                           ctx->username, *otr_data,
--                                          &newmessage, &tlvs,NULL, NULL);
--
-+#ifdef HAVE_LIBOTR3
-+                                          &newmessage, &tlvs, NULL, NULL);
- 
-   tlv = otrl_tlv_find(tlvs, OTRL_TLV_DISCONNECTED);
-   if (tlv) {
-@@ -387,6 +581,9 @@
- 
-   if (tlvs != NULL)
-     otrl_tlv_free(tlvs);
-+#else
-+                                          &newmessage, NULL, NULL, NULL, NULL);
-+#endif
- 
-   if (ignore_message)
-     *otr_data = NULL;
-@@ -410,13 +607,27 @@
- 
-   if (ctx->msgstate == OTRL_MSGSTATE_PLAINTEXT)
-     err = otrl_message_sending(userstate, &ops, NULL, ctx->accountname,
-+#ifdef HAVE_LIBOTR3
-                                ctx->protocol, ctx->username, *msg, NULL,
-                                &newmessage, NULL, NULL);
-+#else
-+                               // INSTAG XXX
-+                               ctx->protocol, ctx->username, OTRL_INSTAG_BEST,
-+                               *msg, NULL, &newmessage, OTRL_FRAGMENT_SEND_SKIP,
-+                               NULL, NULL, NULL);
-+#endif
-   else {
-     htmlmsg = html_escape(*msg);
-     err = otrl_message_sending(userstate, &ops, NULL, ctx->accountname,
-+#ifdef HAVE_LIBOTR3
-                                ctx->protocol, ctx->username, htmlmsg, NULL,
-                                &newmessage, NULL, NULL);
-+#else
-+                               // INSTAG XXX
-+                               ctx->protocol, ctx->username, OTRL_INSTAG_BEST,
-+                               htmlmsg, NULL, &newmessage, OTRL_FRAGMENT_SEND_SKIP,
-+                               NULL, NULL, NULL);
-+#endif
-     g_free(htmlmsg);
-   }
- 
-@@ -648,42 +859,6 @@
-                   LM_MESSAGE_SUB_TYPE_NOT_SET, NULL);
- }
- 
--/* Display a notification message for a particular
-- * accountname / protocol / username conversation. */
--static void cb_notify(void *opdata, OtrlNotifyLevel level,
--                      const char *accountname, const char *protocol,
--                      const char *username, const char *title,
--                      const char *primary, const char *secondary)
--{
--  char *type;
--  char *sbuf = NULL;
--  switch (level) {
--    case OTRL_NOTIFY_ERROR:   type = "error";   break;
--    case OTRL_NOTIFY_WARNING: type = "warning"; break;
--    case OTRL_NOTIFY_INFO:    type = "info";    break;
--    default:                  type = "unknown";
--  }
--  sbuf = g_strdup_printf("OTR %s:%s\n%s\n%s",type,title, primary, secondary);
--  scr_WriteIncomingMessage(username, sbuf, 0, HBB_PREFIX_INFO, 0);
--  g_free(sbuf);
--}
--
--/* Display an OTR control message for a particular
-- * accountname / protocol / username conversation.  Return 0 if you are able
-- * to successfully display it.  If you return non-0 (or if this
-- * function is NULL), the control message will be displayed inline,
-- * as a received message, or else by using the above notify()
-- * callback. */
--static int cb_display_otr_message(void *opdata, const char *accountname,
--                                  const char *protocol, const char *username,
--                                  const char *msg)
--{
--  char *strippedmsg = html_strip(msg);
--  scr_WriteIncomingMessage(username, strippedmsg, 0, HBB_PREFIX_INFO, 0);
--  g_free(strippedmsg);
--  return 0;
--}
--
- /* When the list of ConnContexts changes (including a change in
-  * state), this is called so the UI can be updated. */
- static void cb_update_context_list(void *opdata)
-@@ -692,19 +867,6 @@
-    * then use this function (?!)*/
- }
- 
--/* Return a newly allocated string containing a human-friendly name
-- * for the given protocol id */
--static const char *cb_protocol_name(void *opdata, const char *protocol)
--{
--  return protocol;
--}
--
--/* Deallocate a string allocated by protocol_name */
--static void cb_protocol_name_free (void *opdata, const char *protocol_name)
--{
--  /* We didn't allocated memory, so we don't have to free anything :p */
--}
--
- /* A new fingerprint for the given user has been received. */
- static void cb_new_fingerprint(void *opdata, OtrlUserState us,
-                                const char *accountname, const char *protocol,
-@@ -748,12 +910,92 @@
-                            HBB_PREFIX_INFO, 0);
- }
- 
-+#ifdef HAVE_LIBOTR3
-+
-+/* Display a notification message for a particular
-+ * accountname / protocol / username conversation. */
-+static void cb_notify(void *opdata, OtrlNotifyLevel level,
-+                      const char *accountname, const char *protocol,
-+                      const char *username, const char *title,
-+                      const char *primary, const char *secondary)
-+{
-+  char *type;
-+  char *sbuf = NULL;
-+  switch (level) {
-+    case OTRL_NOTIFY_ERROR:   type = "error";   break;
-+    case OTRL_NOTIFY_WARNING: type = "warning"; break;
-+    case OTRL_NOTIFY_INFO:    type = "info";    break;
-+    default:                  type = "unknown";
-+  }
-+  sbuf = g_strdup_printf("OTR %s:%s\n%s\n%s",type,title, primary, secondary);
-+  scr_WriteIncomingMessage(username, sbuf, 0, HBB_PREFIX_INFO, 0);
-+  g_free(sbuf);
-+}
-+
-+/* Display an OTR control message for a particular
-+ * accountname / protocol / username conversation.  Return 0 if you are able
-+ * to successfully display it.  If you return non-0 (or if this
-+ * function is NULL), the control message will be displayed inline,
-+ * as a received message, or else by using the above notify()
-+ * callback. */
-+static int cb_display_otr_message(void *opdata, const char *accountname,
-+                                  const char *protocol, const char *username,
-+                                  const char *msg)
-+{
-+  char *strippedmsg = html_strip(msg);
-+  scr_WriteIncomingMessage(username, strippedmsg, 0, HBB_PREFIX_INFO, 0);
-+  g_free(strippedmsg);
-+  return 0;
-+}
-+
-+/* Return a newly allocated string containing a human-friendly name
-+ * for the given protocol id */
-+static const char *cb_protocol_name(void *opdata, const char *protocol)
-+{
-+  return protocol;
-+}
-+
-+/* Deallocate a string allocated by protocol_name */
-+static void cb_protocol_name_free (void *opdata, const char *protocol_name)
-+{
-+  /* We didn't allocated memory, so we don't have to free anything :p */
-+}
-+
- /* Log a message.  The passed message will end in "\n". */
- static void cb_log_message(void *opdata, const char *message)
- {
-   scr_LogPrint(LPRINT_DEBUG, "OTR: %s", message);
- }
- 
-+#else /* HAVE_LIBOTR3 */
-+
-+/* Generate unique instance tag for account. */
-+static void cb_create_instag(void *opdata, const char *accountname,
-+                             const char *protocol)
-+{
-+  if (otrl_instag_generate(userstate, tagfile, accountname, protocol)) {
-+    scr_LogPrint(LPRINT_LOGNORM, "OTR instance tag generation failed!");
-+  }
-+}
-+
-+static gboolean otr_timer_cb(gpointer userdata)
-+{
-+  otrl_message_poll(userstate, &ops, userdata);
-+  return TRUE;
-+}
-+
-+static void cb_timer_control(void *opdata, unsigned int interval)
-+{
-+  if (otr_timer_source > 0) {
-+    g_source_remove(otr_timer_source);
-+    otr_timer_source = 0;
-+  }
-+  if (interval > 0)
-+    otr_timer_source = g_timeout_add_seconds(interval, otr_timer_cb, opdata);
-+}
-+
-+#endif /* HAVE_LIBOTR3 */
-+
- /* Find the maximum message size supported by this protocol. */
- static int cb_max_message_size(void *opdata, ConnContext *context)
- {
-diff -r 1b31bdb72d83 mcabber/mcabber/otr.h
---- a/mcabber/mcabber/otr.h	Sun Jan 13 04:35:32 2013 +0200
-+++ b/mcabber/mcabber/otr.h	Fri Jan 18 11:23:47 2013 +0200
-@@ -5,6 +5,9 @@
- 
- #ifdef HAVE_LIBOTR
- 
-+#ifndef HAVE_LIBOTR3
-+# include <libotr/instag.h>
-+#endif
- #include <libotr/proto.h>
- #include <libotr/message.h>
- #include <libotr/privkey.h>