Changes in / [3330468:7c5affca]
- Files:
-
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
Makefile
r3330468 r7c5affca 49 49 50 50 clean: $(subdirs) 51 rm -f *.o $(OUTFILE) core utils/bitlbeed 51 rm -f *.o $(OUTFILE) core utils/bitlbeed encode decode 52 52 $(MAKE) -C tests clean 53 53 … … 124 124 endif 125 125 126 encode: crypting.c 127 $(CC) crypting.c lib/md5.c $(CFLAGS) -o encode -DCRYPTING_MAIN $(CFLAGS) $(EFLAGS) $(LFLAGS) 128 129 decode: encode 130 cp encode decode 131 126 132 ctags: 127 133 ctags `find . -name "*.c"` `find . -name "*.h"` -
account.c
r3330468 r7c5affca 54 54 55 55 s = set_add( &a->set, "auto_reconnect", "true", set_eval_bool, a ); 56 57 s = set_add( &a->set, "nick_source", "handle", NULL, a );58 56 59 57 s = set_add( &a->set, "password", NULL, set_eval_account, a ); -
bitlbee.c
r3330468 r7c5affca 109 109 chdir( "/" ); 110 110 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 ); 122 116 } 123 117 #endif -
bitlbee.conf
r3330468 r7c5affca 55 55 ## 56 56 ## 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). 59 60 ## 60 61 # AuthPassword = ItllBeBitlBee ## Heh.. Our slogan. ;-) … … 120 121 ## Proxy = socks5://socksproxy.localnet.com 121 122 122 ## Protocols offered by bitlbee123 ##124 ## As recompiling may be quite unpractical for some people, this option125 ## allows to remove the support of protocol, even if compiled in. If126 ## nothing is given, there are no restrictions.127 ##128 ## Protocols = jabber yahoo129 130 123 131 124 [defaults] -
bitlbee.h
r3330468 r7c5affca 27 27 #define _BITLBEE_H 28 28 29 #ifndef _GNU_SOURCE30 29 #define _GNU_SOURCE /* Stupid GNU :-P */ 31 #endif32 30 33 31 /* Depend on Windows 2000 for now since we need getaddrinfo() */ … … 35 33 36 34 #define PACKAGE "BitlBee" 37 #define BITLBEE_VERSION "1.2. 5"35 #define BITLBEE_VERSION "1.2.4" 38 36 #define VERSION BITLBEE_VERSION 39 37 -
conf.c
r3330468 r7c5affca 63 63 conf->ping_timeout = 300; 64 64 conf->user = NULL; 65 conf->protocols = NULL;66 65 proxytype = 0; 67 66 … … 128 127 { 129 128 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" 131 130 "\n" 132 131 "An IRC-to-other-chat-networks gateway\n" … … 144 143 " -c Load alternative configuration file\n" 145 144 " -d Specify alternative user configuration directory\n" 146 " -x Command-line interface to password encryption/hashing\n"147 145 " -h Show this help page.\n" ); 148 146 return NULL; … … 308 306 conf->user = g_strdup( ini->value ); 309 307 } 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 }315 308 else 316 309 { -
conf.h
r3330468 r7c5affca 50 50 int ping_timeout; 51 51 char *user; 52 char **protocols;53 52 } conf_t; 54 53 -
configure
r3330468 r7c5affca 159 159 160 160 echo CFLAGS=$CFLAGS >> Makefile.settings 161 echo CFLAGS+=-I`pwd` - iquote`pwd`/lib -iquote`pwd`/protocols -I. >> Makefile.settings161 echo CFLAGS+=-I`pwd` -I`pwd`/lib -I`pwd`/protocols -I. >> Makefile.settings 162 162 163 163 echo CFLAGS+=-DHAVE_CONFIG_H >> Makefile.settings … … 447 447 fi 448 448 449 if [ ! -e doc/user-guide/help.txt ] && ! type xmlto > /dev/null 2> /dev/null; then450 echo451 echo 'WARNING: Building from an unreleased source tree without prebuilt helpfile.'452 echo 'Install xmlto if you want online help to work.'453 fi454 455 449 echo 456 450 if [ -z "$BITLBEE_VERSION" -a -d .bzr ] && type bzr > /dev/null 2> /dev/null; then … … 562 556 ;; 563 557 Darwin ) 564 echo 'STRIP=\# skip strip' >> Makefile.settings565 558 ;; 566 559 IRIX ) -
crypting.c
r3330468 r7c5affca 132 132 return (rv); 133 133 } 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 140 int 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 3 3 4 4 http://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 timing8 issues, Yahoo! crashes at login time with huge contact lists,9 - Avoid linking in a static version of libresolv now that glibc has all10 relevant functions available in the dynamic version.11 - Improved away state code and added the ability to set (non-away) status12 messages using "set status" (also possible per account).13 - Added a post-1.2 equivalent of encode/decode to quickly encrypt/decrypt14 passwords in a way that BitlBee can read them.15 - Allow using the full name for generating nicknames, instead of just the16 handle. This is especially useful when using the Facebook XMPP server.17 - Auto reconnect is now enabled by default since all protocols can properly18 detect cases where auto reconnect should be avoided (i.e. concurrent19 logins).20 5 21 6 Version 1.2.4: -
doc/user-guide/commands.xml
r3330468 r7c5affca 608 608 </bitlbee-setting> 609 609 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 625 610 <bitlbee-setting name="ops" type="string" scope="global"> 626 611 <default>both</default> -
irc.c
r3330468 r7c5affca 166 166 s = set_add( &irc->set, "away_devoice", "true", set_eval_away_devoice, irc ); 167 167 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 ); 169 169 s = set_add( &irc->set, "auto_reconnect_delay", "5*3<900", set_eval_account_reconnect_delay, irc ); 170 170 s = set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc ); -
lib/misc.c
r3330468 r7c5affca 34 34 #include "nogaim.h" 35 35 #include "base64.h" 36 #include "md5.h"37 36 #include <stdio.h> 38 37 #include <stdlib.h> … … 524 523 525 524 /* Word wrapping. Yes, I know this isn't UTF-8 clean. I'm willing to take the risk. */ 526 char *word_wrap( c onst char *msg, int line_len )525 char *word_wrap( char *msg, int line_len ) 527 526 { 528 527 GString *ret = g_string_sized_new( strlen( msg ) + 16 ); -
lib/misc.h
r3330468 r7c5affca 62 62 G_MODULE_EXPORT struct ns_srv_reply *srv_lookup( char *service, char *protocol, char *domain ); 63 63 64 G_MODULE_EXPORT char *word_wrap( c onst char *msg, int line_len );64 G_MODULE_EXPORT char *word_wrap( char *msg, int line_len ); 65 65 66 66 G_MODULE_EXPORT gboolean ssl_sockerr_again( void *ssl ); -
protocols/jabber/io.c
r3330468 r7c5affca 375 375 376 376 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 } 378 388 379 389 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 } 381 401 382 402 /* This flag is already set if we authenticated via SASL, so now 383 403 we can resume the session in the new stream, if we don't have 384 404 to bind/initialize the session. */ 385 if( jd->flags & JFLAG_AUTHENTICATED && ( jd->flags & ( JFLAG_WA NT_BIND | JFLAG_WANT_SESSION ) ) == 0 )405 if( jd->flags & JFLAG_AUTHENTICATED && ( jd->flags & ( JFLAG_WAIT_BIND | JFLAG_WAIT_SESSION ) ) == 0 ) 386 406 { 387 407 if( !jabber_get_roster( ic ) ) 388 408 return XT_ABORT; 389 }390 else if( jd->flags & JFLAG_AUTHENTICATED )391 {392 return jabber_pkt_bind_sess( ic, NULL, NULL );393 409 } 394 410 … … 425 441 imcb_log( ic, "Converting stream to TLS" ); 426 442 427 jd->flags |= JFLAG_STARTTLS_DONE;428 443 jd->ssl = ssl_starttls( jd->fd, jabber_connected_ssl, ic ); 429 444 … … 516 531 jd->r_inpa = b_input_add( jd->fd, B_EV_IO_READ, jabber_read_callback, ic ); 517 532 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 ); 522 536 523 537 st = jabber_write( ic, greet, strlen( greet ) ); -
protocols/jabber/iq.c
r3330468 r7c5affca 298 298 { 299 299 struct jabber_data *jd = ic->proto_data; 300 struct xt_node *c , *reply = NULL;300 struct xt_node *c; 301 301 char *s; 302 302 303 if( node &&( c = xt_find_node( node->children, "bind" ) ) )303 if( ( c = xt_find_node( node->children, "bind" ) ) ) 304 304 { 305 305 c = xt_find_node( c->children, "jid" ); … … 308 308 imcb_log( ic, "Server changed session resource string to `%s'", s + 1 ); 309 309 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 ) 337 318 { 338 319 if( !jabber_get_roster( ic ) ) -
protocols/jabber/jabber.h
r3330468 r7c5affca 40 40 JFLAG_STREAM_RESTART = 4, /* Set when we want to restart the stream (after 41 41 SASL or TLS). */ 42 JFLAG_WA NT_SESSION = 8, /* Set if the server wants a <session/> tag42 JFLAG_WAIT_SESSION = 8, /* Set if we sent a <session> tag and need a reply 43 43 before we continue. */ 44 JFLAG_WA NT_BIND = 16, /* ... for <bind> tag. */44 JFLAG_WAIT_BIND = 16, /* ... for <bind> tag. */ 45 45 JFLAG_WANT_TYPING = 32, /* Set if we ever sent a typing notification, this 46 46 activates all XEP-85 related code. */ 47 47 JFLAG_XMLCONSOLE = 64, /* If the user added an xmlconsole buddy. */ 48 JFLAG_STARTTLS_DONE = 128, /* If a plaintext session was converted to TLS. */49 48 } jabber_flags_t; 50 49 -
protocols/msn/msn.c
r3330468 r7c5affca 26 26 #include "nogaim.h" 27 27 #include "msn.h" 28 29 int msn_chat_id;30 GSList *msn_connections;31 GSList *msn_switchboards;32 28 33 29 static char *msn_set_display_name( set_t *set, char *value ); -
protocols/msn/msn.h
r3330468 r7c5affca 135 135 #define STATUS_SB_CHAT_SPARE 8 /* Same, but also for groupchats (not used yet). */ 136 136 137 externint msn_chat_id;137 int msn_chat_id; 138 138 extern const struct msn_away_state msn_away_state_list[]; 139 139 extern const struct msn_status_code msn_status_code_list[]; … … 144 144 connection), the callback should check whether it's still listed here 145 145 before doing *anything* else. */ 146 externGSList *msn_connections;147 externGSList *msn_switchboards;146 GSList *msn_connections; 147 GSList *msn_switchboards; 148 148 149 149 /* ns.c */ -
protocols/msn/msn_util.c
r3330468 r7c5affca 171 171 172 172 /* 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 ) 176 176 { 177 177 break; -
protocols/msn/ns.c
r3330468 r7c5affca 229 229 } 230 230 } 231 else if( num_parts >= 7 && strcmp( cmd[2], "OK" ) == 0 )231 else if( num_parts == 7 && strcmp( cmd[2], "OK" ) == 0 ) 232 232 { 233 233 set_t *s; 234 234 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] ); 251 244 } 252 245 -
protocols/nogaim.c
r3330468 r7c5affca 98 98 void register_protocol (struct prpl *p) 99 99 { 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); 113 101 } 114 102 … … 391 379 /* list.c */ 392 380 393 void imcb_add_buddy( struct im_connection *ic, c onst char *handle, constchar *group )381 void imcb_add_buddy( struct im_connection *ic, char *handle, char *group ) 394 382 { 395 383 user_t *u; … … 465 453 } 466 454 467 void imcb_rename_buddy( struct im_connection *ic, c onst char *handle, constchar *realname )455 void imcb_rename_buddy( struct im_connection *ic, char *handle, char *realname ) 468 456 { 469 457 user_t *u = user_findhandle( ic, handle ); 470 char *set;471 458 472 459 if( !u || !realname ) return; … … 481 468 imcb_log( ic, "User `%s' changed name to `%s'", u->nick, u->realname ); 482 469 } 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 472 void imcb_remove_buddy( struct im_connection *ic, char *handle, char *group ) 503 473 { 504 474 user_t *u; … … 510 480 /* Mainly meant for ICQ (and now also for Jabber conferences) to allow IM 511 481 modules to suggest a nickname for a handle. */ 512 void imcb_buddy_nick_hint( struct im_connection *ic, c onst char *handle, constchar *nick )482 void imcb_buddy_nick_hint( struct im_connection *ic, char *handle, char *nick ) 513 483 { 514 484 user_t *u = user_findhandle( ic, handle ); … … 722 692 } 723 693 724 void imcb_buddy_msg( struct im_connection *ic, c onst char *handle, char *msg, uint32_t flags, time_t sent_at )694 void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, uint32_t flags, time_t sent_at ) 725 695 { 726 696 irc_t *irc = ic->irc; … … 855 825 } 856 826 857 void imcb_chat_msg( struct groupchat *c, c onst char *who, char *msg, uint32_t flags, time_t sent_at )827 void imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at ) 858 828 { 859 829 struct im_connection *ic = c->ic; … … 927 897 /* buddy_chat.c */ 928 898 929 void imcb_chat_add_buddy( struct groupchat *b, c onst char *handle )899 void imcb_chat_add_buddy( struct groupchat *b, char *handle ) 930 900 { 931 901 user_t *u = user_findhandle( b->ic, handle ); … … 962 932 963 933 /* This function is one BIG hack... :-( EREWRITE */ 964 void imcb_chat_remove_buddy( struct groupchat *b, c onst char *handle, constchar *reason )934 void imcb_chat_remove_buddy( struct groupchat *b, char *handle, char *reason ) 965 935 { 966 936 user_t *u; … … 1111 1081 int imc_away_send_update( struct im_connection *ic ) 1112 1082 { 1113 char *away, *msg = NULL;1083 char *away, *msg; 1114 1084 1115 1085 away = set_getstr( &ic->acc->set, "away" ) ? -
protocols/nogaim.h
r3330468 r7c5affca 276 276 * user, usually after a login, or if the user added a buddy and the IM 277 277 * 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, c onst char *handle, constchar *group );279 G_MODULE_EXPORT void imcb_remove_buddy( struct im_connection *ic, c onst char *handle, char *group );278 G_MODULE_EXPORT void imcb_add_buddy( struct im_connection *ic, char *handle, char *group ); 279 G_MODULE_EXPORT void imcb_remove_buddy( struct im_connection *ic, char *handle, char *group ); 280 280 G_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, c onst char *handle, constchar *realname );282 G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, c onst char *handle, constchar *nick );281 G_MODULE_EXPORT void imcb_rename_buddy( struct im_connection *ic, char *handle, char *realname ); 282 G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, char *handle, char *nick ); 283 283 284 284 /* Buddy activity */ … … 290 290 /* Not implemented yet! */ G_MODULE_EXPORT void imcb_buddy_times( struct im_connection *ic, const char *handle, time_t login, time_t idle ); 291 291 /* 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, c onst char *handle, char *msg, uint32_t flags, time_t sent_at );292 G_MODULE_EXPORT void imcb_buddy_msg( struct im_connection *ic, char *handle, char *msg, uint32_t flags, time_t sent_at ); 293 293 G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags ); 294 294 G_MODULE_EXPORT void imcb_clean_handle( struct im_connection *ic, char *handle ); … … 303 303 * user, too. */ 304 304 G_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, c onst char *handle );305 G_MODULE_EXPORT void imcb_chat_add_buddy( struct groupchat *b, char *handle ); 306 306 /* To remove a handle from a group chat. Reason can be NULL. */ 307 G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *b, c onst char *handle, constchar *reason );307 G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *b, char *handle, char *reason ); 308 308 /* 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, c onst char *who, char *msg, uint32_t flags, time_t sent_at );309 G_MODULE_EXPORT void imcb_chat_msg( struct groupchat *c, char *who, char *msg, uint32_t flags, time_t sent_at ); 310 310 /* System messages specific to a groupchat, so they can be displayed in the right context. */ 311 311 G_MODULE_EXPORT void imcb_chat_log( struct groupchat *c, char *format, ... ) G_GNUC_PRINTF( 2, 3 ); -
protocols/yahoo/libyahoo2.c
r3330468 r7c5affca 855 855 } 856 856 857 static 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 857 906 static char * getcookie(char *rawcookie) 858 907 { … … 1311 1360 } 1312 1361 1313 static void yahoo_process_status(struct yahoo_input_data *yid, 1314 1362 1363 static void yahoo_process_status(struct yahoo_input_data *yid, struct yahoo_packet *pkt) 1315 1364 { 1316 1365 YList *l; 1317 1366 struct yahoo_data *yd = yid->yd; 1318 1367 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; 1320 1389 1321 1390 YList *users = 0; 1322 1391 1323 1392 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 } 1334 1396 1335 1397 for (l = pkt->hash; l; l = l->next) { … … 1337 1399 1338 1400 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); 1342 1410 } 1343 1411 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 */ 1351 1413 NOTICE(("key %d:%s", pair->key, pair->value)); 1352 1414 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); 1371 1417 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 */ 1395 1442 /* 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); 1397 1444 break; 1398 1445 case 138: 1399 u->f138 = atoi(pair->value);1446 ((struct user*)users->data)->f138 = atoi(pair->value); 1400 1447 break; 1401 1448 case 184: 1402 u->f184 = pair->value;1449 ((struct user*)users->data)->f184 = pair->value; 1403 1450 break; 1404 1451 case 192: 1405 u->f192 = atoi(pair->value);1452 ((struct user*)users->data)->f192 = atoi(pair->value); 1406 1453 break; 1407 1454 case 10001: 1408 u->f10001 = atoi(pair->value);1455 ((struct user*)users->data)->f10001 = atoi(pair->value); 1409 1456 break; 1410 1457 case 10002: 1411 u->f10002 = atoi(pair->value);1458 ((struct user*)users->data)->f10002 = atoi(pair->value); 1412 1459 break; 1413 1460 case 198: 1414 u->f198 = atoi(pair->value);1461 ((struct user*)users->data)->f198 = atoi(pair->value); 1415 1462 break; 1416 1463 case 197: 1417 u->f197 = pair->value;1464 ((struct user*)users->data)->f197 = pair->value; 1418 1465 break; 1419 1466 case 205: 1420 u->f205 = pair->value;1467 ((struct user*)users->data)->f205 = pair->value; 1421 1468 break; 1422 1469 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); 1428 1474 break; 1429 1475 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 1436 1481 while (users) { 1437 1482 YList *t = users; 1438 struct yahoo_process_status_entry*u = users->data;1483 struct user *u = users->data; 1439 1484 1440 1485 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); 1447 1488 } else { 1448 1489 /* Key 47 always seems to be 1 for YMSG16 */ 1449 if 1490 if(!u->state) 1450 1491 u->away = 0; 1451 1492 else 1452 1493 u->away = 1; 1453 1494 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); 1457 1496 } 1458 1497 } … … 1464 1503 } 1465 1504 1466 static void yahoo_process_buddy_list(struct yahoo_input_data *yid, 1467 struct yahoo_packet *pkt) 1505 static void yahoo_process_buddy_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt) 1468 1506 { 1469 1507 struct yahoo_data *yd = yid->yd; … … 1477 1515 struct yahoo_pair *pair = l->data; 1478 1516 1479 switch 1517 switch(pair->key) { 1480 1518 case 300: 1481 1519 case 301: 1482 1520 case 302: 1483 break; /* Separators. Our logic does not need them */1484 1521 case 303: 1485 if ( 318 == atoi(pair->value))1522 if ( 315 == atoi(pair->value) ) 1486 1523 last_packet = 1; 1487 1524 break; 1488 1525 case 65: 1526 g_free(cur_group); 1489 1527 cur_group = strdup(pair->value); 1490 1528 break; … … 1492 1530 newbud = y_new0(struct yahoo_buddy, 1); 1493 1531 newbud->id = strdup(pair->value); 1494 if (cur_group) 1532 if (cur_group) { 1495 1533 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 } 1504 1546 1505 1547 yd->buddies = y_list_append(yd->buddies, newbud); … … 1508 1550 } 1509 1551 } 1552 1553 g_free(cur_group); 1510 1554 1511 1555 /* we could be getting multiple packets here */ 1512 if ( pkt->hash && !last_packet)1513 return; 1514 1515 YAHOO_CALLBACK(ext_yahoo_got_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 */ 1518 1562 if (!yd->logged_in) { 1519 yd->logged_in = 1;1520 if 1563 yd->logged_in = TRUE; 1564 if(yd->current_status < 0) 1521 1565 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 1570 static void yahoo_process_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt) 1537 1571 { 1538 1572 struct yahoo_data *yd = yid->yd; 1539 1573 YList *l; 1540 1574 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 1542 1582 for (l = pkt->hash; l; l = l->next) { 1543 1583 struct yahoo_pair *pair = l->data; 1544 1584 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 */ 1547 1601 { 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, 1554 1606 strdup(identities[i])); 1555 1607 y_strfreev(identities); 1556 1608 } 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') { 1562 1624 FREE(yd->cookie_y); 1563 1625 FREE(yd->login_cookie); … … 1566 1628 yd->login_cookie = getlcookie(yd->cookie_y); 1567 1629 1568 } else if (pair->value[0] =='T') {1630 } else if(pair->value[0]=='T') { 1569 1631 FREE(yd->cookie_t); 1570 1632 yd->cookie_t = getcookie(pair->value); 1571 1633 1572 } else if (pair->value[0] =='C') {1634 } else if(pair->value[0]=='C') { 1573 1635 FREE(yd->cookie_c); 1574 1636 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 } 1590 1652 } 1591 1653 -
protocols/yahoo/yahoo2_types.h
r3330468 r7c5affca 196 196 197 197 void *server_settings; 198 199 struct yahoo_process_status_entry *half_user;200 198 }; 201 199 … … 263 261 }; 264 262 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 286 263 #ifdef __cplusplus 287 264 } -
root_commands.c
r3330468 r7c5affca 143 143 storage_status_t status = storage_load( irc, cmd[1] ); 144 144 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 }151 145 152 146 switch (status) { … … 1121 1115 irc_usermsg( irc, "Unknown command: %s %s. Please use \x02help commands\x02 to get a list of available commands.", "chat", cmd[1] ); 1122 1116 } 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 1123 1190 } 1124 1191 -
unix.c
r3330468 r7c5affca 25 25 26 26 #include "bitlbee.h" 27 28 #include "arc.h"29 #include "base64.h"30 27 #include "commands.h" 28 #include "crypting.h" 31 29 #include "protocols/nogaim.h" 32 30 #include "help.h" 33 31 #include "ipc.h" 34 #include "md5.h"35 #include "misc.h"36 32 #include <signal.h> 37 33 #include <unistd.h> … … 44 40 static void sighandler( int signal ); 45 41 46 static int crypt_main( int argc, char *argv[] );47 48 42 int main( int argc, char *argv[] ) 49 43 { … … 51 45 char *old_cwd = NULL; 52 46 struct sigaction sig, old; 53 54 if( argc > 1 && strcmp( argv[1], "-x" ) == 0 )55 return crypt_main( argc, argv );56 47 57 48 log_init(); … … 169 160 } 170 161 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 229 162 static void sighandler( int signal ) 230 163 { … … 282 215 return( (double) time->tv_sec + (double) time->tv_usec / 1000000 ); 283 216 } 217 218
Note: See TracChangeset
for help on using the changeset viewer.