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())); } }
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; }
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; }