Changes in / [df1ae622:bb09b3c]


Ignore:
Files:
3 added
39 edited

Legend:

Unmodified
Added
Removed
  • Makefile

    rdf1ae622 rbb09b3c  
    1111# Program variables
    1212objects = account.o bitlbee.o chat.o crypting.o help.o ipc.o irc.o irc_commands.o nick.o query.o root_commands.o set.o storage.o $(STORAGE_OBJS) 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
     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
     
    2020OUTFILE=bitlbee.exe
    2121else
    22 objects += unix.o conf.o log.o
     22objects += unix.o conf.o log.o otr.o
    2323OUTFILE=bitlbee
    2424endif
     
    9494        mkdir -p $(DESTDIR)$(ETCDIR)
    9595        install -m 0644 motd.txt $(DESTDIR)$(ETCDIR)/motd.txt
     96        install -m 0644 welcome.txt $(DESTDIR)$(ETCDIR)/welcome.txt
    9697        install -m 0644 bitlbee.conf $(DESTDIR)$(ETCDIR)/bitlbee.conf
    9798
    9899uninstall-etc:
    99100        rm -f $(DESTDIR)$(ETCDIR)/motd.txt
     101        rm -f $(DESTDIR)$(ETCDIR)/welcome.txt
    100102        rm -f $(DESTDIR)$(ETCDIR)/bitlbee.conf
    101103        -rmdir $(DESTDIR)$(ETCDIR)
  • bitlbee.conf

    rdf1ae622 rbb09b3c  
    8585# MotdFile = /etc/bitlbee/motd.txt
    8686
     87## WelcomeFile
     88##
     89## Specify an alternative file for the welcome message displayed when joining the
     90## control channel. Default value depends on the --etcdir argument to configure.
     91##
     92# WelcomeFile = /etc/bitlbee/welcome.txt
     93
    8794## ConfigDir
    8895##
  • bitlbee.h

    rdf1ae622 rbb09b3c  
    3030#define _GNU_SOURCE /* Stupid GNU :-P */
    3131#endif
     32
     33/* Depend on Windows 2000 for now since we need getaddrinfo() */
     34#define _WIN32_WINNT 0x0501
    3235
    3336/* Depend on Windows 2000 for now since we need getaddrinfo() */
     
    141144#include "misc.h"
    142145#include "proxy.h"
     146#include "otr.h"
    143147
    144148typedef struct global {
     
    152156        char *helpfile;
    153157        int restart;
     158        OtrlMessageAppOps otr_ops;   /* collects interface functions required by OTR */
    154159} global_t;
    155160
  • conf.c

    rdf1ae622 rbb09b3c  
    6060        conf->pidfile = g_strdup( PIDFILE );
    6161        conf->motdfile = g_strdup( ETCDIR "/motd.txt" );
     62        conf->welcomefile = g_strdup( ETCDIR "/welcome.txt" );
    6263        conf->ping_interval = 180;
    6364        conf->ping_timeout = 300;
     
    258259                                conf->motdfile = g_strdup( ini->value );
    259260                        }
     261                        else if( g_strcasecmp( ini->key, "welcomefile" ) == 0 )
     262                        {
     263                                g_free( conf->welcomefile );
     264                                conf->welcomefile = g_strdup( ini->value );
     265                        }
    260266                        else if( g_strcasecmp( ini->key, "account_storage" ) == 0 )
    261267                        {
  • conf.h

    rdf1ae622 rbb09b3c  
    4545        char *pidfile;
    4646        char *motdfile;
     47        char *welcomefile;
    4748        char *primary_storage;
    4849        char **migrate_storage;
  • configure

    rdf1ae622 rbb09b3c  
    3232gcov=0
    3333plugins=1
     34otr=auto
    3435
    3536events=glib
     
    7374--gcov=0/1      Disable/enable test coverage reporting  $gcov
    7475--plugins=0/1   Disable/enable plugins support          $plugins
     76--otr=0/1       Disable/enable OTR encryption support   $otr
    7577
    7678--events=...    Event handler (glib, libevent)          $events
     
    452454fi
    453455
     456otrprefix=""
     457for i in / /usr /usr/local; do
     458        if [ -f ${i}/lib/libotr.a ]; then
     459                otrprefix=${i}
     460                break
     461        fi
     462done
     463if [ "$otr" = "auto" ]; then
     464        if [ -n "$otrprefix" ]; then
     465                otr=1
     466        else
     467                otr=0
     468        fi
     469fi
     470if [ "$otr" = 1 ]; then
     471        echo '#define WITH_OTR' >> config.h
     472        echo "EFLAGS+=-L${otrprefix}/lib -lotr" >> Makefile.settings
     473        echo "CFLAGS+=-I${otrprefix}/include" >> Makefile.settings
     474else
     475        echo '#undef WITH_OTR' >> config.h
     476fi
     477
    454478if [ ! -e doc/user-guide/help.txt ] && ! type xmlto > /dev/null 2> /dev/null; then
    455479        echo
     
    606630fi
    607631
     632if [ "$otr" = "1" ]; then
     633        echo '  Off-the-Record (OTR) Messaging enabled.'
     634else
     635        echo '  Off-the-Record (OTR) Messaging disabled.'
     636fi
     637
    608638echo '  Using event handler: '$events
    609639echo '  Using SSL library: '$ssl
  • doc/README

    rdf1ae622 rbb09b3c  
    6767BitlBee's only real dependency is GLib. This is available on virtually every
    6868platform. Any recent version of GLib (2.4 or higher) will work.
     69
     70Off-the-Record encryption support will be included by default if the
     71configure script finds libotr in one of the usual places. You can pass
     72--otr=1 or --otr=0 to force it on or off, respectively.
    6973
    7074These days, MSN Messenger clients have to connect to the MS Passport servers
     
    143147
    144148
    145 A NOTE ON ENCRYPTION
    146 ====================
     149A NOTE ON PASSWORD ENCRYPTION
     150=============================
    147151
    148152There used to be a note here about the simple obfuscation method used to
  • doc/user-guide/commands.xml

    rdf1ae622 rbb09b3c  
    349349                </description>
    350350        </bitlbee-command>
     351       
     352        <bitlbee-command name="otr">
     353                <short-description>Off-the-Record encryption control</short-description>
     354                <syntax>otr &lt;subcommand&gt; [&lt;arguments&gt;]</syntax>
     355
     356                <description>
     357
     358                        <para>
     359                                Available subcommands: connect, disconnect, smp, trust, info, keygen, and forget. See <emphasis>help otr &lt;subcommand&gt;</emphasis> for more information.
     360                        </para>
     361
     362                </description>
     363               
     364                <bitlbee-command name="connect">
     365                        <syntax>otr connect &lt;nick&gt;</syntax>
     366                       
     367                        <description>
     368                       
     369                                <para>
     370                                        Attempts to establish an encrypted connection with the specified user by sending a magic string.
     371                                </para>
     372                               
     373                        </description>
     374               
     375                </bitlbee-command>
     376               
     377                <bitlbee-command name="disconnect">
     378                        <syntax>otr disconnect &lt;nick&gt;</syntax>
     379                       
     380                        <description>
     381                       
     382                                <para>
     383                                        Resets the connection with the specified user to cleartext.
     384                                </para>
     385                               
     386                        </description>
     387               
     388                </bitlbee-command>
     389               
     390                <bitlbee-command name="smp">
     391                        <syntax>otr smp &lt;nick&gt; &lt;secret&gt;</syntax>
     392                       
     393                        <description>
     394                       
     395                                <para>
     396                                        Attempts to authenticate the given user's active fingerprint via the Socialist Millionaires' Protocol.
     397                                </para>
     398                               
     399                                <para>
     400                                        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.
     401                                </para>
     402                               
     403                        </description>
     404               
     405                </bitlbee-command>
     406               
     407                <bitlbee-command name="trust">
     408                        <syntax>otr trust &lt;nick&gt; &lt;fp1&gt; &lt;fp2&gt; &lt;fp3&gt; &lt;fp4&gt; &lt;fp5&gt;</syntax>
     409                       
     410                        <description>
     411                       
     412                                <para>
     413                                        Manually affirms trust in the specified fingerprint, given as five blocks of precisely eight (hexadecimal) digits each.
     414                                </para>
     415                               
     416                        </description>
     417               
     418                </bitlbee-command>
     419               
     420                <bitlbee-command name="info">
     421                        <syntax>otr info</syntax>
     422                        <syntax>otr info &lt;nick&gt;</syntax>
     423                       
     424                        <description>
     425                       
     426                                <para>
     427                                        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.
     428                                </para>
     429                               
     430                        </description>
     431               
     432                </bitlbee-command>
     433               
     434                <bitlbee-command name="keygen">
     435                        <syntax>otr keygen &lt;account-no&gt;</syntax>
     436                       
     437                        <description>
     438                       
     439                                <para>
     440                                        Generates a new OTR private key for the given account.
     441                                </para>
     442                               
     443                        </description>
     444               
     445                </bitlbee-command>
     446               
     447                <bitlbee-command name="forget">
     448                        <syntax>otr forget &lt;thing&gt; &lt;arguments&gt;</syntax>
     449                       
     450                        <description>
     451                       
     452                                <para>
     453                                        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.
     454                                </para>
     455                       
     456                        </description>
     457                       
     458                        <bitlbee-command name="fingerprint">
     459                                <syntax>otr forget fingerprint &lt;nick&gt; &lt;fingerprint&gt;</syntax>
     460                               
     461                                <description>
     462                               
     463                                        <para>
     464                                                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.
     465                                        </para>
     466                                       
     467                                </description>
     468                               
     469                        </bitlbee-command>
     470                               
     471                        <bitlbee-command name="context">
     472                                <syntax>otr forget context &lt;nick&gt;</syntax>
     473                               
     474                                <description>
     475                               
     476                                        <para>
     477                                                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.
     478                                        </para>
     479                                       
     480                                </description>
     481                               
     482                        </bitlbee-command>
     483
     484                        <bitlbee-command name="key">
     485                                <syntax>otr forget key &lt;fingerprint&gt;</syntax>
     486                               
     487                                <description>
     488                               
     489                                        <para>
     490                                                Forgets an OTR private key matching the specified fingerprint. It is allowed to specify only a (unique) prefix of the fingerprint.
     491                                        </para>
     492                                       
     493                                </description>
     494                               
     495                        </bitlbee-command>
     496               
     497                </bitlbee-command>
     498               
     499        </bitlbee-command>
    351500
    352501        <bitlbee-command name="set">
     
    533682        </bitlbee-setting>
    534683
     684        <bitlbee-setting name="color_encrypted" type="boolean" scope="global">
     685                <default>true</default>
     686
     687                <description>
     688                        <para>
     689                                If set to true, BitlBee will color incoming encrypted messages according to their fingerprint trust level: untrusted=red, trusted=green.
     690                        </para>
     691                </description>
     692        </bitlbee-setting>
     693
    535694        <bitlbee-setting name="control_channel" type="string" scope="global">
    536695                <default>&amp;bitlbee</default>
     
    619778        </bitlbee-setting>
    620779
     780        <bitlbee-setting name="halfop_buddies" type="string" scope="global">
     781                <default>encrypted</default>
     782                <possible-values>encrypted, trusted, notaway, online, false</possible-values>
     783
     784                <description>
     785                        <para>
     786                                Specifies under which circumstances BitlBee should give the "halfop" mode flag (+h) to buddies.
     787                        </para>
     788                       
     789                        <para>
     790                                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. On "online", the flag is set whenever the user is online; only meaningful in conjunction with "show_offline".
     791                        </para>
     792                </description>
     793        </bitlbee-setting>
     794
    621795        <bitlbee-setting name="ignore_auth_requests" type="boolean" scope="account">
    622796                <default>true</default>
     
    627801                        </para>
    628802                </description>
    629 
    630803        </bitlbee-setting>
    631804
     
    661834                </description>
    662835
     836        </bitlbee-setting>
     837
     838        <bitlbee-setting name="op_buddies" type="string" scope="global">
     839                <default>trusted</default>
     840                <possible-values>encrypted, trusted, notaway, online, false</possible-values>
     841
     842                <description>
     843                        <para>
     844                                Specifies under which circumstances BitlBee should give the "op" mode flag (+o) to buddies.
     845                        </para>
     846                       
     847                        <para>
     848                                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. On "online", the flag is set whenever the user is online; only meaningful in conjunction with "show_offline".
     849                        </para>
     850                </description>
     851
     852        </bitlbee-setting>
     853
     854        <bitlbee-setting name="op_root" type="bool" scope="global">
     855                <default>true</default>
     856
     857                <description>
     858                        <para>
     859                                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.
     860                        </para>
     861                </description>
     862        </bitlbee-setting>
     863
     864        <bitlbee-setting name="op_user" type="bool" scope="global">
     865                <default>true</default>
     866
     867                <description>
     868                        <para>
     869                                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.
     870                        </para>
     871                </description>
     872        </bitlbee-setting>
     873
     874        <bitlbee-setting name="otr_policy" type="string" scope="global">
     875                <default>opportunistic</default>
     876                <possible-values>never, opportunistic, manual, always</possible-values>
     877
     878                <description>
     879                        <para>
     880                                This setting controls the policy for establishing Off-the-Record connections.
     881                        </para>
     882                        <para>
     883                                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.
     884                        </para>
     885                </description>
    663886        </bitlbee-setting>
    664887
     
    695918                        </para>
    696919                </description>
    697 
    698920        </bitlbee-setting>
    699921
     
    8811103                <description>
    8821104                        <para>
    883                                 If enabled causes BitlBee to also show offline users in Channel. Online-users will get op, away-users voice and offline users none of both. This option takes effect as soon as you reconnect.
     1105                                If enabled causes BitlBee to also show offline users in Channel. You may want to adjust the settings "voice_buddies", "halfop_buddies" and "op_buddies" according to your liking. A reasonable candidate is "voice_buddies=online", "halfop_buddies=false", "op_buddies=notaway".
     1106                        </para>
     1107                        <para>
     1108                                This option takes effect as soon as you reconnect.
    8841109                        </para>
    8851110                </description>
     
    10041229                        </para>
    10051230                </description>
     1231        </bitlbee-setting>
     1232
     1233        <bitlbee-setting name="voice_buddies" type="string" scope="global">
     1234                <default>notaway</default>
     1235                <possible-values>encrypted, trusted, notaway, online, false</possible-values>
     1236
     1237                <description>
     1238                        <para>
     1239                                Specifies under which circumstances BitlBee should give the "voice" mode flag (+v) to buddies.
     1240                        </para>
     1241                       
     1242                        <para>
     1243                                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. On "online", the flag is set whenever the user is online; only meaningful in conjunction with "show_offline".
     1244                        </para>
     1245                </description>
     1246
    10061247        </bitlbee-setting>
    10071248
  • ipc.c

    rdf1ae622 rbb09b3c  
    3333
    3434GSList *child_list = NULL;
     35static char *statefile = NULL;
    3536
    3637static void ipc_master_cmd_client( irc_t *data, char **cmd )
     
    6263}
    6364
    64 static void ipc_master_cmd_deaf( irc_t *data, char **cmd )
    65 {
    66         if( global.conf->runmode == RUNMODE_DAEMON )
    67         {
    68                 b_event_remove( global.listen_watch_source_id );
    69                 close( global.listen_socket );
    70                
    71                 global.listen_socket = global.listen_watch_source_id = -1;
    72        
    73                 ipc_to_children_str( "OPERMSG :Closed listening socket, waiting "
    74                                      "for all users to disconnect." );
    75         }
    76         else
    77         {
    78                 ipc_to_children_str( "OPERMSG :The DEAF command only works in "
    79                                      "normal daemon mode. Try DIE instead." );
    80         }
    81 }
    82 
    8365void ipc_master_cmd_rehash( irc_t *data, char **cmd )
    8466{
     
    11698        { "hello",      0, ipc_master_cmd_client,     0 },
    11799        { "die",        0, ipc_master_cmd_die,        0 },
    118         { "deaf",       0, ipc_master_cmd_deaf,       0 },
    119100        { "wallops",    1, NULL,                      IPC_CMD_TO_CHILDREN },
    120101        { "wall",       1, NULL,                      IPC_CMD_TO_CHILDREN },
     
    460441}
    461442
    462 #ifndef _WIN32
    463443char *ipc_master_save_state()
    464444{
     
    501481}
    502482
     483void ipc_master_set_statefile( char *fn )
     484{
     485        statefile = g_strdup( fn );
     486}
     487
    503488
    504489static gboolean new_ipc_client( gpointer data, gint serversock, b_input_condition cond )
     
    521506}
    522507
     508#ifndef _WIN32
    523509int ipc_master_listen_socket()
    524510{
     
    557543}
    558544#else
    559 int ipc_master_listen_socket()
    560 {
    561545        /* FIXME: Open named pipe \\.\BITLBEE */
    562         return 0;
    563 }
    564546#endif
    565547
    566 int ipc_master_load_state( char *statefile )
     548int ipc_master_load_state()
    567549{
    568550        struct bitlbee_child *child;
     
    572554        if( statefile == NULL )
    573555                return 0;
    574        
    575556        fp = fopen( statefile, "r" );
    576557        unlink( statefile );    /* Why do it later? :-) */
  • ipc.h

    rdf1ae622 rbb09b3c  
    5858
    5959char *ipc_master_save_state();
    60 int ipc_master_load_state( char *statefile );
     60void ipc_master_set_statefile( char *fn );
     61int ipc_master_load_state();
    6162int ipc_master_listen_socket();
    6263
  • irc.c

    rdf1ae622 rbb09b3c  
    2929#include "crypting.h"
    3030#include "ipc.h"
     31#include <sys/types.h>
     32#include <sys/wait.h>
    3133
    3234static gboolean irc_userping( gpointer _irc, int fd, b_input_condition cond );
     35static void irc_welcome( irc_t* irc );
    3336
    3437GSList *irc_connection_list = NULL;
     
    177180
    178181        irc_connection_list = g_slist_append( irc_connection_list, irc );
     182
    179183       
    180184        s = set_add( &irc->set, "away", NULL,  set_eval_away_status, irc );
    181185        s->flags |= SET_NULL_OK;
    182         s = set_add( &irc->set, "away_devoice", "true",  set_eval_away_devoice, irc );
    183186        s = set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc );
    184187        s = set_add( &irc->set, "auto_reconnect", "true", set_eval_bool, irc );
     
    187190        s = set_add( &irc->set, "buddy_sendbuffer_delay", "200", set_eval_int, irc );
    188191        s = set_add( &irc->set, "charset", "utf-8", set_eval_charset, irc );
     192        s = set_add( &irc->set, "color_encrypted", "true", set_eval_bool, irc );
    189193        s = set_add( &irc->set, "control_channel", irc->channel, set_eval_control_channel, irc );
    190194        s = set_add( &irc->set, "debug", "false", set_eval_bool, irc );
     
    193197        s = set_add( &irc->set, "display_timestamps", "true", set_eval_bool, irc );
    194198        s = set_add( &irc->set, "handle_unknown", "root", NULL, irc );
     199        s = set_add( &irc->set, "halfop_buddies", "encrypted", set_eval_halfop_buddies, irc );
    195200        s = set_add( &irc->set, "lcnicks", "true", set_eval_bool, irc );
    196         s = set_add( &irc->set, "ops", "both", set_eval_ops, irc );
     201        s = set_add( &irc->set, "op_buddies", "trusted", set_eval_op_buddies, irc );
     202        s = set_add( &irc->set, "op_root", "true", set_eval_op_root, irc );
     203        s = set_add( &irc->set, "otr_policy", "oppurtunistic", set_eval_otr_policy, irc );
    197204        s = set_add( &irc->set, "password", NULL, set_eval_password, irc );
    198205        s->flags |= SET_NULL_OK;
     
    203210        s = set_add( &irc->set, "show_offline", "false", set_eval_bool, irc );
    204211        s = set_add( &irc->set, "simulate_netsplit", "true", set_eval_bool, irc );
    205         s = set_add( &irc->set, "status", NULL,  set_eval_away_status, irc );
    206         s->flags |= SET_NULL_OK;
    207212        s = set_add( &irc->set, "strip_html", "true", NULL, irc );
    208213        s = set_add( &irc->set, "timezone", "local", set_eval_timezone, irc );
    209214        s = set_add( &irc->set, "to_char", ": ", set_eval_to_char, irc );
    210215        s = set_add( &irc->set, "typing_notice", "false", set_eval_bool, irc );
     216        s = set_add( &irc->set, "voice_buddies", "notaway", set_eval_voice_buddies, irc);
    211217       
    212218        conf_loaddefaults( irc );
    213        
     219
     220        irc->otr = otr_new();
     221
    214222        /* Evaluator sets the iconv/oconv structures. */
    215223        set_eval_charset( set_find( &irc->set, "charset" ), set_getstr( &irc->set, "charset" ) );
     
    363371       
    364372        g_free( irc->last_target );
     373
     374        otr_free(irc->otr);
    365375       
    366376        g_free( irc );
    367        
     377
    368378        if( global.conf->runmode == RUNMODE_INETD ||
    369379            global.conf->runmode == RUNMODE_FORKDAEMON ||
     
    734744}
    735745
     746const char *user_mode_prefix( irc_t *irc, user_t *u )
     747{
     748        static char op[] = "@";
     749        static char halfop[] = "%";
     750        static char voice[] = "+";
     751        static char none[] = "";
     752
     753        int or = set_getbool(&irc->set, "op_root");
     754        int ou = set_getbool(&irc->set, "op_user");
     755        char *ob = set_getstr(&irc->set, "op_buddies");
     756        char *hb = set_getstr(&irc->set, "halfop_buddies");
     757        char *vb = set_getstr(&irc->set, "voice_buddies");
     758
     759        if( (!strcmp(u->nick, irc->mynick) && or) ||
     760            (!strcmp(u->nick, irc->nick) && ou) ||
     761        (!u->away && !strcmp(ob, "notaway")) ||
     762        (u->encrypted && !strcmp(ob, "encrypted")) ||
     763        (u->encrypted>1 && !strcmp(ob, "trusted"))
     764      )
     765                return op;
     766        else if( (!u->away && !strcmp(hb, "notaway")) ||
     767             (u->encrypted && !strcmp(hb, "encrypted")) ||
     768             (u->encrypted>1 && !strcmp(hb, "trusted"))
     769               )
     770                return halfop;
     771        else if( (!u->away && !strcmp(vb, "notaway")) ||
     772             (u->encrypted && !strcmp(vb, "encrypted")) ||
     773             (u->encrypted>1 && !strcmp(vb, "trusted"))
     774               )
     775                return voice;
     776        else
     777                return none;
     778}
     779                       
    736780void irc_names( irc_t *irc, char *channel )
    737781{
     
    739783        char namelist[385] = "";
    740784        struct groupchat *c = NULL;
    741         char *ops = set_getstr( &irc->set, "ops" );
    742785       
    743786        /* RFCs say there is no error reply allowed on NAMES, so when the
     
    754797                        }
    755798                       
    756                         if( u->ic && !u->away && set_getbool( &irc->set, "away_devoice" ) )
    757                                 strcat( namelist, "+" );
    758                         else if( ( strcmp( u->nick, irc->mynick ) == 0 && ( strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) == 0 ) ) ||
    759                                  ( strcmp( u->nick, irc->nick ) == 0 && ( strcmp( ops, "user" ) == 0 || strcmp( ops, "both" ) == 0 ) ) )
    760                                 strcat( namelist, "@" );
    761                        
     799                        strcat( namelist, user_mode_prefix(irc, u) );
    762800                        strcat( namelist, u->nick );
    763801                        strcat( namelist, " " );
     
    770808                /* root and the user aren't in the channel userlist but should
    771809                   show up in /NAMES, so list them first: */
    772                 sprintf( namelist, "%s%s %s%s ", strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) ? "@" : "", irc->mynick,
    773                                                  strcmp( ops, "user" ) == 0 || strcmp( ops, "both" ) ? "@" : "", irc->nick );
     810                sprintf( namelist, "%s%s %s%s ", set_getbool(&irc->set, "op_root") ? "@" : "", irc->mynick,
     811                                                 set_getbool(&irc->set, "op_user") ? "@" : "", irc->nick );
    774812               
    775813                for( l = c->in_room; l; l = l->next ) if( ( u = user_findhandle( c->ic, l->data ) ) )
     
    781819                        }
    782820                       
     821                        strcat( namelist, user_mode_prefix(irc, u) );
    783822                        strcat( namelist, u->nick );
    784823                        strcat( namelist, " " );
     
    822861        irc_reply( irc,   3, ":%s", IRCD_INFO );
    823862        irc_reply( irc,   4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES UMODES_PRIV, CMODES );
    824         irc_reply( irc,   5, "PREFIX=(ov)@+ CHANTYPES=%s CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee "
     863        irc_reply( irc,   5, "PREFIX=(ohv)@%%+ CHANTYPES=%s CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee "
    825864                             "CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server",
    826865                             CTYPES, CMODES, MAX_NICK_LENGTH - 1 );
     
    828867        irc->umode[0] = '\0';
    829868        irc_umode_set( irc, "+" UMODE, 1 );
    830 
    831         u = user_add( irc, irc->mynick );
     869u = user_add( irc, irc->mynick );
    832870        u->host = g_strdup( irc->myhost );
    833871        u->realname = g_strdup( ROOT_FN );
     
    851889        irc_spawn( irc, u );
    852890       
    853         irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\n"
    854                           "If you've never used BitlBee before, please do read the help "
    855                           "information using the \x02help\x02 command. Lots of FAQs are "
    856                           "answered there.\n"
    857                           "If you already have an account on this server, just use the "
    858                           "\x02identify\x02 command to identify yourself." );
     891        irc_welcome( irc );
    859892       
    860893        if( global.conf->runmode == RUNMODE_FORKDAEMON || global.conf->runmode == RUNMODE_DAEMON )
     
    871904                root_command( irc, send_cmd );
    872905                g_free( send_cmd[1] );
     906        }
     907}
     908
     909static void irc_welcome( irc_t *irc )
     910{
     911        FILE *f;
     912       
     913        f = fopen( global.conf->welcomefile, "r" );
     914        if( !f )
     915        {
     916                irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\n"
     917                                  "If you've never used BitlBee before, please do read the help "
     918                                  "information using the \x02help\x02 command. Lots of FAQs are "
     919                                  "answered there.\n"
     920                                  "OTR users please note: Private key files are owned by the user "
     921                                  "BitlBee is running as.\n"
     922                                  "If you already have an account on this server, just use the "
     923                                  "\x02identify\x02 command to identify yourself." );
     924        }
     925        else
     926        {
     927                char linebuf[380];
     928               
     929                while( fgets( linebuf, 380, f ) )
     930                {
     931                        irc_usermsg( irc, linebuf );
     932                }
     933               
     934                fclose( f );
    873935        }
    874936}
  • irc.h

    rdf1ae622 rbb09b3c  
    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
  • irc_commands.c

    rdf1ae622 rbb09b3c  
    604604        { "completions", 0, irc_cmd_completions, IRC_CMD_LOGGED_IN },
    605605        { "die",         0, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER },
    606         { "deaf",        0, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER },
    607606        { "wallops",     1, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER },
    608607        { "wall",        1, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER },
  • lib/misc.c

    rdf1ae622 rbb09b3c  
    157157        char *s = out, *cs;
    158158        int i, matched;
     159        int taglen;
    159160       
    160161        memset( out, 0, strlen( in ) + 1 );
     
    173174                                in ++;
    174175                       
     176                        taglen = in-cs-1;   /* not <0 because the above loop runs at least once */
    175177                        if( *in )
    176178                        {
    177                                 if( g_strncasecmp( cs+1, "br", 2) == 0 )
     179                                if( g_strncasecmp( cs+1, "b", taglen) == 0 )
     180                                        *(s++) = '\x02';
     181                                else if( g_strncasecmp( cs+1, "/b", taglen) == 0 )
     182                                        *(s++) = '\x02';
     183                                else if( g_strncasecmp( cs+1, "i", taglen) == 0 )
     184                                        *(s++) = '\x1f';
     185                                else if( g_strncasecmp( cs+1, "/i", taglen) == 0 )
     186                                        *(s++) = '\x1f';
     187                                else if( g_strncasecmp( cs+1, "br", 2) == 0 )
    178188                                        *(s++) = '\n';
    179189                                in ++;
  • lib/ssl_bogus.c

    rdf1ae622 rbb09b3c  
    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 )
     
    6670        return 0;
    6771}
     72
     73int ssl_pending( void *conn )
     74{
     75        return 0;
     76}
  • lib/ssl_client.h

    rdf1ae622 rbb09b3c  
    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

    rdf1ae622 rbb09b3c  
    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

    rdf1ae622 rbb09b3c  
    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

    rdf1ae622 rbb09b3c  
    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

    rdf1ae622 rbb09b3c  
    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

    rdf1ae622 rbb09b3c  
    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

    rdf1ae622 rbb09b3c  
    526526       
    527527        ret->name = "jabber";
     528    ret->mms = 0;                        /* no limit */
    528529        ret->login = jabber_login;
    529530        ret->init = jabber_init;
  • protocols/msn/msn.c

    rdf1ae622 rbb09b3c  
    307307       
    308308        ret->name = "msn";
     309    ret->mms = 1409;         /* this guess taken from libotr UPGRADING file */
    309310        ret->login = msn_login;
    310311        ret->init = msn_init;
  • protocols/msn/ns.c

    rdf1ae622 rbb09b3c  
    271271                if( num_parts == 5 )
    272272                {
    273                         int i, groupcount;
    274                        
    275                         groupcount = atoi( cmd[4] );
    276                         if( groupcount > 0 )
    277                         {
    278                                 /* valgrind says this is leaking memory, I'm guessing
    279                                    that this happens during server redirects. */
    280                                 if( md->grouplist )
    281                                 {
    282                                         for( i = 0; i < md->groupcount; i ++ )
    283                                                 g_free( md->grouplist[i] );
    284                                         g_free( md->grouplist );
    285                                 }
    286                                
    287                                 md->groupcount = groupcount;
     273                        md->buddycount = atoi( cmd[3] );
     274                        md->groupcount = atoi( cmd[4] );
     275                        if( md->groupcount > 0 )
    288276                                md->grouplist = g_new0( char *, md->groupcount );
    289                         }
    290                        
    291                         md->buddycount = atoi( cmd[3] );
     277                       
    292278                        if( !*cmd[3] || md->buddycount == 0 )
    293279                                msn_logged_in( ic );
  • protocols/nogaim.c

    rdf1ae622 rbb09b3c  
    725725        }
    726726       
    727         /* early if-clause for show_offline even if there is some redundant code here because this isn't LISP but C ;) */
    728         if( set_getbool( &ic->irc->set, "show_offline" ) && set_getbool( &ic->irc->set, "away_devoice" ) )
     727        /* LISPy... */
     728        if( ( u->online ) &&                                            /* Don't touch offline people */
     729            ( ( u->online != oo ) ||                                    /* Do joining people */
     730              ( ( u->online == oo ) && ( oa == !u->away ) ) ) )         /* Do people changing state */
    729731        {
    730732                char *from;
     
    740742                }
    741743
    742                 /* if we use show_offline, we op online users, voice away users, and devoice/deop offline users */
    743                 if( flags & OPT_LOGGED_IN )
    744                 {
    745                         /* user is "online" (either really online or away) */
    746                         irc_write( ic->irc, ":%s MODE %s %cv%co %s %s", from, ic->irc->channel,
    747                                                                   u->away?'+':'-', u->away?'-':'+', u->nick, u->nick );
    748                 }
    749                 else
    750                 {
    751                         /* user is offline */
    752                         irc_write( ic->irc, ":%s MODE %s -vo %s %s", from, ic->irc->channel, u->nick, u->nick );
    753                 }
    754         }
    755         else
    756         {
    757                 /* LISPy... */
    758                 if( ( set_getbool( &ic->irc->set, "away_devoice" ) ) &&         /* Don't do a thing when user doesn't want it */
    759                     ( u->online ) &&                                            /* Don't touch offline people */
    760                     ( ( ( u->online != oo ) && !u->away ) ||                    /* Voice joining people */
    761                       ( ( u->online == oo ) && ( oa == !u->away ) ) ) )         /* (De)voice people changing state */
    762                 {
    763                         char *from;
    764 
    765                         if( set_getbool( &ic->irc->set, "simulate_netsplit" ) )
    766                         {
    767                                 from = g_strdup( ic->irc->myhost );
    768                         }
    769                         else
    770                         {
    771                                 from = g_strdup_printf( "%s!%s@%s", ic->irc->mynick, ic->irc->mynick,
    772                                                                     ic->irc->myhost );
    773                         }
     744                if(!strcmp(set_getstr(&ic->irc->set, "voice_buddies"), "online")) {
     745                        irc_write( ic->irc, ":%s MODE %s +v %s", from, ic->irc->channel, u->nick );
     746                }
     747                if(!strcmp(set_getstr(&ic->irc->set, "halfop_buddies"), "online")) {
     748                        irc_write( ic->irc, ":%s MODE %s +h %s", from, ic->irc->channel, u->nick );
     749                }
     750                if(!strcmp(set_getstr(&ic->irc->set, "op_buddies"), "online")) {
     751                        irc_write( ic->irc, ":%s MODE %s +o %s", from, ic->irc->channel, u->nick );
     752                }
     753
     754                if(!strcmp(set_getstr(&ic->irc->set, "voice_buddies"), "notaway")) {
    774755                        irc_write( ic->irc, ":%s MODE %s %cv %s", from, ic->irc->channel,
    775                                                                   u->away?'-':'+', u->nick );
    776                         g_free( from );
    777                 }
     756                                                                 u->away?'-':'+', u->nick );
     757                }
     758                if(!strcmp(set_getstr(&ic->irc->set, "halfop_buddies"), "notaway")) {
     759                        irc_write( ic->irc, ":%s MODE %s %ch %s", from, ic->irc->channel,
     760                                                                 u->away?'-':'+', u->nick );
     761                }
     762                if(!strcmp(set_getstr(&ic->irc->set, "op_buddies"), "notaway")) {
     763                        irc_write( ic->irc, ":%s MODE %s %co %s", from, ic->irc->channel,
     764                                                                 u->away?'-':'+', u->nick );
     765                }
     766
     767                g_free( from );
    778768        }
    779769}
     
    784774        char *wrapped, *ts = NULL;
    785775        user_t *u;
    786        
     776
     777        /* pass the message through OTR */
     778        msg = otr_handle_message(ic, handle, msg);
     779        if(!msg) {
     780                /* this was an internal OTR protocol message */
     781                return;
     782        }
     783
    787784        u = user_findhandle( ic, handle );
    788        
    789785        if( !u )
    790786        {
     
    796792                                imcb_log( ic, "Ignoring message from unknown handle %s", handle );
    797793                       
     794                        g_free(msg);
    798795                        return;
    799796                }
     
    829826        {
    830827                char *new = g_strconcat( ts, msg, NULL );
    831                 g_free( ts );
    832                 ts = msg = new;
     828                g_free( msg );
     829                msg = new;
    833830        }
    834831       
     
    836833        irc_msgfrom( irc, u->nick, wrapped );
    837834        g_free( wrapped );
     835        g_free( msg );
    838836        g_free( ts );
    839837}
     
    11121110/* Misc. BitlBee stuff which shouldn't really be here */
    11131111
    1114 char *set_eval_away_devoice( set_t *set, char *value )
    1115 {
    1116         irc_t *irc = set->data;
    1117         int st;
    1118        
    1119         if( !is_bool( value ) )
    1120                 return SET_INVALID;
    1121        
    1122         st = bool2int( value );
    1123        
    1124         /* Horror.... */
    1125        
    1126         if( st != set_getbool( &irc->set, "away_devoice" ) )
    1127         {
    1128                 char list[80] = "";
    1129                 user_t *u = irc->users;
    1130                 int i = 0, count = 0;
    1131                 char pm;
    1132                 char v[80];
    1133                
    1134                 if( st )
    1135                         pm = '+';
    1136                 else
    1137                         pm = '-';
    1138                
    1139                 while( u )
    1140                 {
    1141                         if( u->ic && u->online && !u->away )
    1142                         {
    1143                                 if( ( strlen( list ) + strlen( u->nick ) ) >= 79 )
    1144                                 {
    1145                                         for( i = 0; i < count; v[i++] = 'v' ); v[i] = 0;
    1146                                         irc_write( irc, ":%s MODE %s %c%s%s",
    1147                                                    irc->myhost,
    1148                                                    irc->channel, pm, v, list );
    1149                                        
    1150                                         *list = 0;
    1151                                         count = 0;
    1152                                 }
    1153                                
    1154                                 sprintf( list + strlen( list ), " %s", u->nick );
    1155                                 count ++;
    1156                         }
    1157                         u = u->next;
    1158                 }
    1159                
    1160                 /* $v = 'v' x $i */
    1161                 for( i = 0; i < count; v[i++] = 'v' ); v[i] = 0;
    1162                 irc_write( irc, ":%s MODE %s %c%s%s", irc->myhost,
    1163                                                             irc->channel, pm, v, list );
    1164         }
    1165        
    1166         return value;
    1167 }
    1168 
    11691112char *set_eval_timezone( set_t *set, char *value )
    11701113{
     
    12691212                msg = buf;
    12701213        }
    1271        
    1272         st = ic->acc->prpl->buddy_msg( ic, handle, msg, flags );
    1273         g_free( buf );
    1274        
     1214
     1215        /* if compiled without otr support, this just calls the prpl buddy_msg */
     1216        st = otr_send_message(ic, handle, msg, flags);
     1217       
     1218        g_free(buf);
    12751219        return st;
    12761220}
  • protocols/nogaim.h

    rdf1ae622 rbb09b3c  
    132132         * - The user sees this name ie. when imcb_log() is used. */
    133133        const char *name;
     134    /* Maximum Message Size of this protocol.
     135     * - Introduced for OTR, in order to fragment large protocol messages.
     136     * - 0 means "unlimited". */
     137    unsigned int mms;
    134138
    135139        /* Added this one to be able to add per-account settings, don't think
     
    326330/* Misc. stuff */
    327331char *set_eval_timezone( set_t *set, char *value );
    328 char *set_eval_away_devoice( set_t *set, char *value );
    329332gboolean auto_reconnect( gpointer data, gint fd, b_input_condition cond );
    330333void cancel_auto_reconnect( struct account *a );
  • protocols/oscar/oscar.c

    rdf1ae622 rbb09b3c  
    25482548        struct prpl *ret = g_new0(struct prpl, 1);
    25492549        ret->name = "oscar";
     2550    ret->mms = 2343;       /* this guess taken from libotr UPGRADING file */
    25502551        ret->away_states = oscar_away_states;
    25512552        ret->init = oscar_init;
  • protocols/yahoo/libyahoo2.c

    rdf1ae622 rbb09b3c  
    6969#ifdef __MINGW32__
    7070# include <winsock2.h>
     71# define write(a,b,c) send(a,b,c,0)
     72# define read(a,b,c)  recv(a,b,c,0)
    7173#endif
    7274
  • protocols/yahoo/yahoo.c

    rdf1ae622 rbb09b3c  
    355355        struct prpl *ret = g_new0(struct prpl, 1);
    356356        ret->name = "yahoo";
     357    ret->mms = 832;           /* this guess taken from libotr UPGRADING file */
    357358        ret->init = byahoo_init;
    358359       
  • protocols/yahoo/yahoo_httplib.c

    rdf1ae622 rbb09b3c  
    5151#ifdef __MINGW32__
    5252# include <winsock2.h>
     53# define write(a,b,c) send(a,b,c,0)
     54# define read(a,b,c)  recv(a,b,c,0)
    5355# define snprintf _snprintf
    5456#endif
  • query.c

    rdf1ae622 rbb09b3c  
    103103        int count = 0;
    104104       
     105        if(!ic)
     106                return;
     107       
    105108        q = irc->queries;
    106109        def = query_default( irc );
     
    145148                else
    146149                        irc_usermsg( irc, "Accepted: %s", q->question );
    147                 q->yes( q->data );
     150                if( q->yes )
     151                        q->yes( q->data );
    148152        }
    149153        else
     
    153157                else
    154158                        irc_usermsg( irc, "Rejected: %s", q->question );
    155                 q->no( q->data );
     159                if( q->no )
     160                        q->no( q->data );
    156161        }
    157162        q->data = NULL;
  • root_commands.c

    rdf1ae622 rbb09b3c  
    2929#include "bitlbee.h"
    3030#include "help.h"
     31#include "otr.h"
    3132#include "chat.h"
    3233
     
    414415               
    415416                irc_usermsg( irc, "Account successfully added" );
     417               
     418                if(otr_check_for_key(a)) {
     419                        irc_usermsg(irc, "otr: you will be notified when it completes");
     420                }
    416421        }
    417422        else if( g_strcasecmp( cmd[1], "del" ) == 0 )
     
    11771182        { "qlist",          0, cmd_qlist,          0 },
    11781183        { "join_chat",      2, cmd_join_chat,      0 },
     1184        { "otr",            1, cmd_otr,            0 },
    11791185        { "chat",           1, cmd_chat,           0 },
    11801186        { NULL }
  • set.c

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

    rdf1ae622 rbb09b3c  
    100100/* Some not very generic evaluators that really shouldn't be here... */
    101101char *set_eval_to_char( set_t *set, char *value );
    102 char *set_eval_ops( set_t *set, char *value );
     102char *set_eval_op_root( set_t *set, char *value );
     103char *set_eval_op_user( set_t *set, char *value );
     104char *set_eval_op_buddies( set_t *set, char *value );
     105char *set_eval_halfop_buddies( set_t *set, char *value );
     106char *set_eval_voice_buddies( set_t *set, char *value );
     107char *set_eval_otr_policy( set_t *set, char *value );
    103108
    104109#endif /* __SET_H__ */
  • sock.h

    rdf1ae622 rbb09b3c  
    1616#else
    1717# include <winsock2.h>
    18 # include <ws2tcpip.h>
     18# ifndef _MSC_VER
     19#  include <ws2tcpip.h>
     20# endif
    1921# if !defined(BITLBEE_CORE) && defined(_MSC_VER)
    2022#   pragma comment(lib,"bitlbee.lib")
    2123# endif
    2224# include <io.h>
     25# define read(a,b,c) recv(a,b,c,0)
     26# define write(a,b,c) send(a,b,c,0)
     27# define umask _umask
     28# define mode_t int
    2329# define sock_make_nonblocking(fd) { int non_block = 1; ioctlsocket(fd, FIONBIO, &non_block); }
    2430# define sock_make_blocking(fd) { int non_block = 0; ioctlsocket(fd, FIONBIO, &non_block); }
  • storage.c

    rdf1ae622 rbb09b3c  
    2929#include "bitlbee.h"
    3030#include "crypting.h"
     31#include "otr.h"
    3132
    3233extern storage_t storage_text;
     
    116117
    117118                status = st->load(irc, password);
    118                 if (status == STORAGE_OK)
     119                if (status == STORAGE_OK) {
     120                        otr_load(irc);
    119121                        return status;
    120                
     122                }
    121123                if (status != STORAGE_NO_SUCH_USER)
    122124                        return status;
     
    139141                return STORAGE_NO_SUCH_USER;
    140142        }
    141        
     143
     144        otr_save(irc);
    142145        st = ((storage_t *)global.storage->data)->save(irc, overwrite);
    143146       
     
    165168                        ret = status;
    166169        }
     170        if (ret == STORAGE_OK) {
     171                otr_remove(nick);
     172        }
    167173       
    168174        return ret;
     
    178184        storage_t *primary_storage = gl->data;
    179185        irc_t *irc;
    180 
     186       
    181187        /* First, try to rename in the current write backend, assuming onick
    182188         * is stored there */
    183189        status = primary_storage->rename(onick, nnick, password);
    184         if (status != STORAGE_NO_SUCH_USER)
     190        if (status != STORAGE_NO_SUCH_USER) {
     191                otr_rename(onick, nnick);
    185192                return status;
     193        }
    186194
    187195        /* Try to load from a migration backend and save to the current backend.
     
    207215
    208216        storage_remove(onick, password);
     217        otr_rename(onick, nnick);
    209218
    210219        return STORAGE_OK;
  • storage_text.c

    rdf1ae622 rbb09b3c  
    2727#include "bitlbee.h"
    2828#include "crypting.h"
    29 #ifdef _WIN32
    30 # define umask _umask
    31 # define mode_t int
    32 #endif
    33 
    34 #ifndef F_OK
    35 #define F_OK 0
    36 #endif
    3729
    3830static void text_init (void)
  • unix.c

    rdf1ae622 rbb09b3c  
    2929#include "base64.h"
    3030#include "commands.h"
     31#include "crypting.h"
     32#include "otr.h"
    3133#include "protocols/nogaim.h"
    3234#include "help.h"
    3335#include "ipc.h"
     36#include "lib/ssl_client.h"
    3437#include "md5.h"
    3538#include "misc.h"
     
    6366        b_main_init();
    6467        nogaim_init();
     68        /* Ugly Note: libotr and gnutls both use libgcrypt. libgcrypt
     69           has a process-global config state whose initialization happpens
     70           twice if libotr and gnutls are used together. libotr installs custom
     71           memory management functions for libgcrypt while our gnutls module
     72           uses the defaults. Therefore we initialize OTR after SSL. *sigh* */
     73        ssl_init();
     74        otr_init();
    6575       
    6676        srand( time( NULL ) ^ getpid() );
  • user.h

    rdf1ae622 rbb09b3c  
    3838        char is_private;
    3939        char online;
     40        char encrypted;
    4041       
    4142        char *handle;
Note: See TracChangeset for help on using the changeset viewer.