Changeset 99a01b9
- Timestamp:
- 2010-09-19T18:23:05Z (14 years ago)
- Branches:
- master
- Children:
- 2171044
- Parents:
- 51e9a1d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
otr.c
r51e9a1d r99a01b9 8 8 OTR support (cf. http://www.cypherpunks.ca/otr/) 9 9 10 2008 , Sven Moritz Hallberg <pesco@khjk.org>10 2008-2010, Sven Moritz Hallberg <pesco@khjk.org> 11 11 (c) and funded by stonedcoder.org 12 12 … … 88 88 void cmd_otr_disconnect(irc_t *irc, char **args); 89 89 void cmd_otr_smp(irc_t *irc, char **args); 90 void cmd_otr_smpq(irc_t *irc, char **args); 90 91 void cmd_otr_trust(irc_t *irc, char **args); 91 92 void cmd_otr_info(irc_t *irc, char **args); … … 97 98 { "disconnect", 1, &cmd_otr_disconnect, 0 }, 98 99 { "smp", 2, &cmd_otr_smp, 0 }, 100 { "smpq", 3, &cmd_otr_smpq, 0 }, 99 101 { "trust", 6, &cmd_otr_trust, 0 }, 100 102 { "info", 0, &cmd_otr_info, 0 }, … … 155 157 /* handle SMP TLVs from a received message */ 156 158 void otr_handle_smp(struct im_connection *ic, const char *handle, OtrlTLV *tlvs); 159 160 /* combined handler for the 'otr smp' and 'otr smpq' commands */ 161 void otr_initiate_smp(irc_t *irc, const char *nick, const char *question, 162 const char *secret); 157 163 158 164 /* update op/voice flag of given user according to encryption state and settings … … 729 735 void cmd_otr_smp(irc_t *irc, char **args) 730 736 { 731 irc_user_t *u; 732 ConnContext *ctx; 733 734 u = irc_user_by_name(irc, args[1]); 735 if(!u || !u->bu || !u->bu->ic) { 736 irc_usermsg(irc, "%s: unknown user", args[1]); 737 return; 738 } 739 if(!(u->bu->flags & BEE_USER_ONLINE)) { 740 irc_usermsg(irc, "%s is offline", args[1]); 741 return; 742 } 743 744 ctx = otrl_context_find(irc->otr->us, u->bu->handle, 745 u->bu->ic->acc->user, u->bu->ic->acc->prpl->name, 1, NULL, NULL, NULL); 746 if(!ctx) { 747 /* huh? out of memory or what? */ 748 return; 749 } 750 751 if(ctx->smstate->nextExpected != OTRL_SMP_EXPECT1) { 752 log_message(LOGLVL_INFO, 753 "SMP already in phase %d, sending abort before reinitiating", 754 ctx->smstate->nextExpected+1); 755 otrl_message_abort_smp(irc->otr->us, &otr_ops, u->bu->ic, ctx); 756 otrl_sm_state_free(ctx->smstate); 757 } 758 759 /* warning: the following assumes that smstates are cleared whenever an SMP 760 is completed or aborted! */ 761 if(ctx->smstate->secret == NULL) { 762 irc_usermsg(irc, "smp: initiating with %s...", u->nick); 763 otrl_message_initiate_smp(irc->otr->us, &otr_ops, 764 u->bu->ic, ctx, (unsigned char *)args[2], strlen(args[2])); 765 /* smp is now in EXPECT2 */ 766 } else { 767 /* if we're still in EXPECT1 but smstate is initialized, we must have 768 received the SMP1, so let's issue a response */ 769 irc_usermsg(irc, "smp: responding to %s...", u->nick); 770 otrl_message_respond_smp(irc->otr->us, &otr_ops, 771 u->bu->ic, ctx, (unsigned char *)args[2], strlen(args[2])); 772 /* smp is now in EXPECT3 */ 773 } 737 otr_initiate_smp(irc, args[1], NULL, args[2]); /* no question */ 738 } 739 740 void cmd_otr_smpq(irc_t *irc, char **args) 741 { 742 otr_initiate_smp(irc, args[1], args[2], args[3]); 774 743 } 775 744 … … 1187 1156 } 1188 1157 1158 /* combined handler for the 'otr smp' and 'otr smpq' commands */ 1159 void otr_initiate_smp(irc_t *irc, const char *nick, const char *question, 1160 const char *secret) 1161 { 1162 irc_user_t *u; 1163 ConnContext *ctx; 1164 1165 u = irc_user_by_name(irc, nick); 1166 if(!u || !u->bu || !u->bu->ic) { 1167 irc_usermsg(irc, "%s: unknown user", nick); 1168 return; 1169 } 1170 if(!(u->bu->flags & BEE_USER_ONLINE)) { 1171 irc_usermsg(irc, "%s is offline", nick); 1172 return; 1173 } 1174 1175 ctx = otrl_context_find(irc->otr->us, u->bu->handle, 1176 u->bu->ic->acc->user, u->bu->ic->acc->prpl->name, 1, NULL, NULL, NULL); 1177 if(!ctx) { 1178 /* huh? out of memory or what? */ 1179 return; 1180 } 1181 1182 if(ctx->smstate->nextExpected != OTRL_SMP_EXPECT1) { 1183 log_message(LOGLVL_INFO, 1184 "SMP already in phase %d, sending abort before reinitiating", 1185 ctx->smstate->nextExpected+1); 1186 otrl_message_abort_smp(irc->otr->us, &otr_ops, u->bu->ic, ctx); 1187 otrl_sm_state_free(ctx->smstate); 1188 } 1189 1190 /* warning: the following assumes that smstates are cleared whenever an SMP 1191 is completed or aborted! */ 1192 if(ctx->smstate->secret == NULL) { 1193 irc_usermsg(irc, "smp: initiating with %s...", u->nick); 1194 if(question) { 1195 otrl_message_initiate_smp_q(irc->otr->us, &otr_ops, 1196 u->bu->ic, ctx, question, 1197 (unsigned char *)secret, strlen(secret)); 1198 } else { 1199 otrl_message_initiate_smp(irc->otr->us, &otr_ops, 1200 u->bu->ic, ctx, (unsigned char *)secret, strlen(secret)); 1201 } 1202 /* smp is now in EXPECT2 */ 1203 } else { 1204 /* if we're still in EXPECT1 but smstate is initialized, we must have 1205 received the SMP1, so let's issue a response */ 1206 irc_usermsg(irc, "smp: responding to %s...", u->nick); 1207 otrl_message_respond_smp(irc->otr->us, &otr_ops, 1208 u->bu->ic, ctx, (unsigned char *)secret, strlen(secret)); 1209 /* smp is now in EXPECT3 */ 1210 } 1211 } 1212 1189 1213 /* helper to assert that account and protocol names given to ops below always 1190 1214 match the im_connection passed through as opdata */
Note: See TracChangeset
for help on using the changeset viewer.