Changeset 6ce2240
- Timestamp:
- 2010-09-30T06:02:01Z (14 years ago)
- Branches:
- master
- Children:
- 560129a
- Parents:
- 858ea01 (diff), 4752063 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/user-guide/commands.xml
r858ea01 r6ce2240 375 375 376 376 <para> 377 Available subcommands: connect, disconnect, smp, trust, info, keygen, and forget. See <emphasis>help otr <subcommand></emphasis> for more information.377 Available subcommands: connect, disconnect, smp, smpq, trust, info, keygen, and forget. See <emphasis>help otr <subcommand></emphasis> for more information. 378 378 </para> 379 379 … … 417 417 <para> 418 418 If an SMP challenge has already been received from the given user, responds with the specified secret. Otherwise, a challenge for the secret will be sent. If the protocol succeeds (i.e. both parties gave the same secret), the fingerprint will be trusted. 419 </para> 420 421 </description> 422 423 </bitlbee-command> 424 425 <bitlbee-command name="smpq"> 426 <syntax>otr smpq <nick> <question> <answer></syntax> 427 428 <description> 429 430 <para> 431 Attempts to authenticate the given user's active fingerprint via the Socialist Millionaires' Protocol, Q&A style. 432 </para> 433 434 <para> 435 When initiating SMP, this is an alternative to the 'otr smp' command. The shared secret is provided as the answer to a specific question. The question is transmitted with the initial SMP packet and used to prompt the other party. If the protocol succeeds (i.e. they give the correct answer), the fingerprint will be trusted. 419 436 </para> 420 437 -
irc.c
r858ea01 r6ce2240 222 222 log_message( LOGLVL_INFO, "Destroying connection with fd %d", irc->fd ); 223 223 224 if( irc->status & USTATUS_IDENTIFIED && set_getbool( &irc->b->set, "save_on_quit" ) ) 225 if( storage_save( irc, NULL, TRUE ) != STORAGE_OK ) 226 log_message( LOGLVL_WARNING, "Error while saving settings for user %s", irc->user->nick ); 227 224 228 for( l = irc_plugins; l; l = l->next ) 225 229 { … … 228 232 p->irc_free( irc ); 229 233 } 230 231 if( irc->status & USTATUS_IDENTIFIED && set_getbool( &irc->b->set, "save_on_quit" ) )232 if( storage_save( irc, NULL, TRUE ) != STORAGE_OK )233 log_message( LOGLVL_WARNING, "Error while saving settings for user %s", irc->user->nick );234 234 235 235 irc_connection_list = g_slist_remove( irc_connection_list, irc ); -
otr.c
r858ea01 r6ce2240 2 2 * BitlBee -- An IRC to other IM-networks gateway * 3 3 * * 4 * Copyright 2002-20 08Wilmer van der Gaast and others *4 * Copyright 2002-2010 Wilmer van der Gaast and others * 5 5 \********************************************************************/ 6 6 … … 87 87 void cmd_otr_disconnect(irc_t *irc, char **args); 88 88 void cmd_otr_smp(irc_t *irc, char **args); 89 void cmd_otr_smpq(irc_t *irc, char **args); 89 90 void cmd_otr_trust(irc_t *irc, char **args); 90 91 void cmd_otr_info(irc_t *irc, char **args); … … 96 97 { "disconnect", 1, &cmd_otr_disconnect, 0 }, 97 98 { "smp", 2, &cmd_otr_smp, 0 }, 99 { "smpq", 3, &cmd_otr_smpq, 0 }, 98 100 { "trust", 6, &cmd_otr_trust, 0 }, 99 101 { "info", 0, &cmd_otr_info, 0 }, … … 154 156 /* handle SMP TLVs from a received message */ 155 157 void otr_handle_smp(struct im_connection *ic, const char *handle, OtrlTLV *tlvs); 158 159 /* combined handler for the 'otr smp' and 'otr smpq' commands */ 160 void otr_initiate_smp(irc_t *irc, const char *nick, const char *question, 161 const char *secret); 156 162 157 163 /* update op/voice flag of given user according to encryption state and settings … … 732 738 void cmd_otr_smp(irc_t *irc, char **args) 733 739 { 734 irc_user_t *u; 735 ConnContext *ctx; 736 737 u = irc_user_by_name(irc, args[1]); 738 if(!u || !u->bu || !u->bu->ic) { 739 irc_usermsg(irc, "%s: unknown user", args[1]); 740 return; 741 } 742 if(!(u->bu->flags & BEE_USER_ONLINE)) { 743 irc_usermsg(irc, "%s is offline", args[1]); 744 return; 745 } 746 747 ctx = otrl_context_find(irc->otr->us, u->bu->handle, 748 u->bu->ic->acc->user, u->bu->ic->acc->prpl->name, 1, NULL, NULL, NULL); 749 if(!ctx) { 750 /* huh? out of memory or what? */ 751 return; 752 } 753 754 if(ctx->smstate->nextExpected != OTRL_SMP_EXPECT1) { 755 log_message(LOGLVL_INFO, 756 "SMP already in phase %d, sending abort before reinitiating", 757 ctx->smstate->nextExpected+1); 758 otrl_message_abort_smp(irc->otr->us, &otr_ops, u->bu->ic, ctx); 759 otrl_sm_state_free(ctx->smstate); 760 } 761 762 /* warning: the following assumes that smstates are cleared whenever an SMP 763 is completed or aborted! */ 764 if(ctx->smstate->secret == NULL) { 765 irc_usermsg(irc, "smp: initiating with %s...", u->nick); 766 otrl_message_initiate_smp(irc->otr->us, &otr_ops, 767 u->bu->ic, ctx, (unsigned char *)args[2], strlen(args[2])); 768 /* smp is now in EXPECT2 */ 769 } else { 770 /* if we're still in EXPECT1 but smstate is initialized, we must have 771 received the SMP1, so let's issue a response */ 772 irc_usermsg(irc, "smp: responding to %s...", u->nick); 773 otrl_message_respond_smp(irc->otr->us, &otr_ops, 774 u->bu->ic, ctx, (unsigned char *)args[2], strlen(args[2])); 775 /* smp is now in EXPECT3 */ 776 } 740 otr_initiate_smp(irc, args[1], NULL, args[2]); /* no question */ 741 } 742 743 void cmd_otr_smpq(irc_t *irc, char **args) 744 { 745 otr_initiate_smp(irc, args[1], args[2], args[3]); 777 746 } 778 747 … … 1098 1067 if(!context) { 1099 1068 /* huh? out of memory or what? */ 1069 irc_usermsg(irc, "smp: failed to get otr context for %s", u->nick); 1070 otrl_message_abort_smp(us, ops, u->bu->ic, context); 1071 otrl_sm_state_free(context->smstate); 1100 1072 return; 1101 1073 } 1102 1074 nextMsg = context->smstate->nextExpected; 1103 1075 1076 tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP1Q); 1077 if (tlv) { 1078 if (nextMsg != OTRL_SMP_EXPECT1) { 1079 irc_usermsg(irc, "smp %s: spurious SMP1Q received, aborting", u->nick); 1080 otrl_message_abort_smp(us, ops, u->bu->ic, context); 1081 otrl_sm_state_free(context->smstate); 1082 } else { 1083 char *question = g_strndup((char *)tlv->data, tlv->len); 1084 irc_usermsg(irc, "smp: initiated by %s with question: \"%s\"", u->nick, 1085 question); 1086 irc_usermsg(irc, "smp: respond with \x02otr smp %s <answer>\x02", 1087 u->nick); 1088 g_free(question); 1089 /* smp stays in EXPECT1 until user responds */ 1090 } 1091 } 1104 1092 tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP1); 1105 1093 if (tlv) { … … 1171 1159 otrl_sm_state_free(context->smstate); 1172 1160 /* smp is in back in EXPECT1 */ 1161 } 1162 } 1163 1164 /* combined handler for the 'otr smp' and 'otr smpq' commands */ 1165 void otr_initiate_smp(irc_t *irc, const char *nick, const char *question, 1166 const char *secret) 1167 { 1168 irc_user_t *u; 1169 ConnContext *ctx; 1170 1171 u = irc_user_by_name(irc, nick); 1172 if(!u || !u->bu || !u->bu->ic) { 1173 irc_usermsg(irc, "%s: unknown user", nick); 1174 return; 1175 } 1176 if(!(u->bu->flags & BEE_USER_ONLINE)) { 1177 irc_usermsg(irc, "%s is offline", nick); 1178 return; 1179 } 1180 1181 ctx = otrl_context_find(irc->otr->us, u->bu->handle, 1182 u->bu->ic->acc->user, u->bu->ic->acc->prpl->name, 0, NULL, NULL, NULL); 1183 if(!ctx || ctx->msgstate != OTRL_MSGSTATE_ENCRYPTED) { 1184 irc_usermsg(irc, "smp: otr inactive with %s, try \x02otr connect" 1185 " %s\x02", nick, nick); 1186 return; 1187 } 1188 1189 if(ctx->smstate->nextExpected != OTRL_SMP_EXPECT1) { 1190 log_message(LOGLVL_INFO, 1191 "SMP already in phase %d, sending abort before reinitiating", 1192 ctx->smstate->nextExpected+1); 1193 otrl_message_abort_smp(irc->otr->us, &otr_ops, u->bu->ic, ctx); 1194 otrl_sm_state_free(ctx->smstate); 1195 } 1196 1197 if(question) { 1198 /* this was 'otr smpq', just initiate */ 1199 irc_usermsg(irc, "smp: initiating with %s...", u->nick); 1200 otrl_message_initiate_smp_q(irc->otr->us, &otr_ops, u->bu->ic, ctx, 1201 question, (unsigned char *)secret, strlen(secret)); 1202 /* smp is now in EXPECT2 */ 1203 } else { 1204 /* this was 'otr smp', initiate or reply */ 1205 /* warning: the following assumes that smstates are cleared whenever an SMP 1206 is completed or aborted! */ 1207 if(ctx->smstate->secret == NULL) { 1208 irc_usermsg(irc, "smp: initiating with %s...", u->nick); 1209 otrl_message_initiate_smp(irc->otr->us, &otr_ops, 1210 u->bu->ic, ctx, (unsigned char *)secret, strlen(secret)); 1211 /* smp is now in EXPECT2 */ 1212 } else { 1213 /* if we're still in EXPECT1 but smstate is initialized, we must have 1214 received the SMP1, so let's issue a response */ 1215 irc_usermsg(irc, "smp: responding to %s...", u->nick); 1216 otrl_message_respond_smp(irc->otr->us, &otr_ops, 1217 u->bu->ic, ctx, (unsigned char *)secret, strlen(secret)); 1218 /* smp is now in EXPECT3 */ 1219 } 1173 1220 } 1174 1221 }
Note: See TracChangeset
for help on using the changeset viewer.