/* * === FUNCTION ====================================================================== * Name: action_by_eap_type * Description: 根据eap报文的类型完成相关的应答 * ===================================================================================== */ void action_by_eap_type(enum EAPType pType, const struct eap_header *eap_head, const struct pcap_pkthdr *packetinfo, const uint8_t *packet) { // printf("PackType: %d\n", pType); switch(pType){ case EAP_SUCCESS: action_eapol_success (eap_head, packetinfo, packet); break; case EAP_FAILURE: action_eapol_failre (eap_head, packetinfo, packet); break; case EAP_REQUEST_IDENTITY: action_eap_req_idnty (eap_head, packetinfo, packet); break; case EAP_REQUETS_MD5_CHALLENGE: action_eap_req_md5_chg (eap_head, packetinfo, packet); break; case RUIJIE_EAPOL_MSG: print_server_info (packet, packetinfo->caplen, RUIJIE_EAPOL_MSG); break; default: return; } }
void action_eapol_failre(const struct eap_header *eap_head, const struct pcap_pkthdr *packetinfo, const uint8_t *packet) { extern int background; extern int exit_flag; extern pthread_t exit_waiter_id; state = READY; fprintf(stdout, ">>Protocol: EAP_FAILURE\n"); if(state == ONLINE){ fprintf(stdout, "&&Info: SERVER Forced Logoff\n"); } if (state == STARTED){ fprintf(stdout, "&&Info: Invalid Username or Client info mismatch.\n"); } if (state == ID_AUTHED){ fprintf(stdout, "&&Info: Invalid Password.\n"); } print_server_info (packet, packetinfo->caplen, EAP_FAILURE); if (exit_flag) { fprintf(stdout, "&&Info: Session Ended.\n"); pcap_breakloop (handle); } else{ exit_flag = 1; if (pthread_create (&exit_waiter_id, NULL, thread_wait_exit, NULL) != 0) { fprintf(stderr, "@@Fatal ERROR: Thread failure.\n"); exit (EXIT_FAILURE); } } }
void action_eapol_success(const struct eap_header *eap_head, const struct pcap_pkthdr *packetinfo, const uint8_t *packet) { extern enum STATE state; extern int background; extern pthread_t live_keeper_id; state = ONLINE; fprintf(stdout, ">>Protocol: EAP_SUCCESS\n"); fprintf(stdout, "&&Info: Authorized Access to Network. \n"); print_server_info (packet, packetinfo->caplen, EAP_SUCCESS); /* 成为后台守护进程 */ if (background){ background = 0; /* 防止以后误触发 */ daemon_init(); } /* 获得succes_key */ ruijie_succes_key = ntohl ( ruijie_byte_to_int32 ( (const uint8_t*)(packet + 0x104))); /* 打开保持线程 */ if ( !live_keeper_id ) { if ( pthread_create(&live_keeper_id, NULL, keep_alive, NULL) != 0 ){ fprintf(stderr, "@@Fatal ERROR: " "Init Life Keeper Thread Failure.\n"); exit (EXIT_FAILURE); } } }
int main(int argc, char *argv[]) { FSServer *svr; char *servername = NULL; int i; progname = argv[0]; for (i = 1; i < argc; i++) { if (strncmp(argv[i], "-s", 2) == 0) { if (++i > argc) usage(); servername = argv[i]; } else { usage(); } } svr = FSOpenServer(servername); if (!svr) { if (FSServerName(servername) == NULL) { fprintf(stderr, "%s: no font server defined\n", progname); exit(1); } fprintf(stderr, "%s: unable to open server \"%s\"\n", progname, FSServerName(servername)); exit(1); } print_server_info(svr); FSCloseServer(svr); exit(0); }
int main(int argc, char *argv[]) { int i; init(); /* Init some variables (like malloc timestamp string, encrypt text string, etc.) */ check_par(argc, argv); /* Check command arguments number */ open_config(argv); /* Open config file and check if it failed */ open_log(argv); /* Open log file and check if it failed */ get_ipaddr(); /* Get server IP address */ create_socket(); /* Create a socket */ bind_socket(); /* Bind the socket */ listen_socket(); /* Listen at the socket */ print_server_info(); /* Print server information */ while (TRUE) { /* Read until the end of file */ if (read_flag) { if (fscanf(fcfg, "%s", enc_txt) == EOF) { finish_flag = 1; break; } else { fscanf(fcfg, "%s", dec_txt); } } read_flag = 0; init_select(); /* Select function */ if (select_func() == -1) break; for (i = 0; i < max_fds + 1; i++) { if (FD_ISSET(i, &rfds)) { if (i == sockfd) { /* If have a new client connect */ if (accept_new_cli() == -1) break; /* Try to accept new client */ if (check_connect() == -1) break; /* Check connect message from client */ if (print_client_info() == -1) break; /* Print the information of client side */ store_client_ip(); /* Store the client ip address */ break; } else { /* If have new message from client side */ client_ip = get_host_by_sockfd(i); /* Get the client ip address by socket */ recv_socket_msg(i, recv_mark); /* Get the message from socket */ handle_client_msg(i); /* Handle client message (SUCCESS_MSG, FAILURE_MSG, DISPATCH_MSG, etc.) */ break; } } if (main_flag == EXIT_FAILURE) break; } if (main_flag == EXIT_FAILURE) break; } remained_cli = ask_clients_quit(); /* Ask clients quit and count the remain clients number */ wait_clients_quit(); /* Wait for all clients quit */ quit_server(); /* Clean up and quit server, also print the message to log */ return main_flag; }
/* * === FUNCTION ====================================================================== * Name: action_by_eap_type * Description: 根据eap报文的类型完成相关的应答 * ===================================================================================== */ void action_by_eap_type(enum EAPType pType, const struct eap_header *header, const struct pcap_pkthdr *packetinfo, const uint8_t *packet) { // printf("PackType: %d\n", pType); switch(pType){ case EAP_SUCCESS: state = ONLINE; fprintf(stdout, ">>Protocol: EAP_SUCCESS\n"); fprintf(stdout, "&&Info: Authorized Access to Network. \n"); print_server_info (packet, packetinfo->caplen); if (background){ background = 0; /* 防止以后误触发 */ daemon_init(); } break; case EAP_FAILURE: state = READY; fprintf(stdout, ">>Protocol: EAP_FAILURE\n"); if(state == ONLINE){ fprintf(stdout, "&&Info: SERVER Forced Logoff\n"); } if (state == STARTED){ fprintf(stdout, "&&Info: Invalid Username or Client info mismatch.\n"); } if (state == ID_AUTHED){ fprintf(stdout, "&&Info: Invalid Password.\n"); } print_server_info (packet, packetinfo->caplen); pcap_breakloop (handle); break; case EAP_REQUEST_IDENTITY: if (state == STARTED){ fprintf(stdout, ">>Protocol: REQUEST EAP-Identity\n"); } send_eap_packet(EAP_RESPONSE_IDENTITY); break; case EAP_REQUETS_MD5_CHALLENGE: state = ID_AUTHED; fprintf(stdout, ">>Protocol: REQUEST MD5-Challenge(PASSWORD)\n"); fill_password_md5((uint8_t*)header->eap_md5_challenge, header->eap_id); send_eap_packet(EAP_RESPONSE_MD5_CHALLENGE); break; case EAP_REQUEST_IDENTITY_KEEP_ALIVE: if (state == ONLINE){ fprintf(stdout, ">>Protocol: REQUEST EAP_REQUEST_IDENTITY_KEEP_ALIVE\n"); } // // 使用伪IP模式认证成功后,获取真实IP,并写入RES/IDTY数据块 // if (use_pseudo_ip){ // // //若获取成功,关闭伪IP模式标签 // if (set_device_new_ip() == 0) { // use_pseudo_ip = 0; // } // } send_eap_packet(EAP_RESPONSE_IDENTITY_KEEP_ALIVE); break; default: return; } }