Changes in / [5f8ab6a9:3f81999]


Ignore:
Files:
40 edited

Legend:

Unmodified
Added
Removed
  • Makefile

    r5f8ab6a9 r3f81999  
    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
     
    126126endif
    127127
     128encode: crypting.c
     129        $(CC) crypting.c lib/md5.c $(CFLAGS) -o encode -DCRYPTING_MAIN $(CFLAGS) $(EFLAGS) $(LFLAGS)
     130
     131decode: encode
     132        cp encode decode
     133
    128134ctags:
    129135        ctags `find . -name "*.c"` `find . -name "*.h"`
  • account.c

    r5f8ab6a9 r3f81999  
    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
     
    2727#include "bitlbee.h"
    2828#include "account.h"
    29 #include "chat.h"
    3029
    3130account_t *account_add( irc_t *irc, struct prpl *prpl, char *user, char *pass )
     
    5554        s = set_add( &a->set, "auto_reconnect", "true", set_eval_bool, a );
    5655       
    57         s = set_add( &a->set, "nick_source", "handle", NULL, a );
    58        
    5956        s = set_add( &a->set, "password", NULL, set_eval_account, a );
    6057        s->flags |= ACC_SET_NOSAVE | SET_NULL_OK;
     
    7168                prpl->init( a );
    7269       
    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;
     70        return( a );
    8371}
    8472
     
    132120               
    133121                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                
    149122                return value;
    150123        }
     
    293266        p->max = 86400;
    294267       
    295         /* Format: /[0-9]+([*+][0-9]+(<[0-9+])?)?/ */
     268        /* Format: /[0-9]+([*+][0-9]+(<[0-9+]))/ */
    296269        while( *value && isdigit( *value ) )
    297270                p->start = p->start * 10 + *value++ - '0';
  • account.h

    r5f8ab6a9 r3f81999  
    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

    r5f8ab6a9 r3f81999  
    109109                chdir( "/" );
    110110               
    111                 if( getenv( "_BITLBEE_RESTART_STATE" ) == NULL )
    112                         for( i = 0; i < 3; i ++ )
    113                                 if( close( i ) == 0 )
    114                                 {
    115                                         /* Keep something bogus on those fd's just in case. */
    116                                         open( "/dev/null", O_WRONLY );
    117                                 }
     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 );
    118116        }
    119117#endif
  • bitlbee.conf

    r5f8ab6a9 r3f81999  
    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. ;-)
     
    127128## Proxy = socks5://socksproxy.localnet.com
    128129
    129 ## Protocols offered by bitlbee
    130 ##
    131 ## As recompiling may be quite unpractical for some people, this option
    132 ## allows to remove the support of protocol, even if compiled in. If
    133 ## nothing is given, there are no restrictions.
    134 ##
    135 ## Protocols = jabber yahoo
    136 
    137130
    138131[defaults]
  • bitlbee.h

    r5f8ab6a9 r3f81999  
    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() */
     
    3836
    3937#define PACKAGE "BitlBee"
    40 #define BITLBEE_VERSION "1.2.5"
     38#define BITLBEE_VERSION "1.2.4"
    4139#define VERSION BITLBEE_VERSION
    4240
     
    134132#include "account.h"
    135133#include "nick.h"
     134#include "chat.h"
    136135#include "conf.h"
    137136#include "log.h"
  • chat.c

    r5f8ab6a9 r3f81999  
    2525
    2626#include "bitlbee.h"
    27 #include "chat.h"
    2827
    2928struct chat *chat_add( irc_t *irc, account_t *acc, char *handle, char *channel )
  • chat.h

    r5f8ab6a9 r3f81999  
    2424*/
    2525
    26 #ifndef _CHAT_H
    27 #define _CHAT_H
    28 
    2926struct chat
    3027{
     
    4845
    4946int chat_join( irc_t *irc, struct chat *c, const char *password );
    50 
    51 #endif
  • conf.c

    r5f8ab6a9 r3f81999  
    6464        conf->ping_timeout = 300;
    6565        conf->user = NULL;
    66         conf->protocols = NULL;
    6766        proxytype = 0;
    6867       
     
    129128                {
    130129                        printf( "Usage: bitlbee [-D/-F [-i <interface>] [-p <port>] [-n] [-v]] [-I]\n"
    131                                 "               [-c <file>] [-d <dir>] [-x] [-h]\n"
     130                                "               [-c <file>] [-d <dir>] [-h]\n"
    132131                                "\n"
    133132                                "An IRC-to-other-chat-networks gateway\n"
     
    145144                                "  -c  Load alternative configuration file\n"
    146145                                "  -d  Specify alternative user configuration directory\n"
    147                                 "  -x  Command-line interface to password encryption/hashing\n"
    148146                                "  -h  Show this help page.\n" );
    149147                        return NULL;
     
    314312                                conf->user = g_strdup( ini->value );
    315313                        }
    316                         else if( g_strcasecmp( ini->key, "protocols" ) == 0 )
    317                         {
    318                                 g_strfreev( conf->protocols );
    319                                 conf->protocols = g_strsplit_set( ini->value, " \t,;", -1 );
    320                         }
    321314                        else
    322315                        {
  • conf.h

    r5f8ab6a9 r3f81999  
    5151        int ping_timeout;
    5252        char *user;
    53         char **protocols;
    5453} conf_t;
    5554
  • configure

    r5f8ab6a9 r3f81999  
    158158
    159159echo CFLAGS=$CFLAGS >> Makefile.settings
    160 echo CFLAGS+=-I`pwd` -iquote`pwd`/lib -iquote`pwd`/protocols -I. >> Makefile.settings
     160echo CFLAGS+=-I`pwd` -I`pwd`/lib -I`pwd`/protocols -I. >> Makefile.settings
    161161
    162162echo CFLAGS+=-DHAVE_CONFIG_H >> Makefile.settings
     
    269269detect_ldap()
    270270{
    271         TMPFILE=$(mktemp)
     271        TMPFILE=`mktemp`
    272272        if $CC -o $TMPFILE -shared -lldap 2>/dev/null >/dev/null; then
    273273                cat<<EOF>>Makefile.settings
     
    282282                ret=0
    283283        fi
    284 }
    285 
    286 RESOLV_TESTCODE='
    287 #include <arpa/nameser.h>
    288 #include <resolv.h>
    289 
    290 int main()
    291 {
    292         ns_initparse( NULL, 0, NULL );
    293         ns_parserr( NULL, ns_s_an, 0, NULL );
    294 }
    295 '
    296 
    297 detect_resolv_dynamic()
    298 {
    299         echo "$RESOLV_TESTCODE" | $CC -o /dev/null -x c - -lresolv >/dev/null 2>/dev/null
    300         if [ "$?" = "0" ]; then
    301                 echo 'EFLAGS+=-lresolv' >> Makefile.settings
    302                 return 0
    303         fi
    304 
    305         return 1
    306 }
    307 
    308 detect_resolv_static()
    309 {
    310         for i in $systemlibdirs; do
    311                 if [ -f $i/libresolv.a ]; then
    312                         echo "$RESOLV_TESTCODE" | $CC -o /dev/null -x c - -Wl,$i/libresolv.a >/dev/null 2>/dev/null
    313                         if [ "$?" = "0" ]; then
    314                                 echo 'EFLAGS+='$i'/libresolv.a' >> Makefile.settings
    315                                 return 0
    316                         fi
    317                 fi
    318         done
    319 
    320         return 1
    321284}
    322285
     
    362325       
    363326        ## Yes, you, at the console! How can you authenticate if you don't have any SSL!?
    364         if [ "$msn" = "1" -o "$yahoo" = "1" ]; then
     327        if [ "$msn" = "1" ]; then
    365328                echo
    366                 echo 'WARNING: The MSN and Yahoo! modules will not work without SSL. Disabling.'
     329                echo 'Real SSL support is necessary for MSN authentication, will build without'
     330                echo 'MSN protocol support.'
    367331                msn=0
    368                 yahoo=0
    369332        fi
    370333       
     
    388351echo 'SSL_CLIENT=ssl_'$ssl'.o' >> Makefile.settings
    389352
    390 if detect_resolv_dynamic || detect_resolv_static; then
    391         echo '#define HAVE_RESOLV_A' >> config.h
    392 fi
     353for i in $systemlibdirs; do
     354        if [ -f $i/libresolv.a ]; then
     355                echo '#define HAVE_RESOLV_A' >> config.h
     356                echo 'EFLAGS+='$i'/libresolv.a' >> Makefile.settings
     357                break
     358        fi
     359done
    393360
    394361STORAGES="text xml"
     
    468435fi
    469436
    470 if [ ! -e doc/user-guide/help.txt ] && ! type xmlto > /dev/null 2> /dev/null; then
    471         echo
    472         echo 'WARNING: Building from an unreleased source tree without prebuilt helpfile.'
    473         echo 'Install xmlto if you want online help to work.'
    474 fi
    475 
    476437echo
    477438if [ -z "$BITLBEE_VERSION" -a -d .bzr ] && type bzr > /dev/null 2> /dev/null; then
     
    559520;;
    560521Darwin )
    561         echo 'STRIP=\# skip strip' >> Makefile.settings
    562522;;
    563523IRIX )
  • crypting.c

    r5f8ab6a9 r3f81999  
    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
  • doc/CHANGES

    r5f8ab6a9 r3f81999  
    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

    r5f8ab6a9 r3f81999  
    585585        </bitlbee-setting>
    586586
    587         <bitlbee-setting name="away" type="string" scope="both">
    588                 <description>
    589                         <para>
    590                                 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.
    591                         </para>
    592 
    593                         <para>
    594                                 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.
    595                         </para>
    596 
    597                         <para>
    598                                 Any per-account away setting will override globally set away states. To un-set the setting, use <emphasis>set -del away</emphasis>.
    599                         </para>
    600                 </description>
    601         </bitlbee-setting>
    602 
    603587        <bitlbee-setting name="away_devoice" type="boolean" scope="global">
    604588                <default>true</default>
     
    834818        </bitlbee-setting>
    835819
    836         <bitlbee-setting name="nick_source" type="string" scope="account">
    837                 <default>handle</default>
    838                 <possible-values>handle, full_name, first_name</possible-values>
    839 
    840                 <description>
    841                         <para>
    842                                 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.
    843                         </para>
    844 
    845                         <para>
    846                                 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.
    847                         </para>
    848                 </description>
    849         </bitlbee-setting>
    850 
    851         <bitlbee-setting name="ops" type="string" scope="global">
    852                 <default>both</default>
    853                 <possible-values>both, root, user, none</possible-values>
    854 
    855                 <description>
    856                         <para>
    857                                 Some people prefer themself and root to have operator status in &amp;bitlbee, other people don't. You can change these states using this setting.
    858                         </para>
    859 
    860                         <para>
    861                                 The value "both" means both user and root get ops. "root" means, well, just root. "user" means just the user. "none" means nobody will get operator status.
    862                         </para>
    863                 </description>
    864         </bitlbee-setting>
    865 
    866820        <bitlbee-setting name="password" type="string" scope="both">
    867821                <description>
     
    942896
    943897        <bitlbee-setting name="resource_select" type="string" scope="account">
    944                 <default>activity</default>
     898                <default>priority</default>
    945899                <possible-values>priority, activity</possible-values>
    946900
     
    1000954                        <para>
    1001955                                Currently only available for Jabber connections. Set this to true if the server accepts SSL connections.
    1002                         </para>
    1003                 </description>
    1004         </bitlbee-setting>
    1005 
    1006         <bitlbee-setting name="status" type="string" scope="both">
    1007                 <description>
    1008                         <para>
    1009                                 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.
    1010                         </para>
    1011 
    1012                         <para>
    1013                                 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).
    1014                         </para>
    1015 
    1016                         <para>
    1017                                 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>.
    1018956                        </para>
    1019957                </description>
  • doc/user-guide/misc.xml

    r5f8ab6a9 r3f81999  
    7777
    7878<para>
    79 Some protocols (like Jabber) also support named groupchats. BitlBee now supports these too. You can use the <emphasis>chat add</emphasis> command to join them. See <emphasis>help chat add</emphasis> for more information.
     79Some protocols (like Jabber) also support named groupchats. BitlBee now supports these too. You can use the <emphasis>chat add</emphasis> command to join them. See <emphasis>help chat_add</emphasis> for more information.
    8080</para>
    8181
     
    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

    r5f8ab6a9 r3f81999  
    8181}
    8282
    83 static char *set_eval_away_status( set_t *set, char *value )
    84 {
    85         irc_t *irc = set->data;
    86         account_t *a;
    87        
    88         g_free( set->value );
    89         set->value = g_strdup( value );
    90        
    91         for( a = irc->accounts; a; a = a->next )
    92         {
    93                 struct im_connection *ic = a->ic;
    94                
    95                 if( ic && ic->flags & OPT_LOGGED_IN )
    96                         imc_away_send_update( ic );
    97         }
    98        
    99         return value;
    100 }
    101 
    10283irc_t *irc_new( int fd )
    10384{
     
    166147
    167148       
    168         s = set_add( &irc->set, "away", NULL,  set_eval_away_status, irc );
    169         s->flags |= SET_NULL_OK;
    170149        s = set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc );
    171         s = set_add( &irc->set, "auto_reconnect", "true", set_eval_bool, irc );
     150        s = set_add( &irc->set, "auto_reconnect", "false", set_eval_bool, irc );
    172151        s = set_add( &irc->set, "auto_reconnect_delay", "5*3<900", set_eval_account_reconnect_delay, irc );
    173152        s = set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc );
  • irc_commands.c

    r5f8ab6a9 r3f81999  
    2727#include "bitlbee.h"
    2828#include "ipc.h"
    29 #include "chat.h"
    3029
    3130static void irc_cmd_pass( irc_t *irc, char **cmd )
     
    448447        user_t *u = user_find( irc, irc->nick );
    449448        char *away = cmd[1];
     449        account_t *a;
    450450       
    451451        if( !u ) return;
     
    474474        }
    475475       
    476         set_setstr( &irc->set, "away", u->away );
     476        for( a = irc->accounts; a; a = a->next )
     477        {
     478                struct im_connection *ic = a->ic;
     479               
     480                if( ic && ic->flags & OPT_LOGGED_IN )
     481                        imc_set_away( ic, u->away );
     482        }
    477483}
    478484
     
    497503                else if( u->away )
    498504                        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 );
    501505               
    502506                irc_reply( irc, 318, "%s :End of /WHOIS list", nick );
  • lib/misc.c

    r5f8ab6a9 r3f81999  
    3434#include "nogaim.h"
    3535#include "base64.h"
    36 #include "md5.h"
    3736#include <stdio.h>
    3837#include <stdlib.h>
     
    4746#endif
    4847
    49 #include "md5.h"
    5048#include "ssl_client.h"
    5149
     
    534532
    535533/* Word wrapping. Yes, I know this isn't UTF-8 clean. I'm willing to take the risk. */
    536 char *word_wrap( const char *msg, int line_len )
     534char *word_wrap( char *msg, int line_len )
    537535{
    538536        GString *ret = g_string_sized_new( strlen( msg ) + 16 );
  • lib/misc.h

    r5f8ab6a9 r3f81999  
    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

    r5f8ab6a9 r3f81999  
    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

    r5f8ab6a9 r3f81999  
    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

    r5f8ab6a9 r3f81999  
    6767        s->flags |= ACC_SET_OFFLINE_ONLY;
    6868       
    69         s = set_add( &acc->set, "resource_select", "activity", NULL, acc );
     69        s = set_add( &acc->set, "resource_select", "priority", NULL, acc );
    7070       
    7171        s = set_add( &acc->set, "server", NULL, set_eval_account, acc );
     
    8080        s = set_add( &acc->set, "xmlconsole", "false", set_eval_bool, acc );
    8181        s->flags |= ACC_SET_OFFLINE_ONLY;
    82        
    83         acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE;
    8482}
    8583
     
    366364        while( bud )
    367365        {
    368                 imcb_log( ic, "Buddy %s (%d) information:", bud->full_jid, bud->priority );
    369                 if( bud->away_state )
    370                         imcb_log( ic, "Away state: %s", bud->away_state->full_name );
    371                 imcb_log( ic, "Status message: %s", bud->away_message ? : "(none)" );
    372                
     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)" );
    373370                bud = bud->next;
    374371        }
     
    380377{
    381378        struct jabber_data *jd = ic->proto_data;
    382        
    383         /* state_txt == NULL -> Not away.
    384            Unknown state -> fall back to the first defined away state. */
    385         jd->away_state = state_txt ? jabber_away_state_by_name( state_txt )
    386                          ? : jabber_away_state_list : NULL;
    387        
     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. */
    388384        g_free( jd->away_message );
    389385        jd->away_message = ( message && *message ) ? g_strdup( message ) : NULL;
  • protocols/jabber/jabber.h

    r5f8ab6a9 r3f81999  
    2727#include <glib.h>
    2828
     29#include "xmltree.h"
    2930#include "bitlbee.h"
    30 #include "md5.h"
    31 #include "xmltree.h"
    3231
    3332extern GSList *jabber_connections;
     
    4039        JFLAG_STREAM_RESTART = 4,       /* Set when we want to restart the stream (after
    4140                                           SASL or TLS). */
    42         JFLAG_WANT_SESSION = 8,         /* Set if the server wants a <session/> tag
     41        JFLAG_WAIT_SESSION = 8,         /* Set if we sent a <session> tag and need a reply
    4342                                           before we continue. */
    44         JFLAG_WANT_BIND = 16,           /* ... for <bind> tag. */
     43        JFLAG_WAIT_BIND = 16,           /* ... for <bind> tag. */
    4544        JFLAG_WANT_TYPING = 32,         /* Set if we ever sent a typing notification, this
    4645                                           activates all XEP-85 related code. */
    4746        JFLAG_XMLCONSOLE = 64,          /* If the user added an xmlconsole buddy. */
    48         JFLAG_STARTTLS_DONE = 128,      /* If a plaintext session was converted to TLS. */
    4947} jabber_flags_t;
    5048
     
    8583        /* After changing one of these two (or the priority setting), call
    8684           presence_send_update() to inform the server about the changes. */
    87         const struct jabber_away_state *away_state;
     85        struct jabber_away_state *away_state;
    8886        char *away_message;
    8987       
  • protocols/jabber/jabber_util.c

    r5f8ab6a9 r3f81999  
    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 ++ )
  • protocols/jabber/presence.c

    r5f8ab6a9 r3f81999  
    190190                int is_away = 0;
    191191
    192                 if( send_presence->away_state &&
    193                     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 ) )
    194194                        is_away = OPT_AWAY;
    195195
    196196                imcb_buddy_status( ic, send_presence->bare_jid, OPT_LOGGED_IN | is_away,
    197                                    is_away ? send_presence->away_state->full_name : NULL,
     197                                   ( is_away && send_presence->away_state ) ?
     198                                   send_presence->away_state->full_name : NULL,
    198199                                   send_presence->away_message );
    199200        }
     
    208209        struct jabber_data *jd = ic->proto_data;
    209210        struct xt_node *node, *cap;
     211        char *show = jd->away_state->code;
     212        char *status = jd->away_message;
    210213        struct groupchat *c;
    211214        int st;
     
    213216        node = jabber_make_packet( "presence", NULL, NULL, NULL );
    214217        xt_add_child( node, xt_new_node( "priority", set_getstr( &ic->acc->set, "priority" ), NULL ) );
    215         if( jd->away_state )
    216                 xt_add_child( node, xt_new_node( "show", jd->away_state->code, NULL ) );
    217         if( jd->away_message )
    218                 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 ) );
    219222       
    220223        /* This makes the packet slightly bigger, but clients interested in
  • protocols/msn/msn.c

    r5f8ab6a9 r3f81999  
    2626#include "nogaim.h"
    2727#include "msn.h"
    28 
    29 int msn_chat_id;
    30 GSList *msn_connections;
    31 GSList *msn_switchboards;
    3228
    3329static char *msn_set_display_name( set_t *set, char *value );
     
    143139       
    144140        if( l == NULL )
    145                 for( i = 0; *msn_away_state_list[i].code; i ++ )
    146                         if( *msn_away_state_list[i].name )
    147                                 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 );
    148143       
    149144        return l;
     
    154149        char buf[1024];
    155150        struct msn_data *md = ic->proto_data;
    156        
    157         if( state )
    158                 md->away_state = msn_away_state_by_name( state ) ? :
    159                                  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" );
    160155        else
    161                 md->away_state = msn_away_state_list;
    162        
    163         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 );
    164162        msn_write( ic, buf, strlen( buf ) );
    165163}
  • protocols/msn/msn.h

    r5f8ab6a9 r3f81999  
    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 */
  • protocols/msn/msn_util.c

    r5f8ab6a9 r3f81999  
    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}
  • protocols/msn/ns.c

    r5f8ab6a9 r3f81999  
    229229                        }
    230230                }
    231                 else if( num_parts >= 7 && strcmp( cmd[2], "OK" ) == 0 )
     231                else if( num_parts == 7 && strcmp( cmd[2], "OK" ) == 0 )
    232232                {
    233233                        set_t *s;
    234234                       
    235                         if( num_parts == 7 )
    236                         {
    237                                 http_decode( cmd[4] );
    238                                
    239                                 strncpy( ic->displayname, cmd[4], sizeof( ic->displayname ) );
    240                                 ic->displayname[sizeof(ic->displayname)-1] = 0;
    241                                
    242                                 if( ( s = set_find( &ic->acc->set, "display_name" ) ) )
    243                                 {
    244                                         g_free( s->value );
    245                                         s->value = g_strdup( cmd[4] );
    246                                 }
    247                         }
    248                         else
    249                         {
    250                                 imcb_log( ic, "Warning: Friendly name in server response was corrupted" );
     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] );
    251244                        }
    252245                       
     
    413406                {
    414407                        /* 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 );
     408                        st = msn_away_state_list;
     409                }
     410               
     411                imcb_buddy_status( ic, cmd[3], OPT_LOGGED_IN |
     412                                   ( st->number ? OPT_AWAY : 0 ), st->name, NULL );
    421413        }
    422414        else if( strcmp( cmd[0], "FLN" ) == 0 )
     
    443435                {
    444436                        /* 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 );
     437                        st = msn_away_state_list;
     438                }
     439               
     440                imcb_buddy_status( ic, cmd[2], OPT_LOGGED_IN |
     441                                   ( st->number ? OPT_AWAY : 0 ), st->name, NULL );
    451442        }
    452443        else if( strcmp( cmd[0], "RNG" ) == 0 )
     
    658649                                }
    659650                               
    660                                 g_free( arg1 );
    661                                 g_free( mtype );
     651                                if( arg1 ) g_free( arg1 );
     652                                if( mtype ) g_free( mtype );
    662653                        }
    663654                        else if( g_strncasecmp( ct, "text/x-msmsgsprofile", 20 ) == 0 )
     
    667658                        else if( g_strncasecmp( ct, "text/x-msmsgsinitialemailnotification", 37 ) == 0 )
    668659                        {
    669                                 if( set_getbool( &ic->acc->set, "mail_notifications" ) )
     660                                char *inbox = msn_findheader( body, "Inbox-Unread:", blen );
     661                                char *folders = msn_findheader( body, "Folders-Unread:", blen );
     662                               
     663                                if( inbox && folders && set_getbool( &ic->acc->set, "mail_notifications" ) )
    670664                                {
    671                                         char *inbox = msn_findheader( body, "Inbox-Unread:", blen );
    672                                         char *folders = msn_findheader( body, "Folders-Unread:", blen );
    673 
    674                                         if( inbox && folders )
    675                                                 imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders );
    676                                        
    677                                         g_free( inbox );
    678                                         g_free( folders );
     665                                        imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders );
    679666                                }
    680667                        }
    681668                        else if( g_strncasecmp( ct, "text/x-msmsgsemailnotification", 30 ) == 0 )
    682669                        {
    683                                 if( set_getbool( &ic->acc->set, "mail_notifications" ) )
     670                                char *from = msn_findheader( body, "From-Addr:", blen );
     671                                char *fromname = msn_findheader( body, "From:", blen );
     672                               
     673                                if( from && fromname && set_getbool( &ic->acc->set, "mail_notifications" ) )
    684674                                {
    685                                         char *from = msn_findheader( body, "From-Addr:", blen );
    686                                         char *fromname = msn_findheader( body, "From:", blen );
    687                                        
    688                                         if( from && fromname )
    689                                                 imcb_log( ic, "Received an e-mail message from %s <%s>.", fromname, from );
    690 
    691                                         g_free( from );
    692                                         g_free( fromname );
     675                                        imcb_log( ic, "Received an e-mail message from %s <%s>.", fromname, from );
    693676                                }
    694677                        }
  • protocols/msn/tables.c

    r5f8ab6a9 r3f81999  
    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

    r5f8ab6a9 r3f81999  
    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
     
    3333
    3434#define BITLBEE_CORE
     35#include "nogaim.h"
    3536#include <ctype.h>
    36 
    37 #include "nogaim.h"
    38 #include "chat.h"
    3937
    4038static int remove_chat_buddy_silent( struct groupchat *b, const char *handle );
     
    9896void register_protocol (struct prpl *p)
    9997{
    100         int i;
    101         gboolean refused = global.conf->protocols != NULL;
    102  
    103         for (i = 0; global.conf->protocols && global.conf->protocols[i]; i++)
    104         {
    105                 if (g_strcasecmp(p->name, global.conf->protocols[i]) == 0)
    106                         refused = FALSE;
    107         }
    108 
    109         if (refused)
    110                 log_message(LOGLVL_WARNING, "Protocol %s disabled\n", p->name);
    111         else
    112                 protocols = g_list_append(protocols, p);
     98        protocols = g_list_append(protocols, p);
    11399}
    114100
     
    280266        ic->flags |= OPT_LOGGED_IN;
    281267       
    282         /* Necessary to send initial presence status, even if we're not away. */
    283         imc_away_send_update( ic );
     268        /* Also necessary when we're not away, at least for some of the
     269           protocols. */
     270        imc_set_away( ic, u->away );
    284271       
    285272        /* Apparently we're connected successfully, so reset the
     
    383370/* list.c */
    384371
    385 void imcb_add_buddy( struct im_connection *ic, const char *handle, const char *group )
     372void imcb_add_buddy( struct im_connection *ic, char *handle, char *group )
    386373{
    387374        user_t *u;
     
    457444}
    458445
    459 void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *realname )
     446void imcb_rename_buddy( struct im_connection *ic, char *handle, char *realname )
    460447{
    461448        user_t *u = user_findhandle( ic, handle );
    462         char *set;
    463449       
    464450        if( !u || !realname ) return;
     
    473459                        imcb_log( ic, "User `%s' changed name to `%s'", u->nick, u->realname );
    474460        }
    475        
    476         set = set_getstr( &ic->acc->set, "nick_source" );
    477         if( strcmp( set, "handle" ) != 0 )
    478         {
    479                 char *name = g_strdup( realname );
    480                
    481                 if( strcmp( set, "first_name" ) == 0 )
    482                 {
    483                         int i;
    484                         for( i = 0; name[i] && !isspace( name[i] ); i ++ ) {}
    485                         name[i] = '\0';
    486                 }
    487                
    488                 imcb_buddy_nick_hint( ic, handle, name );
    489                
    490                 g_free( name );
    491         }
    492 }
    493 
    494 void imcb_remove_buddy( struct im_connection *ic, const char *handle, char *group )
     461}
     462
     463void imcb_remove_buddy( struct im_connection *ic, char *handle, char *group )
    495464{
    496465        user_t *u;
     
    502471/* Mainly meant for ICQ (and now also for Jabber conferences) to allow IM
    503472   modules to suggest a nickname for a handle. */
    504 void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick )
     473void imcb_buddy_nick_hint( struct im_connection *ic, char *handle, char *nick )
    505474{
    506475        user_t *u = user_findhandle( ic, handle );
     
    647616        oo = u->online;
    648617       
    649         g_free( u->away );
    650         g_free( u->status_msg );
    651         u->away = u->status_msg = NULL;
     618        if( u->away )
     619        {
     620                g_free( u->away );
     621                u->away = NULL;
     622        }
    652623       
    653624        if( ( flags & OPT_LOGGED_IN ) && !u->online )
     
    687658                }
    688659        }
    689         else
    690         {
    691                 u->status_msg = g_strdup( message );
    692         }
     660        /* else waste_any_state_information_for_now(); */
    693661       
    694662        /* LISPy... */
     
    724692}
    725693
    726 void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at )
     694void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, uint32_t flags, time_t sent_at )
    727695{
    728696        irc_t *irc = ic->irc;
     
    865833}
    866834
    867 void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t flags, time_t sent_at )
     835void imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at )
    868836{
    869837        struct im_connection *ic = c->ic;
     
    937905/* buddy_chat.c */
    938906
    939 void imcb_chat_add_buddy( struct groupchat *b, const char *handle )
     907void imcb_chat_add_buddy( struct groupchat *b, char *handle )
    940908{
    941909        user_t *u = user_findhandle( b->ic, handle );
     
    972940
    973941/* This function is one BIG hack... :-( EREWRITE */
    974 void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char *reason )
     942void imcb_chat_remove_buddy( struct groupchat *b, char *handle, char *reason )
    975943{
    976944        user_t *u;
     
    10581026}
    10591027
    1060 static char *imc_away_state_find( GList *gcm, char *away, char **message );
    1061 
    1062 int imc_away_send_update( struct im_connection *ic )
    1063 {
    1064         char *away, *msg = NULL;
    1065        
    1066         away = set_getstr( &ic->acc->set, "away" ) ?
    1067              : set_getstr( &ic->irc->set, "away" );
    1068         if( away && *away )
    1069         {
    1070                 GList *m = ic->acc->prpl->away_states( ic );
    1071                 msg = ic->acc->flags & ACC_FLAG_AWAY_MESSAGE ? away : NULL;
    1072                 away = imc_away_state_find( m, away, &msg ) ? : m->data;
    1073         }
    1074         else if( ic->acc->flags & ACC_FLAG_STATUS_MESSAGE )
    1075         {
    1076                 away = NULL;
    1077                 msg = set_getstr( &ic->acc->set, "status" ) ?
    1078                     : set_getstr( &ic->irc->set, "status" );
    1079         }
    1080        
    1081         ic->acc->prpl->set_away( ic, away, msg );
    1082        
    1083         return 1;
     1028static char *imc_away_alias_find( GList *gcm, char *away );
     1029
     1030int imc_set_away( struct im_connection *ic, char *away )
     1031{
     1032        GList *m, *ms;
     1033        char *s;
     1034       
     1035        if( !away ) away = "";
     1036        ms = m = ic->acc->prpl->away_states( ic );
     1037       
     1038        while( m )
     1039        {
     1040                if( *away )
     1041                {
     1042                        if( g_strncasecmp( m->data, away, strlen( m->data ) ) == 0 )
     1043                                break;
     1044                }
     1045                else
     1046                {
     1047                        if( g_strcasecmp( m->data, "Available" ) == 0 )
     1048                                break;
     1049                        if( g_strcasecmp( m->data, "Online" ) == 0 )
     1050                                break;
     1051                }
     1052                m = m->next;
     1053        }
     1054       
     1055        if( m )
     1056        {
     1057                ic->acc->prpl->set_away( ic, m->data, *away ? away : NULL );
     1058        }
     1059        else
     1060        {
     1061                s = imc_away_alias_find( ms, away );
     1062                if( s )
     1063                {
     1064                        ic->acc->prpl->set_away( ic, s, away );
     1065                        if( set_getbool( &ic->irc->set, "debug" ) )
     1066                                imcb_log( ic, "Setting away state to %s", s );
     1067                }
     1068                else
     1069                        ic->acc->prpl->set_away( ic, GAIM_AWAY_CUSTOM, away );
     1070        }
     1071       
     1072        return( 1 );
    10841073}
    10851074
     
    10961085};
    10971086
    1098 static char *imc_away_state_find( GList *gcm, char *away, char **message )
     1087static char *imc_away_alias_find( GList *gcm, char *away )
    10991088{
    11001089        GList *m;
    11011090        int i, j;
    11021091       
    1103         for( m = gcm; m; m = m->next )
    1104                 if( g_strncasecmp( m->data, away, strlen( m->data ) ) == 0 )
    1105                 {
    1106                         /* At least the Yahoo! module works better if message
    1107                            contains no data unless it adds something to what
    1108                            we have in state already. */
    1109                         if( strlen( m->data ) == strlen( away ) )
    1110                                 *message = NULL;
    1111                        
    1112                         return m->data;
    1113                 }
    1114        
    11151092        for( i = 0; *imc_away_alias_list[i]; i ++ )
    11161093        {
    1117                 int keep_message;
    1118                
    11191094                for( j = 0; imc_away_alias_list[i][j]; j ++ )
    11201095                        if( g_strncasecmp( away, imc_away_alias_list[i][j], strlen( imc_away_alias_list[i][j] ) ) == 0 )
    1121                         {
    1122                                 keep_message = strlen( away ) != strlen( imc_away_alias_list[i][j] );
    11231096                                break;
    1124                         }
    11251097               
    11261098                if( !imc_away_alias_list[i][j] )        /* If we reach the end, this row */
     
    11301102                for( j = 0; imc_away_alias_list[i][j]; j ++ )
    11311103                {
    1132                         for( m = gcm; m; m = m->next )
     1104                        m = gcm;
     1105                        while( m )
     1106                        {
    11331107                                if( g_strcasecmp( imc_away_alias_list[i][j], m->data ) == 0 )
    1134                                 {
    1135                                         if( !keep_message )
    1136                                                 *message = NULL;
    1137                                        
    1138                                         return imc_away_alias_list[i][j];
    1139                                 }
    1140                 }
    1141                
    1142                 /* No need to look further, apparently this state doesn't
    1143                    have any good alias for this protocol. */
    1144                 break;
    1145         }
    1146        
    1147         return NULL;
     1108                                        return( imc_away_alias_list[i][j] );
     1109                                m = m->next;
     1110                        }
     1111                }
     1112        }
     1113       
     1114        return( NULL );
    11481115}
    11491116
  • protocols/nogaim.h

    r5f8ab6a9 r3f81999  
    3939#define _NOGAIM_H
    4040
    41 #include <stdint.h>
    42 
    4341#include "bitlbee.h"
    4442#include "account.h"
    4543#include "proxy.h"
    4644#include "query.h"
     45#include "md5.h"
    4746
    4847#define BUDDY_ALIAS_MAXLEN 388   /* because MSN names can be 387 characters */
    4948
    5049#define WEBSITE "http://www.bitlbee.org/"
     50#define GAIM_AWAY_CUSTOM "Custom"
    5151
    5252/* Sharing flags between all kinds of things. I just hope I won't hit any
     
    221221       
    222222        /* You can tell what away states your protocol supports, so that
    223          * BitlBee will try to map the IRC away reasons to them. If your
    224          * protocol doesn't have any, just return one generic "Away". */
     223         * BitlBee will try to map the IRC away reasons to them, or use
     224         * GAIM_AWAY_CUSTOM when calling skype_set_away(). */
    225225        GList *(* away_states)(struct im_connection *ic);
    226226       
     
    279279 * user, usually after a login, or if the user added a buddy and the IM
    280280 * server confirms that the add was successful. Don't forget to do this! */
    281 G_MODULE_EXPORT void imcb_add_buddy( struct im_connection *ic, const char *handle, const char *group );
    282 G_MODULE_EXPORT void imcb_remove_buddy( struct im_connection *ic, const char *handle, char *group );
     281G_MODULE_EXPORT void imcb_add_buddy( struct im_connection *ic, char *handle, char *group );
     282G_MODULE_EXPORT void imcb_remove_buddy( struct im_connection *ic, char *handle, char *group );
    283283G_MODULE_EXPORT struct buddy *imcb_find_buddy( struct im_connection *ic, char *handle );
    284 G_MODULE_EXPORT void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *realname );
    285 G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick );
     284G_MODULE_EXPORT void imcb_rename_buddy( struct im_connection *ic, char *handle, char *realname );
     285G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, char *handle, char *nick );
    286286
    287287/* Buddy activity */
     
    293293/* Not implemented yet! */ G_MODULE_EXPORT void imcb_buddy_times( struct im_connection *ic, const char *handle, time_t login, time_t idle );
    294294/* Call when a handle says something. 'flags' and 'sent_at may be just 0. */
    295 G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at );
     295G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, uint32_t flags, time_t sent_at );
    296296G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags );
    297297G_MODULE_EXPORT void imcb_clean_handle( struct im_connection *ic, char *handle );
     
    306306 *   user, too. */
    307307G_MODULE_EXPORT struct groupchat *imcb_chat_new( struct im_connection *ic, const char *handle );
    308 G_MODULE_EXPORT void imcb_chat_add_buddy( struct groupchat *b, const char *handle );
     308G_MODULE_EXPORT void imcb_chat_add_buddy( struct groupchat *b, char *handle );
    309309/* To remove a handle from a group chat. Reason can be NULL. */
    310 G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char *reason );
     310G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *b, char *handle, char *reason );
    311311/* To tell BitlBee 'who' said 'msg' in 'c'. 'flags' and 'sent_at' can be 0. */
    312 G_MODULE_EXPORT void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t flags, time_t sent_at );
     312G_MODULE_EXPORT void imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at );
    313313/* System messages specific to a groupchat, so they can be displayed in the right context. */
    314314G_MODULE_EXPORT void imcb_chat_log( struct groupchat *c, char *format, ... ) G_GNUC_PRINTF( 2, 3 );
     
    318318
    319319/* Actions, or whatever. */
    320 int imc_away_send_update( struct im_connection *ic );
     320int imc_set_away( struct im_connection *ic, char *away );
    321321int imc_buddy_msg( struct im_connection *ic, char *handle, char *msg, int flags );
    322322int imc_chat_msg( struct groupchat *c, char *msg, int flags );
  • protocols/oscar/oscar.c

    r5f8ab6a9 r3f81999  
    380380                s->flags |= ACC_SET_OFFLINE_ONLY;
    381381        }
    382        
    383         acc->flags |= ACC_FLAG_AWAY_MESSAGE;
    384382}
    385383
     
    19541952static void oscar_set_away_aim(struct im_connection *ic, struct oscar_data *od, const char *state, const char *message)
    19551953{
    1956         if (state == NULL)
    1957                 state = "";
    19581954
    19591955        if (!g_strcasecmp(state, _("Visible"))) {
     
    19631959                aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_INVISIBLE);
    19641960                return;
    1965         } else if (message == NULL) {
    1966                 message = state;
    1967         }
     1961        } /* else... */
    19681962
    19691963        if (od->rights.maxawaymsglen == 0)
     
    20082002        }
    20092003
    2010         if (state == NULL) {
     2004        if (!g_strcasecmp(state, "Online")) {
    20112005                aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL);
    20122006        } else if (!g_strcasecmp(state, "Away")) {
     
    20332027                aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_INVISIBLE);
    20342028                ic->away = g_strdup(msg);
    2035         } else {
     2029        } else if (!g_strcasecmp(state, GAIM_AWAY_CUSTOM)) {
    20362030                if (no_message) {
    20372031                        aim_setextstatus(od->sess, od->conn, AIM_ICQ_STATE_NORMAL);
     
    22822276{
    22832277        struct oscar_data *od = ic->proto_data;
    2284 
    2285         if (od->icq) {
    2286                 static GList *m = NULL;
    2287                 m = g_list_append(m, "Away");
    2288                 m = g_list_append(m, "Do Not Disturb");
    2289                 m = g_list_append(m, "Not Available");
    2290                 m = g_list_append(m, "Occupied");
    2291                 m = g_list_append(m, "Free For Chat");
    2292                 m = g_list_append(m, "Invisible");
    2293                 return m;
    2294         } else {
    2295                 static GList *m = NULL;
    2296                 m = g_list_append(m, "Away");
    2297                 return m;
    2298         }
     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;
    22992292}
    23002293
  • protocols/yahoo/libyahoo2.c

    r5f8ab6a9 r3f81999  
    857857}
    858858
     859static YList * bud_str2list(char *rawlist)
     860{
     861        YList * l = NULL;
     862
     863        char **lines;
     864        char **split;
     865        char **buddies;
     866        char **tmp, **bud;
     867
     868        lines = y_strsplit(rawlist, "\n", -1);
     869        for (tmp = lines; *tmp; tmp++) {
     870                struct yahoo_buddy *newbud;
     871
     872                split = y_strsplit(*tmp, ":", 2);
     873                if (!split)
     874                        continue;
     875                if (!split[0] || !split[1]) {
     876                        y_strfreev(split);
     877                        continue;
     878                }
     879                buddies = y_strsplit(split[1], ",", -1);
     880
     881                for (bud = buddies; bud && *bud; bud++) {
     882                        newbud = y_new0(struct yahoo_buddy, 1);
     883                        newbud->id = strdup(*bud);
     884                        newbud->group = strdup(split[0]);
     885
     886                        if(y_list_find_custom(l, newbud, is_same_bud)) {
     887                                FREE(newbud->id);
     888                                FREE(newbud->group);
     889                                FREE(newbud);
     890                                continue;
     891                        }
     892
     893                        newbud->real_name = NULL;
     894
     895                        l = y_list_append(l, newbud);
     896
     897                        NOTICE(("Added buddy %s to group %s", newbud->id, newbud->group));
     898                }
     899
     900                y_strfreev(buddies);
     901                y_strfreev(split);
     902        }
     903        y_strfreev(lines);
     904
     905        return l;
     906}
     907
    859908static char * getcookie(char *rawcookie)
    860909{
     
    13131362}
    13141363
    1315 static void yahoo_process_status(struct yahoo_input_data *yid,
    1316         struct yahoo_packet *pkt)
     1364
     1365static void yahoo_process_status(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
    13171366{
    13181367        YList *l;
    13191368        struct yahoo_data *yd = yid->yd;
    13201369
    1321         struct yahoo_process_status_entry *u;
     1370        struct user
     1371        {
     1372                char *name;     /* 7    name */
     1373                int   state;    /* 10   state */
     1374                int   flags;    /* 13   flags, bit 0 = pager, bit 1 = chat, bit 2 = game */
     1375                int   mobile;   /* 60   mobile */
     1376                char *msg;      /* 19   custom status message */
     1377                int   away;     /* 47   away (or invisible)*/
     1378                int   buddy_session;    /* 11   state */
     1379                int   f17;      /* 17   in chat? then what about flags? */
     1380                int   idle;     /* 137  seconds idle */
     1381                int   f138;     /* 138  state */
     1382                char *f184;     /* 184  state */
     1383                int   f192;     /* 192  state */
     1384                int   f10001;   /* 10001        state */
     1385                int   f10002;   /* 10002        state */
     1386                int   f198;     /* 198  state */
     1387                char *f197;     /* 197  state */
     1388                char *f205;     /* 205  state */
     1389                int   f213;     /* 213  state */
     1390        } *u;
    13221391
    13231392        YList *users = 0;
    1324 
     1393       
    13251394        if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) {
    1326                 YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id,
    1327                         YAHOO_LOGIN_DUPL, NULL);
    1328                 return;
    1329         }
    1330 
    1331         /* Status updates may be spread accross multiple packets and not
    1332            even on buddy boundaries, so keeping some state is important.
    1333            So, continue where we left off, and only add a user entry to
    1334            the list once it's complete (301-315 End buddy). */
    1335         u = yd->half_user;
     1395                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_DUPL, NULL);
     1396                return;
     1397        }
    13361398
    13371399        for (l = pkt->hash; l; l = l->next) {
     
    13391401
    13401402                switch (pair->key) {
    1341                 case 300:       /* Begin buddy */
    1342                         if (!strcmp(pair->value, "315") && !u) {
    1343                                 u = yd->half_user = y_new0(struct yahoo_process_status_entry, 1);
     1403                case 0: /* we won't actually do anything with this */
     1404                        NOTICE(("key %d:%s", pair->key, pair->value));
     1405                        break;
     1406                case 1: /* we don't get the full buddy list here. */
     1407                        if (!yd->logged_in) {
     1408                                yd->logged_in = TRUE;
     1409                                if(yd->current_status < 0)
     1410                                        yd->current_status = yd->initial_status;
     1411                                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
    13441412                        }
    13451413                        break;
    1346                 case 301:       /* End buddy */
    1347                         if (!strcmp(pair->value, "315") && u) {
    1348                                 /* Sometimes user info comes in an odd format with no
    1349                                    "begin buddy" but *with* an "end buddy". Don't add
    1350                                    it twice. */
    1351                                 if (!y_list_find(users, u))
    1352                                         users = y_list_prepend(users, u);
    1353                                 u = yd->half_user = NULL;
    1354                         }
    1355                         break;
    1356                 case 0: /* we won't actually do anything with this */
     1414                case 8: /* how many online buddies we have */
    13571415                        NOTICE(("key %d:%s", pair->key, pair->value));
    13581416                        break;
    1359                 case 1: /* we don't get the full buddy list here. */
    1360                         if (!yd->logged_in) {
    1361                                 yd->logged_in = 1;
    1362                                 if (yd->current_status < 0)
    1363                                         yd->current_status = yd->initial_status;
    1364                                 YAHOO_CALLBACK(ext_yahoo_login_response) (yd->
    1365                                         client_id, YAHOO_LOGIN_OK, NULL);
    1366                         }
    1367                         break;
    1368                 case 8: /* how many online buddies we have */
    1369                         NOTICE(("key %d:%s", pair->key, pair->value));
    1370                         break;
    1371                 case 7: /* the current buddy */
    1372                         if (!u) {
    1373                                 /* This will only happen in case of a single level message */
    1374                                 u = y_new0(struct yahoo_process_status_entry, 1);
    1375                                 users = y_list_prepend(users, u);
    1376                         }
     1417                case 7: /* the current buddy */
     1418                        u = y_new0(struct user, 1);
    13771419                        u->name = pair->value;
    1378                         break;
    1379                 case 10:        /* state */
    1380                         u->state = strtol(pair->value, NULL, 10);
    1381                         break;
    1382                 case 19:        /* custom status message */
    1383                         u->msg = pair->value;
    1384                         break;
    1385                 case 47:        /* is it an away message or not. Not applicable for YMSG16 anymore */
    1386                         u->away = atoi(pair->value);
    1387                         break;
    1388                 case 137:       /* seconds idle */
    1389                         u->idle = atoi(pair->value);
    1390                         break;
    1391                 case 11:        /* this is the buddy's session id */
    1392                         u->buddy_session = atoi(pair->value);
    1393                         break;
    1394                 case 17:        /* in chat? */
    1395                         u->f17 = atoi(pair->value);
    1396                         break;
    1397                 case 13:        /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */
    1398                         u->flags = atoi(pair->value);
    1399                         break;
    1400                 case 60:        /* SMS -> 1 MOBILE USER */
     1420                        users = y_list_prepend(users, u);
     1421                        break;
     1422                case 10: /* state */
     1423                        ((struct user*)users->data)->state = strtol(pair->value, NULL, 10);
     1424                        break;
     1425                case 19: /* custom status message */
     1426                        ((struct user*)users->data)->msg = pair->value;
     1427                        break;
     1428                case 47: /* is it an away message or not */
     1429                        ((struct user*)users->data)->away = atoi(pair->value);
     1430                        break;
     1431                case 137: /* seconds idle */
     1432                        ((struct user*)users->data)->idle = atoi(pair->value);
     1433                        break;
     1434                case 11: /* this is the buddy's session id */
     1435                        ((struct user*)users->data)->buddy_session = atoi(pair->value);
     1436                        break;
     1437                case 17: /* in chat? */
     1438                        ((struct user*)users->data)->f17 = atoi(pair->value);
     1439                        break;
     1440                case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */
     1441                        ((struct user*)users->data)->flags = atoi(pair->value);
     1442                        break;
     1443                case 60: /* SMS -> 1 MOBILE USER */
    14011444                        /* sometimes going offline makes this 2, but invisible never sends it */
    1402                         u->mobile = atoi(pair->value);
     1445                        ((struct user*)users->data)->mobile = atoi(pair->value);
    14031446                        break;
    14041447                case 138:
    1405                         u->f138 = atoi(pair->value);
     1448                        ((struct user*)users->data)->f138 = atoi(pair->value);
    14061449                        break;
    14071450                case 184:
    1408                         u->f184 = pair->value;
     1451                        ((struct user*)users->data)->f184 = pair->value;
    14091452                        break;
    14101453                case 192:
    1411                         u->f192 = atoi(pair->value);
     1454                        ((struct user*)users->data)->f192 = atoi(pair->value);
    14121455                        break;
    14131456                case 10001:
    1414                         u->f10001 = atoi(pair->value);
     1457                        ((struct user*)users->data)->f10001 = atoi(pair->value);
    14151458                        break;
    14161459                case 10002:
    1417                         u->f10002 = atoi(pair->value);
     1460                        ((struct user*)users->data)->f10002 = atoi(pair->value);
    14181461                        break;
    14191462                case 198:
    1420                         u->f198 = atoi(pair->value);
     1463                        ((struct user*)users->data)->f198 = atoi(pair->value);
    14211464                        break;
    14221465                case 197:
    1423                         u->f197 = pair->value;
     1466                        ((struct user*)users->data)->f197 = pair->value;
    14241467                        break;
    14251468                case 205:
    1426                         u->f205 = pair->value;
     1469                        ((struct user*)users->data)->f205 = pair->value;
    14271470                        break;
    14281471                case 213:
    1429                         u->f213 = atoi(pair->value);
    1430                         break;
    1431                 case 16:        /* Custom error message */
    1432                         YAHOO_CALLBACK(ext_yahoo_error) (yd->client_id,
    1433                                 pair->value, 0, E_CUSTOM);
     1472                        ((struct user*)users->data)->f213 = atoi(pair->value);
     1473                        break;
     1474                case 16: /* Custom error message */
     1475                        YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, pair->value, 0, E_CUSTOM);
    14341476                        break;
    14351477                default:
    1436                         WARNING(("unknown status key %d:%s", pair->key,
    1437                                         pair->value));
    1438                         break;
    1439                 }
    1440         }
    1441 
     1478                        WARNING(("unknown status key %d:%s", pair->key, pair->value));
     1479                        break;
     1480                }
     1481        }
     1482       
    14421483        while (users) {
    14431484                YList *t = users;
    1444                 struct yahoo_process_status_entry *u = users->data;
     1485                struct user *u = users->data;
    14451486
    14461487                if (u->name != NULL) {
    1447                         if (pkt->service ==
    1448                                 YAHOO_SERVICE_LOGOFF
    1449                                 /*|| u->flags == 0 No flags for YMSG16 */ ) {
    1450                                 YAHOO_CALLBACK(ext_yahoo_status_changed) (yd->
    1451                                         client_id, u->name,
    1452                                         YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0);
     1488                        if (pkt->service == YAHOO_SERVICE_LOGOFF) { /* || u->flags == 0) { Not in YMSG16 */
     1489                                YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, u->name, YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0);
    14531490                        } else {
    14541491                                /* Key 47 always seems to be 1 for YMSG16 */
    1455                                 if (!u->state)
     1492                                if(!u->state)
    14561493                                        u->away = 0;
    14571494                                else
    14581495                                        u->away = 1;
    14591496
    1460                                 YAHOO_CALLBACK(ext_yahoo_status_changed) (yd->
    1461                                         client_id, u->name, u->state, u->msg,
    1462                                         u->away, u->idle, u->mobile);
     1497                                YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, u->name, u->state, u->msg, u->away, u->idle, u->mobile);
    14631498                        }
    14641499                }
     
    14701505}
    14711506
    1472 static void yahoo_process_buddy_list(struct yahoo_input_data *yid,
    1473         struct yahoo_packet *pkt)
     1507static void yahoo_process_buddy_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
    14741508{
    14751509        struct yahoo_data *yd = yid->yd;
     
    14831517                struct yahoo_pair *pair = l->data;
    14841518
    1485                 switch (pair->key) {
     1519                switch(pair->key) {
    14861520                case 300:
    14871521                case 301:
    14881522                case 302:
    1489                         break;  /* Separators. Our logic does not need them */
    14901523                case 303:
    1491                         if (318 == atoi(pair->value))
     1524                        if ( 315 == atoi(pair->value) )
    14921525                                last_packet = 1;
    14931526                        break;
    14941527                case 65:
     1528                        g_free(cur_group);
    14951529                        cur_group = strdup(pair->value);
    14961530                        break;
     
    14981532                        newbud = y_new0(struct yahoo_buddy, 1);
    14991533                        newbud->id = strdup(pair->value);
    1500                         if (cur_group)
     1534                        if(cur_group)
    15011535                                newbud->group = strdup(cur_group);
    1502                         else if (yd->buddies) {
    1503                                 struct yahoo_buddy *lastbud =
    1504                                         (struct yahoo_buddy *)y_list_nth(yd->
    1505                                         buddies,
    1506                                         y_list_length(yd->buddies) - 1)->data;
     1536                        else {
     1537                                struct yahoo_buddy *lastbud = (struct yahoo_buddy *)y_list_nth(
     1538                                                                yd->buddies, y_list_length(yd->buddies)-1)->data;
    15071539                                newbud->group = strdup(lastbud->group);
    1508                         } else
    1509                                 newbud->group = strdup("Buddies");
     1540                        }
    15101541
    15111542                        yd->buddies = y_list_append(yd->buddies, newbud);
     
    15141545                }
    15151546        }
     1547       
     1548        g_free(cur_group);
    15161549
    15171550        /* we could be getting multiple packets here */
    1518         if (pkt->hash && !last_packet)
    1519                 return;
    1520 
    1521         YAHOO_CALLBACK(ext_yahoo_got_buddies) (yd->client_id, yd->buddies);
    1522 
    1523         /* Logged in */
     1551        if (last_packet)
     1552                return;
     1553
     1554        YAHOO_CALLBACK(ext_yahoo_got_buddies)(yd->client_id, yd->buddies);
     1555
     1556        /*** We login at the very end of the packet communication */
    15241557        if (!yd->logged_in) {
    1525                 yd->logged_in = 1;
    1526                 if (yd->current_status < 0)
     1558                yd->logged_in = TRUE;
     1559                if(yd->current_status < 0)
    15271560                        yd->current_status = yd->initial_status;
    1528                 YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id,
    1529                         YAHOO_LOGIN_OK, NULL);
    1530 
    1531                 /*
    1532                 yahoo_set_away(yd->client_id, yd->initial_status, NULL,
    1533                         (yd->initial_status == YAHOO_STATUS_AVAILABLE) ? 0 : 1);
    1534 
    1535                 yahoo_get_yab(yd->client_id);
    1536                 */
    1537         }
    1538 
    1539 }
    1540 
    1541 static void yahoo_process_list(struct yahoo_input_data *yid,
    1542         struct yahoo_packet *pkt)
     1561                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
     1562        }
     1563}
     1564
     1565static void yahoo_process_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
    15431566{
    15441567        struct yahoo_data *yd = yid->yd;
    15451568        YList *l;
    15461569
    1547         /* we could be getting multiple packets here */
     1570        if (!yd->logged_in) {
     1571                yd->logged_in = TRUE;
     1572                if(yd->current_status < 0)
     1573                        yd->current_status = yd->initial_status;
     1574                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
     1575        }
     1576
    15481577        for (l = pkt->hash; l; l = l->next) {
    15491578                struct yahoo_pair *pair = l->data;
    15501579
    1551                 switch (pair->key) {
    1552                 case 89:        /* identities */
     1580                switch(pair->key) {
     1581                case 87: /* buddies */
     1582                        if(!yd->rawbuddylist)
     1583                                yd->rawbuddylist = strdup(pair->value);
     1584                        else {
     1585                                yd->rawbuddylist = y_string_append(yd->rawbuddylist, pair->value);
     1586                        }
     1587                        break;
     1588
     1589                case 88: /* ignore list */
     1590                        if(!yd->ignorelist)
     1591                                yd->ignorelist = strdup("Ignore:");
     1592                        yd->ignorelist = y_string_append(yd->ignorelist, pair->value);
     1593                        break;
     1594
     1595                case 89: /* identities */
    15531596                        {
    1554                                 char **identities =
    1555                                         y_strsplit(pair->value, ",", -1);
    1556                                 int i;
    1557                                 for (i = 0; identities[i]; i++)
    1558                                         yd->identities =
    1559                                                 y_list_append(yd->identities,
     1597                        char **identities = y_strsplit(pair->value, ",", -1);
     1598                        int i;
     1599                        for(i=0; identities[i]; i++)
     1600                                yd->identities = y_list_append(yd->identities,
    15601601                                                strdup(identities[i]));
    1561                                 y_strfreev(identities);
     1602                        y_strfreev(identities);
    15621603                        }
    1563                         YAHOO_CALLBACK(ext_yahoo_got_identities) (yd->client_id,
    1564                                 yd->identities);
    1565                         break;
    1566                 case 59:        /* cookies */
    1567                         if (pair->value[0] == 'Y') {
     1604                        YAHOO_CALLBACK(ext_yahoo_got_identities)(yd->client_id, yd->identities);
     1605                        break;
     1606                case 59: /* cookies */
     1607                        if(yd->ignorelist) {
     1608                                yd->ignore = bud_str2list(yd->ignorelist);
     1609                                FREE(yd->ignorelist);
     1610                                YAHOO_CALLBACK(ext_yahoo_got_ignore)(yd->client_id, yd->ignore);
     1611                        }
     1612                        if(yd->rawbuddylist) {
     1613                                yd->buddies = bud_str2list(yd->rawbuddylist);
     1614                                FREE(yd->rawbuddylist);
     1615                                YAHOO_CALLBACK(ext_yahoo_got_buddies)(yd->client_id, yd->buddies);
     1616                        }
     1617
     1618                        if(pair->value[0]=='Y') {
    15681619                                FREE(yd->cookie_y);
    15691620                                FREE(yd->login_cookie);
     
    15721623                                yd->login_cookie = getlcookie(yd->cookie_y);
    15731624
    1574                         } else if (pair->value[0] == 'T') {
     1625                        } else if(pair->value[0]=='T') {
    15751626                                FREE(yd->cookie_t);
    15761627                                yd->cookie_t = getcookie(pair->value);
    15771628
    1578                         } else if (pair->value[0] == 'C') {
     1629                        } else if(pair->value[0]=='C') {
    15791630                                FREE(yd->cookie_c);
    15801631                                yd->cookie_c = getcookie(pair->value);
    1581                         }
    1582 
    1583                         break;
    1584                 case 3: /* my id */
    1585                 case 90:        /* 1 */
    1586                 case 100:       /* 0 */
    1587                 case 101:       /* NULL */
    1588                 case 102:       /* NULL */
    1589                 case 93:        /* 86400/1440 */
    1590                         break;
    1591                 }
    1592         }
    1593 
    1594         if (yd->cookie_y && yd->cookie_t)       /* We don't get cookie_c anymore */
    1595                 YAHOO_CALLBACK(ext_yahoo_got_cookies) (yd->client_id);
     1632                        } 
     1633
     1634                        if(yd->cookie_y && yd->cookie_t)
     1635                                YAHOO_CALLBACK(ext_yahoo_got_cookies)(yd->client_id);
     1636
     1637                        break;
     1638                case 3: /* my id */
     1639                case 90: /* 1 */
     1640                case 100: /* 0 */
     1641                case 101: /* NULL */
     1642                case 102: /* NULL */
     1643                case 93: /* 86400/1440 */
     1644                        break;
     1645                }
     1646        }
    15961647}
    15971648
     
    23442395{
    23452396        struct yahoo_https_auth_data *had = req->data;
    2346         struct yahoo_input_data *yid;
    2347         struct yahoo_data *yd;
     2397        struct yahoo_input_data *yid = had->yid;
     2398        struct yahoo_data *yd = yid->yd;
    23482399        int st;
    2349        
    2350         if (y_list_find(inputs, had->yid) == NULL)
    2351                 return;
    2352        
    2353         yid = had->yid;
    2354         yd = yid->yd;
    23552400       
    23562401        if (req->status_code != 200) {
     
    23932438{
    23942439        struct yahoo_https_auth_data *had = req->data;
    2395         struct yahoo_input_data *yid;
    2396         struct yahoo_data *yd;
     2440        struct yahoo_input_data *yid = had->yid;
     2441        struct yahoo_data *yd = yid->yd;
    23972442        struct yahoo_packet *pack;
    2398         char *crumb = NULL;
     2443        char *crumb;
    23992444        int st;
    2400        
    2401         if (y_list_find(inputs, had->yid) == NULL)
    2402                 return;
    2403        
    2404         yid = had->yid;
    2405         yd = yid->yd;
    24062445       
    24072446        md5_byte_t result[16];
     
    40434082
    40444083        yd = yid->yd;
     4084
    40454085        old_status = yd->current_status;
    4046         yd->current_status = state;
     4086
     4087        if (msg && strncmp(msg,"Invisible",9)) {
     4088                yd->current_status = YAHOO_STATUS_CUSTOM;
     4089        } else {
     4090                yd->current_status = state;
     4091        }
    40474092
    40484093        /* Thank you libpurple :) */
     
    40594104        snprintf(s, sizeof(s), "%d", yd->current_status);
    40604105        yahoo_packet_hash(pkt, 10, s);
    4061         yahoo_packet_hash(pkt, 19, msg && state == YAHOO_STATUS_CUSTOM ? msg : "");
     4106         
     4107        if (yd->current_status == YAHOO_STATUS_CUSTOM) {
     4108                yahoo_packet_hash(pkt, 19, msg);
     4109        } else {
     4110                yahoo_packet_hash(pkt, 19, "");
     4111        }
     4112       
    40624113        yahoo_packet_hash(pkt, 47, (away == 2)? "2": (away) ?"1":"0");
     4114
    40634115        yahoo_send_packet(yid, pkt, 0);
    40644116        yahoo_packet_free(pkt);
  • protocols/yahoo/yahoo.c

    r5f8ab6a9 r3f81999  
    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

    r5f8ab6a9 r3f81999  
    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

    r5f8ab6a9 r3f81999  
    3030#include "help.h"
    3131#include "otr.h"
    32 #include "chat.h"
    3332
    3433#include <string.h>
     
    144143        storage_status_t status = storage_load( irc, cmd[1] );
    145144        char *account_on[] = { "account", "on", NULL };
    146        
    147         if( strchr( irc->umode, 'R' ) != NULL )
    148         {
    149                 irc_usermsg( irc, "You're already logged in." );
    150                 return;
    151         }
    152145       
    153146        switch (status) {
     
    919912                online = 1;
    920913        else
    921                 online = away = 1;
     914                online =  away = 1;
    922915       
    923916        if( strchr( irc->umode, 'b' ) != NULL )
     
    932925                if( online == 1 )
    933926                {
    934                         char st[256] = "Online";
    935                        
    936                         if( u->status_msg )
    937                                 g_snprintf( st, sizeof( st ) - 1, "Online (%s)", u->status_msg );
    938                        
    939927                        g_snprintf( s, sizeof( s ) - 1, "%s@%s %s(%s)", u->user, u->host, u->ic->acc->prpl->name, u->ic->acc->user );
    940                         irc_usermsg( irc, format, u->nick, s, st );
     928                        irc_usermsg( irc, format, u->nick, s, "Online" );
    941929                }
    942930               
     
    11311119                irc_usermsg( irc, "Unknown command: %s %s. Please use \x02help commands\x02 to get a list of available commands.", "chat", cmd[1] );
    11321120        }
     1121
     1122
     1123
     1124#if 0
     1125        account_t *a;
     1126        struct im_connection *ic;
     1127        char *chat, *channel, *nick = NULL, *password = NULL;
     1128        struct groupchat *c;
     1129       
     1130        if( !( a = account_get( irc, cmd[1] ) ) )
     1131        {
     1132                irc_usermsg( irc, "Invalid account" );
     1133                return;
     1134        }
     1135        else if( !( a->ic && ( a->ic->flags & OPT_LOGGED_IN ) ) )
     1136        {
     1137                irc_usermsg( irc, "That account is not on-line" );
     1138                return;
     1139        }
     1140        else if( a->prpl->chat_join == NULL )
     1141        {
     1142                irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
     1143                return;
     1144        }
     1145        ic = a->ic;
     1146       
     1147        chat = cmd[2];
     1148        if( cmd[3] )
     1149        {
     1150                if( strchr( CTYPES, cmd[3][0] ) == NULL )
     1151                        channel = g_strdup_printf( "&%s", cmd[3] );
     1152                else
     1153                        channel = g_strdup( cmd[3] );
     1154        }
     1155        else
     1156        {
     1157                char *s;
     1158               
     1159                channel = g_strdup_printf( "&%s", chat );
     1160                if( ( s = strchr( channel, '@' ) ) )
     1161                        *s = 0;
     1162        }
     1163        if( cmd[3] && cmd[4] )
     1164                nick = cmd[4];
     1165        else
     1166                nick = irc->nick;
     1167        if( cmd[3] && cmd[4] && cmd[5] )
     1168                password = cmd[5];
     1169       
     1170        if( !nick_ok( channel + 1 ) )
     1171        {
     1172                irc_usermsg( irc, "Invalid channel name: %s", channel );
     1173                g_free( channel );
     1174                return;
     1175        }
     1176        else if( g_strcasecmp( channel, irc->channel ) == 0 || irc_chat_by_channel( irc, channel ) )
     1177        {
     1178                irc_usermsg( irc, "Channel already exists: %s", channel );
     1179                g_free( channel );
     1180                return;
     1181        }
     1182       
     1183        if( ( c = a->prpl->chat_join( ic, chat, nick, password ) ) )
     1184        {
     1185                g_free( c->channel );
     1186                c->channel = channel;
     1187        }
     1188        else
     1189        {
     1190                irc_usermsg( irc, "Tried to join chat, not sure if this was successful" );
     1191                g_free( channel );
     1192        }
     1193#endif
    11331194}
    11341195
  • storage_xml.c

    r5f8ab6a9 r3f81999  
    2929#include "arc.h"
    3030#include "md5.h"
    31 #include "chat.h"
    3231
    3332#if GLIB_CHECK_VERSION(2,8,0)
  • unix.c

    r5f8ab6a9 r3f81999  
    2525
    2626#include "bitlbee.h"
    27 
    28 #include "arc.h"
    29 #include "base64.h"
    3027#include "commands.h"
    3128#include "crypting.h"
     
    3532#include "ipc.h"
    3633#include "lib/ssl_client.h"
    37 #include "md5.h"
    38 #include "misc.h"
    3934#include <signal.h>
    4035#include <unistd.h>
     
    4742static void sighandler( int signal );
    4843
    49 static int crypt_main( int argc, char *argv[] );
    50 
    5144int main( int argc, char *argv[] )
    5245{
     
    5447        char *old_cwd = NULL;
    5548        struct sigaction sig, old;
    56        
    57         if( argc > 1 && strcmp( argv[1], "-x" ) == 0 )
    58                 return crypt_main( argc, argv );
    5949       
    6050        log_init();
     
    178168}
    179169
    180 static int crypt_main( int argc, char *argv[] )
    181 {
    182         int pass_len;
    183         unsigned char *pass_cr, *pass_cl;
    184        
    185         if( argc < 4 || ( strcmp( argv[2], "hash" ) != 0 &&
    186                           strcmp( argv[2], "unhash" ) != 0 && argc < 5 ) )
    187         {
    188                 printf( "Supported:\n"
    189                         "  %s -x enc <key> <cleartext password>\n"
    190                         "  %s -x dec <key> <encrypted password>\n"
    191                         "  %s -x hash <cleartext password>\n"
    192                         "  %s -x unhash <hashed password>\n"
    193                         "  %s -x chkhash <hashed password> <cleartext password>\n",
    194                         argv[0], argv[0], argv[0], argv[0], argv[0] );
    195         }
    196         else if( strcmp( argv[2], "enc" ) == 0 )
    197         {
    198                 pass_len = arc_encode( argv[4], strlen( argv[4] ), (unsigned char**) &pass_cr, argv[3], 12 );
    199                 printf( "%s\n", base64_encode( pass_cr, pass_len ) );
    200         }
    201         else if( strcmp( argv[2], "dec" ) == 0 )
    202         {
    203                 pass_len = base64_decode( argv[4], (unsigned char**) &pass_cr );
    204                 arc_decode( pass_cr, pass_len, (char**) &pass_cl, argv[3] );
    205                 printf( "%s\n", pass_cl );
    206         }
    207         else if( strcmp( argv[2], "hash" ) == 0 )
    208         {
    209                 md5_byte_t pass_md5[21];
    210                 md5_state_t md5_state;
    211                
    212                 random_bytes( pass_md5 + 16, 5 );
    213                 md5_init( &md5_state );
    214                 md5_append( &md5_state, (md5_byte_t*) argv[3], strlen( argv[3] ) );
    215                 md5_append( &md5_state, pass_md5 + 16, 5 ); /* Add the salt. */
    216                 md5_finish( &md5_state, pass_md5 );
    217                
    218                 printf( "%s\n", base64_encode( pass_md5, 21 ) );
    219         }
    220         else if( strcmp( argv[2], "unhash" ) == 0 )
    221         {
    222                 printf( "Hash %s submitted to a massive Beowulf cluster of\n"
    223                         "overclocked 486s. Expect your answer next year somewhere around this time. :-)\n", argv[3] );
    224         }
    225         else if( strcmp( argv[2], "chkhash" ) == 0 )
    226         {
    227                 char *hash = strncmp( argv[3], "md5:", 4 ) == 0 ? argv[3] + 4 : argv[3];
    228                 int st = md5_verify_password( argv[4], hash );
    229                
    230                 printf( "Hash %s given password.\n", st == 0 ? "matches" : "does not match" );
    231                
    232                 return st;
    233         }
    234        
    235         return 0;
    236 }
    237 
    238170static void sighandler( int signal )
    239171{
  • user.h

    r5f8ab6a9 r3f81999  
    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.