Exemple #1
0
MsgReceived::MsgReceived(MsgEdit *parent, Message *msg, bool bOpen)
        : QObject(parent), EventReceiver(HighPriority - 1)
{
    m_id	  = msg->id();
    m_contact = msg->contact();
    m_client  = msg->client();
    m_edit    = parent;
    m_bOpen	  = bOpen;
    m_msg	  = msg;
    m_type	  = msg->baseType();

    if (m_bOpen){
        m_edit->m_edit->setReadOnly(true);
        m_edit->m_edit->setTextFormat(QTextEdit::RichText);
        QString p = msg->presentation();
        if (p.isEmpty())
            p = msg->getRichText();
        Event e(EventEncodeText, &p);
        e.process();
        p = MsgViewBase::parseText(p, CorePlugin::m_plugin->getOwnColors(), CorePlugin::m_plugin->getUseSmiles());
        m_edit->m_edit->setText(p);
        if ((msg->getBackground() != msg->getForeground()) && !CorePlugin::m_plugin->getOwnColors()){
            m_edit->m_edit->setBackground(msg->getBackground());
            m_edit->m_edit->setForeground(msg->getForeground());
        }
        for (list<msg_id>::iterator it = CorePlugin::m_plugin->unread.begin(); it != CorePlugin::m_plugin->unread.end(); ++it){
            if (((*it).id == msg->id()) &&
                    ((*it).contact == msg->contact()) &&
                    ((*it).client == msg->client())){
                CorePlugin::m_plugin->unread.erase(it);
                Event eRead(EventMessageRead, msg);
                eRead.process();
                break;
            }
        }
        m_edit->setupNext();
    }else{
        connect(m_edit->m_edit, SIGNAL(textChanged()), m_edit, SLOT(setInput()));
    }
}
Exemple #2
0
int
gss_check(int sock)
{
	struct sockaddr_in remote, local;
	socklen_t       addrlen;
	char           *name;

	gss_buffer_desc input_token, output_token;
	gss_cred_id_t   delegated_cred_handle = GSS_C_NO_CREDENTIAL;
	OM_uint32       maj_stat, min_stat;
	gss_name_t      client_name;
	gss_buffer_desc export_name;
	gss_channel_bindings_t input_chan_bindings;

	tunnel_ctx_t* tunnel_ctx = createGssContext(sock);
	if( tunnel_ctx == NULL ) {
		return -1;
	}

#ifndef MIT_KRB5
# if 0 /*VP This does not work neither with GT4 nor Heimdal */
	delegated_cred_handle = malloc(sizeof(*delegated_cred_handle));
	memset((char *) delegated_cred_handle, 0,
	       sizeof(*delegated_cred_handle));
# endif
#endif	/* ! MIT_KRB5 */


	addrlen = sizeof(local);
	if (getsockname(sock, (struct sockaddr *) & local, &addrlen) < 0
	    || addrlen != sizeof(local)) {
#ifdef SHOW_ERROR
		perror("getsockname");
#endif
		return -1;
	}
	addrlen = sizeof(remote);
	if (getpeername(sock, (struct sockaddr *) & remote, &addrlen) < 0
	    || addrlen != sizeof(remote)) {
#ifdef SHOW_ERROR
		perror("getpeername");
#endif
		return -1;
	}
	input_chan_bindings = malloc(sizeof(struct gss_channel_bindings_struct));

	sockaddr_to_gss_address((struct sockaddr *) & local,
				&input_chan_bindings->initiator_addrtype,
				&input_chan_bindings->initiator_address);
	sockaddr_to_gss_address((struct sockaddr *) & remote,
				&input_chan_bindings->acceptor_addrtype,
				&input_chan_bindings->acceptor_address);

	input_chan_bindings->application_data.length = 0;
	input_chan_bindings->application_data.value = NULL;

	do {

		input_token.value = malloc(MAXBUF);
		input_token.length = eRead(sock, input_token.value, MAXBUF);

		maj_stat = gss_accept_sec_context(&min_stat,
						  &tunnel_ctx->context_hdl,
						  GSS_C_NO_CREDENTIAL,
						  &input_token,
						  input_chan_bindings,
						  &client_name,
						  NULL,
						  &output_token,
						  NULL,
						  NULL,
						  &delegated_cred_handle);

		if (GSS_ERROR(maj_stat)) {
			gss_print_errors(maj_stat);
		}

		gss_release_buffer(&min_stat, &input_token);

		if (output_token.length != 0) {
			eWrite(sock, output_token.value, output_token.length);
			printf("sended token %d\n", output_token.length);
			gss_release_buffer(&min_stat, &output_token);
		}

		if (maj_stat == GSS_S_COMPLETE) {
			printf("GSS OK\n");
			if (GSS_ERROR(maj_stat)) {
				gss_print_errors(maj_stat);
			}
			maj_stat = gss_export_name(&min_stat, client_name, &export_name);

			if (GSS_ERROR(maj_stat)) {
				gss_print_errors(maj_stat);
			}
			name = realloc(export_name.value, export_name.length + 1);
			name[export_name.length] = '\0';
#if 0
			printf("name = %s\n", name); fflush(stdout);
#endif
		}




	} while( maj_stat == GSS_S_CONTINUE_NEEDED ) ;

	return 0;
}
Exemple #3
0
int
gssAuth(int sock, tunnel_ctx_t* tunnel_ctx, const char *hostname, const char *service)
{
	struct sockaddr_in6 remote, local;
	socklen_t       addrlen;

	gss_buffer_desc real_input_token, real_output_token;
	gss_buffer_t    input_token = &real_input_token, output_token = &real_output_token;
	OM_uint32       maj_stat, min_stat;
	gss_name_t      server = GSS_C_NO_NAME;
	gss_channel_bindings_t input_chan_bindings;



	if (import_name(service, hostname, &server) < 0) {
		return -1;
	}
	addrlen = sizeof(local);
	if (getsockname(sock, (struct sockaddr *) & local, &addrlen) < 0
	    || addrlen > sizeof(local)) {
#ifdef SHOW_ERROR
		perror("sockname");
#endif
		return -1;
	}
	addrlen = sizeof(remote);
	if (getpeername(sock, (struct sockaddr *) & remote, &addrlen) < 0
	    || addrlen > sizeof(remote)) {
#ifdef SHOW_ERROR
		perror("getpeer");
#endif
		return -1;
	}
	input_token->length = 0;
	input_token->value = NULL;

	output_token->length = 0;
	output_token->value = NULL;

#ifdef GSIGSS
	input_chan_bindings = GSS_C_NO_CHANNEL_BINDINGS;
#else
	input_chan_bindings = malloc(sizeof(struct gss_channel_bindings_struct));

	sockaddr_to_gss_address((struct sockaddr *) & local,
				&input_chan_bindings->initiator_addrtype,
				&input_chan_bindings->initiator_address);
	sockaddr_to_gss_address((struct sockaddr *) & remote,
				&input_chan_bindings->acceptor_addrtype,
				&input_chan_bindings->acceptor_address);

	input_chan_bindings->application_data.length = 0;
	input_chan_bindings->application_data.value = NULL;
#endif
	while (!tunnel_ctx->isAuthentificated) {
		maj_stat =
			gss_init_sec_context(&min_stat,
					     GSS_C_NO_CREDENTIAL,
					     &tunnel_ctx->context_hdl,
					     server,
					     GSS_C_NO_OID,
				     	 GSS_C_MUTUAL_FLAG | GSS_C_SEQUENCE_FLAG,
					     0,
					     input_chan_bindings,
					     input_token,
					     NULL,
					     output_token,
					     NULL,
					     NULL);

		if (tunnel_ctx->context_hdl == NULL) {
			gss_print_errors(min_stat);
			/* send a waste to the server */
			eWrite(sock, "123", 3);
			return -1;
		}
		if ((maj_stat != GSS_S_CONTINUE_NEEDED) && (maj_stat != GSS_S_COMPLETE)) {
			gss_print_errors(min_stat);
			/* send a waste to the server */
			eWrite(sock, "123", 3);
			return -1;
		}
		if (output_token->length > 0) {
			eWrite(sock, output_token->value, output_token->length);
			gss_release_buffer(&min_stat, output_token);
		}
		if (maj_stat & GSS_S_CONTINUE_NEEDED) {
			if( input_token->value == NULL ) {
				input_token->value = malloc(MAXBUF);
			}

            if( input_token->value == NULL ) {
                return -1;
            }

			input_token->length = eRead(sock, input_token->value, MAXBUF);
			if( (input_token->length < 0 ) || (input_token->length > MAXBUF) ) {
				/* incorrect length */
				free(input_token->value);
				input_token->value = NULL;
				return -1;
			}
		} else {
			tunnel_ctx->isAuthentificated = 1;
		}

	}

	return 1;
}