Changes in / [2d88d25a:2ecfe39]


Ignore:
Files:
3 added
33 edited

Legend:

Unmodified
Added
Removed
  • Makefile

    r2d88d25a r2ecfe39  
    1010
    1111# Program variables
    12 objects = account.o bitlbee.o conf.o crypting.o help.o ipc.o irc.o irc_commands.o log.o nick.o query.o root_commands.o set.o storage.o $(STORAGE_OBJS) unix.o user.o
    13 headers = account.h bitlbee.h commands.h conf.h config.h crypting.h help.h ipc.h irc.h log.h nick.h query.h set.h sock.h storage.h user.h lib/events.h lib/http_client.h lib/ini.h lib/md5.h lib/misc.h lib/proxy.h lib/sha1.h lib/ssl_client.h lib/url.h protocols/nogaim.h
     12objects = account.o bitlbee.o conf.o crypting.o help.o ipc.o irc.o irc_commands.o log.o nick.o otr.o query.o root_commands.o set.o storage.o $(STORAGE_OBJS) unix.o user.o
     13headers = account.h bitlbee.h commands.h conf.h config.h crypting.h help.h ipc.h irc.h log.h nick.h otr.h query.h set.h sock.h storage.h user.h lib/events.h lib/http_client.h lib/ini.h lib/md5.h lib/misc.h lib/proxy.h lib/sha1.h lib/ssl_client.h lib/url.h protocols/nogaim.h
    1414subdirs = lib protocols
    1515
     
    8484        mkdir -p $(DESTDIR)$(ETCDIR)
    8585        install -m 0644 motd.txt $(DESTDIR)$(ETCDIR)/motd.txt
     86        install -m 0644 welcome.txt $(DESTDIR)$(ETCDIR)/welcome.txt
    8687        install -m 0644 bitlbee.conf $(DESTDIR)$(ETCDIR)/bitlbee.conf
    8788
    8889uninstall-etc:
    8990        rm -f $(DESTDIR)$(ETCDIR)/motd.txt
     91        rm -f $(DESTDIR)$(ETCDIR)/welcome.txt
    9092        rm -f $(DESTDIR)$(ETCDIR)/bitlbee.conf
    9193        -rmdir $(DESTDIR)$(ETCDIR)
  • bitlbee.c

    r2d88d25a r2ecfe39  
    143143        log_link( LOGLVL_ERROR, LOGOUTPUT_IRC );
    144144        log_link( LOGLVL_WARNING, LOGOUTPUT_IRC );
     145    /* TODO: Remove debugging log_link's */
     146        log_link( LOGLVL_INFO, LOGOUTPUT_IRC );
     147        log_link( LOGLVL_DEBUG, LOGOUTPUT_IRC );
    145148       
    146149        return( 0 );
  • bitlbee.conf

    r2d88d25a r2ecfe39  
    7373# MotdFile = /etc/bitlbee/motd.txt
    7474
     75## WelcomeFile
     76##
     77## Specify an alternative file for the welcome message displayed when joining the
     78## control channel. Default value depends on the --etcdir argument to configure.
     79##
     80# WelcomeFile = /etc/bitlbee/welcome.txt
     81
    7582## ConfigDir
    7683##
  • bitlbee.h

    r2d88d25a r2ecfe39  
    137137#include "misc.h"
    138138#include "proxy.h"
     139#include "otr.h"
    139140
    140141typedef struct global {
     
    148149        char *helpfile;
    149150        int restart;
     151        OtrlMessageAppOps otr_ops;   /* collects interface functions required by OTR */
    150152} global_t;
    151153
  • conf.c

    r2d88d25a r2ecfe39  
    5959        conf->pidfile = g_strdup( PIDFILE );
    6060        conf->motdfile = g_strdup( ETCDIR "/motd.txt" );
     61        conf->welcomefile = g_strdup( ETCDIR "/welcome.txt" );
    6162        conf->ping_interval = 180;
    6263        conf->ping_timeout = 300;
     
    243244                                g_free( conf->motdfile );
    244245                                conf->motdfile = g_strdup( ini->value );
     246                        }
     247                        else if( g_strcasecmp( ini->key, "welcomefile" ) == 0 )
     248                        {
     249                                g_free( conf->welcomefile );
     250                                conf->welcomefile = g_strdup( ini->value );
    245251                        }
    246252                        else if( g_strcasecmp( ini->key, "account_storage" ) == 0 )
  • conf.h

    r2d88d25a r2ecfe39  
    4545        char *pidfile;
    4646        char *motdfile;
     47        char *welcomefile;
    4748        char *primary_storage;
    4849        char **migrate_storage;
  • configure

    r2d88d25a r2ecfe39  
    3030gcov=0
    3131plugins=1
     32otr=auto
    3233
    3334events=glib
     
    7071--gcov=0/1      Disable/enable test coverage reporting  $gcov
    7172--plugins=0/1   Disable/enable plugins support          $plugins
     73--otr=0/1/auto  Disable/enable OTR encryption support   $otr
    7274
    7375--events=...    Event handler (glib, libevent)          $events
     
    174176        if $PKG_CONFIG glib-2.0 --atleast-version=$GLIB_MIN_VERSION; then
    175177                cat<<EOF>>Makefile.settings
    176 EFLAGS+=`$PKG_CONFIG --libs glib-2.0 gmodule-2.0`
    177 CFLAGS+=`$PKG_CONFIG --cflags glib-2.0 gmodule-2.0`
     178EFLAGS+=`$PKG_CONFIG --libs glib-2.0 gmodule-2.0 gthread-2.0`
     179CFLAGS+=`$PKG_CONFIG --cflags glib-2.0 gmodule-2.0 gthread-2.0`
    178180EOF
    179181        else
     
    385387fi
    386388
     389if [ "$otr" = "auto" ]; then
     390        for i in /lib /usr/lib /usr/local/lib; do
     391                if [ -f $i/libotr.a ]; then
     392                        otr=1
     393                        break
     394                fi
     395        done
     396fi
     397if [ "$otr" = 0 ]; then
     398        echo '#undef WITH_OTR' >> config.h
     399else
     400        echo '#define WITH_OTR' >> config.h
     401        echo "EFLAGS+=-lotr" >> Makefile.settings
     402fi
     403
    387404echo
    388405if [ -z "$BITLBEE_VERSION" -a -d .bzr ] && type bzr > /dev/null 2> /dev/null; then
     
    504521fi
    505522
     523if [ "$otr" = "1" ]; then
     524        echo '  Off-the-Record (OTR) Messaging enabled.'
     525else
     526        echo '  Off-the-Record (OTR) Messaging disabled.'
     527fi
     528
    506529echo '  Using event handler: '$events
    507530echo '  Using SSL library: '$ssl
  • doc/README

    r2d88d25a r2ecfe39  
    4949platform. Any recent version of GLib (2.4 or higher) will work.
    5050
     51Off-the-Record encryption support will be included by default if the
     52configure script finds libotr in one of the usual places. You can pass
     53--otr=1 or --otr=0 to force it on or off, respectively.
     54
    5155These days, MSN Messenger clients have to connect to the MS Passport servers
    5256through HTTPS. BitlBee can use several SSL libraries for this: GnuTLS, NSS
     
    152156
    153157
    154 A NOTE ON ENCRYPTION
    155 ====================
     158A NOTE ON PASSWORD ENCRYPTION
     159=============================
    156160
    157161There used to be a note here about the simple obfuscation method used to
  • doc/user-guide/commands.xml

    r2d88d25a r2ecfe39  
    244244                </description>
    245245        </bitlbee-command>
     246       
     247        <bitlbee-command name="otr">
     248                <short-description>Off-the-Record encryption control</short-description>
     249                <syntax>otr &lt;subcommand&gt; [&lt;arguments&gt;]</syntax>
     250
     251                <description>
     252
     253                        <para>
     254                                Available subcommands: connect, disconnect, smp, trust, info, keygen, and forget. See <emphasis>help otr &lt;subcommand&gt;</emphasis> for more information.
     255                        </para>
     256
     257                </description>
     258               
     259                <bitlbee-command name="connect">
     260                        <syntax>otr connect &lt;nick&gt;</syntax>
     261                       
     262                        <description>
     263                       
     264                                <para>
     265                                        Attempts to establish an encrypted connection with the specified user by sending a magic string.
     266                                </para>
     267                               
     268                        </description>
     269               
     270                </bitlbee-command>
     271               
     272                <bitlbee-command name="disconnect">
     273                        <syntax>otr disconnect &lt;nick&gt;</syntax>
     274                       
     275                        <description>
     276                       
     277                                <para>
     278                                        Resets the connection with the specified user to cleartext.
     279                                </para>
     280                               
     281                        </description>
     282               
     283                </bitlbee-command>
     284               
     285                <bitlbee-command name="smp">
     286                        <syntax>otr smp &lt;nick&gt; &lt;secret&gt;</syntax>
     287                       
     288                        <description>
     289                       
     290                                <para>
     291                                        Attempts to authenticate the given user's active fingerprint via the Socialist Millionaires' Protocol.
     292                                </para>
     293                               
     294                                <para>
     295                                        If an SMP challenge has already been received from the given user, responds with the specified secret. Otherwise, a challenge for the secret will be sent. If the protocol succeeds (i.e. both parties gave the same secret), the fingerprint will be trusted.
     296                                </para>
     297                               
     298                        </description>
     299               
     300                </bitlbee-command>
     301               
     302                <bitlbee-command name="trust">
     303                        <syntax>otr trust &lt;nick&gt; &lt;fp1&gt; &lt;fp2&gt; &lt;fp3&gt; &lt;fp4&gt; &lt;fp5&gt;</syntax>
     304                       
     305                        <description>
     306                       
     307                                <para>
     308                                        Manually affirms trust in the specified fingerprint, given as five blocks of precisely eight (hexadecimal) digits each.
     309                                </para>
     310                               
     311                        </description>
     312               
     313                </bitlbee-command>
     314               
     315                <bitlbee-command name="info">
     316                        <syntax>otr info</syntax>
     317                        <syntax>otr info &lt;nick&gt;</syntax>
     318                       
     319                        <description>
     320                       
     321                                <para>
     322                                        Shows information about the OTR state. The first form lists our private keys and current OTR contexts. The second form displays information about the connection with a given user, including the list of their known fingerprints.
     323                                </para>
     324                               
     325                        </description>
     326               
     327                </bitlbee-command>
     328               
     329                <bitlbee-command name="keygen">
     330                        <syntax>otr keygen &lt;account-no&gt;</syntax>
     331                       
     332                        <description>
     333                       
     334                                <para>
     335                                        Generates a new OTR private key for the given account.
     336                                </para>
     337                               
     338                        </description>
     339               
     340                </bitlbee-command>
     341               
     342                <bitlbee-command name="forget">
     343                        <syntax>otr forget &lt;thing&gt; &lt;arguments&gt;</syntax>
     344                       
     345                        <description>
     346                       
     347                                <para>
     348                                        Forgets some part of our OTR userstate. Available things: fingerprint, context, and key. See <emphasis>help otr forget &lt;thing&gt;</emphasis> for more information.
     349                                </para>
     350                       
     351                        </description>
     352                       
     353                        <bitlbee-command name="fingerprint">
     354                                <syntax>otr forget fingerprint &lt;nick&gt; &lt;fingerprint&gt;</syntax>
     355                               
     356                                <description>
     357                               
     358                                        <para>
     359                                                Drops the specified fingerprint from the given user's OTR connection context. It is allowed to specify only a (unique) prefix of the desired fingerprint.
     360                                        </para>
     361                                       
     362                                </description>
     363                               
     364                        </bitlbee-command>
     365                               
     366                        <bitlbee-command name="context">
     367                                <syntax>otr forget context &lt;nick&gt;</syntax>
     368                               
     369                                <description>
     370                               
     371                                        <para>
     372                                                Forgets the entire OTR context associated with the given user. This includes current message and protocol states, as well as any fingerprints for that user.
     373                                        </para>
     374                                       
     375                                </description>
     376                               
     377                        </bitlbee-command>
     378
     379                        <bitlbee-command name="key">
     380                                <syntax>otr forget key &lt;fingerprint&gt;</syntax>
     381                               
     382                                <description>
     383                               
     384                                        <para>
     385                                                Forgets an OTR private key matching the specified fingerprint. It is allowed to specify only a (unique) prefix of the fingerprint.
     386                                        </para>
     387                                       
     388                                </description>
     389                               
     390                        </bitlbee-command>
     391               
     392                </bitlbee-command>
     393               
     394        </bitlbee-command>
    246395
    247396        <bitlbee-command name="set">
     
    398547        </bitlbee-setting>
    399548
     549        <bitlbee-setting name="color_encrypted" type="boolean" scope="global">
     550                <default>true</default>
     551
     552                <description>
     553                        <para>
     554                                If set to true, BitlBee will color incoming encrypted messages according to their fingerprint trust level: untrusted=red, trusted=green.
     555                        </para>
     556                </description>
     557
     558        </bitlbee-setting>
     559
    400560        <bitlbee-setting name="debug" type="boolean" scope="global">
    401561                <default>false</default>
     
    464624        </bitlbee-setting>
    465625
     626        <bitlbee-setting name="halfop_buddies" type="string" scope="global">
     627                <default>encrypted</default>
     628                <possible-values>encrypted, trusted, notaway, false</possible-values>
     629
     630                <description>
     631                        <para>
     632                                Specifies under which circumstances BitlBee should give the "halfop" mode flag (+h) to buddies.
     633                        </para>
     634                       
     635                        <para>
     636                                If "false", the flag is never set. On "notaway", the flag is removed for users marked as "away" and set for all others. On "encrypted", the flag is set for users with whom we have an encrypted connection. On "trusted", it is set only for encrypted connections using a trusted key.
     637                        </para>
     638                </description>
     639
     640        </bitlbee-setting>
     641
    466642        <bitlbee-setting name="lcnicks" type="boolean" scope="global">
    467643                <default>true</default>
     
    486662        </bitlbee-setting>
    487663
    488         <bitlbee-setting name="ops" type="string" scope="global">
    489                 <default>both</default>
    490                 <possible-values>both, root, user, none</possible-values>
    491 
    492                 <description>
    493                         <para>
    494                                 Some people prefer themself and root to have operator status in &amp;bitlbee, other people don't. You can change these states using this setting.
    495                         </para>
    496 
    497                         <para>
    498                                 The value "both" means both user and root get ops. "root" means, well, just root. "user" means just the user. "none" means nobody will get operator status.
     664        <bitlbee-setting name="op_buddies" type="string" scope="global">
     665                <default>trusted</default>
     666                <possible-values>encrypted, trusted, notaway, false</possible-values>
     667
     668                <description>
     669                        <para>
     670                                Specifies under which circumstances BitlBee should give the "op" mode flag (+o) to buddies.
     671                        </para>
     672                       
     673                        <para>
     674                                If "false", the flag is never set. On "notaway", the flag is removed for users marked as "away" and set for all others. On "encrypted", the flag is set for users with whom we have an encrypted connection. On "trusted", it is set only for encrypted connections using a trusted key.
     675                        </para>
     676                </description>
     677
     678        </bitlbee-setting>
     679
     680        <bitlbee-setting name="op_root" type="bool" scope="global">
     681                <default>true</default>
     682
     683                <description>
     684                        <para>
     685                                Some people prefer themself and root to have operator status in &amp;bitlbee, other people don't. You can set the desired state for root using this setting.
     686                        </para>
     687                </description>
     688        </bitlbee-setting>
     689
     690        <bitlbee-setting name="op_user" type="bool" scope="global">
     691                <default>true</default>
     692
     693                <description>
     694                        <para>
     695                                Some people prefer themself and root to have operator status in &amp;bitlbee, other people don't. You can set the desired state for yourself using this setting.
     696                        </para>
     697                </description>
     698        </bitlbee-setting>
     699
     700        <bitlbee-setting name="otr_policy" type="string" scope="global">
     701                <default>opportunistic</default>
     702                <possible-values>never, opportunistic, manual, always</possible-values>
     703
     704                <description>
     705                        <para>
     706                                This setting controls the policy for establishing Off-the-Record connections.
     707                        </para>
     708                        <para>
     709                                A value of "never" effectively disables the OTR subsystem. In "opportunistic" mode, a magic whitespace pattern will be appended to the first message sent to any user. If the peer is also running opportunistic OTR, an encrypted connection will be set up automatically. On "manual", on the other hand, OTR connections must be established explicitly using <emphasis>otr connect</emphasis>. Finally, the setting "always" enforces encrypted communication by causing BitlBee to refuse to send any cleartext messages at all.
    499710                        </para>
    500711                </description>
     
    680891                        </para>
    681892                </description>
     893        </bitlbee-setting>
     894
     895        <bitlbee-setting name="voice_buddies" type="string" scope="global">
     896                <default>trusted</default>
     897                <possible-values>encrypted, trusted, notaway, false</possible-values>
     898
     899                <description>
     900                        <para>
     901                                Specifies under which circumstances BitlBee should give the "voice" mode flag (+v) to buddies.
     902                        </para>
     903                       
     904                        <para>
     905                                If "false", the flag is never set. On "notaway", the flag is removed for users marked as "away" and set for all others. On "encrypted", the flag is set for users with whom we have an encrypted connection. On "trusted", it is set only for encrypted connections using a trusted key.
     906                        </para>
     907                </description>
     908
    682909        </bitlbee-setting>
    683910
  • irc.c

    r2d88d25a r2ecfe39  
    2828#include "crypting.h"
    2929#include "ipc.h"
     30#include <sys/types.h>
     31#include <sys/wait.h>
    3032
    3133static gboolean irc_userping( gpointer _irc, int fd, b_input_condition cond );
     34static void irc_welcome( irc_t *irc );
    3235
    3336GSList *irc_connection_list = NULL;
     
    102105
    103106        irc_connection_list = g_slist_append( irc_connection_list, irc );
    104        
    105         set_add( &irc->set, "away_devoice", "true",  set_eval_away_devoice, irc );
     107
    106108        set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc );
    107109        set_add( &irc->set, "auto_reconnect", "false", set_eval_bool, irc );
     
    110112        set_add( &irc->set, "buddy_sendbuffer_delay", "200", set_eval_int, irc );
    111113        set_add( &irc->set, "charset", "utf-8", set_eval_charset, irc );
     114        set_add( &irc->set, "color_encrypted", "true", set_eval_bool, irc );
    112115        set_add( &irc->set, "debug", "false", set_eval_bool, irc );
    113116        set_add( &irc->set, "default_target", "root", NULL, irc );
    114117        set_add( &irc->set, "display_namechanges", "false", set_eval_bool, irc );
    115118        set_add( &irc->set, "handle_unknown", "root", NULL, irc );
     119        set_add( &irc->set, "halfop_buddies", "encrypted", set_eval_halfop_buddies, irc );
    116120        set_add( &irc->set, "lcnicks", "true", set_eval_bool, irc );
    117         set_add( &irc->set, "ops", "both", set_eval_ops, irc );
     121        set_add( &irc->set, "op_buddies", "trusted", set_eval_op_buddies, irc );
     122        set_add( &irc->set, "op_root", "true", set_eval_op_root, irc );
     123        set_add( &irc->set, "op_user", "true", set_eval_op_user, irc );
     124        set_add( &irc->set, "otr_policy", "opportunistic", set_eval_otr_policy, irc );
    118125        set_add( &irc->set, "password", NULL, passchange, irc );
    119126        set_add( &irc->set, "private", "true", set_eval_bool, irc );
     
    124131        set_add( &irc->set, "to_char", ": ", set_eval_to_char, irc );
    125132        set_add( &irc->set, "typing_notice", "false", set_eval_bool, irc );
     133        set_add( &irc->set, "voice_buddies", "notaway",  set_eval_voice_buddies, irc );
    126134       
    127135        conf_loaddefaults( irc );
     136
     137        irc->otr = otr_new();
    128138       
    129139        return( irc );
     
    264274        g_hash_table_foreach_remove(irc->watches, irc_free_hashkey, NULL);
    265275        g_hash_table_destroy(irc->watches);
     276       
     277        otr_free(irc->otr);
    266278       
    267279        g_free(irc);
     
    620632}
    621633
     634const char *user_mode_prefix( irc_t *irc, user_t *u )
     635{
     636        static char op[] = "@";
     637        static char halfop[] = "%";
     638        static char voice[] = "+";
     639        static char none[] = "";
     640
     641        int or = set_getbool(&irc->set, "op_root");
     642        int ou = set_getbool(&irc->set, "op_user");
     643        char *ob = set_getstr(&irc->set, "op_buddies");
     644        char *hb = set_getstr(&irc->set, "halfop_buddies");
     645        char *vb = set_getstr(&irc->set, "voice_buddies");
     646
     647        if( (!strcmp(u->nick, irc->mynick) && or) ||
     648            (!strcmp(u->nick, irc->nick) && ou) ||
     649        (!u->away && !strcmp(ob, "notaway")) ||
     650        (u->encrypted && !strcmp(ob, "encrypted")) ||
     651        (u->encrypted>1 && !strcmp(ob, "trusted"))
     652      )
     653                return op;
     654        else if( (!u->away && !strcmp(hb, "notaway")) ||
     655             (u->encrypted && !strcmp(hb, "encrypted")) ||
     656             (u->encrypted>1 && !strcmp(hb, "trusted"))
     657               )
     658                return halfop;
     659        else if( (!u->away && !strcmp(vb, "notaway")) ||
     660             (u->encrypted && !strcmp(vb, "encrypted")) ||
     661             (u->encrypted>1 && !strcmp(vb, "trusted"))
     662               )
     663                return voice;
     664        else
     665                return none;
     666}
     667                       
    622668void irc_names( irc_t *irc, char *channel )
    623669{
     
    625671        char namelist[385] = "";
    626672        struct groupchat *c = NULL;
    627         char *ops = set_getstr( &irc->set, "ops" );
    628673       
    629674        /* RFCs say there is no error reply allowed on NAMES, so when the
     
    640685                        }
    641686                       
    642                         if( u->ic && !u->away && set_getbool( &irc->set, "away_devoice" ) )
    643                                 strcat( namelist, "+" );
    644                         else if( ( strcmp( u->nick, irc->mynick ) == 0 && ( strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) == 0 ) ) ||
    645                                  ( strcmp( u->nick, irc->nick ) == 0 && ( strcmp( ops, "user" ) == 0 || strcmp( ops, "both" ) == 0 ) ) )
    646                                 strcat( namelist, "@" );
    647                        
     687                        strcat( namelist, user_mode_prefix(irc, u) );
    648688                        strcat( namelist, u->nick );
    649689                        strcat( namelist, " " );
     
    656696                /* root and the user aren't in the channel userlist but should
    657697                   show up in /NAMES, so list them first: */
    658                 sprintf( namelist, "%s%s %s%s ", strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) ? "@" : "", irc->mynick,
    659                                                  strcmp( ops, "user" ) == 0 || strcmp( ops, "both" ) ? "@" : "", irc->nick );
     698                sprintf( namelist, "%s%s %s%s ", set_getbool(&irc->set, "op_root") ? "@" : "", irc->mynick,
     699                                                 set_getbool(&irc->set, "op_user") ? "@" : "", irc->nick );
    660700               
    661701                for( l = c->in_room; l; l = l->next ) if( ( u = user_findhandle( c->ic, l->data ) ) )
     
    667707                        }
    668708                       
     709                        strcat( namelist, user_mode_prefix(irc, u) );
    669710                        strcat( namelist, u->nick );
    670711                        strcat( namelist, " " );
     
    708749        irc_reply( irc,   3, ":%s", IRCD_INFO );
    709750        irc_reply( irc,   4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES UMODES_PRIV, CMODES );
    710         irc_reply( irc,   5, "PREFIX=(ov)@+ CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 );
     751        irc_reply( irc,   5, "PREFIX=(ohv)@%%+ CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 );
    711752        irc_motd( irc );
    712753        irc->umode[0] = '\0';
     
    735776        irc_spawn( irc, u );
    736777       
    737         irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\nIf you've never used BitlBee before, please do read the help information using the \x02help\x02 command. Lots of FAQs are answered there." );
     778        irc_welcome( irc );
    738779       
    739780        if( global.conf->runmode == RUNMODE_FORKDAEMON || global.conf->runmode == RUNMODE_DAEMON )
     
    741782       
    742783        irc->status |= USTATUS_LOGGED_IN;
     784}
     785
     786static void irc_welcome( irc_t *irc )
     787{
     788        FILE *f;
     789       
     790        f = fopen( global.conf->welcomefile, "r" );
     791        if( !f )
     792        {
     793                irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\nIf you've never used BitlBee before, please do read the help information using the \x02help\x02 command. Lots of FAQs are answered there.\n\nOTR users please note: Private key files are owned by the user BitlBee is running as." );
     794        }
     795        else
     796        {
     797                char linebuf[380];
     798               
     799                while( fgets( linebuf, 380, f ) )
     800                {
     801                        irc_usermsg( irc, linebuf );
     802                }
     803               
     804                fclose( f );
     805        }
    743806}
    744807
  • irc.h

    r2d88d25a r2ecfe39  
    2727#define _IRC_H
    2828
     29#include "otr.h"
     30
    2931#define IRC_MAX_LINE 512
    30 #define IRC_MAX_ARGS 8
     32#define IRC_MAX_ARGS 16
    3133
    3234#define IRC_LOGIN_TIMEOUT 60
     
    9496        gint w_watch_source_id;
    9597        gint ping_source_id;
     98       
     99        otr_t *otr;            /* OTR state and book keeping */
    96100} irc_t;
    97101
  • lib/misc.c

    r2d88d25a r2ecfe39  
    112112        { "gt",     ">" },
    113113        { "amp",    "&" },
     114        { "apos",   "'" },
    114115        { "quot",   "\"" },
    115116        { "aacute", "á" },
     
    143144        char *s = out, *cs;
    144145        int i, matched;
     146        int taglen;
    145147       
    146148        memset( out, 0, strlen( in ) + 1 );
     
    159161                                in ++;
    160162                       
     163                        taglen = in-cs-1;   /* not <0 because the above loop runs at least once */
    161164                        if( *in )
    162165                        {
    163                                 if( g_strncasecmp( cs+1, "br", 2) == 0 )
     166                                if( g_strncasecmp( cs+1, "b", taglen) == 0 )
     167                                        *(s++) = '\x02';
     168                                else if( g_strncasecmp( cs+1, "/b", taglen) == 0 )
     169                                        *(s++) = '\x02';
     170                                else if( g_strncasecmp( cs+1, "i", taglen) == 0 )
     171                                        *(s++) = '\x1f';
     172                                else if( g_strncasecmp( cs+1, "/i", taglen) == 0 )
     173                                        *(s++) = '\x1f';
     174                                else if( g_strncasecmp( cs+1, "br", 2) == 0 )
    164175                                        *(s++) = '\n';
    165176                                in ++;
  • lib/ssl_bogus.c

    r2d88d25a r2ecfe39  
    2727
    2828int ssl_errno;
     29
     30void ssl_init( void )
     31{
     32}
    2933
    3034void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data )
  • lib/ssl_client.h

    r2d88d25a r2ecfe39  
    4747
    4848
     49/* Perform any global initialization the SSL library might need. */
     50G_MODULE_EXPORT void ssl_init( void );
     51
    4952/* Connect to host:port, call the given function when the connection is
    5053   ready to be used for SSL traffic. This is all done asynchronously, no
  • lib/ssl_gnutls.c

    r2d88d25a r2ecfe39  
    6060static gboolean ssl_handshake( gpointer data, gint source, b_input_condition cond );
    6161
     62
     63void ssl_init( void )
     64{
     65        gnutls_global_init();
     66        initialized = TRUE;
     67        atexit( gnutls_global_deinit );
     68}
    6269
    6370void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data )
     
    122129        if( !initialized )
    123130        {
    124                 gnutls_global_init();
    125                 initialized = TRUE;
    126                 atexit( gnutls_global_deinit );
     131                ssl_init();
    127132        }
    128133       
  • lib/ssl_nss.c

    r2d88d25a r2ecfe39  
    9191
    9292
     93void ssl_init( void )
     94{
     95        PR_Init( PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1);
     96        NSS_NoDB_Init(NULL);
     97        NSS_SetDomesticPolicy();
     98        initialized = TRUE;
     99}
     100
    93101void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data )
    94102{
     
    107115        if( !initialized )
    108116        {
    109                 PR_Init( PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1);
    110                 NSS_NoDB_Init(NULL);
    111                 NSS_SetDomesticPolicy();
     117                ssl_init();
    112118        }
    113119
  • lib/ssl_openssl.c

    r2d88d25a r2ecfe39  
    5656static gboolean ssl_handshake( gpointer data, gint source, b_input_condition cond );
    5757
     58
     59void ssl_init( void );
     60{
     61        initialized = TRUE;
     62        SSLeay_add_ssl_algorithms();
     63}
    5864
    5965void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data )
     
    115121        if( !initialized )
    116122        {
    117                 initialized = TRUE;
    118                 SSLeay_add_ssl_algorithms();
     123                ssl_init();
    119124        }
    120125       
  • log.c

    r2d88d25a r2ecfe39  
    3030static log_t logoutput;
    3131
    32 static void log_null(int level, char *logmessage);
    33 static void log_irc(int level, char *logmessage);
    34 static void log_syslog(int level, char *logmessage);
    35 static void log_console(int level, char *logmessage);
     32static void log_null(int level, const char *logmessage);
     33static void log_irc(int level, const char *logmessage);
     34static void log_syslog(int level, const char *logmessage);
     35static void log_console(int level, const char *logmessage);
    3636
    3737void log_init(void) {
     
    9797}
    9898
    99 void log_message(int level, char *message, ... ) {
     99void log_message(int level, const char *message, ... ) {
    100100
    101101        va_list ap;
     
    122122}
    123123
    124 void log_error(char *functionname) {
     124void log_error(const char *functionname) {
    125125        log_message(LOGLVL_ERROR, "%s: %s", functionname, strerror(errno));
    126126       
     
    128128}
    129129
    130 static void log_null(int level, char *message) {
     130static void log_null(int level, const char *message) {
    131131        return;
    132132}
    133133
    134 static void log_irc(int level, char *message) {
     134static void log_irc(int level, const char *message) {
    135135        if(level == LOGLVL_ERROR)
    136136                irc_write_all(1, "ERROR :Error: %s", message);
     
    147147}
    148148
    149 static void log_syslog(int level, char *message) {
     149static void log_syslog(int level, const char *message) {
    150150        if(level == LOGLVL_ERROR)
    151151                syslog(LOG_ERR, "%s", message);
     
    161161}
    162162
    163 static void log_console(int level, char *message) {
     163static void log_console(int level, const char *message) {
    164164        if(level == LOGLVL_ERROR)
    165165                fprintf(stderr, "Error: %s\n", message);
  • log.h

    r2d88d25a r2ecfe39  
    4444
    4545typedef struct log_t {
    46         void (*error)(int level, char *logmessage);
    47         void (*warning)(int level, char *logmessage);
    48         void (*informational)(int level, char *logmessage);
     46        void (*error)(int level, const char *logmessage);
     47        void (*warning)(int level, const char *logmessage);
     48        void (*informational)(int level, const char *logmessage);
    4949#ifdef DEBUG
    50         void (*debug)(int level, char *logmessage);
     50        void (*debug)(int level, const char *logmessage);
    5151#endif
    5252} log_t;
     
    5454void log_init(void);
    5555void log_link(int level, int output);
    56 void log_message(int level, char *message, ...) G_GNUC_PRINTF( 2, 3 );
    57 void log_error(char *functionname);
     56void log_message(int level, const char *message, ...) G_GNUC_PRINTF( 2, 3 );
     57void log_error(const char *functionname);
    5858
    5959#endif
  • protocols/jabber/jabber.c

    r2d88d25a r2ecfe39  
    511511       
    512512        ret->name = "jabber";
     513    ret->mms = 0;                        /* no limit */
    513514        ret->login = jabber_login;
    514515        ret->init = jabber_init;
  • protocols/msn/msn.c

    r2d88d25a r2ecfe39  
    372372       
    373373        ret->name = "msn";
     374    ret->mms = 1409;         /* this guess taken from libotr UPGRADING file */
    374375        ret->login = msn_login;
    375376        ret->init = msn_init;
  • protocols/nogaim.c

    r2d88d25a r2ecfe39  
    603603       
    604604        /* LISPy... */
    605         if( ( set_getbool( &ic->irc->set, "away_devoice" ) ) &&         /* Don't do a thing when user doesn't want it */
    606             ( u->online ) &&                                            /* Don't touch offline people */
    607             ( ( ( u->online != oo ) && !u->away ) ||                    /* Voice joining people */
    608               ( ( u->online == oo ) && ( oa == !u->away ) ) ) )         /* (De)voice people changing state */
     605        if( ( u->online ) &&                                            /* Don't touch offline people */
     606            ( ( ( u->online != oo ) && !u->away ) ||                    /* Do joining people */
     607              ( ( u->online == oo ) && ( oa == !u->away ) ) ) )         /* Do people changing state */
    609608        {
    610609                char *from;
     
    619618                                                            ic->irc->myhost );
    620619                }
    621                 irc_write( ic->irc, ":%s MODE %s %cv %s", from, ic->irc->channel,
    622                                                           u->away?'-':'+', u->nick );
     620                if(!strcmp(set_getstr(&ic->irc->set, "voice_buddies"), "notaway")) {
     621                        irc_write( ic->irc, ":%s MODE %s %cv %s", from, ic->irc->channel,
     622                                                                 u->away?'-':'+', u->nick );
     623                }
     624                if(!strcmp(set_getstr(&ic->irc->set, "halfop_buddies"), "notaway")) {
     625                        irc_write( ic->irc, ":%s MODE %s %ch %s", from, ic->irc->channel,
     626                                                                 u->away?'-':'+', u->nick );
     627                }
     628                if(!strcmp(set_getstr(&ic->irc->set, "op_buddies"), "notaway")) {
     629                        irc_write( ic->irc, ":%s MODE %s %co %s", from, ic->irc->channel,
     630                                                                 u->away?'-':'+', u->nick );
     631                }
    623632                g_free( from );
    624633        }
     
    630639        char *wrapped;
    631640        user_t *u;
    632        
     641
     642        /* pass the message through OTR */
     643        msg = otr_handle_message(ic, handle, msg);
     644        if(!msg) {
     645                /* this was an internal OTR protocol message */
     646                return;
     647        }
     648
    633649        u = user_findhandle( ic, handle );
    634        
    635650        if( !u )
    636651        {
     
    642657                                imcb_log( ic, "Ignoring message from unknown handle %s", handle );
    643658                       
     659                        g_free(msg);
    644660                        return;
    645661                }
     
    674690        irc_msgfrom( irc, u->nick, wrapped );
    675691        g_free( wrapped );
     692        g_free( msg );
    676693}
    677694
     
    914931
    915932
    916 /* Misc. BitlBee stuff which shouldn't really be here */
    917 
    918 char *set_eval_away_devoice( set_t *set, char *value )
    919 {
    920         irc_t *irc = set->data;
    921         int st;
    922        
    923         if( ( g_strcasecmp( value, "true" ) == 0 ) || ( g_strcasecmp( value, "yes" ) == 0 ) || ( g_strcasecmp( value, "on" ) == 0 ) )
    924                 st = 1;
    925         else if( ( g_strcasecmp( value, "false" ) == 0 ) || ( g_strcasecmp( value, "no" ) == 0 ) || ( g_strcasecmp( value, "off" ) == 0 ) )
    926                 st = 0;
    927         else if( sscanf( value, "%d", &st ) != 1 )
    928                 return( NULL );
    929        
    930         st = st != 0;
    931        
    932         /* Horror.... */
    933        
    934         if( st != set_getbool( &irc->set, "away_devoice" ) )
    935         {
    936                 char list[80] = "";
    937                 user_t *u = irc->users;
    938                 int i = 0, count = 0;
    939                 char pm;
    940                 char v[80];
    941                
    942                 if( st )
    943                         pm = '+';
    944                 else
    945                         pm = '-';
    946                
    947                 while( u )
    948                 {
    949                         if( u->ic && u->online && !u->away )
    950                         {
    951                                 if( ( strlen( list ) + strlen( u->nick ) ) >= 79 )
    952                                 {
    953                                         for( i = 0; i < count; v[i++] = 'v' ); v[i] = 0;
    954                                         irc_write( irc, ":%s MODE %s %c%s%s",
    955                                                    irc->myhost,
    956                                                    irc->channel, pm, v, list );
    957                                        
    958                                         *list = 0;
    959                                         count = 0;
    960                                 }
    961                                
    962                                 sprintf( list + strlen( list ), " %s", u->nick );
    963                                 count ++;
    964                         }
    965                         u = u->next;
    966                 }
    967                
    968                 /* $v = 'v' x $i */
    969                 for( i = 0; i < count; v[i++] = 'v' ); v[i] = 0;
    970                 irc_write( irc, ":%s MODE %s %c%s%s", irc->myhost,
    971                                                             irc->channel, pm, v, list );
    972         }
    973        
    974         return( set_eval_bool( set, value ) );
    975 }
    976 
    977 
    978 
    979 
    980933/* The plan is to not allow straight calls to prpl functions anymore, but do
    981934   them all from some wrappers. We'll start to define some down here: */
     
    991944                msg = buf;
    992945        }
    993        
    994         st = ic->acc->prpl->buddy_msg( ic, handle, msg, flags );
    995         g_free( buf );
    996        
     946
     947        /* if compiled without otr support, this just calls the prpl buddy_msg */
     948        st = otr_send_message(ic, handle, msg, flags);
     949       
     950        g_free(buf);
    997951        return st;
    998952}
  • protocols/nogaim.h

    r2d88d25a r2ecfe39  
    136136         * - The user sees this name ie. when imcb_log() is used. */
    137137        const char *name;
     138    /* Maximum Message Size of this protocol.
     139     * - Introduced for OTR, in order to fragment large protocol messages.
     140     * - 0 means "unlimited". */
     141    unsigned int mms;
    138142
    139143        /* Added this one to be able to add per-account settings, don't think
     
    317321
    318322/* Misc. stuff */
    319 char *set_eval_away_devoice( set_t *set, char *value );
    320323gboolean auto_reconnect( gpointer data, gint fd, b_input_condition cond );
    321324void cancel_auto_reconnect( struct account *a );
  • protocols/oscar/oscar.c

    r2d88d25a r2ecfe39  
    26052605        struct prpl *ret = g_new0(struct prpl, 1);
    26062606        ret->name = "oscar";
     2607    ret->mms = 2343;       /* this guess taken from libotr UPGRADING file */
    26072608        ret->away_states = oscar_away_states;
    26082609        ret->init = oscar_init;
  • protocols/yahoo/yahoo.c

    r2d88d25a r2ecfe39  
    354354        struct prpl *ret = g_new0(struct prpl, 1);
    355355        ret->name = "yahoo";
     356    ret->mms = 832;           /* this guess taken from libotr UPGRADING file */
    356357        ret->init = byahoo_init;
    357358       
  • query.c

    r2d88d25a r2ecfe39  
    102102        int count = 0;
    103103       
     104        if(!ic)
     105                return;
     106       
    104107        q = irc->queries;
    105108        def = query_default( irc );
     
    140143        if( ans )
    141144        {
    142                 imcb_log( q->ic, "Accepted: %s", q->question );
    143                 q->yes( NULL, q->data );
     145                if(q->ic)
     146                        imcb_log( q->ic, "Accepted: %s", q->question );
     147                else
     148                        irc_usermsg( irc, "Accepted: %s", q->question );
     149                if(q->yes)
     150                        q->yes( q->ic ? (gpointer)q->ic : (gpointer)irc, q->data );
    144151        }
    145152        else
    146153        {
    147                 imcb_log( q->ic, "Rejected: %s", q->question );
    148                 q->no( NULL, q->data );
     154                if(q->ic)
     155                        imcb_log( q->ic, "Rejected: %s", q->question );
     156                else
     157                        irc_usermsg( irc, "Rejected: %s", q->question );
     158                if(q->no)
     159                        q->no( q->ic ? (gpointer)q->ic : (gpointer)irc, q->data );
    149160        }
    150161        q->data = NULL;
  • root_commands.c

    r2d88d25a r2ecfe39  
    2929#include "bitlbee.h"
    3030#include "help.h"
     31#include "otr.h"
    3132
    3233#include <string.h>
     
    241242               
    242243                irc_usermsg( irc, "Account successfully added" );
     244               
     245                if(otr_check_for_key(a)) {
     246                        irc_usermsg(irc, "otr: you will be notified when it completes");
     247                }
    243248        }
    244249        else if( g_strcasecmp( cmd[1], "del" ) == 0 )
     
    992997        { "qlist",          0, cmd_qlist,          0 },
    993998        { "join_chat",      2, cmd_join_chat,      0 },
     999        { "otr",            1, cmd_otr,            0 },
    9941000        { NULL }
    9951001};
  • set.c

    r2d88d25a r2ecfe39  
    209209}
    210210
    211 char *set_eval_ops( set_t *set, char *value )
     211char *set_eval_op_root( set_t *set, char *value )
    212212{
    213213        irc_t *irc = set->data;
    214        
    215         if( g_strcasecmp( value, "user" ) == 0 )
    216                 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    217                                                               irc->channel, "+o-o", irc->nick, irc->mynick );
    218         else if( g_strcasecmp( value, "root" ) == 0 )
    219                 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    220                                                               irc->channel, "-o+o", irc->nick, irc->mynick );
    221         else if( g_strcasecmp( value, "both" ) == 0 )
    222                 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    223                                                               irc->channel, "+oo", irc->nick, irc->mynick );
    224         else if( g_strcasecmp( value, "none" ) == 0 )
    225                 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    226                                                               irc->channel, "-oo", irc->nick, irc->mynick );
     214        char *ret = set_eval_bool(set, value);
     215        int b = bool2int(ret);
     216       
     217        irc_write( irc, ":%s!%s@%s MODE %s %s %s", irc->mynick, irc->mynick, irc->myhost,
     218                                                   irc->channel, b?"+o":"-o", irc->mynick );
     219        return ret;
     220}
     221
     222char *set_eval_op_user( set_t *set, char *value )
     223{
     224        irc_t *irc = set->data;
     225        char *ret = set_eval_bool(set, value);
     226        int b = bool2int(ret);
     227       
     228        irc_write( irc, ":%s!%s@%s MODE %s %s %s", irc->mynick, irc->mynick, irc->myhost,
     229                                                   irc->channel, b?"+o":"-o", irc->nick );
     230        return ret;
     231}
     232
     233/* generalized version of set_eval_op/voice_buddies */
     234char *set_eval_mode_buddies( set_t *set, char *value, char modeflag )
     235{
     236        irc_t *irc = set->data;
     237        char op[64], deop[64];
     238        int nop=0, ndeop=0;
     239        user_t *u;
     240        int mode;
     241       
     242        if(!strcmp(value, "false"))
     243                mode=0;
     244        else if(!strcmp(value, "encrypted"))
     245                mode=1;
     246        else if(!strcmp(value, "trusted"))
     247                mode=2;
     248        else if(!strcmp(value, "notaway"))
     249                mode=3;
    227250        else
    228251                return NULL;
    229252       
     253        /* sorry for calling them op/deop - too lazy for search+replace :P */
     254        op[0]='\0';
     255        deop[0]='\0';
     256        for(u=irc->users; u; u=u->next) {
     257                /* we're only concerned with online buddies */
     258                if(!u->ic || !u->online)
     259                        continue;
     260
     261                /* just in case... */
     262                if(strlen(u->nick) >= 64)
     263                        continue;
     264               
     265                /* dump out ops/deops when the corresponding name list fills up */
     266                if(strlen(op)+strlen(u->nick)+2 > 64) {
     267                        char *flags = g_strnfill(nop, modeflag);
     268                        irc_write( irc, ":%s!%s@%s MODE %s +%s%s", irc->mynick, irc->mynick, irc->myhost,
     269                                                               irc->channel, flags, op );
     270                    op[0]='\0';
     271            nop=0;
     272                    g_free(flags);
     273                }
     274                if(strlen(deop)+strlen(u->nick)+2 > 64) {
     275                        char *flags = g_strnfill(ndeop, modeflag);
     276                        irc_write( irc, ":%s!%s@%s MODE %s -%s%s", irc->mynick, irc->mynick, irc->myhost,
     277                                                               irc->channel, flags, deop );
     278                    deop[0]='\0';
     279            ndeop=0;
     280                    g_free(flags);
     281                }
     282               
     283                switch(mode) {
     284                /* "false" */
     285                case 0:
     286                        g_strlcat(deop, " ", 64);
     287                        g_strlcat(deop, u->nick, 64);
     288                        ndeop++;
     289                        break;
     290                /* "encrypted" */
     291                case 1:
     292                        if(u->encrypted) {
     293                                g_strlcat(op, " ", 64);
     294                                g_strlcat(op, u->nick, 64);
     295                                nop++;
     296                        } else {
     297                                g_strlcat(deop, " ", 64);
     298                                g_strlcat(deop, u->nick, 64);
     299                                ndeop++;
     300                        }
     301                        break;
     302                /* "trusted" */
     303                case 2:
     304                        if(u->encrypted > 1) {
     305                                g_strlcat(op, " ", 64);
     306                                g_strlcat(op, u->nick, 64);
     307                                nop++;
     308                        } else {
     309                                g_strlcat(deop, " ", 64);
     310                                g_strlcat(deop, u->nick, 64);
     311                                ndeop++;
     312                        }
     313                        break;
     314                /* "notaway" */
     315                case 3:
     316                        if(u->away) {
     317                                g_strlcat(deop, " ", 64);
     318                                g_strlcat(deop, u->nick, 64);
     319                                ndeop++;
     320                        } else {
     321                                g_strlcat(op, " ", 64);
     322                                g_strlcat(op, u->nick, 64);
     323                                nop++;
     324                        }
     325                }
     326        }
     327        /* dump anything left in op/deop lists */
     328        if(*op) {
     329                char *flags = g_strnfill(nop, modeflag);
     330                irc_write( irc, ":%s!%s@%s MODE %s +%s%s", irc->mynick, irc->mynick, irc->myhost,
     331                                                               irc->channel, flags, op );
     332                g_free(flags);
     333        }
     334        if(*deop) {
     335                char *flags = g_strnfill(ndeop, modeflag);
     336                irc_write( irc, ":%s!%s@%s MODE %s -%s%s", irc->mynick, irc->mynick, irc->myhost,
     337                                                       irc->channel, flags, deop );
     338                g_free(flags);
     339        }
     340       
    230341        return value;
     342}
     343
     344char *set_eval_op_buddies( set_t *set, char *value )
     345{
     346        return set_eval_mode_buddies(set, value, 'o');
     347}
     348
     349char *set_eval_halfop_buddies( set_t *set, char *value )
     350{
     351        return set_eval_mode_buddies(set, value, 'h');
     352}
     353
     354char *set_eval_voice_buddies( set_t *set, char *value )
     355{
     356        return set_eval_mode_buddies(set, value, 'v');
    231357}
    232358
     
    245371        return value;
    246372}
     373
     374/* possible values: never, opportunistic, manual, always */
     375char *set_eval_otr_policy( set_t *set, char *value )
     376{
     377        if ( !strcmp(value, "never") )
     378                return value;
     379        if ( !strcmp(value, "opportunistic") )
     380                return value;
     381        if ( !strcmp(value, "manual") )
     382                return value;
     383        if ( !strcmp(value, "always") )
     384                return value;
     385        return NULL;
     386}
  • set.h

    r2d88d25a r2ecfe39  
    9696/* Some not very generic evaluators that really shouldn't be here... */
    9797char *set_eval_to_char( set_t *set, char *value );
    98 char *set_eval_ops( set_t *set, char *value );
     98char *set_eval_op_root( set_t *set, char *value );
     99char *set_eval_op_user( set_t *set, char *value );
     100char *set_eval_op_buddies( set_t *set, char *value );
     101char *set_eval_halfop_buddies( set_t *set, char *value );
     102char *set_eval_voice_buddies( set_t *set, char *value );
    99103char *set_eval_charset( set_t *set, char *value );
     104char *set_eval_otr_policy( set_t *set, char *value );
    100105
    101106#endif /* __SET_H__ */
  • storage.c

    r2d88d25a r2ecfe39  
    2929#include "bitlbee.h"
    3030#include "crypting.h"
     31#include "otr.h"
    3132
    3233extern storage_t storage_text;
     
    115116                if (status == STORAGE_OK) {
    116117                        irc_setpass(irc, password);
     118                        otr_load(irc);          /* load our OTR userstate */
    117119                        return status;
    118120                }
    119121               
    120                 if (status != STORAGE_NO_SUCH_USER)
     122                if (status != STORAGE_NO_SUCH_USER) {
    121123                        return status;
     124                }
    122125        }
    123126       
     
    127130storage_status_t storage_save (irc_t *irc, int overwrite)
    128131{
    129         return ((storage_t *)global.storage->data)->save(irc, overwrite);
     132        storage_status_t st;
     133       
     134        otr_save(irc);
     135        st = ((storage_t *)global.storage->data)->save(irc, overwrite);
     136        return st;
    130137}
    131138
     
    147154                        ret = status;
    148155        }
     156        if (ret == STORAGE_OK) {
     157                otr_remove(nick);
     158        }
    149159       
    150160        return ret;
     
    157167        storage_t *primary_storage = gl->data;
    158168        irc_t *irc;
    159 
     169       
    160170        /* First, try to rename in the current write backend, assuming onick
    161171         * is stored there */
    162172        status = primary_storage->rename(onick, nnick, password);
    163         if (status != STORAGE_NO_SUCH_USER)
     173        if (status != STORAGE_NO_SUCH_USER) {
     174                otr_rename(onick, nnick);
    164175                return status;
     176        }
    165177
    166178        /* Try to load from a migration backend and save to the current backend.
     
    186198
    187199        storage_remove(onick, password);
     200        otr_rename(onick, nnick);
    188201
    189202        return STORAGE_OK;
  • unix.c

    r2d88d25a r2ecfe39  
    2727#include "commands.h"
    2828#include "crypting.h"
     29#include "otr.h"
    2930#include "protocols/nogaim.h"
    3031#include "help.h"
    3132#include "ipc.h"
     33#include "lib/ssl_client.h"
    3234#include <signal.h>
    3335#include <unistd.h>
     
    5456        b_main_init();
    5557        nogaim_init();
     58        /* Ugly Note: libotr and gnutls both use libgcrypt. libgcrypt
     59           has a process-global config state whose initialization happpens
     60           twice if libotr and gnutls are used together. libotr installs custom
     61           memory management functions for libgcrypt while our gnutls module
     62           uses the defaults. Therefore we initialize OTR after SSL. *sigh* */
     63        ssl_init();
     64        otr_init();
    5665       
    5766        srand( time( NULL ) ^ getpid() );
  • user.c

    r2d88d25a r2ecfe39  
    141141}
    142142
    143 user_t *user_findhandle( struct im_connection *ic, char *handle )
     143user_t *user_findhandle( struct im_connection *ic, const char *handle )
    144144{
    145145        user_t *u;
  • user.h

    r2d88d25a r2ecfe39  
    3737        char is_private;
    3838        char online;
     39        char encrypted;
    3940       
    4041        char *handle;
     
    5657int user_del( irc_t *irc, char *nick );
    5758G_MODULE_EXPORT user_t *user_find( irc_t *irc, char *nick );
    58 G_MODULE_EXPORT user_t *user_findhandle( struct im_connection *ic, char *handle );
     59G_MODULE_EXPORT user_t *user_findhandle( struct im_connection *ic, const char *handle );
    5960void user_rename( irc_t *irc, char *oldnick, char *newnick );
    6061
Note: See TracChangeset for help on using the changeset viewer.