Changes in / [123cac7:1014cab]


Ignore:
Files:
1 deleted
47 edited

Legend:

Unmodified
Added
Removed
  • Makefile

    r123cac7 r1014cab  
    4949
    5050clean: $(subdirs)
    51         rm -f *.o $(OUTFILE) core utils/bitlbeed
     51        rm -f *.o $(OUTFILE) core utils/bitlbeed encode decode
    5252        $(MAKE) -C tests clean
    5353
     
    124124endif
    125125
     126encode: crypting.c
     127        $(CC) crypting.c lib/md5.c $(CFLAGS) -o encode -DCRYPTING_MAIN $(CFLAGS) $(EFLAGS) $(LFLAGS)
     128
     129decode: encode
     130        cp encode decode
     131
    126132ctags:
    127133        ctags `find . -name "*.c"` `find . -name "*.h"`
  • account.c

    r123cac7 r1014cab  
    22  * BitlBee -- An IRC to other IM-networks gateway                     *
    33  *                                                                    *
    4   * Copyright 2002-2010 Wilmer van der Gaast and others                *
     4  * Copyright 2002-2004 Wilmer van der Gaast and others                *
    55  \********************************************************************/
    66
     
    5555        s = set_add( &a->set, "auto_reconnect", "true", set_eval_bool, a );
    5656       
    57         s = set_add( &a->set, "nick_source", "handle", NULL, a );
    58        
    5957        s = set_add( &a->set, "password", NULL, set_eval_account, a );
    6058        s->flags |= ACC_SET_NOSAVE | SET_NULL_OK;
     
    7169                prpl->init( a );
    7270       
    73         s = set_add( &a->set, "away", NULL, set_eval_account, a );
    74         s->flags |= SET_NULL_OK;
    75        
    76         if( a->flags & ACC_FLAG_STATUS_MESSAGE )
    77         {
    78                 s = set_add( &a->set, "status", NULL, set_eval_account, a );
    79                 s->flags |= SET_NULL_OK;
    80         }
    81        
    82         return a;
     71        return( a );
    8372}
    8473
     
    132121               
    133122                acc->auto_connect = bool2int( value );
    134                 return value;
    135         }
    136         else if( strcmp( set->key, "away" ) == 0 ||
    137                  strcmp( set->key, "status" ) == 0 )
    138         {
    139                 if( acc->ic && acc->ic->flags & OPT_LOGGED_IN )
    140                 {
    141                         /* If we're currently on-line, set the var now already
    142                            (bit of a hack) and send an update. */
    143                         g_free( set->value );
    144                         set->value = g_strdup( value );
    145                        
    146                         imc_away_send_update( acc->ic );
    147                 }
    148                
    149123                return value;
    150124        }
     
    293267        p->max = 86400;
    294268       
    295         /* Format: /[0-9]+([*+][0-9]+(<[0-9+])?)?/ */
     269        /* Format: /[0-9]+([*+][0-9]+(<[0-9+]))/ */
    296270        while( *value && isdigit( *value ) )
    297271                p->start = p->start * 10 + *value++ - '0';
  • account.h

    r123cac7 r1014cab  
    3737        int auto_reconnect_delay;
    3838        int reconnect;
    39         int flags;
    4039       
    4140        set_t *set;
     
    5756int account_reconnect_delay( account_t *a );
    5857
    59 typedef enum
    60 {
    61         ACC_SET_NOSAVE = 0x01,          /* Don't save this setting (i.e. stored elsewhere). */
    62         ACC_SET_OFFLINE_ONLY = 0x02,    /* Allow changes only if the acct is offline. */
    63         ACC_SET_ONLINE_ONLY = 0x04,     /* Allow changes only if the acct is online. */
    64 } account_set_flag_t;
    65 
    66 typedef enum
    67 {
    68         ACC_FLAG_AWAY_MESSAGE = 0x01,   /* Supports away messages instead of just states. */
    69         ACC_FLAG_STATUS_MESSAGE = 0x02, /* Supports status messages (without being away). */
    70 } account_flag_t;
     58#define ACC_SET_NOSAVE          0x01
     59#define ACC_SET_OFFLINE_ONLY    0x02
     60#define ACC_SET_ONLINE_ONLY     0x04
    7161
    7262#endif
  • bitlbee.c

    r123cac7 r1014cab  
    7070                        continue;
    7171
    72 #ifdef IPV6_V6ONLY             
    73                 if( res->ai_family == AF_INET6 )
    74                 {
    75                         i = 0;
    76                         setsockopt( global.listen_socket, IPPROTO_IPV6, IPV6_V6ONLY,
    77                                     (char *) &i, sizeof( i ) );
    78                 }
    79 #endif
    80 
    8172                /* TIME_WAIT (?) sucks.. */
    8273                i = 1;
     
    8980                        return( -1 );
    9081                }
     82
    9183                break;
    9284        }
     
    117109                chdir( "/" );
    118110               
    119                 if( getenv( "_BITLBEE_RESTART_STATE" ) == NULL )
    120                         for( i = 0; i < 3; i ++ )
    121                                 if( close( i ) == 0 )
    122                                 {
    123                                         /* Keep something bogus on those fd's just in case. */
    124                                         open( "/dev/null", O_WRONLY );
    125                                 }
     111                /* Sometimes std* are already closed (for example when we're in a RESTARTed
     112                   BitlBee process. So let's only close TTY-fds. */
     113                if( isatty( 0 ) ) close( 0 );
     114                if( isatty( 1 ) ) close( 1 );
     115                if( isatty( 2 ) ) close( 2 );
    126116        }
    127117#endif
  • bitlbee.conf

    r123cac7 r1014cab  
    5555##
    5656## Password the user should enter when logging into a closed BitlBee server.
    57 ## You can also have a BitlBee-style MD5 hash here. Format: "md5:", followed
    58 ## by a hash as generated by "bitlbee -x hash <password>".
     57## You can also have an MD5-encrypted password here. Format: "md5:", followed
     58## by a hash as generated for the <user password=""> attribute in a BitlBee
     59## XML file (for now there's no easier way to generate the hash).
    5960##
    6061# AuthPassword = ItllBeBitlBee   ## Heh.. Our slogan. ;-)
     
    120121## Proxy = socks5://socksproxy.localnet.com
    121122
    122 ## Protocols offered by bitlbee
    123 ##
    124 ## As recompiling may be quite unpractical for some people, this option
    125 ## allows to remove the support of protocol, even if compiled in. If
    126 ## nothing is given, there are no restrictions.
    127 ##
    128 ## Protocols = jabber yahoo
    129 
    130123
    131124[defaults]
  • bitlbee.h

    r123cac7 r1014cab  
    2727#define _BITLBEE_H
    2828
    29 #ifndef _GNU_SOURCE
    3029#define _GNU_SOURCE /* Stupid GNU :-P */
    31 #endif
    3230
    3331/* Depend on Windows 2000 for now since we need getaddrinfo() */
     
    3533
    3634#define PACKAGE "BitlBee"
    37 #define BITLBEE_VERSION "1.2.5"
     35#define BITLBEE_VERSION "1.2.4"
    3836#define VERSION BITLBEE_VERSION
    3937
     
    163161
    164162char *set_eval_root_nick( set_t *set, char *new_nick );
    165 char *set_eval_control_channel( set_t *set, char *new_name );
    166163
    167164extern global_t global;
  • conf.c

    r123cac7 r1014cab  
    6363        conf->ping_timeout = 300;
    6464        conf->user = NULL;
    65         conf->protocols = NULL;
    6665        proxytype = 0;
    6766       
     
    128127                {
    129128                        printf( "Usage: bitlbee [-D/-F [-i <interface>] [-p <port>] [-n] [-v]] [-I]\n"
    130                                 "               [-c <file>] [-d <dir>] [-x] [-h]\n"
     129                                "               [-c <file>] [-d <dir>] [-h]\n"
    131130                                "\n"
    132131                                "An IRC-to-other-chat-networks gateway\n"
     
    144143                                "  -c  Load alternative configuration file\n"
    145144                                "  -d  Specify alternative user configuration directory\n"
    146                                 "  -x  Command-line interface to password encryption/hashing\n"
    147145                                "  -h  Show this help page.\n" );
    148146                        return NULL;
     
    308306                                conf->user = g_strdup( ini->value );
    309307                        }
    310                         else if( g_strcasecmp( ini->key, "protocols" ) == 0 )
    311                         {
    312                                 g_strfreev( conf->protocols );
    313                                 conf->protocols = g_strsplit_set( ini->value, " \t,;", -1 );
    314                         }
    315308                        else
    316309                        {
  • conf.h

    r123cac7 r1014cab  
    5050        int ping_timeout;
    5151        char *user;
    52         char **protocols;
    5352} conf_t;
    5453
  • configure

    r123cac7 r1014cab  
    2020ipcsocket='/var/run/bitlbee.sock'
    2121pcdir='$prefix/lib/pkgconfig'
    22 systemlibdirs="/lib /lib64 /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64"
     22systemlibdirs="/lib /usr/lib /usr/local/lib"
    2323
    2424msn=1
     
    297297detect_resolv_dynamic()
    298298{
    299         TMPFILE=$(mktemp)
    300         ret=1
    301         echo "$RESOLV_TESTCODE" | $CC -o $TMPFILE -x c - -lresolv >/dev/null 2>/dev/null
     299        echo "$RESOLV_TESTCODE" | $CC -o /dev/null -x c - -lresolv >/dev/null 2>/dev/null
    302300        if [ "$?" = "0" ]; then
    303301                echo 'EFLAGS+=-lresolv' >> Makefile.settings
    304                 ret=0
    305         fi
    306 
    307         rm -f $TMPFILE
    308         return $ret
     302                return 0
     303        fi
     304
     305        return 1
    309306}
    310307
    311308detect_resolv_static()
    312309{
    313         TMPFILE=$(mktemp)
    314         ret=1
    315310        for i in $systemlibdirs; do
    316311                if [ -f $i/libresolv.a ]; then
    317                         echo "$RESOLV_TESTCODE" | $CC -o $TMPFILE -x c - -Wl,$i/libresolv.a >/dev/null 2>/dev/null
     312                        echo "$RESOLV_TESTCODE" | $CC -o /dev/null -x c - -Wl,$i/libresolv.a >/dev/null 2>/dev/null
    318313                        if [ "$?" = "0" ]; then
    319314                                echo 'EFLAGS+='$i'/libresolv.a' >> Makefile.settings
    320                                 ret=0
     315                                return 0
    321316                        fi
    322317                fi
    323318        done
    324319
    325         rm -f $TMPFILE
    326         return $ret
     320        return 1
    327321}
    328322
     
    368362       
    369363        ## Yes, you, at the console! How can you authenticate if you don't have any SSL!?
    370         if [ "$msn" = "1" -o "$yahoo" = "1" ]; then
     364        if [ "$msn" = "1" ]; then
    371365                echo
    372                 echo 'WARNING: The MSN and Yahoo! modules will not work without SSL. Disabling.'
     366                echo 'Real SSL support is necessary for MSN authentication, will build without'
     367                echo 'MSN protocol support.'
    373368                msn=0
    374                 yahoo=0
    375369        fi
    376370       
     
    452446fi
    453447
    454 if [ ! -e doc/user-guide/help.txt ] && ! type xmlto > /dev/null 2> /dev/null; then
    455         echo
    456         echo 'WARNING: Building from an unreleased source tree without prebuilt helpfile.'
    457         echo 'Install xmlto if you want online help to work.'
    458 fi
    459 
    460448echo
    461449if [ -z "$BITLBEE_VERSION" -a -d .bzr ] && type bzr > /dev/null 2> /dev/null; then
     
    551539;;
    552540Darwin )
    553         echo 'STRIP=\# skip strip' >> Makefile.settings
    554541;;
    555542IRIX )
  • crypting.c

    r123cac7 r1014cab  
    132132        return (rv);
    133133}
     134
     135#ifdef CRYPTING_MAIN
     136
     137/* A little main() function for people who want a stand-alone program to
     138   encode/decode BitlCrypted files. */
     139
     140int main( int argc, char *argv[] )
     141{
     142        char *hash, *action, line[256];
     143        char* (*func)( char *, const char * );
     144       
     145        if( argc < 2 )
     146        {
     147                fprintf( stderr, "Usage: %s <password>\n\n"
     148                                 "Reads from stdin, writes to stdout.\n"
     149                                 "Call as \"encode\" to encode, \"decode\" to decode.\n", argv[0] );
     150                return( 1 );
     151        }
     152       
     153        hash = hashpass( argv[1] );
     154        action = argv[0] + strlen( argv[0] ) - strlen( "encode" );
     155       
     156        if( strcmp( action, "encode" ) == 0 )
     157        {
     158                fwrite( hash, 32, 1, stdout );
     159                func = obfucrypt;
     160        }
     161        else if( strcmp( action, "decode" ) == 0 )
     162        {
     163                char hash2[32];
     164               
     165                fread( hash2, 32, 1, stdin );
     166                if( memcmp( hash, hash2, 32 ) != 0 )
     167                {
     168                        fprintf( stderr, "Passwords don't match. Can't decode.\n" );
     169                        return( 1 );
     170                }
     171                func = deobfucrypt;
     172        }
     173        else
     174        {
     175                return( main( 0, NULL ) );
     176        }
     177       
     178        while( fscanf( stdin, "%[^\n]255s", line ) > 0 )
     179        {
     180                char *out;
     181               
     182                /* Flush the newline */
     183                fgetc( stdin );
     184               
     185                out = func( line, argv[1] );
     186                printf( "%s\n", out );
     187                g_free( out );
     188        }
     189       
     190        return( 0 );
     191}
     192
     193#endif
  • debian/bitlbee.init

    r123cac7 r1014cab  
    4141        chown bitlbee: /var/run/bitlbee.pid
    4242       
    43         start-stop-daemon --start --quiet --pidfile $PIDFILE \
     43        # Clean up after the bug between 1.2-5 and 1.2.1-2 where BitlBee ran
     44        # as root. (#494656 and #495877) Fixing this in the postinst script
     45        # is not enough since the user will restart his BitlBee after up-
     46        # grading the package, and the BitlBee running as root will then
     47        # save its settings, re-setting ownership of the file to root.
     48        # TODO: Remove this after a few revisions.
     49        find /var/lib/bitlbee -uid 0 -name '*.xml' -exec chown bitlbee: {} \;
     50
     51        start-stop-daemon --start --quiet \
    4452                --exec $DAEMON -- -p $BITLBEE_PORT -P $PIDFILE $BITLBEE_OPTS
    4553}
  • debian/changelog

    r123cac7 r1014cab  
    1 bitlbee (1.2.5-1) unstable; urgency=low
    2 
    3   * New upstream version.
    4   * Fixed issues with server-side MSN nickname corruption. (Closes: #538756)
    5   * Debconf translation fixes/additions. (Closes: #541754, #563504)
    6 
    7  -- Wilmer van der Gaast <wilmer@gaast.net>  Wed, 17 Mar 2010 14:59:27 +0000
    8 
    9 bitlbee (1.2.4-2) unstable; urgency=low
    10 
    11   * Merging in some changes from bzr-head:
    12   * Use libresolv.so where possible. (Closes: #551775)
    13   * Some include file changes that make the bitlbee-dev package useful again.
    14 
    15  -- Wilmer van der Gaast <wilmer@gaast.net>  Thu, 19 Nov 2009 23:02:43 +0000
    16 
    17 bitlbee (1.2.4-1) unstable; urgency=low
    18 
    19   * New upstream version.
    20   * Fixed issues with Yahoo! (Closes: #536178)
    21 
    22  -- Wilmer van der Gaast <wilmer@gaast.net>  Sat, 17 Oct 2009 18:12:45 +0100
    23 
    24 bitlbee (1.2.3-2) unstable; urgency=low
    25 
    26   * Fixed bitblee typo in prerm (introduced by NMU 1.2.1-1.1).
    27     (Closes: #531287)
    28   * Fixed bitlbee.deb dep in bitlbee-dev to deal with binary NMUs.
    29     (Closes: #531219)
    30   * Fixed free port detection code in debian/config which was a bit limited
    31     and also buggy.
    32   * Removing code that edits bitlbee.conf from postinst (and chown code in
    33     the init script), it's not really necessary anymore; bitlbee may only
    34     still run as root if the admin doesn't read conffile diffs.
    35     (Closes: #514572)
    36   * No longer overwriting port number info in /etc/default/bitlbee with
    37     what's in debconf. (Closes: #514148)
    38   * Added notes about the above two changes to bitlbee.conf.
    39 
    40  -- Wilmer van der Gaast <wilmer@gaast.net>  Sun, 07 Jun 2009 21:17:39 +0100
    41 
    42 bitlbee (1.2.3-1) unstable; urgency=critical
    43 
    44   * New upstream version.
    45   * Fixes another account hijacking issue. (Closes: #498159)
    46   * Restored --pidfile argument to start-stop-daemon, otherwise the init
    47     script fails to restart BitlBee when users are connected.
    48 
    49  -- Wilmer van der Gaast <wilmer@gaast.net>  Sun, 07 Sep 2008 18:53:04 +0100
    50 
    511bitlbee (1.2.2-1) unstable; urgency=critical
    522
  • debian/config

    r123cac7 r1014cab  
    22
    33. /usr/share/debconf/confmodule
    4 [ -f /etc/default/bitlbee ] && . /etc/default/bitlbee
    54
    65db_title BitlBee
    76
    8 if [ -n "$BITLBEE_PORT" ]; then
    9         db_set bitlbee/serveport "$BITLBEE_PORT"
    10 else
    11         db_get bitlbee/serveport
    12         if [ "$RET" = "stillhavetoask" ]; then
    13                 listens=$(netstat -ltn | awk '{print $4}')
    14                 for port in 6667 6666 6668 6669; do
    15                         if [ $(expr "$listens " : ".*:$port\s") = "0" ]; then
    16                                 break
    17                         fi
    18                 done
    19                 db_set bitlbee/serveport $port;
     7db_get bitlbee/serveport
     8if [ "$RET" = "stillhavetoask" ]; then
     9        if netstat -ltn | grep ':6667' 2> /dev/null > /dev/null; then
     10                port=6668;
     11        else
     12                port=6667;
    2013        fi
     14        db_set bitlbee/serveport $port;
    2115fi
    2216
  • debian/control

    r123cac7 r1014cab  
    1919Package: bitlbee-dev
    2020Architecture: all
    21 Depends: bitlbee (>= ${source:Version}), bitlbee (<< ${source:Version}.1~)
     21Depends: bitlbee (= ${binary:Version})
    2222Description: An IRC to other chat networks gateway
    2323 This program can be used as an IRC server which forwards everything you
  • debian/patches/bitlbee.conf.diff

    r123cac7 r1014cab  
    1 --- debian/bitlbee/etc/bitlbee/bitlbee.conf     2009-06-01 00:20:24.000000000 +0100
    2 +++ debian/bitlbee/etc/bitlbee/bitlbee.conf     2009-06-07 21:16:19.000000000 +0100
    3 @@ -23,13 +23,18 @@
     1=== modified file 'bitlbee.conf'
     2--- debian/bitlbee/etc/bitlbee/bitlbee.conf     2008-08-26 22:33:54 +0000
     3+++ debian/bitlbee/etc/bitlbee/bitlbee.conf     2008-08-27 23:18:13 +0000
     4@@ -23,7 +23,7 @@
    45 ## If BitlBee is started by root as a daemon, it can drop root privileges,
    56 ## and change to the specified user.
    67 ##
    78-# User = bitlbee
    8 +## DEBIAN NOTE: Without this, BitlBee will run as root!
    9 +##
    109+User = bitlbee
    1110 
    1211 ## DaemonPort/DaemonInterface:
    1312 ##
    14  ## For daemon mode, you can specify on what interface and port the daemon
    15  ## should be listening for connections.
    16  ##
    17 +## DEBIAN NOTE: The init script passes the -p flag to use the port number
    18 +## set using debconf, this overrides the DaemonPort setting here.
    19 +##
    20  # DaemonInterface = 0.0.0.0
    21  # DaemonPort = 6667
    22  
     13
  • debian/po/POTFILES.in

    r123cac7 r1014cab  
    1 [type: gettext/rfc822deb] templates
     1[type: gettext/rfc822deb] bitlbee.templates.master
  • debian/postinst

    r123cac7 r1014cab  
    3333## /etc/default/bitlbee: Auto-generated/updated script.
    3434##
    35 ## If running in (fork)daemon mode, listen on this TCP port.
     35## Don't edit this line, use dpkg-reconfigure bitlbee
    3636BITLBEE_PORT="$PORT"
    3737
     
    6161        else
    6262                mv /usr/share/bitlbee/help.upgrading /usr/share/bitlbee/help.txt
     63        fi
     64fi
     65
     66if ! grep -qi '^User *= *' /etc/bitlbee/bitlbee.conf; then
     67        echo 'Updating configuration file, enabling User-setting...'
     68        if ! sed -i -e 's/# *User *= *.*/User = bitlbee/i' /etc/bitlbee/bitlbee.conf; then
     69                echo 'Failed! BitlBee may run as root now, please check your configs.'
    6370        fi
    6471fi
  • debian/prerm

    r123cac7 r1014cab  
    1111else
    1212        if which invoke-rc.d >/dev/null 2>&1; then
    13                 invoke-rc.d bitlbee stop || exit 0
     13                invoke-rc.d bitblee stop || exit 0
    1414        else
    1515                /etc/init.d/bitlbee stop || exit 0
  • doc/CHANGES

    r123cac7 r1014cab  
    33
    44http://bugs.bitlbee.org/bitlbee/timeline?daysback=90&changeset=on
    5 
    6 Version 1.2.5:
    7 - Many bug fixes, including a fix for MSN login issues, Jabber login timing
    8   issues, Yahoo! crashes at login time with huge contact lists,
    9 - Avoid linking in a static version of libresolv now that glibc has all
    10   relevant functions available in the dynamic version.
    11 - Improved away state code and added the ability to set (non-away) status
    12   messages using "set status" (also possible per account) and see them in
    13   blist and /whois output.
    14 - Added a post-1.2 equivalent of encode/decode to quickly encrypt/decrypt
    15   passwords in a way that BitlBee can read them.
    16 - Allow using the full name for generating nicknames, instead of just the
    17   handle. This is especially useful when using the Facebook XMPP server.
    18 - Auto reconnect is now enabled by default since all protocols can properly
    19   detect cases where auto reconnect should be avoided (i.e. concurrent
    20   logins).
    21 - Changed the default resource_select setting which should reduce message
    22   routing issues on Jabber (i.e. messages going someone's phone instead of
    23   the main client).
    24 
    25 Fixed 17 Mar 2010
    265
    276Version 1.2.4:
  • doc/user-guide/commands.xml

    r123cac7 r1014cab  
    436436        </bitlbee-setting>
    437437
    438         <bitlbee-setting name="away" type="string" scope="both">
    439                 <description>
    440                         <para>
    441                                 To mark yourself as away, it is recommended to just use <emphasis>/away</emphasis>, like on normal IRC networks. If you want to mark yourself as away on only one IM network, you can use this per-account setting.
    442                         </para>
    443 
    444                         <para>
    445                                 You can set it to any value and BitlBee will try to map it to the most appropriate away state for every open IM connection, or set it as a free-form away message where possible.
    446                         </para>
    447 
    448                         <para>
    449                                 Any per-account away setting will override globally set away states. To un-set the setting, use <emphasis>set -del away</emphasis>.
    450                         </para>
    451                 </description>
    452         </bitlbee-setting>
    453 
    454438        <bitlbee-setting name="away_devoice" type="boolean" scope="global">
    455439                <default>true</default>
     
    509493                </description>
    510494
    511         </bitlbee-setting>
    512 
    513         <bitlbee-setting name="control_channel" type="string" scope="global">
    514                 <default>&amp;bitlbee</default>
    515 
    516                 <description>
    517                         <para>
    518                                 Normally the control channel where you can see all your contacts is called "&amp;bitlbee". If you don't like this name, you can rename it to anything else using the <emphasis>rename</emphasis> command, or by changing this setting.
    519                         </para>
    520                 </description>
    521495        </bitlbee-setting>
    522496
     
    587561        </bitlbee-setting>
    588562
    589         <bitlbee-setting name="ignore_auth_requests" type="boolean" scope="account">
    590                 <default>true</default>
    591 
    592                 <description>
    593                         <para>
    594                                 Only supported by OSCAR so far, you can use this setting to ignore ICQ authorization requests, which are hardly used for legitimate (i.e. non-spam) reasons anymore.
    595                         </para>
    596                 </description>
    597 
    598         </bitlbee-setting>
    599 
    600563        <bitlbee-setting name="lcnicks" type="boolean" scope="global">
    601564                <default>true</default>
     
    609572        </bitlbee-setting>
    610573
    611         <bitlbee-setting name="local_display_name" type="boolean" scope="account">
    612                 <default>false</default>
    613 
    614                 <description>
    615                         <para>
    616                                 Mostly meant to work around a bug in MSN servers (forgetting the display name set by the user), this setting tells BitlBee to store your display name locally and set this name on the MSN servers when connecting.
    617                         </para>
    618                 </description>
    619 
    620         </bitlbee-setting>
    621 
    622574        <bitlbee-setting name="mail_notifications" type="boolean" scope="account">
    623575                <default>false</default>
     
    636588                        <para>
    637589                                You can use this option to set your nickname in a chatroom. You won't see this nickname yourself, but other people in the room will. By default, BitlBee will use your username as the chatroom nickname.
    638                         </para>
    639                 </description>
    640         </bitlbee-setting>
    641 
    642         <bitlbee-setting name="nick_source" type="string" scope="account">
    643                 <default>handle</default>
    644                 <possible-values>handle, full_name, first_name</possible-values>
    645 
    646                 <description>
    647                         <para>
    648                                 By default, BitlBee generates a nickname for every contact by taking its handle and chopping off everything after the @. In some cases, this gives very inconvenient nicknames. The Facebook XMPP server is a good example, as all Facebook XMPP handles are numeric.
    649                         </para>
    650 
    651                         <para>
    652                                 With this setting set to <emphasis>full_name</emphasis>, the person's full name is used to generate a nickname. Or if you don't like long nicknames, set this setting to <emphasis>first_name</emphasis> instead and only the first word will be used. Note that the full name can be full of non-ASCII characters which will be stripped off.
    653590                        </para>
    654591                </description>
     
    748685
    749686        <bitlbee-setting name="resource_select" type="string" scope="account">
    750                 <default>activity</default>
     687                <default>priority</default>
    751688                <possible-values>priority, activity</possible-values>
    752689
     
    810747        </bitlbee-setting>
    811748
    812         <bitlbee-setting name="status" type="string" scope="both">
    813                 <description>
    814                         <para>
    815                                 Certain protocols (like Jabber/XMPP) support status messages, similar to away messages. They can be used to indicate things like your location or activity, without showing up as away/busy.
    816                         </para>
    817 
    818                         <para>
    819                                 This setting can be used to set such a message. It will be available as a per-account setting for protocols that support it, and also as a global setting (which will then automatically be used for all protocols that support it).
    820                         </para>
    821 
    822                         <para>
    823                                 Away states set using <emphasis>/away</emphasis> or the <emphasis>away</emphasis> setting will override this setting. To un-set the setting, use <emphasis>set -del status</emphasis>.
    824                         </para>
    825                 </description>
    826         </bitlbee-setting>
    827 
    828749        <bitlbee-setting name="strip_html" type="boolean" scope="global">
    829750                <default>true</default>
     
    835756                        <para>
    836757                                If BitlBee fails to detect this sometimes (most likely in AIM messages over an ICQ connection), you can set this setting to <emphasis>always</emphasis>, but this might sometimes accidentally strip non-HTML things too.
    837                         </para>
    838                 </description>
    839         </bitlbee-setting>
    840 
    841         <bitlbee-setting name="timezone" type="string" scope="global">
    842                 <default>local</default>
    843                 <possible-values>local, utc, gmt, timezone-spec</possible-values>
    844 
    845                 <description>
    846                         <para>
    847                                 If message timestamps are available for offline messages or chatroom backlogs, BitlBee will display them as part of the message. By default it will use the local timezone. If you're not in the same timezone as the BitlBee server, you can adjust the timestamps using this setting.
    848                         </para>
    849 
    850                         <para>
    851                                 Values local/utc/gmt should be self-explanatory. timezone-spec is a time offset in hours:minutes, for example: -8 for Pacific Standard Time, +2 for Central European Summer Time, +5:30 for Indian Standard Time.
    852758                        </para>
    853759                </description>
  • doc/user-guide/misc.xml

    r123cac7 r1014cab  
    8686
    8787<para>
    88 To mark yourself as away, you can just use the <emphasis>/away</emphasis> command in your IRC client. BitlBee supports most away-states supported by the protocols.
     88As you might've expected, you can just use the <emphasis>/away</emphasis> command in your IRC client to set an away-state. BitlBee supports most away-states supported by the protocols.
    8989</para>
    9090
    9191<para>
    92 Away states have different names accross different protocols. BitlBee will try to pick the best available option for every connection:
     92Not all away states are supported by all protocols, and some protocols have different names for them. BitlBee will try to pick the best available alias from this list for every connection:
    9393</para>
    9494
    9595<simplelist>
    96         <member>Away</member>
    97         <member>NA</member>
    98         <member>Busy, DND</member>
    99         <member>BRB</member>
    100         <member>Phone</member>
    101         <member>Lunch, Food</member>
     96        <member>Away from computer, Away, Extended away</member>
     97        <member>NA, N/A, Not available</member>
     98        <member>Busy, Do not disturb, DND, Occupied</member>
     99        <member>Be right back, BRB</member>
     100        <member>On the phone, Phone, On phone</member>
     101        <member>Out to lunch, Lunch, Food</member>
    102102        <member>Invisible, Hidden</member>
    103103</simplelist>
    104104
    105105<para>
    106 So <emphasis>/away Food</emphasis> will set your state to "Out to lunch" on your MSN connection, and for most other connections the default, "Away" will be chosen.
     106So <emphasis>/away Food</emphasis> will set your state to "Out to lunch" on your MSN connection, and for most other connections the default, "Away" or "Away from computer" will be chosen.
    107107</para>
    108108
     
    111111</para>
    112112
    113 <para>
    114 If you want to set an away state for only one of your connections, you can use the per-account <emphasis>away</emphasis> setting. See <emphasis>help set away</emphasis>.
    115 </para>
    116 
    117113</sect1>
    118114
  • irc.c

    r123cac7 r1014cab  
    5252{
    5353        irc_t *irc = set->data;
    54         char *test;
    55         gsize test_bytes = 0;
    5654        GIConv ic, oc;
    5755
     
    5957                value = g_strdup( "utf-8" );
    6058
     59        if( ( ic = g_iconv_open( "utf-8", value ) ) == (GIConv) -1 )
     60        {
     61                return NULL;
     62        }
    6163        if( ( oc = g_iconv_open( value, "utf-8" ) ) == (GIConv) -1 )
    6264        {
    63                 return NULL;
    64         }
    65         if( ( test = g_convert_with_iconv( " ", 1, oc, NULL, &test_bytes, NULL ) ) == NULL ||
    66             test_bytes > 1 )
    67         {
    68                 g_free( test );
    69                 g_iconv_close( oc );
    70                 irc_usermsg( irc, "Unsupported character set: The IRC protocol "
    71                                   "only supports 8-bit character sets." );
    72                 return NULL;
    73         }
    74         if( ( ic = g_iconv_open( "utf-8", value ) ) == (GIConv) -1 )
    75         {
    76                 g_iconv_close( oc );
     65                g_iconv_close( ic );
    7766                return NULL;
    7867        }
     
    8978}
    9079
    91 static char *set_eval_away_status( set_t *set, char *value )
    92 {
    93         irc_t *irc = set->data;
    94         account_t *a;
    95        
    96         g_free( set->value );
    97         set->value = g_strdup( value );
    98        
    99         for( a = irc->accounts; a; a = a->next )
    100         {
    101                 struct im_connection *ic = a->ic;
    102                
    103                 if( ic && ic->flags & OPT_LOGGED_IN )
    104                         imc_away_send_update( ic );
    105         }
    106        
    107         return value;
    108 }
    109 
    11080irc_t *irc_new( int fd )
    11181{
     
    173143        irc_connection_list = g_slist_append( irc_connection_list, irc );
    174144       
    175         s = set_add( &irc->set, "away", NULL,  set_eval_away_status, irc );
    176         s->flags |= SET_NULL_OK;
    177145        s = set_add( &irc->set, "away_devoice", "true",  set_eval_away_devoice, irc );
    178146        s = set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc );
    179         s = set_add( &irc->set, "auto_reconnect", "true", set_eval_bool, irc );
     147        s = set_add( &irc->set, "auto_reconnect", "false", set_eval_bool, irc );
    180148        s = set_add( &irc->set, "auto_reconnect_delay", "5*3<900", set_eval_account_reconnect_delay, irc );
    181149        s = set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc );
    182150        s = set_add( &irc->set, "buddy_sendbuffer_delay", "200", set_eval_int, irc );
    183151        s = set_add( &irc->set, "charset", "utf-8", set_eval_charset, irc );
    184         s = set_add( &irc->set, "control_channel", irc->channel, set_eval_control_channel, irc );
    185152        s = set_add( &irc->set, "debug", "false", set_eval_bool, irc );
    186153        s = set_add( &irc->set, "default_target", "root", NULL, irc );
     
    196163        s = set_add( &irc->set, "save_on_quit", "true", set_eval_bool, irc );
    197164        s = set_add( &irc->set, "simulate_netsplit", "true", set_eval_bool, irc );
    198         s = set_add( &irc->set, "status", NULL,  set_eval_away_status, irc );
    199         s->flags |= SET_NULL_OK;
    200165        s = set_add( &irc->set, "strip_html", "true", NULL, irc );
    201         s = set_add( &irc->set, "timezone", "local", set_eval_timezone, irc );
    202166        s = set_add( &irc->set, "to_char", ": ", set_eval_to_char, irc );
    203167        s = set_add( &irc->set, "typing_notice", "false", set_eval_bool, irc );
  • irc_commands.c

    r123cac7 r1014cab  
    448448        user_t *u = user_find( irc, irc->nick );
    449449        char *away = cmd[1];
     450        account_t *a;
    450451       
    451452        if( !u ) return;
     
    474475        }
    475476       
    476         set_setstr( &irc->set, "away", u->away );
     477        for( a = irc->accounts; a; a = a->next )
     478        {
     479                struct im_connection *ic = a->ic;
     480               
     481                if( ic && ic->flags & OPT_LOGGED_IN )
     482                        imc_set_away( ic, u->away );
     483        }
    477484}
    478485
     
    497504                else if( u->away )
    498505                        irc_reply( irc, 301, "%s :%s", u->nick, u->away );
    499                 if( u->status_msg )
    500                         irc_reply( irc, 333, "%s :Status: %s", u->nick, u->status_msg );
    501506               
    502507                irc_reply( irc, 318, "%s :End of /WHOIS list", nick );
  • lib/misc.c

    r123cac7 r1014cab  
    3434#include "nogaim.h"
    3535#include "base64.h"
    36 #include "md5.h"
    3736#include <stdio.h>
    3837#include <stdlib.h>
     
    9089        { "gt",     ">" },
    9190        { "amp",    "&" },
    92         { "apos",   "'" },
    9391        { "quot",   "\"" },
    9492        { "aacute", "á" },
     
    524522
    525523/* Word wrapping. Yes, I know this isn't UTF-8 clean. I'm willing to take the risk. */
    526 char *word_wrap( const char *msg, int line_len )
     524char *word_wrap( char *msg, int line_len )
    527525{
    528526        GString *ret = g_string_sized_new( strlen( msg ) + 16 );
  • lib/misc.h

    r123cac7 r1014cab  
    6262G_MODULE_EXPORT struct ns_srv_reply *srv_lookup( char *service, char *protocol, char *domain );
    6363
    64 G_MODULE_EXPORT char *word_wrap( const char *msg, int line_len );
     64G_MODULE_EXPORT char *word_wrap( char *msg, int line_len );
    6565
    6666G_MODULE_EXPORT gboolean ssl_sockerr_again( void *ssl );
  • protocols/jabber/io.c

    r123cac7 r1014cab  
    375375       
    376376        if( ( c = xt_find_node( node->children, "bind" ) ) )
    377                 jd->flags |= JFLAG_WANT_BIND;
     377        {
     378                reply = xt_new_node( "bind", NULL, xt_new_node( "resource", set_getstr( &ic->acc->set, "resource" ), NULL ) );
     379                xt_add_attr( reply, "xmlns", XMLNS_BIND );
     380                reply = jabber_make_packet( "iq", "set", NULL, reply );
     381                jabber_cache_add( ic, reply, jabber_pkt_bind_sess );
     382               
     383                if( !jabber_write_packet( ic, reply ) )
     384                        return XT_ABORT;
     385               
     386                jd->flags |= JFLAG_WAIT_BIND;
     387        }
    378388       
    379389        if( ( c = xt_find_node( node->children, "session" ) ) )
    380                 jd->flags |= JFLAG_WANT_SESSION;
    381        
    382         if( jd->flags & JFLAG_AUTHENTICATED )
    383                 return jabber_pkt_bind_sess( ic, NULL, NULL );
     390        {
     391                reply = xt_new_node( "session", NULL, NULL );
     392                xt_add_attr( reply, "xmlns", XMLNS_SESSION );
     393                reply = jabber_make_packet( "iq", "set", NULL, reply );
     394                jabber_cache_add( ic, reply, jabber_pkt_bind_sess );
     395               
     396                if( !jabber_write_packet( ic, reply ) )
     397                        return XT_ABORT;
     398               
     399                jd->flags |= JFLAG_WAIT_SESSION;
     400        }
     401       
     402        /* This flag is already set if we authenticated via SASL, so now
     403           we can resume the session in the new stream, if we don't have
     404           to bind/initialize the session. */
     405        if( jd->flags & JFLAG_AUTHENTICATED && ( jd->flags & ( JFLAG_WAIT_BIND | JFLAG_WAIT_SESSION ) ) == 0 )
     406        {
     407                if( !jabber_get_roster( ic ) )
     408                        return XT_ABORT;
     409        }
    384410       
    385411        return XT_HANDLED;
     
    415441        imcb_log( ic, "Converting stream to TLS" );
    416442       
    417         jd->flags |= JFLAG_STARTTLS_DONE;
    418443        jd->ssl = ssl_starttls( jd->fd, jabber_connected_ssl, ic );
    419444       
     
    506531                jd->r_inpa = b_input_add( jd->fd, GAIM_INPUT_READ, jabber_read_callback, ic );
    507532       
    508         greet = g_strdup_printf( "%s<stream:stream to=\"%s\" xmlns=\"jabber:client\" "
    509                                   "xmlns:stream=\"http://etherx.jabber.org/streams\" version=\"1.0\">",
    510                                   ( jd->flags & JFLAG_STARTTLS_DONE ) ? "" : "<?xml version='1.0' ?>",
    511                                   jd->server );
     533        greet = g_strdup_printf( "<?xml version='1.0' ?>"
     534                                 "<stream:stream to=\"%s\" xmlns=\"jabber:client\" "
     535                                  "xmlns:stream=\"http://etherx.jabber.org/streams\" version=\"1.0\">", jd->server );
    512536       
    513537        st = jabber_write( ic, greet, strlen( greet ) );
  • protocols/jabber/iq.c

    r123cac7 r1014cab  
    298298{
    299299        struct jabber_data *jd = ic->proto_data;
    300         struct xt_node *c, *reply = NULL;
     300        struct xt_node *c;
    301301        char *s;
    302302       
    303         if( node && ( c = xt_find_node( node->children, "bind" ) ) )
     303        if( ( c = xt_find_node( node->children, "bind" ) ) )
    304304        {
    305305                c = xt_find_node( c->children, "jid" );
     
    307307                    strcmp( s + 1, set_getstr( &ic->acc->set, "resource" ) ) != 0 )
    308308                        imcb_log( ic, "Server changed session resource string to `%s'", s + 1 );
    309         }
    310        
    311         if( jd->flags & JFLAG_WANT_BIND )
    312         {
    313                 reply = xt_new_node( "bind", NULL, xt_new_node( "resource", set_getstr( &ic->acc->set, "resource" ), NULL ) );
    314                 xt_add_attr( reply, "xmlns", XMLNS_BIND );
    315                 jd->flags &= ~JFLAG_WANT_BIND;
    316         }
    317         else if( jd->flags & JFLAG_WANT_SESSION )
    318         {
    319                 reply = xt_new_node( "session", NULL, NULL );
    320                 xt_add_attr( reply, "xmlns", XMLNS_SESSION );
    321                 jd->flags &= ~JFLAG_WANT_SESSION;
    322         }
    323        
    324         if( reply != NULL )
    325         {
    326                 reply = jabber_make_packet( "iq", "set", NULL, reply );
    327                 jabber_cache_add( ic, reply, jabber_pkt_bind_sess );
    328                
    329                 if( !jabber_write_packet( ic, reply ) )
    330                         return XT_ABORT;
    331         }
    332         else if( ( jd->flags & ( JFLAG_WANT_BIND | JFLAG_WANT_SESSION ) ) == 0 )
     309               
     310                jd->flags &= ~JFLAG_WAIT_BIND;
     311        }
     312        else
     313        {
     314                jd->flags &= ~JFLAG_WAIT_SESSION;
     315        }
     316       
     317        if( ( jd->flags & ( JFLAG_WAIT_BIND | JFLAG_WAIT_SESSION ) ) == 0 )
    333318        {
    334319                if( !jabber_get_roster( ic ) )
  • protocols/jabber/jabber.c

    r123cac7 r1014cab  
    5858        char str[16];
    5959       
    60         s = set_add( &acc->set, "activity_timeout", "600", set_eval_int, acc );
    61        
    6260        g_snprintf( str, sizeof( str ), "%d", jabber_port_list[0] );
    6361        s = set_add( &acc->set, "port", str, set_eval_int, acc );
     
    6967        s->flags |= ACC_SET_OFFLINE_ONLY;
    7068       
    71         s = set_add( &acc->set, "resource_select", "activity", NULL, acc );
     69        s = set_add( &acc->set, "resource_select", "priority", NULL, acc );
    7270       
    7371        s = set_add( &acc->set, "server", NULL, set_eval_account, acc );
     
    8280        s = set_add( &acc->set, "xmlconsole", "false", set_eval_bool, acc );
    8381        s->flags |= ACC_SET_OFFLINE_ONLY;
    84        
    85         acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE;
    8682}
    8783
     
    309305                bud = jabber_buddy_by_ext_jid( ic, who, 0 );
    310306        else
    311                 bud = jabber_buddy_by_jid( ic, who, GET_BUDDY_BARE_OK );
     307                bud = jabber_buddy_by_jid( ic, who, 0 );
    312308       
    313309        node = xt_new_node( "body", message, NULL );
     
    354350static void jabber_get_info( struct im_connection *ic, char *who )
    355351{
     352        struct jabber_data *jd = ic->proto_data;
    356353        struct jabber_buddy *bud;
    357354       
    358         bud = jabber_buddy_by_jid( ic, who, GET_BUDDY_FIRST );
     355        if( strchr( who, '/' ) )
     356                bud = jabber_buddy_by_jid( ic, who, 0 );
     357        else
     358        {
     359                char *s = jabber_normalize( who );
     360                bud = g_hash_table_lookup( jd->buddies, s );
     361                g_free( s );
     362        }
    359363       
    360364        while( bud )
    361365        {
    362                 imcb_log( ic, "Buddy %s (%d) information:", bud->full_jid, bud->priority );
    363                 if( bud->away_state )
    364                         imcb_log( ic, "Away state: %s", bud->away_state->full_name );
    365                 imcb_log( ic, "Status message: %s", bud->away_message ? : "(none)" );
    366                
     366                imcb_log( ic, "Buddy %s (%d) information:\nAway state: %s\nAway message: %s",
     367                                   bud->full_jid, bud->priority,
     368                                   bud->away_state ? bud->away_state->full_name : "(none)",
     369                                   bud->away_message ? : "(none)" );
    367370                bud = bud->next;
    368371        }
     
    374377{
    375378        struct jabber_data *jd = ic->proto_data;
    376        
    377         /* state_txt == NULL -> Not away.
    378            Unknown state -> fall back to the first defined away state. */
    379         jd->away_state = state_txt ? jabber_away_state_by_name( state_txt )
    380                          ? : jabber_away_state_list : NULL;
    381        
     379        struct jabber_away_state *state;
     380       
     381        /* Save all this info. We need it, for example, when changing the priority setting. */
     382        state = (void *) jabber_away_state_by_name( state_txt );
     383        jd->away_state = state ? state : (void *) jabber_away_state_list; /* Fall back to "Away" if necessary. */
    382384        g_free( jd->away_message );
    383385        jd->away_message = ( message && *message ) ? g_strdup( message ) : NULL;
  • protocols/jabber/jabber.h

    r123cac7 r1014cab  
    4040        JFLAG_STREAM_RESTART = 4,       /* Set when we want to restart the stream (after
    4141                                           SASL or TLS). */
    42         JFLAG_WANT_SESSION = 8,         /* Set if the server wants a <session/> tag
     42        JFLAG_WAIT_SESSION = 8,         /* Set if we sent a <session> tag and need a reply
    4343                                           before we continue. */
    44         JFLAG_WANT_BIND = 16,           /* ... for <bind> tag. */
     44        JFLAG_WAIT_BIND = 16,           /* ... for <bind> tag. */
    4545        JFLAG_WANT_TYPING = 32,         /* Set if we ever sent a typing notification, this
    4646                                           activates all XEP-85 related code. */
    4747        JFLAG_XMLCONSOLE = 64,          /* If the user added an xmlconsole buddy. */
    48         JFLAG_STARTTLS_DONE = 128,      /* If a plaintext session was converted to TLS. */
    4948} jabber_flags_t;
    5049
     
    8584        /* After changing one of these two (or the priority setting), call
    8685           presence_send_update() to inform the server about the changes. */
    87         const struct jabber_away_state *away_state;
     86        struct jabber_away_state *away_state;
    8887        char *away_message;
    8988       
     
    108107};
    109108
    110 /* Somewhat messy data structure: We have a hash table with the bare JID as
    111    the key and the head of a struct jabber_buddy list as the value. The head
    112    is always a bare JID. If the JID has other resources (often the case,
    113    except for some transports that don't support multiple resources), those
    114    follow. In that case, the bare JID at the beginning doesn't actually
    115    refer to a real session and should only be used for operations that
    116    support incomplete JIDs. */
    117109struct jabber_buddy
    118110{
     
    128120        char *away_message;
    129121       
    130         time_t last_msg;
     122        time_t last_act;
    131123        jabber_buddy_flags_t flags;
    132124       
     
    216208        GET_BUDDY_EXACT = 2,    /* Get an exact match (only makes sense with bare JIDs). */
    217209        GET_BUDDY_FIRST = 4,    /* No selection, simply get the first resource for this JID. */
    218         GET_BUDDY_BARE = 8,     /* Get the bare version of the JID (possibly inexistent). */
    219         GET_BUDDY_BARE_OK = 16, /* Allow returning a bare JID if that seems better. */
    220210} get_buddy_flags_t;
    221211
  • protocols/jabber/jabber_util.c

    r123cac7 r1014cab  
    44*  Jabber module - Misc. stuff                                              *
    55*                                                                           *
    6 *  Copyright 2006-2010 Wilmer van der Gaast <wilmer@gaast.net>             
     6*  Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net>                   *
    77*                                                                           *
    88*  This program is free software; you can redistribute it and/or modify     *
     
    228228{
    229229        { "away",  "Away" },
    230         { "chat",  "Free for Chat" },   /* WTF actually uses this? */
     230        { "chat",  "Free for Chat" },
    231231        { "dnd",   "Do not Disturb" },
    232232        { "xa",    "Extended Away" },
     233        { "",      "Online" },
    233234        { "",      NULL }
    234235};
     
    237238{
    238239        int i;
    239        
    240         if( code == NULL )
    241                 return NULL;
    242240       
    243241        for( i = 0; jabber_away_state_list[i].full_name; i ++ )
     
    251249{
    252250        int i;
    253        
    254         if( name == NULL )
    255                 return NULL;
    256251       
    257252        for( i = 0; jabber_away_state_list[i].full_name; i ++ )
     
    345340        if( ( bud = g_hash_table_lookup( jd->buddies, full_jid ) ) )
    346341        {
    347                 /* The first entry is always a bare JID. If there are more, we
    348                    should ignore the first one here. */
    349                 if( bud->next )
    350                         bud = bud->next;
    351                
    352342                /* If this is a transport buddy or whatever, it can't have more
    353343                   than one instance, so this is always wrong: */
     
    384374        else
    385375        {
    386                 new->full_jid = new->bare_jid = g_strdup( full_jid );
     376                /* Keep in mind that full_jid currently isn't really
     377                   a full JID... */
     378                new->bare_jid = g_strdup( full_jid );
    387379                g_hash_table_insert( jd->buddies, new->bare_jid, new );
    388                
    389                 if( s )
    390                 {
    391                         new->next = g_new0( struct jabber_buddy, 1 );
    392                         new->next->bare_jid = new->bare_jid;
    393                         new = new->next;
    394                 }
    395380        }
    396381       
     
    418403{
    419404        struct jabber_data *jd = ic->proto_data;
    420         struct jabber_buddy *bud, *head;
     405        struct jabber_buddy *bud;
    421406        char *s, *jid;
    422407       
     
    430415                if( ( bud = g_hash_table_lookup( jd->buddies, jid ) ) )
    431416                {
    432                         bare_exists = 1;
    433                        
    434                         if( bud->next )
    435                                 bud = bud->next;
    436                        
    437417                        /* Just return the first one for this bare JID. */
    438418                        if( flags & GET_BUDDY_FIRST )
     
    456436                                        break;
    457437                }
     438                else
     439                {
     440                        /* This variable tells the if down here that the bare
     441                           JID already exists and we should feel free to add
     442                           more resources, if the caller asked for that. */
     443                        bare_exists = 1;
     444                }
    458445               
    459446                if( bud == NULL && ( flags & GET_BUDDY_CREAT ) &&
    460                     ( bare_exists || imcb_find_buddy( ic, jid ) ) )
     447                    ( !bare_exists || imcb_find_buddy( ic, jid ) ) )
    461448                {
    462449                        *s = '/';
     
    472459                char *set;
    473460               
    474                 head = g_hash_table_lookup( jd->buddies, jid );
    475                 bud = ( head && head->next ) ? head->next : head;
     461                bud = g_hash_table_lookup( jd->buddies, jid );
    476462               
    477463                g_free( jid );
     
    490476                        /* Looks like the caller doesn't care about details. */
    491477                        return bud;
    492                 else if( flags & GET_BUDDY_BARE )
    493                         return head;
    494478               
    495479                best_prio = best_time = bud;
     
    498482                        if( bud->priority > best_prio->priority )
    499483                                best_prio = bud;
    500                         if( bud->last_msg > best_time->last_msg )
     484                        if( bud->last_act > best_time->last_act )
    501485                                best_time = bud;
    502486                }
     
    504488                if( ( set = set_getstr( &ic->acc->set, "resource_select" ) ) == NULL )
    505489                        return NULL;
    506                 else if( strcmp( set, "priority" ) == 0 )
     490                else if( strcmp( set, "activity" ) == 0 )
     491                        return best_time;
     492                else /* if( strcmp( set, "priority" ) == 0 ) */
    507493                        return best_prio;
    508                 else if( flags & GET_BUDDY_BARE_OK ) /* && strcmp( set, "activity" ) == 0 */
    509                 {
    510                         if( best_time->last_msg + set_getint( &ic->acc->set, "activity_timeout" ) >= time( NULL ) )
    511                                 return best_time;
    512                         else
    513                                 return head;
    514                 }
    515                 else
    516                         return best_time;
    517494        }
    518495}
     
    556533{
    557534        struct jabber_data *jd = ic->proto_data;
    558         struct jabber_buddy *bud, *prev = NULL, *bi;
     535        struct jabber_buddy *bud, *prev, *bi;
    559536        char *s, *full_jid;
    560537       
     
    566543        if( ( bud = g_hash_table_lookup( jd->buddies, full_jid ) ) )
    567544        {
    568                 if( bud->next )
    569                         bud = (prev=bud)->next;
    570                
    571545                /* If there's only one item in the list (and if the resource
    572546                   matches), removing it is simple. (And the hash reference
     
    576550                      ( bud->resource && s && strcmp( bud->resource, s + 1 ) == 0 ) ) )
    577551                {
    578                         return jabber_buddy_remove_bare( ic, full_jid );
     552                        g_hash_table_remove( jd->buddies, bud->bare_jid );
     553                        g_free( bud->bare_jid );
     554                        g_free( bud->ext_jid );
     555                        g_free( bud->full_jid );
     556                        g_free( bud->away_message );
     557                        g_free( bud );
     558                       
     559                        g_free( full_jid );
     560                       
     561                        return 1;
    579562                }
    580563                else if( s == NULL || bud->resource == NULL )
     
    587570                else
    588571                {
    589                         for( bi = bud; bi; bi = (prev=bi)->next )
     572                        for( bi = bud, prev = NULL; bi; bi = (prev=bi)->next )
    590573                                if( strcmp( bi->resource, s + 1 ) == 0 )
    591574                                        break;
     
    598581                                        prev->next = bi->next;
    599582                                else
    600                                         /* Don't think this should ever happen anymore. */
     583                                        /* The hash table should point at the second
     584                                           item, because we're removing the first. */
    601585                                        g_hash_table_replace( jd->buddies, bi->bare_jid, bi->next );
    602586                               
  • protocols/jabber/message.c

    r123cac7 r1014cab  
    7171                        if( bud )
    7272                        {
    73                                 bud->last_msg = time( NULL );
     73                                bud->last_act = time( NULL );
    7474                                from = bud->ext_jid ? : bud->bare_jid;
    7575                        }
     
    8080                if( type && strcmp( type, "headline" ) == 0 )
    8181                {
    82                         if( ( c = xt_find_node( node->children, "subject" ) ) && c->text_len > 0 )
    83                                 g_string_append_printf( fullmsg, "Headline: %s\n", c->text );
     82                        c = xt_find_node( node->children, "subject" );
     83                        g_string_append_printf( fullmsg, "Headline: %s\n", c && c->text_len > 0 ? c->text : "" );
    8484                       
    8585                        /* <x xmlns="jabber:x:oob"><url>http://....</url></x> can contain a URL, it seems. */
  • protocols/jabber/presence.c

    r123cac7 r1014cab  
    6868                {
    6969                        bud->away_state = NULL;
     70                        /* Let's only set last_act if there's *no* away state,
     71                           since it could be some auto-away thingy. */
     72                        bud->last_act = time( NULL );
    7073                }
    7174               
     
    187190                int is_away = 0;
    188191
    189                 if( send_presence->away_state &&
    190                     strcmp( send_presence->away_state->code, "chat" ) != 0 )
     192                if( send_presence->away_state && !( *send_presence->away_state->code == 0 ||
     193                    strcmp( send_presence->away_state->code, "chat" ) == 0 ) )
    191194                        is_away = OPT_AWAY;
    192195
    193196                imcb_buddy_status( ic, send_presence->bare_jid, OPT_LOGGED_IN | is_away,
    194                                    is_away ? send_presence->away_state->full_name : NULL,
     197                                   ( is_away && send_presence->away_state ) ?
     198                                   send_presence->away_state->full_name : NULL,
    195199                                   send_presence->away_message );
    196200        }
     
    205209        struct jabber_data *jd = ic->proto_data;
    206210        struct xt_node *node, *cap;
     211        char *show = jd->away_state->code;
     212        char *status = jd->away_message;
    207213        struct groupchat *c;
    208214        int st;
     
    210216        node = jabber_make_packet( "presence", NULL, NULL, NULL );
    211217        xt_add_child( node, xt_new_node( "priority", set_getstr( &ic->acc->set, "priority" ), NULL ) );
    212         if( jd->away_state )
    213                 xt_add_child( node, xt_new_node( "show", jd->away_state->code, NULL ) );
    214         if( jd->away_message )
    215                 xt_add_child( node, xt_new_node( "status", jd->away_message, NULL ) );
     218        if( show && *show )
     219                xt_add_child( node, xt_new_node( "show", show, NULL ) );
     220        if( status )
     221                xt_add_child( node, xt_new_node( "status", status, NULL ) );
    216222       
    217223        /* This makes the packet slightly bigger, but clients interested in
  • protocols/msn/msn.c

    r123cac7 r1014cab  
    2727#include "msn.h"
    2828
    29 int msn_chat_id;
    30 GSList *msn_connections;
    31 GSList *msn_switchboards;
    32 
    33 static char *set_eval_display_name( set_t *set, char *value );
     29static char *msn_set_display_name( set_t *set, char *value );
    3430
    3531static void msn_init( account_t *acc )
    3632{
    37         set_add( &acc->set, "display_name", NULL, set_eval_display_name, acc );
    38         set_add( &acc->set, "local_display_name", "false", set_eval_bool, acc );
    39         set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc );
     33        set_t *s;
     34       
     35        s = set_add( &acc->set, "display_name", NULL, msn_set_display_name, acc );
     36        s->flags |= ACC_SET_NOSAVE | ACC_SET_ONLINE_ONLY;
     37
     38        s = set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc );
    4039}
    4140
     
    140139       
    141140        if( l == NULL )
    142                 for( i = 0; *msn_away_state_list[i].code; i ++ )
    143                         if( *msn_away_state_list[i].name )
    144                                 l = g_list_append( l, (void*) msn_away_state_list[i].name );
     141                for( i = 0; msn_away_state_list[i].number > -1; i ++ )
     142                        l = g_list_append( l, (void*) msn_away_state_list[i].name );
    145143       
    146144        return l;
     
    151149        char buf[1024];
    152150        struct msn_data *md = ic->proto_data;
    153        
    154         if( state )
    155                 md->away_state = msn_away_state_by_name( state ) ? :
    156                                  msn_away_state_list + 1;
     151        const struct msn_away_state *st;
     152       
     153        if( strcmp( state, GAIM_AWAY_CUSTOM ) == 0 )
     154                st = msn_away_state_by_name( "Away" );
    157155        else
    158                 md->away_state = msn_away_state_list;
    159        
    160         g_snprintf( buf, sizeof( buf ), "CHG %d %s\r\n", ++md->trId, md->away_state->code );
     156                st = msn_away_state_by_name( state );
     157       
     158        if( !st ) st = msn_away_state_list;
     159        md->away_state = st;
     160       
     161        g_snprintf( buf, sizeof( buf ), "CHG %d %s\r\n", ++md->trId, st->code );
    161162        msn_write( ic, buf, strlen( buf ) );
    162163}
     
    164165static void msn_set_my_name( struct im_connection *ic, char *info )
    165166{
    166         msn_set_display_name( ic, info );
     167        msn_set_display_name( set_find( &ic->acc->set, "display_name" ), info );
    167168}
    168169
     
    280281}
    281282
    282 static char *set_eval_display_name( set_t *set, char *value )
     283static char *msn_set_display_name( set_t *set, char *value )
    283284{
    284285        account_t *acc = set->data;
    285286        struct im_connection *ic = acc->ic;
    286        
    287         /* Allow any name if we're offline. */
     287        struct msn_data *md;
     288        char buf[1024], *fn;
     289       
     290        /* Double-check. */
    288291        if( ic == NULL )
    289                 return value;
     292                return NULL;
     293       
     294        md = ic->proto_data;
    290295       
    291296        if( strlen( value ) > 129 )
     
    294299                return NULL;
    295300        }
     301       
     302        fn = msn_http_encode( value );
     303       
     304        g_snprintf( buf, sizeof( buf ), "REA %d %s %s\r\n", ++md->trId, ic->acc->user, fn );
     305        msn_write( ic, buf, strlen( buf ) );
     306        g_free( fn );
    296307       
    297308        /* Returning NULL would be better, because the server still has to
    298309           confirm the name change. However, it looks a bit confusing to the
    299310           user. */
    300         return msn_set_display_name( ic, value ) ? value : NULL;
     311        return value;
    301312}
    302313
  • protocols/msn/msn.h

    r123cac7 r1014cab  
    9797struct msn_away_state
    9898{
     99        int number;
    99100        char code[4];
    100101        char name[16];
     
    135136#define STATUS_SB_CHAT_SPARE    8       /* Same, but also for groupchats (not used yet). */
    136137
    137 extern int msn_chat_id;
     138int msn_chat_id;
    138139extern const struct msn_away_state msn_away_state_list[];
    139140extern const struct msn_status_code msn_status_code_list[];
     
    144145   connection), the callback should check whether it's still listed here
    145146   before doing *anything* else. */
    146 extern GSList *msn_connections;
    147 extern GSList *msn_switchboards;
     147GSList *msn_connections;
     148GSList *msn_switchboards;
    148149
    149150/* ns.c */
     
    161162char *msn_http_encode( const char *input );
    162163void msn_msgq_purge( struct im_connection *ic, GSList **list );
    163 gboolean msn_set_display_name( struct im_connection *ic, const char *rawname );
    164164
    165165/* tables.c */
  • protocols/msn/msn_util.c

    r123cac7 r1014cab  
    3838                imcb_error( ic, "Short write() to main server" );
    3939                imc_logout( ic, TRUE );
    40                 return 0;
    41         }
    42        
    43         return 1;
     40                return( 0 );
     41        }
     42       
     43        return( 1 );
    4444}
    4545
     
    171171               
    172172                /* End of headers? */
    173                 if( ( i >= 4 && strncmp( text + i - 4, "\r\n\r\n", 4 ) == 0 ) ||
    174                     ( i >= 2 && ( strncmp( text + i - 2, "\n\n", 2 ) == 0 ||   
    175                                   strncmp( text + i - 2, "\r\r", 2 ) == 0 ) ) )
     173                if( strncmp( text + i - 2, "\n\n", 2 ) == 0 ||
     174                    strncmp( text + i - 4, "\r\n\r\n", 4 ) == 0 ||
     175                    strncmp( text + i - 2, "\r\r", 2 ) == 0 )
    176176                {
    177177                        break;
     
    374374        *list = NULL;
    375375       
    376         imcb_log( ic, "%s", ret->str );
     376        imcb_log( ic, ret->str );
    377377        g_string_free( ret, TRUE );
    378378}
    379 
    380 gboolean msn_set_display_name( struct im_connection *ic, const char *rawname )
    381 {
    382         char *fn = msn_http_encode( rawname );
    383         struct msn_data *md = ic->proto_data;
    384         char buf[1024];
    385        
    386         g_snprintf( buf, sizeof( buf ), "REA %d %s %s\r\n", ++md->trId, ic->acc->user, fn );
    387         g_free( fn );
    388        
    389         return msn_write( ic, buf, strlen( buf ) ) != 0;
    390 }
  • protocols/msn/ns.c

    r123cac7 r1014cab  
    3535
    3636static void msn_auth_got_passport_token( struct msn_auth_data *mad );
    37 static gboolean msn_ns_got_display_name( struct im_connection *ic, char *name );
    3837
    3938gboolean msn_ns_connected( gpointer data, gint source, b_input_condition cond )
     
    230229                        }
    231230                }
    232                 else if( num_parts >= 7 && strcmp( cmd[2], "OK" ) == 0 )
    233                 {
    234                         if( num_parts == 7 )
    235                                 msn_ns_got_display_name( ic, cmd[4] );
    236                         else
    237                                 imcb_log( ic, "Warning: Friendly name in server response was corrupted" );
     231                else if( num_parts == 7 && strcmp( cmd[2], "OK" ) == 0 )
     232                {
     233                        set_t *s;
     234                       
     235                        http_decode( cmd[4] );
     236                       
     237                        strncpy( ic->displayname, cmd[4], sizeof( ic->displayname ) );
     238                        ic->displayname[sizeof(ic->displayname)-1] = 0;
     239                       
     240                        if( ( s = set_find( &ic->acc->set, "display_name" ) ) )
     241                        {
     242                                g_free( s->value );
     243                                s->value = g_strdup( cmd[4] );
     244                        }
    238245                       
    239246                        imcb_log( ic, "Authenticated, getting buddy list" );
     
    413420                {
    414421                        /* FIXME: Warn/Bomb about unknown away state? */
    415                         st = msn_away_state_list + 1;
    416                 }
    417                
    418                 imcb_buddy_status( ic, cmd[3], OPT_LOGGED_IN |
    419                                    ( st != msn_away_state_list ? OPT_AWAY : 0 ),
    420                                    st->name, NULL );
     422                        st = msn_away_state_list;
     423                }
     424               
     425                imcb_buddy_status( ic, cmd[3], OPT_LOGGED_IN |
     426                                   ( st->number ? OPT_AWAY : 0 ), st->name, NULL );
    421427        }
    422428        else if( strcmp( cmd[0], "FLN" ) == 0 )
     
    443449                {
    444450                        /* FIXME: Warn/Bomb about unknown away state? */
    445                         st = msn_away_state_list + 1;
    446                 }
    447                
    448                 imcb_buddy_status( ic, cmd[2], OPT_LOGGED_IN |
    449                                    ( st != msn_away_state_list ? OPT_AWAY : 0 ),
    450                                    st->name, NULL );
     451                        st = msn_away_state_list;
     452                }
     453               
     454                imcb_buddy_status( ic, cmd[2], OPT_LOGGED_IN |
     455                                   ( st->number ? OPT_AWAY : 0 ), st->name, NULL );
    451456        }
    452457        else if( strcmp( cmd[0], "RNG" ) == 0 )
     
    553558                return( 0 );
    554559        }
    555 #if 0
    556         /* Discard this one completely for now since I don't care about the ack
    557            and since MSN servers can apparently screw up the formatting. */
    558560        else if( strcmp( cmd[0], "REA" ) == 0 )
    559561        {
     
    586588                }
    587589        }
    588 #endif
    589590        else if( strcmp( cmd[0], "IPG" ) == 0 )
    590591        {
     
    662663                                }
    663664                               
    664                                 g_free( arg1 );
    665                                 g_free( mtype );
     665                                if( arg1 ) g_free( arg1 );
     666                                if( mtype ) g_free( mtype );
    666667                        }
    667668                        else if( g_strncasecmp( ct, "text/x-msmsgsprofile", 20 ) == 0 )
     
    671672                        else if( g_strncasecmp( ct, "text/x-msmsgsinitialemailnotification", 37 ) == 0 )
    672673                        {
    673                                 if( set_getbool( &ic->acc->set, "mail_notifications" ) )
     674                                char *inbox = msn_findheader( body, "Inbox-Unread:", blen );
     675                                char *folders = msn_findheader( body, "Folders-Unread:", blen );
     676                               
     677                                if( inbox && folders && set_getbool( &ic->acc->set, "mail_notifications" ) )
    674678                                {
    675                                         char *inbox = msn_findheader( body, "Inbox-Unread:", blen );
    676                                         char *folders = msn_findheader( body, "Folders-Unread:", blen );
    677 
    678                                         if( inbox && folders )
    679                                                 imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders );
    680                                        
    681                                         g_free( inbox );
    682                                         g_free( folders );
     679                                        imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders );
    683680                                }
     681                               
     682                                g_free( inbox );
     683                                g_free( folders );
    684684                        }
    685685                        else if( g_strncasecmp( ct, "text/x-msmsgsemailnotification", 30 ) == 0 )
    686686                        {
    687                                 if( set_getbool( &ic->acc->set, "mail_notifications" ) )
     687                                char *from = msn_findheader( body, "From-Addr:", blen );
     688                                char *fromname = msn_findheader( body, "From:", blen );
     689                               
     690                                if( from && fromname && set_getbool( &ic->acc->set, "mail_notifications" ) )
    688691                                {
    689                                         char *from = msn_findheader( body, "From-Addr:", blen );
    690                                         char *fromname = msn_findheader( body, "From:", blen );
    691                                        
    692                                         if( from && fromname )
    693                                                 imcb_log( ic, "Received an e-mail message from %s <%s>.", fromname, from );
    694 
    695                                         g_free( from );
    696                                         g_free( fromname );
     692                                        imcb_log( ic, "Received an e-mail message from %s <%s>.", fromname, from );
    697693                                }
    698694                        }
     
    736732        }
    737733}
    738 
    739 static gboolean msn_ns_got_display_name( struct im_connection *ic, char *name )
    740 {
    741         set_t *s;
    742        
    743         if( ( s = set_find( &ic->acc->set, "display_name" ) ) == NULL )
    744                 return FALSE; /* Shouldn't happen.. */
    745        
    746         http_decode( name );
    747        
    748         if( s->value && strcmp( s->value, name ) == 0 )
    749         {
    750                 return TRUE;
    751                 /* The names match, nothing to worry about. */
    752         }
    753         else if( s->value != NULL &&
    754                  ( strcmp( name, ic->acc->user ) == 0 ||
    755                    set_getbool( &ic->acc->set, "local_display_name" ) ) )
    756         {
    757                 /* The server thinks our display name is our e-mail address
    758                    which is probably wrong, or the user *wants* us to do this:
    759                    Always use the locally set display_name. */
    760                 return msn_set_display_name( ic, s->value );
    761         }
    762         else
    763         {
    764                 if( s->value && *s->value )
    765                         imcb_log( ic, "BitlBee thinks your display name is `%s' but "
    766                                       "the MSN server says it's `%s'. Using the MSN "
    767                                       "server's name. Set local_display_name to true "
    768                                       "to use the local name.", s->value, name );
    769                
    770                 if( g_utf8_validate( name, -1, NULL ) )
    771                 {
    772                         g_free( s->value );
    773                         s->value = g_strdup( name );
    774                 }
    775                 else
    776                 {
    777                         imcb_log( ic, "Warning: Friendly name in server response was corrupted" );
    778                 }
    779                
    780                 return TRUE;
    781         }
    782 }
  • protocols/msn/tables.c

    r123cac7 r1014cab  
    2929const struct msn_away_state msn_away_state_list[] =
    3030{
    31         { "NLN", "" },
    32         { "AWY", "Away" },
    33         { "BSY", "Busy" },
    34         { "IDL", "Idle" },
    35         { "BRB", "Be Right Back" },
    36         { "PHN", "On the Phone" },
    37         { "LUN", "Out to Lunch" },
    38         { "HDN", "Hidden" },
    39         { "",    "" }
     31        {  0, "NLN", "Available" },
     32        {  1, "BSY", "Busy" },
     33        {  3, "IDL", "Idle" },
     34        {  5, "BRB", "Be Right Back" },
     35        {  7, "AWY", "Away" },
     36        {  9, "PHN", "On the Phone" },
     37        { 11, "LUN", "Out to Lunch" },
     38        { 13, "HDN", "Hidden" },
     39        { -1, "",    "" }
    4040};
     41
     42const struct msn_away_state *msn_away_state_by_number( int number )
     43{
     44        int i;
     45       
     46        for( i = 0; msn_away_state_list[i].number > -1; i ++ )
     47                if( msn_away_state_list[i].number == number )
     48                        return( msn_away_state_list + i );
     49       
     50        return( NULL );
     51}
    4152
    4253const struct msn_away_state *msn_away_state_by_code( char *code )
     
    4455        int i;
    4556       
    46         for( i = 0; *msn_away_state_list[i].code; i ++ )
     57        for( i = 0; msn_away_state_list[i].number > -1; i ++ )
    4758                if( g_strcasecmp( msn_away_state_list[i].code, code ) == 0 )
    4859                        return( msn_away_state_list + i );
    4960       
    50         return NULL;
     61        return( NULL );
    5162}
    5263
     
    5566        int i;
    5667       
    57         for( i = 0; *msn_away_state_list[i].code; i ++ )
     68        for( i = 0; msn_away_state_list[i].number > -1; i ++ )
    5869                if( g_strcasecmp( msn_away_state_list[i].name, name ) == 0 )
    5970                        return( msn_away_state_list + i );
    6071       
    61         return NULL;
     72        return( NULL );
    6273}
    6374
  • protocols/nogaim.c

    r123cac7 r1014cab  
    22  * BitlBee -- An IRC to other IM-networks gateway                     *
    33  *                                                                    *
    4   * Copyright 2002-2010 Wilmer van der Gaast and others                *
     4  * Copyright 2002-2006 Wilmer van der Gaast and others                *
    55  \********************************************************************/
    66
     
    3939
    4040static int remove_chat_buddy_silent( struct groupchat *b, const char *handle );
    41 static char *format_timestamp( irc_t *irc, time_t msg_ts );
    4241
    4342GSList *connections;
     
    9998void register_protocol (struct prpl *p)
    10099{
    101         int i;
    102         gboolean refused = global.conf->protocols != NULL;
    103  
    104         for (i = 0; global.conf->protocols && global.conf->protocols[i]; i++)
    105         {
    106                 if (g_strcasecmp(p->name, global.conf->protocols[i]) == 0)
    107                         refused = FALSE;
    108         }
    109 
    110         if (refused)
    111                 log_message(LOGLVL_WARNING, "Protocol %s disabled\n", p->name);
    112         else
    113                 protocols = g_list_append(protocols, p);
     100        protocols = g_list_append(protocols, p);
    114101}
    115102
     
    286273        ic->flags |= OPT_LOGGED_IN;
    287274       
    288         /* Necessary to send initial presence status, even if we're not away. */
    289         imc_away_send_update( ic );
     275        /* Also necessary when we're not away, at least for some of the
     276           protocols. */
     277        imc_set_away( ic, u->away );
    290278       
    291279        /* Apparently we're connected successfully, so reset the
     
    389377/* list.c */
    390378
    391 void imcb_add_buddy( struct im_connection *ic, const char *handle, const char *group )
     379void imcb_add_buddy( struct im_connection *ic, char *handle, char *group )
    392380{
    393381        user_t *u;
     
    463451}
    464452
    465 void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *realname )
     453void imcb_rename_buddy( struct im_connection *ic, char *handle, char *realname )
    466454{
    467455        user_t *u = user_findhandle( ic, handle );
    468         char *set;
    469456       
    470457        if( !u || !realname ) return;
     
    479466                        imcb_log( ic, "User `%s' changed name to `%s'", u->nick, u->realname );
    480467        }
    481        
    482         set = set_getstr( &ic->acc->set, "nick_source" );
    483         if( strcmp( set, "handle" ) != 0 )
    484         {
    485                 char *name = g_strdup( realname );
    486                
    487                 if( strcmp( set, "first_name" ) == 0 )
    488                 {
    489                         int i;
    490                         for( i = 0; name[i] && !isspace( name[i] ); i ++ ) {}
    491                         name[i] = '\0';
    492                 }
    493                
    494                 imcb_buddy_nick_hint( ic, handle, name );
    495                
    496                 g_free( name );
    497         }
    498 }
    499 
    500 void imcb_remove_buddy( struct im_connection *ic, const char *handle, char *group )
     468}
     469
     470void imcb_remove_buddy( struct im_connection *ic, char *handle, char *group )
    501471{
    502472        user_t *u;
     
    508478/* Mainly meant for ICQ (and now also for Jabber conferences) to allow IM
    509479   modules to suggest a nickname for a handle. */
    510 void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick )
     480void imcb_buddy_nick_hint( struct im_connection *ic, char *handle, char *nick )
    511481{
    512482        user_t *u = user_findhandle( ic, handle );
     
    653623        oo = u->online;
    654624       
    655         g_free( u->away );
    656         g_free( u->status_msg );
    657         u->away = u->status_msg = NULL;
     625        if( u->away )
     626        {
     627                g_free( u->away );
     628                u->away = NULL;
     629        }
    658630       
    659631        if( ( flags & OPT_LOGGED_IN ) && !u->online )
     
    693665                }
    694666        }
    695         else
    696         {
    697                 u->status_msg = g_strdup( message );
    698         }
     667        /* else waste_any_state_information_for_now(); */
    699668       
    700669        /* LISPy... */
     
    721690}
    722691
    723 void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at )
     692void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, uint32_t flags, time_t sent_at )
    724693{
    725694        irc_t *irc = ic->irc;
    726         char *wrapped, *ts;
     695        char *wrapped;
    727696        user_t *u;
    728697       
     
    766735            ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) )
    767736                strip_html( msg );
    768        
    769         if( ( ts = format_timestamp( irc, sent_at ) ) )
    770         {
    771                 char *new = g_strconcat( ts, msg, NULL );
    772                 g_free( ts );
    773                 ts = msg = new;
    774         }
    775        
     737
    776738        wrapped = word_wrap( msg, 425 );
    777739        irc_msgfrom( irc, u->nick, wrapped );
    778740        g_free( wrapped );
    779         g_free( ts );
    780741}
    781742
     
    862823}
    863824
    864 void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t flags, time_t sent_at )
     825void imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at )
    865826{
    866827        struct im_connection *ic = c->ic;
     
    881842        if( c && u )
    882843        {
    883                 char *ts = format_timestamp( ic->irc, sent_at );
    884                 irc_privmsg( ic->irc, u, "PRIVMSG", c->channel, ts ? : "", wrapped );
    885                 g_free( ts );
     844                irc_privmsg( ic->irc, u, "PRIVMSG", c->channel, "", wrapped );
    886845        }
    887846        else
     
    936895/* buddy_chat.c */
    937896
    938 void imcb_chat_add_buddy( struct groupchat *b, const char *handle )
     897void imcb_chat_add_buddy( struct groupchat *b, char *handle )
    939898{
    940899        user_t *u = user_findhandle( b->ic, handle );
     
    971930
    972931/* This function is one BIG hack... :-( EREWRITE */
    973 void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char *reason )
     932void imcb_chat_remove_buddy( struct groupchat *b, char *handle, char *reason )
    974933{
    975934        user_t *u;
     
    10771036}
    10781037
    1079 char *set_eval_timezone( set_t *set, char *value )
    1080 {
    1081         char *s;
    1082        
    1083         if( strcmp( value, "local" ) == 0 ||
    1084             strcmp( value, "gmt" ) == 0 || strcmp( value, "utc" ) == 0 )
    1085                 return value;
    1086        
    1087         /* Otherwise: +/- at the beginning optional, then one or more numbers,
    1088            possibly followed by a colon and more numbers. Don't bother bound-
    1089            checking them since users are free to shoot themselves in the foot. */
    1090         s = value;
    1091         if( *s == '+' || *s == '-' )
    1092                 s ++;
    1093        
    1094         /* \d+ */
    1095         if( !isdigit( *s ) )
    1096                 return SET_INVALID;
    1097         while( *s && isdigit( *s ) ) s ++;
    1098        
    1099         /* EOS? */
    1100         if( *s == '\0' )
    1101                 return value;
    1102        
    1103         /* Otherwise, colon */
    1104         if( *s != ':' )
    1105                 return SET_INVALID;
    1106         s ++;
    1107        
    1108         /* \d+ */
    1109         if( !isdigit( *s ) )
    1110                 return SET_INVALID;
    1111         while( *s && isdigit( *s ) ) s ++;
    1112        
    1113         /* EOS */
    1114         return *s == '\0' ? value : SET_INVALID;
    1115 }
    1116 
    1117 static char *format_timestamp( irc_t *irc, time_t msg_ts )
    1118 {
    1119         time_t now_ts = time( NULL );
    1120         struct tm now, msg;
    1121         char *set;
    1122        
    1123         /* If the timestamp is <= 0 or less than a minute ago, discard it as
    1124            it doesn't seem to add to much useful info and/or might be noise. */
    1125         if( msg_ts <= 0 || msg_ts > now_ts - 60 )
    1126                 return NULL;
    1127        
    1128         set = set_getstr( &irc->set, "timezone" );
    1129         if( strcmp( set, "local" ) == 0 )
    1130         {
    1131                 localtime_r( &now_ts, &now );
    1132                 localtime_r( &msg_ts, &msg );
    1133         }
    1134         else
    1135         {
    1136                 int hr, min = 0, sign = 60;
    1137                
    1138                 if( set[0] == '-' )
    1139                 {
    1140                         sign *= -1;
    1141                         set ++;
    1142                 }
    1143                 else if( set[0] == '+' )
    1144                 {
    1145                         set ++;
    1146                 }
    1147                
    1148                 if( sscanf( set, "%d:%d", &hr, &min ) >= 1 )
    1149                 {
    1150                         msg_ts += sign * ( hr * 60 + min );
    1151                         now_ts += sign * ( hr * 60 + min );
    1152                 }
    1153                
    1154                 gmtime_r( &now_ts, &now );
    1155                 gmtime_r( &msg_ts, &msg );
    1156         }
    1157        
    1158         if( msg.tm_year == now.tm_year && msg.tm_yday == now.tm_yday )
    1159                 return g_strdup_printf( "\x02[\x02\x02\x02%02d:%02d:%02d\x02]\x02 ",
    1160                                         msg.tm_hour, msg.tm_min, msg.tm_sec );
    1161         else
    1162                 return g_strdup_printf( "\x02[\x02\x02\x02%04d-%02d-%02d "
    1163                                         "%02d:%02d:%02d\x02]\x02 ",
    1164                                         msg.tm_year + 1900, msg.tm_mon, msg.tm_mday,
    1165                                         msg.tm_hour, msg.tm_min, msg.tm_sec );
    1166 }
     1038
     1039
    11671040
    11681041/* The plan is to not allow straight calls to prpl functions anymore, but do
     
    12021075}
    12031076
    1204 static char *imc_away_state_find( GList *gcm, char *away, char **message );
    1205 
    1206 int imc_away_send_update( struct im_connection *ic )
    1207 {
    1208         char *away, *msg = NULL;
    1209        
    1210         away = set_getstr( &ic->acc->set, "away" ) ?
    1211              : set_getstr( &ic->irc->set, "away" );
    1212         if( away && *away )
    1213         {
    1214                 GList *m = ic->acc->prpl->away_states( ic );
    1215                 msg = ic->acc->flags & ACC_FLAG_AWAY_MESSAGE ? away : NULL;
    1216                 away = imc_away_state_find( m, away, &msg ) ? : m->data;
    1217         }
    1218         else if( ic->acc->flags & ACC_FLAG_STATUS_MESSAGE )
    1219         {
    1220                 away = NULL;
    1221                 msg = set_getstr( &ic->acc->set, "status" ) ?
    1222                     : set_getstr( &ic->irc->set, "status" );
    1223         }
    1224        
    1225         ic->acc->prpl->set_away( ic, away, msg );
    1226        
    1227         return 1;
     1077static char *imc_away_alias_find( GList *gcm, char *away );
     1078
     1079int imc_set_away( struct im_connection *ic, char *away )
     1080{
     1081        GList *m, *ms;
     1082        char *s;
     1083       
     1084        if( !away ) away = "";
     1085        ms = m = ic->acc->prpl->away_states( ic );
     1086       
     1087        while( m )
     1088        {
     1089                if( *away )
     1090                {
     1091                        if( g_strncasecmp( m->data, away, strlen( m->data ) ) == 0 )
     1092                                break;
     1093                }
     1094                else
     1095                {
     1096                        if( g_strcasecmp( m->data, "Available" ) == 0 )
     1097                                break;
     1098                        if( g_strcasecmp( m->data, "Online" ) == 0 )
     1099                                break;
     1100                }
     1101                m = m->next;
     1102        }
     1103       
     1104        if( m )
     1105        {
     1106                ic->acc->prpl->set_away( ic, m->data, *away ? away : NULL );
     1107        }
     1108        else
     1109        {
     1110                s = imc_away_alias_find( ms, away );
     1111                if( s )
     1112                {
     1113                        ic->acc->prpl->set_away( ic, s, away );
     1114                        if( set_getbool( &ic->irc->set, "debug" ) )
     1115                                imcb_log( ic, "Setting away state to %s", s );
     1116                }
     1117                else
     1118                        ic->acc->prpl->set_away( ic, GAIM_AWAY_CUSTOM, away );
     1119        }
     1120       
     1121        return( 1 );
    12281122}
    12291123
     
    12401134};
    12411135
    1242 static char *imc_away_state_find( GList *gcm, char *away, char **message )
     1136static char *imc_away_alias_find( GList *gcm, char *away )
    12431137{
    12441138        GList *m;
    12451139        int i, j;
    12461140       
    1247         for( m = gcm; m; m = m->next )
    1248                 if( g_strncasecmp( m->data, away, strlen( m->data ) ) == 0 )
    1249                 {
    1250                         /* At least the Yahoo! module works better if message
    1251                            contains no data unless it adds something to what
    1252                            we have in state already. */
    1253                         if( strlen( m->data ) == strlen( away ) )
    1254                                 *message = NULL;
    1255                        
    1256                         return m->data;
    1257                 }
    1258        
    12591141        for( i = 0; *imc_away_alias_list[i]; i ++ )
    12601142        {
    1261                 int keep_message;
    1262                
    12631143                for( j = 0; imc_away_alias_list[i][j]; j ++ )
    12641144                        if( g_strncasecmp( away, imc_away_alias_list[i][j], strlen( imc_away_alias_list[i][j] ) ) == 0 )
    1265                         {
    1266                                 keep_message = strlen( away ) != strlen( imc_away_alias_list[i][j] );
    12671145                                break;
    1268                         }
    12691146               
    12701147                if( !imc_away_alias_list[i][j] )        /* If we reach the end, this row */
     
    12741151                for( j = 0; imc_away_alias_list[i][j]; j ++ )
    12751152                {
    1276                         for( m = gcm; m; m = m->next )
     1153                        m = gcm;
     1154                        while( m )
     1155                        {
    12771156                                if( g_strcasecmp( imc_away_alias_list[i][j], m->data ) == 0 )
    1278                                 {
    1279                                         if( !keep_message )
    1280                                                 *message = NULL;
    1281                                        
    1282                                         return imc_away_alias_list[i][j];
    1283                                 }
    1284                 }
    1285                
    1286                 /* No need to look further, apparently this state doesn't
    1287                    have any good alias for this protocol. */
    1288                 break;
    1289         }
    1290        
    1291         return NULL;
     1157                                        return( imc_away_alias_list[i][j] );
     1158                                m = m->next;
     1159                        }
     1160                }
     1161        }
     1162       
     1163        return( NULL );
    12921164}
    12931165
  • protocols/nogaim.h

    r123cac7 r1014cab  
    4949
    5050#define WEBSITE "http://www.bitlbee.org/"
     51#define GAIM_AWAY_CUSTOM "Custom"
    5152
    5253/* Sharing flags between all kinds of things. I just hope I won't hit any
     
    217218       
    218219        /* You can tell what away states your protocol supports, so that
    219          * BitlBee will try to map the IRC away reasons to them. If your
    220          * protocol doesn't have any, just return one generic "Away". */
     220         * BitlBee will try to map the IRC away reasons to them, or use
     221         * GAIM_AWAY_CUSTOM when calling skype_set_away(). */
    221222        GList *(* away_states)(struct im_connection *ic);
    222223       
     
    275276 * user, usually after a login, or if the user added a buddy and the IM
    276277 * server confirms that the add was successful. Don't forget to do this! */
    277 G_MODULE_EXPORT void imcb_add_buddy( struct im_connection *ic, const char *handle, const char *group );
    278 G_MODULE_EXPORT void imcb_remove_buddy( struct im_connection *ic, const char *handle, char *group );
     278G_MODULE_EXPORT void imcb_add_buddy( struct im_connection *ic, char *handle, char *group );
     279G_MODULE_EXPORT void imcb_remove_buddy( struct im_connection *ic, char *handle, char *group );
    279280G_MODULE_EXPORT struct buddy *imcb_find_buddy( struct im_connection *ic, char *handle );
    280 G_MODULE_EXPORT void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *realname );
    281 G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick );
     281G_MODULE_EXPORT void imcb_rename_buddy( struct im_connection *ic, char *handle, char *realname );
     282G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, char *handle, char *nick );
    282283
    283284/* Buddy activity */
     
    289290/* Not implemented yet! */ G_MODULE_EXPORT void imcb_buddy_times( struct im_connection *ic, const char *handle, time_t login, time_t idle );
    290291/* Call when a handle says something. 'flags' and 'sent_at may be just 0. */
    291 G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at );
     292G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, uint32_t flags, time_t sent_at );
    292293G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags );
    293294G_MODULE_EXPORT void imcb_clean_handle( struct im_connection *ic, char *handle );
     
    302303 *   user, too. */
    303304G_MODULE_EXPORT struct groupchat *imcb_chat_new( struct im_connection *ic, const char *handle );
    304 G_MODULE_EXPORT void imcb_chat_add_buddy( struct groupchat *b, const char *handle );
     305G_MODULE_EXPORT void imcb_chat_add_buddy( struct groupchat *b, char *handle );
    305306/* To remove a handle from a group chat. Reason can be NULL. */
    306 G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char *reason );
     307G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *b, char *handle, char *reason );
    307308/* To tell BitlBee 'who' said 'msg' in 'c'. 'flags' and 'sent_at' can be 0. */
    308 G_MODULE_EXPORT void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t flags, time_t sent_at );
     309G_MODULE_EXPORT void imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at );
    309310/* System messages specific to a groupchat, so they can be displayed in the right context. */
    310311G_MODULE_EXPORT void imcb_chat_log( struct groupchat *c, char *format, ... ) G_GNUC_PRINTF( 2, 3 );
     
    314315
    315316/* Actions, or whatever. */
    316 int imc_away_send_update( struct im_connection *ic );
     317int imc_set_away( struct im_connection *ic, char *away );
    317318int imc_buddy_msg( struct im_connection *ic, char *handle, char *msg, int flags );
    318319int imc_chat_msg( struct groupchat *c, char *msg, int flags );
     
    324325
    325326/* Misc. stuff */
    326 char *set_eval_timezone( set_t *set, char *value );
    327327char *set_eval_away_devoice( set_t *set, char *value );
    328328gboolean auto_reconnect( gpointer data, gint fd, b_input_condition cond );
  • protocols/oscar/oscar.c

    r123cac7 r1014cab  
    373373        set_t *s;
    374374       
     375        s = set_add( &acc->set, "server", AIM_DEFAULT_LOGIN_SERVER, set_eval_account, acc );
     376        s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY;
     377       
    375378        if (isdigit(acc->user[0])) {
    376                 set_add(&acc->set, "ignore_auth_requests", "false", set_eval_bool, acc);
    377         }
    378        
    379         s = set_add(&acc->set, "server", AIM_DEFAULT_LOGIN_SERVER, set_eval_account, acc);
    380         s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY;
    381        
    382         if(isdigit(acc->user[0])) {
    383                 s = set_add(&acc->set, "web_aware", "false", set_eval_bool, acc);
     379                s = set_add( &acc->set, "web_aware", "false", set_eval_bool, acc );
    384380                s->flags |= ACC_SET_OFFLINE_ONLY;
    385381        }
    386        
    387         acc->flags |= ACC_FLAG_AWAY_MESSAGE;
    388382}
    389383
     
    12161210 */
    12171211static void gaim_icq_authask(struct im_connection *ic, guint32 uin, char *msg) {
    1218         struct icq_auth *data;
     1212        struct icq_auth *data = g_new(struct icq_auth, 1);
    12191213        char *reason = NULL;
    12201214        char *dialog_msg;
    1221 
    1222         if (set_getbool(&ic->acc->set, "ignore_auth_requests"))
    1223                 return;
    1224        
    1225         data = g_new(struct icq_auth, 1);
    1226 
     1215       
    12271216        if (strlen(msg) > 6)
    12281217                reason = msg + 6;
     
    19631952static void oscar_set_away_aim(struct im_connection *ic, struct oscar_data *od, const char *state, const char *message)
    19641953{
    1965         if (state == NULL)
    1966                 state = "";
    19671954
    19681955        if (!g_strcasecmp(state, _("Visible"))) {
     
    19721959                aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_INVISIBLE);
    19731960                return;
    1974         } else if (message == NULL) {
    1975                 message = state;
    1976         }
     1961        } /* else... */
    19771962
    19781963        if (od->rights.maxawaymsglen == 0)
     
    20172002        }
    20182003
    2019         if (state == NULL) {
     2004        if (!g_strcasecmp(state, "Online")) {
    20202005                aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL);
    20212006        } else if (!g_strcasecmp(state, "Away")) {
     
    20422027                aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_INVISIBLE);
    20432028                ic->away = g_strdup(msg);
    2044         } else {
     2029        } else if (!g_strcasecmp(state, GAIM_AWAY_CUSTOM)) {
    20452030                if (no_message) {
    20462031                        aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL);
     
    22912276{
    22922277        struct oscar_data *od = ic->proto_data;
    2293 
    2294         if (od->icq) {
    2295                 static GList *m = NULL;
    2296                 m = g_list_append(m, "Away");
    2297                 m = g_list_append(m, "Do Not Disturb");
    2298                 m = g_list_append(m, "Not Available");
    2299                 m = g_list_append(m, "Occupied");
    2300                 m = g_list_append(m, "Free For Chat");
    2301                 m = g_list_append(m, "Invisible");
    2302                 return m;
    2303         } else {
    2304                 static GList *m = NULL;
    2305                 m = g_list_append(m, "Away");
    2306                 return m;
    2307         }
     2278        GList *m = NULL;
     2279
     2280        if (!od->icq)
     2281                return g_list_append(m, GAIM_AWAY_CUSTOM);
     2282
     2283        m = g_list_append(m, "Online");
     2284        m = g_list_append(m, "Away");
     2285        m = g_list_append(m, "Do Not Disturb");
     2286        m = g_list_append(m, "Not Available");
     2287        m = g_list_append(m, "Occupied");
     2288        m = g_list_append(m, "Free For Chat");
     2289        m = g_list_append(m, "Invisible");
     2290
     2291        return m;
    23082292}
    23092293
  • protocols/yahoo/libyahoo2.c

    r123cac7 r1014cab  
    855855}
    856856
     857static YList * bud_str2list(char *rawlist)
     858{
     859        YList * l = NULL;
     860
     861        char **lines;
     862        char **split;
     863        char **buddies;
     864        char **tmp, **bud;
     865
     866        lines = y_strsplit(rawlist, "\n", -1);
     867        for (tmp = lines; *tmp; tmp++) {
     868                struct yahoo_buddy *newbud;
     869
     870                split = y_strsplit(*tmp, ":", 2);
     871                if (!split)
     872                        continue;
     873                if (!split[0] || !split[1]) {
     874                        y_strfreev(split);
     875                        continue;
     876                }
     877                buddies = y_strsplit(split[1], ",", -1);
     878
     879                for (bud = buddies; bud && *bud; bud++) {
     880                        newbud = y_new0(struct yahoo_buddy, 1);
     881                        newbud->id = strdup(*bud);
     882                        newbud->group = strdup(split[0]);
     883
     884                        if(y_list_find_custom(l, newbud, is_same_bud)) {
     885                                FREE(newbud->id);
     886                                FREE(newbud->group);
     887                                FREE(newbud);
     888                                continue;
     889                        }
     890
     891                        newbud->real_name = NULL;
     892
     893                        l = y_list_append(l, newbud);
     894
     895                        NOTICE(("Added buddy %s to group %s", newbud->id, newbud->group));
     896                }
     897
     898                y_strfreev(buddies);
     899                y_strfreev(split);
     900        }
     901        y_strfreev(lines);
     902
     903        return l;
     904}
     905
    857906static char * getcookie(char *rawcookie)
    858907{
     
    13111360}
    13121361
    1313 static void yahoo_process_status(struct yahoo_input_data *yid,
    1314         struct yahoo_packet *pkt)
     1362
     1363static void yahoo_process_status(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
    13151364{
    13161365        YList *l;
    13171366        struct yahoo_data *yd = yid->yd;
    13181367
    1319         struct yahoo_process_status_entry *u;
     1368        struct user
     1369        {
     1370                char *name;     /* 7    name */
     1371                int   state;    /* 10   state */
     1372                int   flags;    /* 13   flags, bit 0 = pager, bit 1 = chat, bit 2 = game */
     1373                int   mobile;   /* 60   mobile */
     1374                char *msg;      /* 19   custom status message */
     1375                int   away;     /* 47   away (or invisible)*/
     1376                int   buddy_session;    /* 11   state */
     1377                int   f17;      /* 17   in chat? then what about flags? */
     1378                int   idle;     /* 137  seconds idle */
     1379                int   f138;     /* 138  state */
     1380                char *f184;     /* 184  state */
     1381                int   f192;     /* 192  state */
     1382                int   f10001;   /* 10001        state */
     1383                int   f10002;   /* 10002        state */
     1384                int   f198;     /* 198  state */
     1385                char *f197;     /* 197  state */
     1386                char *f205;     /* 205  state */
     1387                int   f213;     /* 213  state */
     1388        } *u;
    13201389
    13211390        YList *users = 0;
    1322 
     1391       
    13231392        if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) {
    1324                 YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id,
    1325                         YAHOO_LOGIN_DUPL, NULL);
    1326                 return;
    1327         }
    1328 
    1329         /* Status updates may be spread accross multiple packets and not
    1330            even on buddy boundaries, so keeping some state is important.
    1331            So, continue where we left off, and only add a user entry to
    1332            the list once it's complete (301-315 End buddy). */
    1333         u = yd->half_user;
     1393                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_DUPL, NULL);
     1394                return;
     1395        }
    13341396
    13351397        for (l = pkt->hash; l; l = l->next) {
     
    13371399
    13381400                switch (pair->key) {
    1339                 case 300:       /* Begin buddy */
    1340                         if (!strcmp(pair->value, "315") && !u) {
    1341                                 u = yd->half_user = y_new0(struct yahoo_process_status_entry, 1);
     1401                case 0: /* we won't actually do anything with this */
     1402                        NOTICE(("key %d:%s", pair->key, pair->value));
     1403                        break;
     1404                case 1: /* we don't get the full buddy list here. */
     1405                        if (!yd->logged_in) {
     1406                                yd->logged_in = TRUE;
     1407                                if(yd->current_status < 0)
     1408                                        yd->current_status = yd->initial_status;
     1409                                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
    13421410                        }
    13431411                        break;
    1344                 case 301:       /* End buddy */
    1345                         if (!strcmp(pair->value, "315") && u) {
    1346                                 /* Sometimes user info comes in an odd format with no
    1347                                    "begin buddy" but *with* an "end buddy". Don't add
    1348                                    it twice. */
    1349                                 if (!y_list_find(users, u))
    1350                                         users = y_list_prepend(users, u);
    1351                                 u = yd->half_user = NULL;
    1352                         }
    1353                         break;
    1354                 case 0: /* we won't actually do anything with this */
     1412                case 8: /* how many online buddies we have */
    13551413                        NOTICE(("key %d:%s", pair->key, pair->value));
    13561414                        break;
    1357                 case 1: /* we don't get the full buddy list here. */
    1358                         if (!yd->logged_in) {
    1359                                 yd->logged_in = 1;
    1360                                 if (yd->current_status < 0)
    1361                                         yd->current_status = yd->initial_status;
    1362                                 YAHOO_CALLBACK(ext_yahoo_login_response) (yd->
    1363                                         client_id, YAHOO_LOGIN_OK, NULL);
    1364                         }
    1365                         break;
    1366                 case 8: /* how many online buddies we have */
    1367                         NOTICE(("key %d:%s", pair->key, pair->value));
    1368                         break;
    1369                 case 7: /* the current buddy */
    1370                         if (!u) {
    1371                                 /* This will only happen in case of a single level message */
    1372                                 u = y_new0(struct yahoo_process_status_entry, 1);
    1373                                 users = y_list_prepend(users, u);
    1374                         }
     1415                case 7: /* the current buddy */
     1416                        u = y_new0(struct user, 1);
    13751417                        u->name = pair->value;
    1376                         break;
    1377                 case 10:        /* state */
    1378                         u->state = strtol(pair->value, NULL, 10);
    1379                         break;
    1380                 case 19:        /* custom status message */
    1381                         u->msg = pair->value;
    1382                         break;
    1383                 case 47:        /* is it an away message or not. Not applicable for YMSG16 anymore */
    1384                         u->away = atoi(pair->value);
    1385                         break;
    1386                 case 137:       /* seconds idle */
    1387                         u->idle = atoi(pair->value);
    1388                         break;
    1389                 case 11:        /* this is the buddy's session id */
    1390                         u->buddy_session = atoi(pair->value);
    1391                         break;
    1392                 case 17:        /* in chat? */
    1393                         u->f17 = atoi(pair->value);
    1394                         break;
    1395                 case 13:        /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */
    1396                         u->flags = atoi(pair->value);
    1397                         break;
    1398                 case 60:        /* SMS -> 1 MOBILE USER */
     1418                        users = y_list_prepend(users, u);
     1419                        break;
     1420                case 10: /* state */
     1421                        ((struct user*)users->data)->state = strtol(pair->value, NULL, 10);
     1422                        break;
     1423                case 19: /* custom status message */
     1424                        ((struct user*)users->data)->msg = pair->value;
     1425                        break;
     1426                case 47: /* is it an away message or not */
     1427                        ((struct user*)users->data)->away = atoi(pair->value);
     1428                        break;
     1429                case 137: /* seconds idle */
     1430                        ((struct user*)users->data)->idle = atoi(pair->value);
     1431                        break;
     1432                case 11: /* this is the buddy's session id */
     1433                        ((struct user*)users->data)->buddy_session = atoi(pair->value);
     1434                        break;
     1435                case 17: /* in chat? */
     1436                        ((struct user*)users->data)->f17 = atoi(pair->value);
     1437                        break;
     1438                case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */
     1439                        ((struct user*)users->data)->flags = atoi(pair->value);
     1440                        break;
     1441                case 60: /* SMS -> 1 MOBILE USER */
    13991442                        /* sometimes going offline makes this 2, but invisible never sends it */
    1400                         u->mobile = atoi(pair->value);
     1443                        ((struct user*)users->data)->mobile = atoi(pair->value);
    14011444                        break;
    14021445                case 138:
    1403                         u->f138 = atoi(pair->value);
     1446                        ((struct user*)users->data)->f138 = atoi(pair->value);
    14041447                        break;
    14051448                case 184:
    1406                         u->f184 = pair->value;
     1449                        ((struct user*)users->data)->f184 = pair->value;
    14071450                        break;
    14081451                case 192:
    1409                         u->f192 = atoi(pair->value);
     1452                        ((struct user*)users->data)->f192 = atoi(pair->value);
    14101453                        break;
    14111454                case 10001:
    1412                         u->f10001 = atoi(pair->value);
     1455                        ((struct user*)users->data)->f10001 = atoi(pair->value);
    14131456                        break;
    14141457                case 10002:
    1415                         u->f10002 = atoi(pair->value);
     1458                        ((struct user*)users->data)->f10002 = atoi(pair->value);
    14161459                        break;
    14171460                case 198:
    1418                         u->f198 = atoi(pair->value);
     1461                        ((struct user*)users->data)->f198 = atoi(pair->value);
    14191462                        break;
    14201463                case 197:
    1421                         u->f197 = pair->value;
     1464                        ((struct user*)users->data)->f197 = pair->value;
    14221465                        break;
    14231466                case 205:
    1424                         u->f205 = pair->value;
     1467                        ((struct user*)users->data)->f205 = pair->value;
    14251468                        break;
    14261469                case 213:
    1427                         u->f213 = atoi(pair->value);
    1428                         break;
    1429                 case 16:        /* Custom error message */
    1430                         YAHOO_CALLBACK(ext_yahoo_error) (yd->client_id,
    1431                                 pair->value, 0, E_CUSTOM);
     1470                        ((struct user*)users->data)->f213 = atoi(pair->value);
     1471                        break;
     1472                case 16: /* Custom error message */
     1473                        YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, pair->value, 0, E_CUSTOM);
    14321474                        break;
    14331475                default:
    1434                         WARNING(("unknown status key %d:%s", pair->key,
    1435                                         pair->value));
    1436                         break;
    1437                 }
    1438         }
    1439 
     1476                        WARNING(("unknown status key %d:%s", pair->key, pair->value));
     1477                        break;
     1478                }
     1479        }
     1480       
    14401481        while (users) {
    14411482                YList *t = users;
    1442                 struct yahoo_process_status_entry *u = users->data;
     1483                struct user *u = users->data;
    14431484
    14441485                if (u->name != NULL) {
    1445                         if (pkt->service ==
    1446                                 YAHOO_SERVICE_LOGOFF
    1447                                 /*|| u->flags == 0 No flags for YMSG16 */ ) {
    1448                                 YAHOO_CALLBACK(ext_yahoo_status_changed) (yd->
    1449                                         client_id, u->name,
    1450                                         YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0);
     1486                        if (pkt->service == YAHOO_SERVICE_LOGOFF) { /* || u->flags == 0) { Not in YMSG16 */
     1487                                YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, u->name, YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0);
    14511488                        } else {
    14521489                                /* Key 47 always seems to be 1 for YMSG16 */
    1453                                 if (!u->state)
     1490                                if(!u->state)
    14541491                                        u->away = 0;
    14551492                                else
    14561493                                        u->away = 1;
    14571494
    1458                                 YAHOO_CALLBACK(ext_yahoo_status_changed) (yd->
    1459                                         client_id, u->name, u->state, u->msg,
    1460                                         u->away, u->idle, u->mobile);
     1495                                YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, u->name, u->state, u->msg, u->away, u->idle, u->mobile);
    14611496                        }
    14621497                }
     
    14681503}
    14691504
    1470 static void yahoo_process_buddy_list(struct yahoo_input_data *yid,
    1471         struct yahoo_packet *pkt)
     1505static void yahoo_process_buddy_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
    14721506{
    14731507        struct yahoo_data *yd = yid->yd;
     
    14811515                struct yahoo_pair *pair = l->data;
    14821516
    1483                 switch (pair->key) {
     1517                switch(pair->key) {
    14841518                case 300:
    14851519                case 301:
    14861520                case 302:
    1487                         break;  /* Separators. Our logic does not need them */
    14881521                case 303:
    1489                         if (318 == atoi(pair->value))
     1522                        if ( 315 == atoi(pair->value) )
    14901523                                last_packet = 1;
    14911524                        break;
    14921525                case 65:
     1526                        g_free(cur_group);
    14931527                        cur_group = strdup(pair->value);
    14941528                        break;
     
    14961530                        newbud = y_new0(struct yahoo_buddy, 1);
    14971531                        newbud->id = strdup(pair->value);
    1498                         if (cur_group)
     1532                        if(cur_group)
    14991533                                newbud->group = strdup(cur_group);
    1500                         else if (yd->buddies) {
    1501                                 struct yahoo_buddy *lastbud =
    1502                                         (struct yahoo_buddy *)y_list_nth(yd->
    1503                                         buddies,
    1504                                         y_list_length(yd->buddies) - 1)->data;
     1534                        else {
     1535                                struct yahoo_buddy *lastbud = (struct yahoo_buddy *)y_list_nth(
     1536                                                                yd->buddies, y_list_length(yd->buddies)-1)->data;
    15051537                                newbud->group = strdup(lastbud->group);
    1506                         } else
    1507                                 newbud->group = strdup("Buddies");
     1538                        }
    15081539
    15091540                        yd->buddies = y_list_append(yd->buddies, newbud);
     
    15121543                }
    15131544        }
     1545       
     1546        g_free(cur_group);
    15141547
    15151548        /* we could be getting multiple packets here */
    1516         if (pkt->hash && !last_packet)
    1517                 return;
    1518 
    1519         YAHOO_CALLBACK(ext_yahoo_got_buddies) (yd->client_id, yd->buddies);
    1520 
    1521         /* Logged in */
     1549        if (last_packet)
     1550                return;
     1551
     1552        YAHOO_CALLBACK(ext_yahoo_got_buddies)(yd->client_id, yd->buddies);
     1553
     1554        /*** We login at the very end of the packet communication */
    15221555        if (!yd->logged_in) {
    1523                 yd->logged_in = 1;
    1524                 if (yd->current_status < 0)
     1556                yd->logged_in = TRUE;
     1557                if(yd->current_status < 0)
    15251558                        yd->current_status = yd->initial_status;
    1526                 YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id,
    1527                         YAHOO_LOGIN_OK, NULL);
    1528 
    1529                 /*
    1530                 yahoo_set_away(yd->client_id, yd->initial_status, NULL,
    1531                         (yd->initial_status == YAHOO_STATUS_AVAILABLE) ? 0 : 1);
    1532 
    1533                 yahoo_get_yab(yd->client_id);
    1534                 */
    1535         }
    1536 
    1537 }
    1538 
    1539 static void yahoo_process_list(struct yahoo_input_data *yid,
    1540         struct yahoo_packet *pkt)
     1559                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
     1560        }
     1561}
     1562
     1563static void yahoo_process_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
    15411564{
    15421565        struct yahoo_data *yd = yid->yd;
    15431566        YList *l;
    15441567
    1545         /* we could be getting multiple packets here */
     1568        if (!yd->logged_in) {
     1569                yd->logged_in = TRUE;
     1570                if(yd->current_status < 0)
     1571                        yd->current_status = yd->initial_status;
     1572                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
     1573        }
     1574
    15461575        for (l = pkt->hash; l; l = l->next) {
    15471576                struct yahoo_pair *pair = l->data;
    15481577
    1549                 switch (pair->key) {
    1550                 case 89:        /* identities */
     1578                switch(pair->key) {
     1579                case 87: /* buddies */
     1580                        if(!yd->rawbuddylist)
     1581                                yd->rawbuddylist = strdup(pair->value);
     1582                        else {
     1583                                yd->rawbuddylist = y_string_append(yd->rawbuddylist, pair->value);
     1584                        }
     1585                        break;
     1586
     1587                case 88: /* ignore list */
     1588                        if(!yd->ignorelist)
     1589                                yd->ignorelist = strdup("Ignore:");
     1590                        yd->ignorelist = y_string_append(yd->ignorelist, pair->value);
     1591                        break;
     1592
     1593                case 89: /* identities */
    15511594                        {
    1552                                 char **identities =
    1553                                         y_strsplit(pair->value, ",", -1);
    1554                                 int i;
    1555                                 for (i = 0; identities[i]; i++)
    1556                                         yd->identities =
    1557                                                 y_list_append(yd->identities,
     1595                        char **identities = y_strsplit(pair->value, ",", -1);
     1596                        int i;
     1597                        for(i=0; identities[i]; i++)
     1598                                yd->identities = y_list_append(yd->identities,
    15581599                                                strdup(identities[i]));
    1559                                 y_strfreev(identities);
     1600                        y_strfreev(identities);
    15601601                        }
    1561                         YAHOO_CALLBACK(ext_yahoo_got_identities) (yd->client_id,
    1562                                 yd->identities);
    1563                         break;
    1564                 case 59:        /* cookies */
    1565                         if (pair->value[0] == 'Y') {
     1602                        YAHOO_CALLBACK(ext_yahoo_got_identities)(yd->client_id, yd->identities);
     1603                        break;
     1604                case 59: /* cookies */
     1605                        if(yd->ignorelist) {
     1606                                yd->ignore = bud_str2list(yd->ignorelist);
     1607                                FREE(yd->ignorelist);
     1608                                YAHOO_CALLBACK(ext_yahoo_got_ignore)(yd->client_id, yd->ignore);
     1609                        }
     1610                        if(yd->rawbuddylist) {
     1611                                yd->buddies = bud_str2list(yd->rawbuddylist);
     1612                                FREE(yd->rawbuddylist);
     1613                                YAHOO_CALLBACK(ext_yahoo_got_buddies)(yd->client_id, yd->buddies);
     1614                        }
     1615
     1616                        if(pair->value[0]=='Y') {
    15661617                                FREE(yd->cookie_y);
    15671618                                FREE(yd->login_cookie);
     
    15701621                                yd->login_cookie = getlcookie(yd->cookie_y);
    15711622
    1572                         } else if (pair->value[0] == 'T') {
     1623                        } else if(pair->value[0]=='T') {
    15731624                                FREE(yd->cookie_t);
    15741625                                yd->cookie_t = getcookie(pair->value);
    15751626
    1576                         } else if (pair->value[0] == 'C') {
     1627                        } else if(pair->value[0]=='C') {
    15771628                                FREE(yd->cookie_c);
    15781629                                yd->cookie_c = getcookie(pair->value);
    1579                         }
    1580 
    1581                         break;
    1582                 case 3: /* my id */
    1583                 case 90:        /* 1 */
    1584                 case 100:       /* 0 */
    1585                 case 101:       /* NULL */
    1586                 case 102:       /* NULL */
    1587                 case 93:        /* 86400/1440 */
    1588                         break;
    1589                 }
    1590         }
    1591 
    1592         if (yd->cookie_y && yd->cookie_t)       /* We don't get cookie_c anymore */
    1593                 YAHOO_CALLBACK(ext_yahoo_got_cookies) (yd->client_id);
     1630                        } 
     1631
     1632                        if(yd->cookie_y && yd->cookie_t)
     1633                                YAHOO_CALLBACK(ext_yahoo_got_cookies)(yd->client_id);
     1634
     1635                        break;
     1636                case 3: /* my id */
     1637                case 90: /* 1 */
     1638                case 100: /* 0 */
     1639                case 101: /* NULL */
     1640                case 102: /* NULL */
     1641                case 93: /* 86400/1440 */
     1642                        break;
     1643                }
     1644        }
    15941645}
    15951646
     
    23422393{
    23432394        struct yahoo_https_auth_data *had = req->data;
    2344         struct yahoo_input_data *yid;
    2345         struct yahoo_data *yd;
     2395        struct yahoo_input_data *yid = had->yid;
     2396        struct yahoo_data *yd = yid->yd;
    23462397        int st;
    2347        
    2348         if (y_list_find(inputs, had->yid) == NULL)
    2349                 return;
    2350        
    2351         yid = had->yid;
    2352         yd = yid->yd;
    23532398       
    23542399        if (req->status_code != 200) {
     
    23912436{
    23922437        struct yahoo_https_auth_data *had = req->data;
    2393         struct yahoo_input_data *yid;
    2394         struct yahoo_data *yd;
     2438        struct yahoo_input_data *yid = had->yid;
     2439        struct yahoo_data *yd = yid->yd;
    23952440        struct yahoo_packet *pack;
    2396         char *crumb = NULL;
     2441        char *crumb;
    23972442        int st;
    2398        
    2399         if (y_list_find(inputs, had->yid) == NULL)
    2400                 return;
    2401        
    2402         yid = had->yid;
    2403         yd = yid->yd;
    24042443       
    24052444        md5_byte_t result[16];
     
    40414080
    40424081        yd = yid->yd;
     4082
    40434083        old_status = yd->current_status;
    4044         yd->current_status = state;
     4084
     4085        if (msg && strncmp(msg,"Invisible",9)) {
     4086                yd->current_status = YAHOO_STATUS_CUSTOM;
     4087        } else {
     4088                yd->current_status = state;
     4089        }
    40454090
    40464091        /* Thank you libpurple :) */
     
    40574102        snprintf(s, sizeof(s), "%d", yd->current_status);
    40584103        yahoo_packet_hash(pkt, 10, s);
    4059         yahoo_packet_hash(pkt, 19, msg && state == YAHOO_STATUS_CUSTOM ? msg : "");
     4104         
     4105        if (yd->current_status == YAHOO_STATUS_CUSTOM) {
     4106                yahoo_packet_hash(pkt, 19, msg);
     4107        } else {
     4108                yahoo_packet_hash(pkt, 19, "");
     4109        }
     4110       
    40604111        yahoo_packet_hash(pkt, 47, (away == 2)? "2": (away) ?"1":"0");
     4112
    40614113        yahoo_send_packet(yid, pkt, 0);
    40624114        yahoo_packet_free(pkt);
  • protocols/yahoo/yahoo.c

    r123cac7 r1014cab  
    130130{
    131131        set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc );
    132        
    133         acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE;
    134132}
    135133
     
    199197{
    200198        struct byahoo_data *yd = (struct byahoo_data *) ic->proto_data;
    201        
    202         if( state && msg == NULL )
    203         {
    204                 /* Use these states only if msg doesn't contain additional
    205                    info since away messages are only supported with CUSTOM. */
    206                 if( g_strcasecmp( state, "Be Right Back" ) == 0 )
     199        char *away;
     200       
     201        away = NULL;
     202       
     203        if( state && msg && g_strcasecmp( state, msg ) != 0 )
     204        {
     205                yd->current_status = YAHOO_STATUS_CUSTOM;
     206                away = "";
     207        }
     208        else if( state )
     209        {
     210                /* Set msg to NULL since (if it isn't NULL already) it's equal
     211                   to state. msg must be empty if we want to use an existing
     212                   away state. */
     213                msg = NULL;
     214               
     215                away = "";
     216                if( g_strcasecmp( state, "Available" ) == 0 )
     217                {
     218                        yd->current_status = YAHOO_STATUS_AVAILABLE;
     219                        away = NULL;
     220                }
     221                else if( g_strcasecmp( state, "Be Right Back" ) == 0 )
    207222                        yd->current_status = YAHOO_STATUS_BRB;
    208223                else if( g_strcasecmp( state, "Busy" ) == 0 )
     
    224239                else if( g_strcasecmp( state, "Invisible" ) == 0 )
    225240                        yd->current_status = YAHOO_STATUS_INVISIBLE;
    226                 else
    227                         yd->current_status = YAHOO_STATUS_CUSTOM;
    228         }
    229         else if( msg )
    230                 yd->current_status = YAHOO_STATUS_CUSTOM;
     241                else if( g_strcasecmp( state, GAIM_AWAY_CUSTOM ) == 0 )
     242                {
     243                        yd->current_status = YAHOO_STATUS_AVAILABLE;
     244                       
     245                        away = NULL;
     246                }
     247        }
    231248        else
    232249                yd->current_status = YAHOO_STATUS_AVAILABLE;
    233250       
    234         yahoo_set_away( yd->y2_id, yd->current_status, msg, state ? 2 : 0 );
     251        yahoo_set_away( yd->y2_id, yd->current_status, msg, away != NULL ? 2 : 0 );
    235252}
    236253
     
    241258        if( m == NULL )
    242259        {
     260                m = g_list_append( m, "Available" );
    243261                m = g_list_append( m, "Be Right Back" );
    244262                m = g_list_append( m, "Busy" );
     
    251269                m = g_list_append( m, "Stepped Out" );
    252270                m = g_list_append( m, "Invisible" );
     271                m = g_list_append( m, GAIM_AWAY_CUSTOM );
    253272        }
    254273       
  • protocols/yahoo/yahoo2_types.h

    r123cac7 r1014cab  
    196196
    197197        void  *server_settings;
    198        
    199         struct yahoo_process_status_entry *half_user;
    200198};
    201199
     
    263261};
    264262
    265 struct yahoo_process_status_entry {
    266         char *name;     /* 7      name */
    267         int state;      /* 10     state */
    268         int flags;      /* 13     flags, bit 0 = pager, bit 1 = chat, bit 2 = game */
    269         int mobile;     /* 60     mobile */
    270         char *msg;      /* 19     custom status message */
    271         int away;       /* 47     away (or invisible) */
    272         int buddy_session; /* 11  state */
    273         int f17;        /* 17     in chat? then what about flags? */
    274         int idle;       /* 137    seconds idle */
    275         int f138;       /* 138    state */
    276         char *f184;     /* 184    state */
    277         int f192;       /* 192    state */
    278         int f10001;     /* 10001  state */
    279         int f10002;     /* 10002  state */
    280         int f198;       /* 198    state */
    281         char *f197;     /* 197    state */
    282         char *f205;     /* 205    state */
    283         int f213;       /* 213    state */
    284 };
    285 
    286263#ifdef __cplusplus
    287264}
  • root_commands.c

    r123cac7 r1014cab  
    22  * BitlBee -- An IRC to other IM-networks gateway                     *
    33  *                                                                    *
    4   * Copyright 2002-2010 Wilmer van der Gaast and others                *
     4  * Copyright 2002-2004 Wilmer van der Gaast and others                *
    55  \********************************************************************/
    66
     
    143143        storage_status_t status = storage_load( irc, cmd[1] );
    144144        char *account_on[] = { "account", "on", NULL };
    145        
    146         if( strchr( irc->umode, 'R' ) != NULL )
    147         {
    148                 irc_usermsg( irc, "You're already logged in." );
    149                 return;
    150         }
    151145       
    152146        switch (status) {
     
    654648                irc_usermsg( irc, "Nick `%s' can't be changed", cmd[1] );
    655649        }
    656         else if( g_strcasecmp( cmd[1], irc->channel ) == 0 )
    657         {
    658                 if( strchr( CTYPES, cmd[2][0] ) && nick_ok( cmd[2] + 1 ) )
    659                 {
    660                         u = user_find( irc, irc->nick );
    661                        
    662                         irc_part( irc, u, irc->channel );
    663                         g_free( irc->channel );
    664                         irc->channel = g_strdup( cmd[2] );
    665                         irc_join( irc, u, irc->channel );
    666                        
    667                         if( strcmp( cmd[0], "set_rename" ) != 0 )
    668                                 set_setstr( &irc->set, "control_channel", cmd[2] );
    669                 }
    670         }
    671650        else if( user_find( irc, cmd[2] ) && ( nick_cmp( cmd[1], cmd[2] ) != 0 ) )
    672651        {
     
    716695       
    717696        return strcmp( irc->mynick, new_nick ) == 0 ? new_nick : SET_INVALID;
    718 }
    719 
    720 char *set_eval_control_channel( set_t *set, char *new_name )
    721 {
    722         irc_t *irc = set->data;
    723        
    724         if( strcmp( irc->channel, new_name ) != 0 )
    725         {
    726                 char *cmd[] = { "set_rename", irc->channel, new_name, NULL };
    727                
    728                 cmd_rename( irc, cmd );
    729         }
    730        
    731         return strcmp( irc->channel, new_name ) == 0 ? new_name : SET_INVALID;
    732697}
    733698
     
    943908                online = 1;
    944909        else
    945                 online = away = 1;
     910                online =  away = 1;
    946911       
    947912        if( strchr( irc->umode, 'b' ) != NULL )
     
    956921                if( online == 1 )
    957922                {
    958                         char st[256] = "Online";
    959                        
    960                         if( u->status_msg )
    961                                 g_snprintf( st, sizeof( st ) - 1, "Online (%s)", u->status_msg );
    962                        
    963923                        g_snprintf( s, sizeof( s ) - 1, "%s@%s %s(%s)", u->user, u->host, u->ic->acc->prpl->name, u->ic->acc->user );
    964                         irc_usermsg( irc, format, u->nick, s, st );
     924                        irc_usermsg( irc, format, u->nick, s, "Online" );
    965925                }
    966926               
     
    11551115                irc_usermsg( irc, "Unknown command: %s %s. Please use \x02help commands\x02 to get a list of available commands.", "chat", cmd[1] );
    11561116        }
     1117
     1118
     1119
     1120#if 0
     1121        account_t *a;
     1122        struct im_connection *ic;
     1123        char *chat, *channel, *nick = NULL, *password = NULL;
     1124        struct groupchat *c;
     1125       
     1126        if( !( a = account_get( irc, cmd[1] ) ) )
     1127        {
     1128                irc_usermsg( irc, "Invalid account" );
     1129                return;
     1130        }
     1131        else if( !( a->ic && ( a->ic->flags & OPT_LOGGED_IN ) ) )
     1132        {
     1133                irc_usermsg( irc, "That account is not on-line" );
     1134                return;
     1135        }
     1136        else if( a->prpl->chat_join == NULL )
     1137        {
     1138                irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
     1139                return;
     1140        }
     1141        ic = a->ic;
     1142       
     1143        chat = cmd[2];
     1144        if( cmd[3] )
     1145        {
     1146                if( strchr( CTYPES, cmd[3][0] ) == NULL )
     1147                        channel = g_strdup_printf( "&%s", cmd[3] );
     1148                else
     1149                        channel = g_strdup( cmd[3] );
     1150        }
     1151        else
     1152        {
     1153                char *s;
     1154               
     1155                channel = g_strdup_printf( "&%s", chat );
     1156                if( ( s = strchr( channel, '@' ) ) )
     1157                        *s = 0;
     1158        }
     1159        if( cmd[3] && cmd[4] )
     1160                nick = cmd[4];
     1161        else
     1162                nick = irc->nick;
     1163        if( cmd[3] && cmd[4] && cmd[5] )
     1164                password = cmd[5];
     1165       
     1166        if( !nick_ok( channel + 1 ) )
     1167        {
     1168                irc_usermsg( irc, "Invalid channel name: %s", channel );
     1169                g_free( channel );
     1170                return;
     1171        }
     1172        else if( g_strcasecmp( channel, irc->channel ) == 0 || irc_chat_by_channel( irc, channel ) )
     1173        {
     1174                irc_usermsg( irc, "Channel already exists: %s", channel );
     1175                g_free( channel );
     1176                return;
     1177        }
     1178       
     1179        if( ( c = a->prpl->chat_join( ic, chat, nick, password ) ) )
     1180        {
     1181                g_free( c->channel );
     1182                c->channel = channel;
     1183        }
     1184        else
     1185        {
     1186                irc_usermsg( irc, "Tried to join chat, not sure if this was successful" );
     1187                g_free( channel );
     1188        }
     1189#endif
    11571190}
    11581191
  • tests/check_jabber_util.c

    r123cac7 r1014cab  
    1414       
    1515        budw1 = jabber_buddy_add( ic, "wilmer@gaast.net/BitlBee" );
    16         budw1->last_msg = time( NULL ) - 100;
     16        budw1->last_act = time( NULL ) - 100;
    1717        budw2 = jabber_buddy_add( ic, "WILMER@gaast.net/Telepathy" );
    1818        budw2->priority = 2;
    19         budw2->last_msg = time( NULL );
     19        budw2->last_act = time( NULL );
    2020        budw3 = jabber_buddy_add( ic, "wilmer@GAAST.NET/bitlbee" );
    21         budw3->last_msg = time( NULL ) - 200;
     21        budw3->last_act = time( NULL ) - 200;
    2222        budw3->priority = 4;
    2323        /* TODO(wilmer): Shouldn't this just return budw3? */
     
    6060        fail_unless( jabber_buddy_remove( ic, "wilmer@gaast.net/Telepathy" ) );
    6161        fail_unless( jabber_buddy_remove( ic, "wilmer@gaast.net/telepathy" ) );
    62        
    63         /* Test activity_timeout and GET_BUDDY_BARE_OK. */
    64         fail_unless( jabber_buddy_by_jid( ic, "wilmer@gaast.net", GET_BUDDY_BARE_OK ) == budw1 );
    65         budw1->last_msg -= 50;
    66         fail_unless( ( bud = jabber_buddy_by_jid( ic, "wilmer@gaast.net", GET_BUDDY_BARE_OK ) ) != NULL );
    67         fail_unless( strcmp( bud->full_jid, "wilmer@gaast.net" ) == 0 );
     62        fail_unless( jabber_buddy_by_jid( ic, "wilmer@gaast.net", 0 ) == budw1 );
    6863       
    6964        fail_if( jabber_buddy_remove( ic, "wilmer@gaast.net" ) );
    7065        fail_unless( jabber_buddy_by_jid( ic, "wilmer@gaast.net", 0 ) == budw1 );
    7166       
    72         fail_if( jabber_buddy_remove( ic, "wilmer@gaast.net" ) );
    73         fail_unless( jabber_buddy_remove( ic, "wilmer@gaast.net/bitlbee" ) );
    74         fail_unless( jabber_buddy_remove( ic, "wilmer@gaast.net/BitlBee" ) );
    75         fail_if( jabber_buddy_by_jid( ic, "wilmer@gaast.net", GET_BUDDY_BARE_OK ) );
    76        
    7767        /* Check if remove_bare() indeed gets rid of all. */
    78         /* disable this one for now.
    7968        fail_unless( jabber_buddy_remove_bare( ic, "wilmer@gaast.net" ) );
    8069        fail_if( jabber_buddy_by_jid( ic, "wilmer@gaast.net", 0 ) );
    81         */
    8270
    8371        fail_if( jabber_buddy_remove( ic, "nekkid@lamejab.net/Illegal" ) );
    8472        fail_unless( jabber_buddy_remove( ic, "nekkid@lamejab.net" ) );
    8573        fail_if( jabber_buddy_by_jid( ic, "nekkid@lamejab.net", 0 ) );
    86        
    87         /* Fixing a bug in this branch that caused information to get lost when
    88            removing the first full JID from a list. */
    89         jabber_buddy_add( ic, "bugtest@google.com/A" );
    90         jabber_buddy_add( ic, "bugtest@google.com/B" );
    91         jabber_buddy_add( ic, "bugtest@google.com/C" );
    92         fail_unless( jabber_buddy_remove( ic, "bugtest@google.com/A" ) );
    93         fail_unless( jabber_buddy_remove( ic, "bugtest@google.com/B" ) );
    94         fail_unless( jabber_buddy_remove( ic, "bugtest@google.com/C" ) );
    9574}
    9675
     
    10685        jd->buddies = g_hash_table_new( g_str_hash, g_str_equal );
    10786        set_add( &ic->acc->set, "resource_select", "priority", NULL, ic->acc );
    108         set_add( &ic->acc->set, "activity_timeout", "120", NULL, ic->acc );
    10987       
    11088        suite_add_tcase (s, tc_core);
  • unix.c

    r123cac7 r1014cab  
    2525
    2626#include "bitlbee.h"
    27 
    28 #include "arc.h"
    29 #include "base64.h"
    3027#include "commands.h"
     28#include "crypting.h"
    3129#include "protocols/nogaim.h"
    3230#include "help.h"
    3331#include "ipc.h"
    34 #include "md5.h"
    35 #include "misc.h"
    3632#include <signal.h>
    3733#include <unistd.h>
     
    4440static void sighandler( int signal );
    4541
    46 static int crypt_main( int argc, char *argv[] );
    47 
    4842int main( int argc, char *argv[] )
    4943{
     
    5145        char *old_cwd = NULL;
    5246        struct sigaction sig, old;
    53        
    54         if( argc > 1 && strcmp( argv[1], "-x" ) == 0 )
    55                 return crypt_main( argc, argv );
    5647       
    5748        log_init();
     
    168159}
    169160
    170 static int crypt_main( int argc, char *argv[] )
    171 {
    172         int pass_len;
    173         unsigned char *pass_cr, *pass_cl;
    174        
    175         if( argc < 4 || ( strcmp( argv[2], "hash" ) != 0 &&
    176                           strcmp( argv[2], "unhash" ) != 0 && argc < 5 ) )
    177         {
    178                 printf( "Supported:\n"
    179                         "  %s -x enc <key> <cleartext password>\n"
    180                         "  %s -x dec <key> <encrypted password>\n"
    181                         "  %s -x hash <cleartext password>\n"
    182                         "  %s -x unhash <hashed password>\n"
    183                         "  %s -x chkhash <hashed password> <cleartext password>\n",
    184                         argv[0], argv[0], argv[0], argv[0], argv[0] );
    185         }
    186         else if( strcmp( argv[2], "enc" ) == 0 )
    187         {
    188                 pass_len = arc_encode( argv[4], strlen( argv[4] ), (unsigned char**) &pass_cr, argv[3], 12 );
    189                 printf( "%s\n", base64_encode( pass_cr, pass_len ) );
    190         }
    191         else if( strcmp( argv[2], "dec" ) == 0 )
    192         {
    193                 pass_len = base64_decode( argv[4], (unsigned char**) &pass_cr );
    194                 arc_decode( pass_cr, pass_len, (char**) &pass_cl, argv[3] );
    195                 printf( "%s\n", pass_cl );
    196         }
    197         else if( strcmp( argv[2], "hash" ) == 0 )
    198         {
    199                 md5_byte_t pass_md5[21];
    200                 md5_state_t md5_state;
    201                
    202                 random_bytes( pass_md5 + 16, 5 );
    203                 md5_init( &md5_state );
    204                 md5_append( &md5_state, (md5_byte_t*) argv[3], strlen( argv[3] ) );
    205                 md5_append( &md5_state, pass_md5 + 16, 5 ); /* Add the salt. */
    206                 md5_finish( &md5_state, pass_md5 );
    207                
    208                 printf( "%s\n", base64_encode( pass_md5, 21 ) );
    209         }
    210         else if( strcmp( argv[2], "unhash" ) == 0 )
    211         {
    212                 printf( "Hash %s submitted to a massive Beowulf cluster of\n"
    213                         "overclocked 486s. Expect your answer next year somewhere around this time. :-)\n", argv[3] );
    214         }
    215         else if( strcmp( argv[2], "chkhash" ) == 0 )
    216         {
    217                 char *hash = strncmp( argv[3], "md5:", 4 ) == 0 ? argv[3] + 4 : argv[3];
    218                 int st = md5_verify_password( argv[4], hash );
    219                
    220                 printf( "Hash %s given password.\n", st == 0 ? "matches" : "does not match" );
    221                
    222                 return st;
    223         }
    224        
    225         return 0;
    226 }
    227 
    228161static void sighandler( int signal )
    229162{
     
    281214        return( (double) time->tv_sec + (double) time->tv_usec / 1000000 );
    282215}
     216
     217
  • user.h

    r123cac7 r1014cab  
    3434       
    3535        char *away;
    36         char *status_msg; /* Non-IRC extension, but nice on IM. */
    3736       
    3837        char is_private;
Note: See TracChangeset for help on using the changeset viewer.