Changeset 2c81d15


Ignore:
Timestamp:
2015-05-15T03:20:42Z (5 years ago)
Author:
dequis <dx@…>
Branches:
master
Children:
9740ce9
Parents:
a6bed1a
git-author:
dequis <dx@…> (05-05-15 15:06:51)
git-committer:
dequis <dx@…> (15-05-15 03:20:42)
Message:

otr: Fix 'otr info' display problems

Patch by 'anonymous' from trac ticket 1150.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • otr.c

    ra6bed1a r2c81d15  
    193193void show_general_otr_info(irc_t *irc);
    194194
    195 /* show info about a given OTR context */
    196 void show_otr_context_info(irc_t *irc, ConnContext *ctx);
     195/* show info about a given OTR context and subcontexts/instances. bestctx
     196   may be either NULL or preferred destination context (this is hilighted
     197   in the output as being the target for a message) */
     198void show_otr_context_info(irc_t *irc, ConnContext *ctx, ConnContext *bestctx);
    197199
    198200/* show the list of fingerprints associated with a given context */
     
    11021104                char *arg = g_strdup(args[1]);
    11031105                char *myhandle, *handle = NULL, *protocol;
    1104                 ConnContext *ctx;
     1106                ConnContext *bestctx = NULL, *ctx;
    11051107
    11061108                /* interpret arg as 'user/protocol/account' if possible */
     
    11351137                                return;
    11361138                        }
     1139                        /* This does no harm if it returns NULL */
     1140                        bestctx = otrl_context_find(irc->otr->us, u->bu->handle, u->bu->ic->acc->user,
     1141                                                    u->bu->ic->acc->prpl->name, OTRL_INSTAG_BEST, 0, NULL, NULL, NULL);
    11371142                }
    11381143
    11391144                /* show how we resolved the (nick) argument, if we did */
    11401145                if (handle != arg) {
    1141                         irc_rootmsg(irc, "%s is %s/%s; we are %s/%s to them", args[1],
    1142                                     ctx->username, ctx->protocol, ctx->accountname, ctx->protocol);
    1143                 }
    1144                 show_otr_context_info(irc, ctx);
     1146                        irc_rootmsg(irc, "%s:", args[1]);
     1147                        irc_rootmsg(irc, "  they are: %s/%s", ctx->username, ctx->protocol);
     1148                        irc_rootmsg(irc, "  we are: %s/%s", ctx->accountname, ctx->protocol);
     1149                }
     1150                show_otr_context_info(irc, ctx, bestctx);
    11451151                g_free(arg);
    11461152        }
     
    15491555        int count = 0;
    15501556
    1551         for (fp = &ctx->fingerprint_root; fp; fp = fp->next) {
     1557        /* Is this a subcontext? If so, only list the active fingerprint */
     1558        if (ctx->m_context != ctx) {
     1559                fp = ctx->active_fingerprint;
     1560        } else {
     1561                fp = &ctx->fingerprint_root;
     1562        }
     1563
     1564        while (fp) {
    15521565                if (!fp->fingerprint) {
     1566                        fp = fp->next;
    15531567                        continue;
    15541568                }
     
    15611575                }
    15621576                if (fp == ctx->active_fingerprint) {
    1563                         irc_rootmsg(irc, "    \x02%s (%s)\x02", human, trust);
     1577                        irc_rootmsg(irc, "      \x02%s (%s)\x02", human, trust);
    15641578                } else {
    1565                         irc_rootmsg(irc, "    %s (%s)", human, trust);
    1566                 }
     1579                        irc_rootmsg(irc, "      %s (%s)", human, trust);
     1580                }
     1581
     1582                /* Break if this is a subcontext - we only print active fp */
     1583                if (ctx->m_context != ctx) {
     1584                        break;
     1585                }
     1586                fp = fp->next;
    15671587        }
    15681588        if (count == 0) {
    1569                 irc_rootmsg(irc, "    (none)");
     1589                irc_rootmsg(irc, "      (none)");
    15701590        }
    15711591}
     
    17551775        /* list all contexts */
    17561776        /* XXX remove this, or split off as its own command */
    1757         /* XXX show instags? */
    17581777        irc_rootmsg(irc, "%s", "");
    17591778        irc_rootmsg(irc, "\x1f" "connection contexts:\x1f (bold=currently encrypted)");
    1760         for (ctx = irc->otr->us->context_root; ctx; ctx = ctx->next) { \
     1779
     1780        ctx = irc->otr->us->context_root;
     1781        while (ctx) {
     1782                ConnContext *subctx;
    17611783                irc_user_t *u;
    17621784                char *userstring;
     1785                char encrypted = 0;
    17631786
    17641787                u = peeruser(irc, ctx->username, ctx->protocol);
     
    17711794                }
    17721795
    1773                 if (ctx->msgstate == OTRL_MSGSTATE_ENCRYPTED) {
     1796                subctx = ctx;
     1797                while (subctx && subctx->m_context == ctx) {
     1798                        if (subctx->msgstate == OTRL_MSGSTATE_ENCRYPTED) {
     1799                                encrypted = 1;
     1800                        }
     1801                        subctx = subctx->next;
     1802                }
     1803
     1804                if(encrypted) {
    17741805                        irc_rootmsg(irc, "  \x02%s\x02", userstring);
    17751806                } else {
     
    17771808                }
    17781809
     1810                /* Skip subcontexts/instances from output */
     1811                ctx = subctx;
     1812
    17791813                g_free(userstring);
    17801814        }
     1815
    17811816        if (ctx == irc->otr->us->context_root) {
    17821817                irc_rootmsg(irc, "  (none)");
     
    17841819}
    17851820
    1786 void show_otr_context_info(irc_t *irc, ConnContext *ctx)
    1787 {
    1788         // XXX show all instags/subcontexts
    1789 
    1790         switch (ctx->otr_offer) {
    1791         case OFFER_NOT:
    1792                 irc_rootmsg(irc, "  otr offer status: none sent");
    1793                 break;
    1794         case OFFER_SENT:
    1795                 irc_rootmsg(irc, "  otr offer status: awaiting reply");
    1796                 break;
    1797         case OFFER_ACCEPTED:
    1798                 irc_rootmsg(irc, "  otr offer status: accepted our offer");
    1799                 break;
    1800         case OFFER_REJECTED:
    1801                 irc_rootmsg(irc, "  otr offer status: ignored our offer");
    1802                 break;
    1803         default:
    1804                 irc_rootmsg(irc, "  otr offer status: %d", ctx->otr_offer);
    1805         }
    1806 
    1807         switch (ctx->msgstate) {
    1808         case OTRL_MSGSTATE_PLAINTEXT:
    1809                 irc_rootmsg(irc, "  connection state: cleartext");
    1810                 break;
    1811         case OTRL_MSGSTATE_ENCRYPTED:
    1812                 irc_rootmsg(irc, "  connection state: encrypted (v%d)", ctx->protocol_version);
    1813                 break;
    1814         case OTRL_MSGSTATE_FINISHED:
    1815                 irc_rootmsg(irc, "  connection state: shut down");
    1816                 break;
    1817         default:
    1818                 irc_rootmsg(irc, "  connection state: %d", ctx->msgstate);
    1819         }
    1820 
    1821         irc_rootmsg(irc, "  fingerprints: (bold=active)");
    1822         show_fingerprints(irc, ctx);
     1821void show_otr_context_info(irc_t *irc, ConnContext *ctx, ConnContext *bestctx)
     1822{
     1823        ConnContext *subctx;
     1824        int instcount = 0;
     1825
     1826        subctx = ctx;
     1827        while (subctx && subctx->m_context == ctx) {
     1828                if (subctx->m_context == subctx) {
     1829                        if (subctx == bestctx) {
     1830                                irc_rootmsg(irc, "  \x02master context (target):\x02");
     1831                        } else {
     1832                                irc_rootmsg(irc, "  master context:");
     1833                        }
     1834                        irc_rootmsg(irc, "    known fingerprints (bold = active for v1 or v2):");
     1835                } else {
     1836                        if (subctx == bestctx) {
     1837                                irc_rootmsg(irc, "  \x02instance %d (target):\x02", instcount);
     1838                        } else {
     1839                                irc_rootmsg(irc, "  instance %d:", instcount);
     1840                        }
     1841                        irc_rootmsg(irc, "    active fingerprint:");
     1842                        instcount++;
     1843                }
     1844
     1845                show_fingerprints(irc, subctx);
     1846
     1847                switch (subctx->msgstate) {
     1848                case OTRL_MSGSTATE_PLAINTEXT:
     1849                        irc_rootmsg(irc, "    connection state: cleartext");
     1850                        break;
     1851                case OTRL_MSGSTATE_ENCRYPTED:
     1852                        irc_rootmsg(irc, "    connection state: encrypted (v%d)", subctx->protocol_version);
     1853                        break;
     1854                case OTRL_MSGSTATE_FINISHED:
     1855                        irc_rootmsg(irc, "    connection state: shut down");
     1856                        break;
     1857                default:
     1858                        irc_rootmsg(irc, "    connection state: %d", subctx->msgstate);
     1859                }
     1860
     1861                subctx = subctx->next;
     1862        }
    18231863}
    18241864
Note: See TracChangeset for help on using the changeset viewer.