Changes in / [3330468:7c5affca]


Ignore:
Files:
27 edited

Legend:

Unmodified
Added
Removed
  • Makefile

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

    r3330468 r7c5affca  
    5454       
    5555        s = set_add( &a->set, "auto_reconnect", "true", set_eval_bool, a );
    56        
    57         s = set_add( &a->set, "nick_source", "handle", NULL, a );
    5856       
    5957        s = set_add( &a->set, "password", NULL, set_eval_account, a );
  • bitlbee.c

    r3330468 r7c5affca  
    109109                chdir( "/" );
    110110               
    111                 i = close( 0 ) == 0;
    112                 i += close( 1 ) == 0;
    113                 i += close( 2 ) == 0;
    114                 /* To avoid that something important ends up on one of those
    115                    fd's, open them for something bogus. Otherwise RESTART
    116                    may cause troubles. */
    117                 while( i > 0 )
    118                 {
    119                         open( "/dev/null", O_WRONLY );
    120                         i --;
    121                 }
     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 );
    122116        }
    123117#endif
  • bitlbee.conf

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

    r3330468 r7c5affca  
    2727#define _BITLBEE_H
    2828
    29 #ifndef _GNU_SOURCE
    3029#define _GNU_SOURCE /* Stupid GNU :-P */
    31 #endif
    3230
    3331/* Depend on Windows 2000 for now since we need getaddrinfo() */
     
    3533
    3634#define PACKAGE "BitlBee"
    37 #define BITLBEE_VERSION "1.2.5"
     35#define BITLBEE_VERSION "1.2.4"
    3836#define VERSION BITLBEE_VERSION
    3937
  • conf.c

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

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

    r3330468 r7c5affca  
    159159
    160160echo CFLAGS=$CFLAGS >> Makefile.settings
    161 echo CFLAGS+=-I`pwd` -iquote`pwd`/lib -iquote`pwd`/protocols -I. >> Makefile.settings
     161echo CFLAGS+=-I`pwd` -I`pwd`/lib -I`pwd`/protocols -I. >> Makefile.settings
    162162
    163163echo CFLAGS+=-DHAVE_CONFIG_H >> Makefile.settings
     
    447447fi
    448448
    449 if [ ! -e doc/user-guide/help.txt ] && ! type xmlto > /dev/null 2> /dev/null; then
    450         echo
    451         echo 'WARNING: Building from an unreleased source tree without prebuilt helpfile.'
    452         echo 'Install xmlto if you want online help to work.'
    453 fi
    454 
    455449echo
    456450if [ -z "$BITLBEE_VERSION" -a -d .bzr ] && type bzr > /dev/null 2> /dev/null; then
     
    562556;;
    563557Darwin )
    564         echo 'STRIP=\# skip strip' >> Makefile.settings
    565558;;
    566559IRIX )
  • crypting.c

    r3330468 r7c5affca  
    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

    r3330468 r7c5affca  
    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).
    13 - Added a post-1.2 equivalent of encode/decode to quickly encrypt/decrypt
    14   passwords in a way that BitlBee can read them.
    15 - Allow using the full name for generating nicknames, instead of just the
    16   handle. This is especially useful when using the Facebook XMPP server.
    17 - Auto reconnect is now enabled by default since all protocols can properly
    18   detect cases where auto reconnect should be avoided (i.e. concurrent
    19   logins).
    205
    216Version 1.2.4:
  • doc/user-guide/commands.xml

    r3330468 r7c5affca  
    608608        </bitlbee-setting>
    609609
    610         <bitlbee-setting name="nick_source" type="string" scope="account">
    611                 <default>handle</default>
    612                 <possible-values>handle, full_name, first_name</possible-values>
    613 
    614                 <description>
    615                         <para>
    616                                 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.
    617                         </para>
    618 
    619                         <para>
    620                                 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.
    621                         </para>
    622                 </description>
    623         </bitlbee-setting>
    624 
    625610        <bitlbee-setting name="ops" type="string" scope="global">
    626611                <default>both</default>
  • irc.c

    r3330468 r7c5affca  
    166166        s = set_add( &irc->set, "away_devoice", "true",  set_eval_away_devoice, irc );
    167167        s = set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc );
    168         s = set_add( &irc->set, "auto_reconnect", "true", set_eval_bool, irc );
     168        s = set_add( &irc->set, "auto_reconnect", "false", set_eval_bool, irc );
    169169        s = set_add( &irc->set, "auto_reconnect_delay", "5*3<900", set_eval_account_reconnect_delay, irc );
    170170        s = set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc );
  • lib/misc.c

    r3330468 r7c5affca  
    3434#include "nogaim.h"
    3535#include "base64.h"
    36 #include "md5.h"
    3736#include <stdio.h>
    3837#include <stdlib.h>
     
    524523
    525524/* Word wrapping. Yes, I know this isn't UTF-8 clean. I'm willing to take the risk. */
    526 char *word_wrap( const char *msg, int line_len )
     525char *word_wrap( char *msg, int line_len )
    527526{
    528527        GString *ret = g_string_sized_new( strlen( msg ) + 16 );
  • lib/misc.h

    r3330468 r7c5affca  
    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

    r3330468 r7c5affca  
    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;
     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        }
    381401       
    382402        /* This flag is already set if we authenticated via SASL, so now
    383403           we can resume the session in the new stream, if we don't have
    384404           to bind/initialize the session. */
    385         if( jd->flags & JFLAG_AUTHENTICATED && ( jd->flags & ( JFLAG_WANT_BIND | JFLAG_WANT_SESSION ) ) == 0 )
     405        if( jd->flags & JFLAG_AUTHENTICATED && ( jd->flags & ( JFLAG_WAIT_BIND | JFLAG_WAIT_SESSION ) ) == 0 )
    386406        {
    387407                if( !jabber_get_roster( ic ) )
    388408                        return XT_ABORT;
    389         }
    390         else if( jd->flags & JFLAG_AUTHENTICATED )
    391         {
    392                 return jabber_pkt_bind_sess( ic, NULL, NULL );
    393409        }
    394410       
     
    425441        imcb_log( ic, "Converting stream to TLS" );
    426442       
    427         jd->flags |= JFLAG_STARTTLS_DONE;
    428443        jd->ssl = ssl_starttls( jd->fd, jabber_connected_ssl, ic );
    429444       
     
    516531                jd->r_inpa = b_input_add( jd->fd, B_EV_IO_READ, jabber_read_callback, ic );
    517532       
    518         greet = g_strdup_printf( "%s<stream:stream to=\"%s\" xmlns=\"jabber:client\" "
    519                                   "xmlns:stream=\"http://etherx.jabber.org/streams\" version=\"1.0\">",
    520                                   ( jd->flags & JFLAG_STARTTLS_DONE ) ? "" : "<?xml version='1.0' ?>",
    521                                   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 );
    522536       
    523537        st = jabber_write( ic, greet, strlen( greet ) );
  • protocols/jabber/iq.c

    r3330468 r7c5affca  
    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" );
     
    308308                        imcb_log( ic, "Server changed session resource string to `%s'", s + 1 );
    309309               
    310                 jd->flags &= ~JFLAG_WANT_BIND;
    311         }
    312         else if( node && ( c = xt_find_node( node->children, "session" ) ) )
    313         {
    314                 jd->flags &= ~JFLAG_WANT_SESSION;
    315         }
    316        
    317         if( jd->flags & JFLAG_WANT_BIND )
    318         {
    319                 reply = xt_new_node( "bind", NULL, xt_new_node( "resource", set_getstr( &ic->acc->set, "resource" ), NULL ) );
    320                 xt_add_attr( reply, "xmlns", XMLNS_BIND );
    321         }
    322         else if( jd->flags & JFLAG_WANT_SESSION )
    323         {
    324                 reply = xt_new_node( "session", NULL, NULL );
    325                 xt_add_attr( reply, "xmlns", XMLNS_SESSION );
    326         }
    327        
    328         if( reply != NULL )
    329         {
    330                 reply = jabber_make_packet( "iq", "set", NULL, reply );
    331                 jabber_cache_add( ic, reply, jabber_pkt_bind_sess );
    332                
    333                 if( !jabber_write_packet( ic, reply ) )
    334                         return XT_ABORT;
    335         }
    336         else if( ( jd->flags & ( JFLAG_WANT_BIND | JFLAG_WANT_SESSION ) ) == 0 )
     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 )
    337318        {
    338319                if( !jabber_get_roster( ic ) )
  • protocols/jabber/jabber.h

    r3330468 r7c5affca  
    4040        JFLAG_STREAM_RESTART = 4,       /* Set when we want to restart the stream (after
    4141                                           SASL or TLS). */
    42         JFLAG_WANT_SESSION = 8,         /* Set if the server wants a <session/> tag
     42        JFLAG_WAIT_SESSION = 8,         /* Set if we sent a <session> tag and need a reply
    4343                                           before we continue. */
    44         JFLAG_WANT_BIND = 16,           /* ... for <bind> tag. */
     44        JFLAG_WAIT_BIND = 16,           /* ... for <bind> tag. */
    4545        JFLAG_WANT_TYPING = 32,         /* Set if we ever sent a typing notification, this
    4646                                           activates all XEP-85 related code. */
    4747        JFLAG_XMLCONSOLE = 64,          /* If the user added an xmlconsole buddy. */
    48         JFLAG_STARTTLS_DONE = 128,      /* If a plaintext session was converted to TLS. */
    4948} jabber_flags_t;
    5049
  • protocols/msn/msn.c

    r3330468 r7c5affca  
    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 );
  • protocols/msn/msn.h

    r3330468 r7c5affca  
    135135#define STATUS_SB_CHAT_SPARE    8       /* Same, but also for groupchats (not used yet). */
    136136
    137 extern int msn_chat_id;
     137int msn_chat_id;
    138138extern const struct msn_away_state msn_away_state_list[];
    139139extern const struct msn_status_code msn_status_code_list[];
     
    144144   connection), the callback should check whether it's still listed here
    145145   before doing *anything* else. */
    146 extern GSList *msn_connections;
    147 extern GSList *msn_switchboards;
     146GSList *msn_connections;
     147GSList *msn_switchboards;
    148148
    149149/* ns.c */
  • protocols/msn/msn_util.c

    r3330468 r7c5affca  
    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;
  • protocols/msn/ns.c

    r3330468 r7c5affca  
    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                       
  • protocols/nogaim.c

    r3330468 r7c5affca  
    9898void register_protocol (struct prpl *p)
    9999{
    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);
     100        protocols = g_list_append(protocols, p);
    113101}
    114102
     
    391379/* list.c */
    392380
    393 void imcb_add_buddy( struct im_connection *ic, const char *handle, const char *group )
     381void imcb_add_buddy( struct im_connection *ic, char *handle, char *group )
    394382{
    395383        user_t *u;
     
    465453}
    466454
    467 void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *realname )
     455void imcb_rename_buddy( struct im_connection *ic, char *handle, char *realname )
    468456{
    469457        user_t *u = user_findhandle( ic, handle );
    470         char *set;
    471458       
    472459        if( !u || !realname ) return;
     
    481468                        imcb_log( ic, "User `%s' changed name to `%s'", u->nick, u->realname );
    482469        }
    483        
    484         set = set_getstr( &ic->acc->set, "nick_source" );
    485         if( strcmp( set, "handle" ) != 0 )
    486         {
    487                 char *name = g_strdup( realname );
    488                
    489                 if( strcmp( set, "first_name" ) == 0 )
    490                 {
    491                         int i;
    492                         for( i = 0; name[i] && !isspace( name[i] ); i ++ ) {}
    493                         name[i] = '\0';
    494                 }
    495                
    496                 imcb_buddy_nick_hint( ic, handle, name );
    497                
    498                 g_free( name );
    499         }
    500 }
    501 
    502 void imcb_remove_buddy( struct im_connection *ic, const char *handle, char *group )
     470}
     471
     472void imcb_remove_buddy( struct im_connection *ic, char *handle, char *group )
    503473{
    504474        user_t *u;
     
    510480/* Mainly meant for ICQ (and now also for Jabber conferences) to allow IM
    511481   modules to suggest a nickname for a handle. */
    512 void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick )
     482void imcb_buddy_nick_hint( struct im_connection *ic, char *handle, char *nick )
    513483{
    514484        user_t *u = user_findhandle( ic, handle );
     
    722692}
    723693
    724 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 )
    725695{
    726696        irc_t *irc = ic->irc;
     
    855825}
    856826
    857 void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t flags, time_t sent_at )
     827void imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at )
    858828{
    859829        struct im_connection *ic = c->ic;
     
    927897/* buddy_chat.c */
    928898
    929 void imcb_chat_add_buddy( struct groupchat *b, const char *handle )
     899void imcb_chat_add_buddy( struct groupchat *b, char *handle )
    930900{
    931901        user_t *u = user_findhandle( b->ic, handle );
     
    962932
    963933/* This function is one BIG hack... :-( EREWRITE */
    964 void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char *reason )
     934void imcb_chat_remove_buddy( struct groupchat *b, char *handle, char *reason )
    965935{
    966936        user_t *u;
     
    11111081int imc_away_send_update( struct im_connection *ic )
    11121082{
    1113         char *away, *msg = NULL;
     1083        char *away, *msg;
    11141084       
    11151085        away = set_getstr( &ic->acc->set, "away" ) ?
  • protocols/nogaim.h

    r3330468 r7c5affca  
    276276 * user, usually after a login, or if the user added a buddy and the IM
    277277 * server confirms that the add was successful. Don't forget to do this! */
    278 G_MODULE_EXPORT void imcb_add_buddy( struct im_connection *ic, const char *handle, const char *group );
    279 G_MODULE_EXPORT void imcb_remove_buddy( struct im_connection *ic, const char *handle, char *group );
     278G_MODULE_EXPORT void imcb_add_buddy( struct im_connection *ic, char *handle, char *group );
     279G_MODULE_EXPORT void imcb_remove_buddy( struct im_connection *ic, char *handle, char *group );
    280280G_MODULE_EXPORT struct buddy *imcb_find_buddy( struct im_connection *ic, char *handle );
    281 G_MODULE_EXPORT void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *realname );
    282 G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick );
     281G_MODULE_EXPORT void imcb_rename_buddy( struct im_connection *ic, char *handle, char *realname );
     282G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, char *handle, char *nick );
    283283
    284284/* Buddy activity */
     
    290290/* Not implemented yet! */ G_MODULE_EXPORT void imcb_buddy_times( struct im_connection *ic, const char *handle, time_t login, time_t idle );
    291291/* Call when a handle says something. 'flags' and 'sent_at may be just 0. */
    292 G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at );
     292G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, uint32_t flags, time_t sent_at );
    293293G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags );
    294294G_MODULE_EXPORT void imcb_clean_handle( struct im_connection *ic, char *handle );
     
    303303 *   user, too. */
    304304G_MODULE_EXPORT struct groupchat *imcb_chat_new( struct im_connection *ic, const char *handle );
    305 G_MODULE_EXPORT void imcb_chat_add_buddy( struct groupchat *b, const char *handle );
     305G_MODULE_EXPORT void imcb_chat_add_buddy( struct groupchat *b, char *handle );
    306306/* To remove a handle from a group chat. Reason can be NULL. */
    307 G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char *reason );
     307G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *b, char *handle, char *reason );
    308308/* To tell BitlBee 'who' said 'msg' in 'c'. 'flags' and 'sent_at' can be 0. */
    309 G_MODULE_EXPORT void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t flags, time_t sent_at );
     309G_MODULE_EXPORT void imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at );
    310310/* System messages specific to a groupchat, so they can be displayed in the right context. */
    311311G_MODULE_EXPORT void imcb_chat_log( struct groupchat *c, char *format, ... ) G_GNUC_PRINTF( 2, 3 );
  • protocols/yahoo/libyahoo2.c

    r3330468 r7c5affca  
    855855}
    856856
     857static YList * bud_str2list(char *rawlist)
     858{
     859        YList * l = NULL;
     860
     861        char **lines;
     862        char **split;
     863        char **buddies;
     864        char **tmp, **bud;
     865
     866        lines = y_strsplit(rawlist, "\n", -1);
     867        for (tmp = lines; *tmp; tmp++) {
     868                struct yahoo_buddy *newbud;
     869
     870                split = y_strsplit(*tmp, ":", 2);
     871                if (!split)
     872                        continue;
     873                if (!split[0] || !split[1]) {
     874                        y_strfreev(split);
     875                        continue;
     876                }
     877                buddies = y_strsplit(split[1], ",", -1);
     878
     879                for (bud = buddies; bud && *bud; bud++) {
     880                        newbud = y_new0(struct yahoo_buddy, 1);
     881                        newbud->id = strdup(*bud);
     882                        newbud->group = strdup(split[0]);
     883
     884                        if(y_list_find_custom(l, newbud, is_same_bud)) {
     885                                FREE(newbud->id);
     886                                FREE(newbud->group);
     887                                FREE(newbud);
     888                                continue;
     889                        }
     890
     891                        newbud->real_name = NULL;
     892
     893                        l = y_list_append(l, newbud);
     894
     895                        NOTICE(("Added buddy %s to group %s", newbud->id, newbud->group));
     896                }
     897
     898                y_strfreev(buddies);
     899                y_strfreev(split);
     900        }
     901        y_strfreev(lines);
     902
     903        return l;
     904}
     905
    857906static char * getcookie(char *rawcookie)
    858907{
     
    13111360}
    13121361
    1313 static void yahoo_process_status(struct yahoo_input_data *yid,
    1314         struct yahoo_packet *pkt)
     1362
     1363static void yahoo_process_status(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
    13151364{
    13161365        YList *l;
    13171366        struct yahoo_data *yd = yid->yd;
    13181367
    1319         struct yahoo_process_status_entry *u;
     1368        struct user
     1369        {
     1370                char *name;     /* 7    name */
     1371                int   state;    /* 10   state */
     1372                int   flags;    /* 13   flags, bit 0 = pager, bit 1 = chat, bit 2 = game */
     1373                int   mobile;   /* 60   mobile */
     1374                char *msg;      /* 19   custom status message */
     1375                int   away;     /* 47   away (or invisible)*/
     1376                int   buddy_session;    /* 11   state */
     1377                int   f17;      /* 17   in chat? then what about flags? */
     1378                int   idle;     /* 137  seconds idle */
     1379                int   f138;     /* 138  state */
     1380                char *f184;     /* 184  state */
     1381                int   f192;     /* 192  state */
     1382                int   f10001;   /* 10001        state */
     1383                int   f10002;   /* 10002        state */
     1384                int   f198;     /* 198  state */
     1385                char *f197;     /* 197  state */
     1386                char *f205;     /* 205  state */
     1387                int   f213;     /* 213  state */
     1388        } *u;
    13201389
    13211390        YList *users = 0;
    1322 
     1391       
    13231392        if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) {
    1324                 YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id,
    1325                         YAHOO_LOGIN_DUPL, NULL);
    1326                 return;
    1327         }
    1328 
    1329         /* Status updates may be spread accross multiple packets and not
    1330            even on buddy boundaries, so keeping some state is important.
    1331            So, continue where we left off, and only add a user entry to
    1332            the list once it's complete (301-315 End buddy). */
    1333         u = yd->half_user;
     1393                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_DUPL, NULL);
     1394                return;
     1395        }
    13341396
    13351397        for (l = pkt->hash; l; l = l->next) {
     
    13371399
    13381400                switch (pair->key) {
    1339                 case 300:       /* Begin buddy */
    1340                         if (!strcmp(pair->value, "315") && !u) {
    1341                                 u = yd->half_user = y_new0(struct yahoo_process_status_entry, 1);
     1401                case 0: /* we won't actually do anything with this */
     1402                        NOTICE(("key %d:%s", pair->key, pair->value));
     1403                        break;
     1404                case 1: /* we don't get the full buddy list here. */
     1405                        if (!yd->logged_in) {
     1406                                yd->logged_in = TRUE;
     1407                                if(yd->current_status < 0)
     1408                                        yd->current_status = yd->initial_status;
     1409                                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
    13421410                        }
    13431411                        break;
    1344                 case 301:       /* End buddy */
    1345                         if (!strcmp(pair->value, "315") && u) {
    1346                                 users = y_list_prepend(users, u);
    1347                                 u = yd->half_user = NULL;
    1348                         }
    1349                         break;
    1350                 case 0: /* we won't actually do anything with this */
     1412                case 8: /* how many online buddies we have */
    13511413                        NOTICE(("key %d:%s", pair->key, pair->value));
    13521414                        break;
    1353                 case 1: /* we don't get the full buddy list here. */
    1354                         if (!yd->logged_in) {
    1355                                 yd->logged_in = 1;
    1356                                 if (yd->current_status < 0)
    1357                                         yd->current_status = yd->initial_status;
    1358                                 YAHOO_CALLBACK(ext_yahoo_login_response) (yd->
    1359                                         client_id, YAHOO_LOGIN_OK, NULL);
    1360                         }
    1361                         break;
    1362                 case 8: /* how many online buddies we have */
    1363                         NOTICE(("key %d:%s", pair->key, pair->value));
    1364                         break;
    1365                 case 7: /* the current buddy */
    1366                         if (!u) {
    1367                                 /* This will only happen in case of a single level message */
    1368                                 u = y_new0(struct yahoo_process_status_entry, 1);
    1369                                 users = y_list_prepend(users, u);
    1370                         }
     1415                case 7: /* the current buddy */
     1416                        u = y_new0(struct user, 1);
    13711417                        u->name = pair->value;
    1372                         break;
    1373                 case 10:        /* state */
    1374                         u->state = strtol(pair->value, NULL, 10);
    1375                         break;
    1376                 case 19:        /* custom status message */
    1377                         u->msg = pair->value;
    1378                         break;
    1379                 case 47:        /* is it an away message or not. Not applicable for YMSG16 anymore */
    1380                         u->away = atoi(pair->value);
    1381                         break;
    1382                 case 137:       /* seconds idle */
    1383                         u->idle = atoi(pair->value);
    1384                         break;
    1385                 case 11:        /* this is the buddy's session id */
    1386                         u->buddy_session = atoi(pair->value);
    1387                         break;
    1388                 case 17:        /* in chat? */
    1389                         u->f17 = atoi(pair->value);
    1390                         break;
    1391                 case 13:        /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */
    1392                         u->flags = atoi(pair->value);
    1393                         break;
    1394                 case 60:        /* SMS -> 1 MOBILE USER */
     1418                        users = y_list_prepend(users, u);
     1419                        break;
     1420                case 10: /* state */
     1421                        ((struct user*)users->data)->state = strtol(pair->value, NULL, 10);
     1422                        break;
     1423                case 19: /* custom status message */
     1424                        ((struct user*)users->data)->msg = pair->value;
     1425                        break;
     1426                case 47: /* is it an away message or not */
     1427                        ((struct user*)users->data)->away = atoi(pair->value);
     1428                        break;
     1429                case 137: /* seconds idle */
     1430                        ((struct user*)users->data)->idle = atoi(pair->value);
     1431                        break;
     1432                case 11: /* this is the buddy's session id */
     1433                        ((struct user*)users->data)->buddy_session = atoi(pair->value);
     1434                        break;
     1435                case 17: /* in chat? */
     1436                        ((struct user*)users->data)->f17 = atoi(pair->value);
     1437                        break;
     1438                case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */
     1439                        ((struct user*)users->data)->flags = atoi(pair->value);
     1440                        break;
     1441                case 60: /* SMS -> 1 MOBILE USER */
    13951442                        /* sometimes going offline makes this 2, but invisible never sends it */
    1396                         u->mobile = atoi(pair->value);
     1443                        ((struct user*)users->data)->mobile = atoi(pair->value);
    13971444                        break;
    13981445                case 138:
    1399                         u->f138 = atoi(pair->value);
     1446                        ((struct user*)users->data)->f138 = atoi(pair->value);
    14001447                        break;
    14011448                case 184:
    1402                         u->f184 = pair->value;
     1449                        ((struct user*)users->data)->f184 = pair->value;
    14031450                        break;
    14041451                case 192:
    1405                         u->f192 = atoi(pair->value);
     1452                        ((struct user*)users->data)->f192 = atoi(pair->value);
    14061453                        break;
    14071454                case 10001:
    1408                         u->f10001 = atoi(pair->value);
     1455                        ((struct user*)users->data)->f10001 = atoi(pair->value);
    14091456                        break;
    14101457                case 10002:
    1411                         u->f10002 = atoi(pair->value);
     1458                        ((struct user*)users->data)->f10002 = atoi(pair->value);
    14121459                        break;
    14131460                case 198:
    1414                         u->f198 = atoi(pair->value);
     1461                        ((struct user*)users->data)->f198 = atoi(pair->value);
    14151462                        break;
    14161463                case 197:
    1417                         u->f197 = pair->value;
     1464                        ((struct user*)users->data)->f197 = pair->value;
    14181465                        break;
    14191466                case 205:
    1420                         u->f205 = pair->value;
     1467                        ((struct user*)users->data)->f205 = pair->value;
    14211468                        break;
    14221469                case 213:
    1423                         u->f213 = atoi(pair->value);
    1424                         break;
    1425                 case 16:        /* Custom error message */
    1426                         YAHOO_CALLBACK(ext_yahoo_error) (yd->client_id,
    1427                                 pair->value, 0, E_CUSTOM);
     1470                        ((struct user*)users->data)->f213 = atoi(pair->value);
     1471                        break;
     1472                case 16: /* Custom error message */
     1473                        YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, pair->value, 0, E_CUSTOM);
    14281474                        break;
    14291475                default:
    1430                         WARNING(("unknown status key %d:%s", pair->key,
    1431                                         pair->value));
    1432                         break;
    1433                 }
    1434         }
    1435 
     1476                        WARNING(("unknown status key %d:%s", pair->key, pair->value));
     1477                        break;
     1478                }
     1479        }
     1480       
    14361481        while (users) {
    14371482                YList *t = users;
    1438                 struct yahoo_process_status_entry *u = users->data;
     1483                struct user *u = users->data;
    14391484
    14401485                if (u->name != NULL) {
    1441                         if (pkt->service ==
    1442                                 YAHOO_SERVICE_LOGOFF
    1443                                 /*|| u->flags == 0 No flags for YMSG16 */ ) {
    1444                                 YAHOO_CALLBACK(ext_yahoo_status_changed) (yd->
    1445                                         client_id, u->name,
    1446                                         YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0);
     1486                        if (pkt->service == YAHOO_SERVICE_LOGOFF) { /* || u->flags == 0) { Not in YMSG16 */
     1487                                YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, u->name, YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0);
    14471488                        } else {
    14481489                                /* Key 47 always seems to be 1 for YMSG16 */
    1449                                 if (!u->state)
     1490                                if(!u->state)
    14501491                                        u->away = 0;
    14511492                                else
    14521493                                        u->away = 1;
    14531494
    1454                                 YAHOO_CALLBACK(ext_yahoo_status_changed) (yd->
    1455                                         client_id, u->name, u->state, u->msg,
    1456                                         u->away, u->idle, u->mobile);
     1495                                YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, u->name, u->state, u->msg, u->away, u->idle, u->mobile);
    14571496                        }
    14581497                }
     
    14641503}
    14651504
    1466 static void yahoo_process_buddy_list(struct yahoo_input_data *yid,
    1467         struct yahoo_packet *pkt)
     1505static void yahoo_process_buddy_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
    14681506{
    14691507        struct yahoo_data *yd = yid->yd;
     
    14771515                struct yahoo_pair *pair = l->data;
    14781516
    1479                 switch (pair->key) {
     1517                switch(pair->key) {
    14801518                case 300:
    14811519                case 301:
    14821520                case 302:
    1483                         break;  /* Separators. Our logic does not need them */
    14841521                case 303:
    1485                         if (318 == atoi(pair->value))
     1522                        if ( 315 == atoi(pair->value) )
    14861523                                last_packet = 1;
    14871524                        break;
    14881525                case 65:
     1526                        g_free(cur_group);
    14891527                        cur_group = strdup(pair->value);
    14901528                        break;
     
    14921530                        newbud = y_new0(struct yahoo_buddy, 1);
    14931531                        newbud->id = strdup(pair->value);
    1494                         if (cur_group)
     1532                        if (cur_group) {
    14951533                                newbud->group = strdup(cur_group);
    1496                         else if (yd->buddies) {
    1497                                 struct yahoo_buddy *lastbud =
    1498                                         (struct yahoo_buddy *)y_list_nth(yd->
    1499                                         buddies,
    1500                                         y_list_length(yd->buddies) - 1)->data;
    1501                                 newbud->group = strdup(lastbud->group);
    1502                         } else
    1503                                 newbud->group = strdup("Buddies");
     1534                        } else {
     1535                                YList *last;
     1536                                struct yahoo_buddy *lastbud;
     1537                               
     1538                                for (last = yd->buddies; last && last->next; last = last->next);
     1539                                if (last) {
     1540                                        lastbud = last->data;
     1541                                        newbud->group = strdup(lastbud->group);
     1542                                } else {
     1543                                        newbud->group = strdup("Buddies");
     1544                                }
     1545                        }
    15041546
    15051547                        yd->buddies = y_list_append(yd->buddies, newbud);
     
    15081550                }
    15091551        }
     1552       
     1553        g_free(cur_group);
    15101554
    15111555        /* we could be getting multiple packets here */
    1512         if (pkt->hash && !last_packet)
    1513                 return;
    1514 
    1515         YAHOO_CALLBACK(ext_yahoo_got_buddies) (yd->client_id, yd->buddies);
    1516 
    1517         /* Logged in */
     1556        if (last_packet)
     1557                return;
     1558
     1559        YAHOO_CALLBACK(ext_yahoo_got_buddies)(yd->client_id, yd->buddies);
     1560
     1561        /*** We login at the very end of the packet communication */
    15181562        if (!yd->logged_in) {
    1519                 yd->logged_in = 1;
    1520                 if (yd->current_status < 0)
     1563                yd->logged_in = TRUE;
     1564                if(yd->current_status < 0)
    15211565                        yd->current_status = yd->initial_status;
    1522                 YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id,
    1523                         YAHOO_LOGIN_OK, NULL);
    1524 
    1525                 /*
    1526                 yahoo_set_away(yd->client_id, yd->initial_status, NULL,
    1527                         (yd->initial_status == YAHOO_STATUS_AVAILABLE) ? 0 : 1);
    1528 
    1529                 yahoo_get_yab(yd->client_id);
    1530                 */
    1531         }
    1532 
    1533 }
    1534 
    1535 static void yahoo_process_list(struct yahoo_input_data *yid,
    1536         struct yahoo_packet *pkt)
     1566                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
     1567        }
     1568}
     1569
     1570static void yahoo_process_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
    15371571{
    15381572        struct yahoo_data *yd = yid->yd;
    15391573        YList *l;
    15401574
    1541         /* we could be getting multiple packets here */
     1575        if (!yd->logged_in) {
     1576                yd->logged_in = TRUE;
     1577                if(yd->current_status < 0)
     1578                        yd->current_status = yd->initial_status;
     1579                YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_OK, NULL);
     1580        }
     1581
    15421582        for (l = pkt->hash; l; l = l->next) {
    15431583                struct yahoo_pair *pair = l->data;
    15441584
    1545                 switch (pair->key) {
    1546                 case 89:        /* identities */
     1585                switch(pair->key) {
     1586                case 87: /* buddies */
     1587                        if(!yd->rawbuddylist)
     1588                                yd->rawbuddylist = strdup(pair->value);
     1589                        else {
     1590                                yd->rawbuddylist = y_string_append(yd->rawbuddylist, pair->value);
     1591                        }
     1592                        break;
     1593
     1594                case 88: /* ignore list */
     1595                        if(!yd->ignorelist)
     1596                                yd->ignorelist = strdup("Ignore:");
     1597                        yd->ignorelist = y_string_append(yd->ignorelist, pair->value);
     1598                        break;
     1599
     1600                case 89: /* identities */
    15471601                        {
    1548                                 char **identities =
    1549                                         y_strsplit(pair->value, ",", -1);
    1550                                 int i;
    1551                                 for (i = 0; identities[i]; i++)
    1552                                         yd->identities =
    1553                                                 y_list_append(yd->identities,
     1602                        char **identities = y_strsplit(pair->value, ",", -1);
     1603                        int i;
     1604                        for(i=0; identities[i]; i++)
     1605                                yd->identities = y_list_append(yd->identities,
    15541606                                                strdup(identities[i]));
    1555                                 y_strfreev(identities);
     1607                        y_strfreev(identities);
    15561608                        }
    1557                         YAHOO_CALLBACK(ext_yahoo_got_identities) (yd->client_id,
    1558                                 yd->identities);
    1559                         break;
    1560                 case 59:        /* cookies */
    1561                         if (pair->value[0] == 'Y') {
     1609                        YAHOO_CALLBACK(ext_yahoo_got_identities)(yd->client_id, yd->identities);
     1610                        break;
     1611                case 59: /* cookies */
     1612                        if(yd->ignorelist) {
     1613                                yd->ignore = bud_str2list(yd->ignorelist);
     1614                                FREE(yd->ignorelist);
     1615                                YAHOO_CALLBACK(ext_yahoo_got_ignore)(yd->client_id, yd->ignore);
     1616                        }
     1617                        if(yd->rawbuddylist) {
     1618                                yd->buddies = bud_str2list(yd->rawbuddylist);
     1619                                FREE(yd->rawbuddylist);
     1620                                YAHOO_CALLBACK(ext_yahoo_got_buddies)(yd->client_id, yd->buddies);
     1621                        }
     1622
     1623                        if(pair->value[0]=='Y') {
    15621624                                FREE(yd->cookie_y);
    15631625                                FREE(yd->login_cookie);
     
    15661628                                yd->login_cookie = getlcookie(yd->cookie_y);
    15671629
    1568                         } else if (pair->value[0] == 'T') {
     1630                        } else if(pair->value[0]=='T') {
    15691631                                FREE(yd->cookie_t);
    15701632                                yd->cookie_t = getcookie(pair->value);
    15711633
    1572                         } else if (pair->value[0] == 'C') {
     1634                        } else if(pair->value[0]=='C') {
    15731635                                FREE(yd->cookie_c);
    15741636                                yd->cookie_c = getcookie(pair->value);
    1575                         }
    1576 
    1577                         break;
    1578                 case 3: /* my id */
    1579                 case 90:        /* 1 */
    1580                 case 100:       /* 0 */
    1581                 case 101:       /* NULL */
    1582                 case 102:       /* NULL */
    1583                 case 93:        /* 86400/1440 */
    1584                         break;
    1585                 }
    1586         }
    1587 
    1588         if (yd->cookie_y && yd->cookie_t)       /* We don't get cookie_c anymore */
    1589                 YAHOO_CALLBACK(ext_yahoo_got_cookies) (yd->client_id);
     1637                        } 
     1638
     1639                        if(yd->cookie_y && yd->cookie_t)
     1640                                YAHOO_CALLBACK(ext_yahoo_got_cookies)(yd->client_id);
     1641
     1642                        break;
     1643                case 3: /* my id */
     1644                case 90: /* 1 */
     1645                case 100: /* 0 */
     1646                case 101: /* NULL */
     1647                case 102: /* NULL */
     1648                case 93: /* 86400/1440 */
     1649                        break;
     1650                }
     1651        }
    15901652}
    15911653
  • protocols/yahoo/yahoo2_types.h

    r3330468 r7c5affca  
    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

    r3330468 r7c5affca  
    143143        storage_status_t status = storage_load( irc, cmd[1] );
    144144        char *account_on[] = { "account", "on", NULL };
    145        
    146         if( strchr( irc->umode, 'R' ) != NULL )
    147         {
    148                 irc_usermsg( irc, "You're already logged in." );
    149                 return;
    150         }
    151145       
    152146        switch (status) {
     
    11211115                irc_usermsg( irc, "Unknown command: %s %s. Please use \x02help commands\x02 to get a list of available commands.", "chat", cmd[1] );
    11221116        }
     1117
     1118
     1119
     1120#if 0
     1121        account_t *a;
     1122        struct im_connection *ic;
     1123        char *chat, *channel, *nick = NULL, *password = NULL;
     1124        struct groupchat *c;
     1125       
     1126        if( !( a = account_get( irc, cmd[1] ) ) )
     1127        {
     1128                irc_usermsg( irc, "Invalid account" );
     1129                return;
     1130        }
     1131        else if( !( a->ic && ( a->ic->flags & OPT_LOGGED_IN ) ) )
     1132        {
     1133                irc_usermsg( irc, "That account is not on-line" );
     1134                return;
     1135        }
     1136        else if( a->prpl->chat_join == NULL )
     1137        {
     1138                irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
     1139                return;
     1140        }
     1141        ic = a->ic;
     1142       
     1143        chat = cmd[2];
     1144        if( cmd[3] )
     1145        {
     1146                if( strchr( CTYPES, cmd[3][0] ) == NULL )
     1147                        channel = g_strdup_printf( "&%s", cmd[3] );
     1148                else
     1149                        channel = g_strdup( cmd[3] );
     1150        }
     1151        else
     1152        {
     1153                char *s;
     1154               
     1155                channel = g_strdup_printf( "&%s", chat );
     1156                if( ( s = strchr( channel, '@' ) ) )
     1157                        *s = 0;
     1158        }
     1159        if( cmd[3] && cmd[4] )
     1160                nick = cmd[4];
     1161        else
     1162                nick = irc->nick;
     1163        if( cmd[3] && cmd[4] && cmd[5] )
     1164                password = cmd[5];
     1165       
     1166        if( !nick_ok( channel + 1 ) )
     1167        {
     1168                irc_usermsg( irc, "Invalid channel name: %s", channel );
     1169                g_free( channel );
     1170                return;
     1171        }
     1172        else if( g_strcasecmp( channel, irc->channel ) == 0 || irc_chat_by_channel( irc, channel ) )
     1173        {
     1174                irc_usermsg( irc, "Channel already exists: %s", channel );
     1175                g_free( channel );
     1176                return;
     1177        }
     1178       
     1179        if( ( c = a->prpl->chat_join( ic, chat, nick, password ) ) )
     1180        {
     1181                g_free( c->channel );
     1182                c->channel = channel;
     1183        }
     1184        else
     1185        {
     1186                irc_usermsg( irc, "Tried to join chat, not sure if this was successful" );
     1187                g_free( channel );
     1188        }
     1189#endif
    11231190}
    11241191
  • unix.c

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