Ejemplo n.º 1
0
/*
 * implements /otr authabort
 */
void otr_auth_abort(SERVER_REC *irssi, const char *nick)
{
	ConnContext *ctx;

	assert(irssi);
	assert(nick);

	ctx = otr_find_context(irssi, nick, FALSE);
	if (!ctx) {
		IRSSI_NOTICE(irssi, nick, "Context for %9%s%9 not found.", nick);
		goto end;
	}

	otrl_message_abort_smp(user_state_global->otr_state, &otr_ops, irssi, ctx);
	otr_status_change(irssi, nick, OTR_STATUS_SMP_ABORT);

	if (ctx->smstate->nextExpected != OTRL_SMP_EXPECT1) {
		IRSSI_NOTICE(irssi, nick, "%rOngoing authentication aborted%n");
	} else {
		IRSSI_NOTICE(irssi, nick, "%rAuthentication aborted%n");
	}

end:
	return;
}
Ejemplo n.º 2
0
void OtrInternal::abortSMP(ConnContext *context, TreeModelItem &item)
{
    otrl_message_abort_smp( m_userstate, &m_uiOps, this, context);
    if (context->active_fingerprint->trust && !context->active_fingerprint->trust[0]) {
        gone_secure(context);
        sendCustomNessage(item,tr("Authentication aborded. The conversation is now insecure!"));
    }
}
Ejemplo n.º 3
0
void
otrlib_handle_tlvs(OtrlUserState user_state, OtrlMessageAppOps *ops, ConnContext *context, OtrlTLV *tlvs, GHashTable *smp_initiators)
{
    NextExpectedSMP nextMsg = context->smstate->nextExpected;
    OtrlTLV *tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP1);
    if (tlv) {
        if (nextMsg != OTRL_SMP_EXPECT1) {
            otrl_message_abort_smp(user_state, ops, NULL, context);
        } else {
            ProfChatWin *chatwin = wins_get_chat(context->username);
            if (chatwin) {
                chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_INIT, NULL);
            }
            g_hash_table_insert(smp_initiators, strdup(context->username), strdup(context->username));
        }
    }
    tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP1Q);
    if (tlv) {
        if (nextMsg != OTRL_SMP_EXPECT1) {
            otrl_message_abort_smp(user_state, ops, NULL, context);
        } else {
            ProfChatWin *chatwin = wins_get_chat(context->username);
            if (chatwin) {
                char *question = (char *)tlv->data;
                char *eoq = memchr(question, '\0', tlv->len);
                if (eoq) {
                    chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_INIT_Q, question);
                }
            }
        }
    }
    tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP2);
    if (tlv) {
        if (nextMsg != OTRL_SMP_EXPECT2) {
            otrl_message_abort_smp(user_state, ops, NULL, context);
        } else {
            context->smstate->nextExpected = OTRL_SMP_EXPECT4;
        }
    }
    tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP3);
    if (tlv) {
        if (nextMsg != OTRL_SMP_EXPECT3) {
            otrl_message_abort_smp(user_state, ops, NULL, context);
        } else {
            context->smstate->nextExpected = OTRL_SMP_EXPECT1;
            ProfChatWin *chatwin = wins_get_chat(context->username);
            if (chatwin) {
                if (context->smstate->received_question == 0) {
                    if (context->active_fingerprint->trust && (context->active_fingerprint->trust[0] != '\0')) {
                        chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_SUCCESS, NULL);
                        chatwin_otr_trust(chatwin);
                    } else {
                        chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_SENDER_FAIL, NULL);
                        chatwin_otr_untrust(chatwin);
                    }
                } else {
                    if (context->smstate->sm_prog_state == OTRL_SMP_PROG_SUCCEEDED) {
                        chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_SUCCESS_Q, NULL);
                    } else {
                        chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_FAIL_Q, NULL);
                    }
                }
            }
        }
    }
    tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP4);
    if (tlv) {
        if (nextMsg != OTRL_SMP_EXPECT4) {
            otrl_message_abort_smp(user_state, ops, NULL, context);
        } else {
            context->smstate->nextExpected = OTRL_SMP_EXPECT1;
            ProfChatWin *chatwin = wins_get_chat(context->username);
            if (chatwin) {
                if (context->active_fingerprint->trust && (context->active_fingerprint->trust[0] != '\0')) {
                    chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_SUCCESS, NULL);
                    chatwin_otr_trust(chatwin);
                } else {
                    chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_RECEIVER_FAIL, NULL);
                    chatwin_otr_untrust(chatwin);
                }
            }
        }
    }
    tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP_ABORT);
    if (tlv) {
        context->smstate->nextExpected = OTRL_SMP_EXPECT1;
        ProfChatWin *chatwin = wins_get_chat(context->username);
        if (chatwin) {
            chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_ABORT, NULL);
            chatwin_otr_untrust(chatwin);
        }
        otr_untrust(context->username);
    }
}
Ejemplo n.º 4
0
static void
cb_handle_smp_event(void *opdata, OtrlSMPEvent smp_event,
    ConnContext *context, unsigned short progress_percent,
    char *question)
{
    NextExpectedSMP nextMsg = context->smstate->nextExpected;
    OtrlUserState user_state = otr_userstate();
    OtrlMessageAppOps *ops = otr_messageops();
    GHashTable *smp_initiators = otr_smpinitators();

    switch(smp_event)
    {
        case OTRL_SMPEVENT_ASK_FOR_SECRET:
            ui_smp_recipient_initiated(context->username);
            g_hash_table_insert(smp_initiators, strdup(context->username), strdup(context->username));
            break;

        case OTRL_SMPEVENT_ASK_FOR_ANSWER:
            ui_smp_recipient_initiated_q(context->username, question);
            break;

        case OTRL_SMPEVENT_SUCCESS:
            if (context->smstate->received_question == 0) {
                ui_smp_successful(context->username);
                ui_trust(context->username);
            } else {
                ui_smp_answer_success(context->username);
            }
            break;

        case OTRL_SMPEVENT_FAILURE:
            if (context->smstate->received_question == 0) {
                if (nextMsg == OTRL_SMP_EXPECT3) {
                    ui_smp_unsuccessful_sender(context->username);
                } else if (nextMsg == OTRL_SMP_EXPECT4) {
                    ui_smp_unsuccessful_receiver(context->username);
                }
                ui_untrust(context->username);
            } else {
                ui_smp_answer_failure(context->username);
            }
            break;

        case OTRL_SMPEVENT_ERROR:
            otrl_message_abort_smp(user_state, ops, NULL, context);
            break;

        case OTRL_SMPEVENT_CHEATED:
            otrl_message_abort_smp(user_state, ops, NULL, context);
            break;

        case OTRL_SMPEVENT_ABORT:
            ui_smp_aborted(context->username);
            ui_untrust(context->username);
            break;

        case OTRL_SMPEVENT_IN_PROGRESS:
            break;

        default:
            break;
    }
}
Ejemplo n.º 5
0
void OtrInternal::abortSMP(ConnContext* context)
{
    otrl_message_abort_smp(m_userstate, &m_uiOps, this, context);
}