int cgiMain() { int result; #ifdef DEBUG fprintf(stderr, "========== LED.CGI Start ===========.\n"); #endif // 初始化 session session_start(g_session_datadir); do { if (session_get("USERNAME") != NULL) { if (strcmp(session_get("USERNAME"), g_login_username) == 0) { result = control_process(); break; } } result = login_process(); } while (0); #ifdef DEBUG fprintf(cgiOut, "========== LED.CGI End ===========.\n"); #endif return result; }
/* * High-level handling of login requests * Uses login specific routines from login.c * */ static int process_login_request(sp_session *s, struct request *req) { int ret; sp_error error; unsigned char key_recv[32], key_send[32]; if(req->state == REQ_STATE_NEW) { req->state = REQ_STATE_RUNNING; s->login = login_create(s->username, s->password); if(s->login == NULL) return request_set_result(s, req, SP_ERROR_OTHER_TRANSIENT, NULL); } /* * A call to sp_session_logout() will post a REQ_TYPE_LOGOUT * It will trigger a call to process_logout_request() which in turn * will call login_release() on s->login and set it to NULL. * * We check for this condition here and return SP_ERROR_OTHER_TRANSIENT * */ if(s->login == NULL) { /* Fail login with SP_ERROR_OTHER_TRANSIENT */ return request_set_result(s, req, SP_ERROR_OTHER_TRANSIENT, NULL); } ret = login_process(s->login); if(ret == 0) return 0; else if(ret == 1) { login_export_session(s->login, &s->sock, key_recv, key_send); login_release(s->login); s->login = NULL; shn_key(&s->shn_recv, key_recv, sizeof(key_recv)); s->key_recv_IV = 0; shn_key(&s->shn_send, key_send, sizeof(key_send)); s->key_send_IV = 0; s->connectionstate = SP_CONNECTION_STATE_LOGGED_IN; DSFYDEBUG("Logged in\n"); return request_set_result(s, req, SP_ERROR_OK, NULL); } switch(s->login->error) { case SP_LOGIN_ERROR_DNS_FAILURE: case SP_LOGIN_ERROR_NO_MORE_SERVERS: error = SP_ERROR_UNABLE_TO_CONTACT_SERVER; break; case SP_LOGIN_ERROR_UPGRADE_REQUIRED: error = SP_ERROR_CLIENT_TOO_OLD; break; case SP_LOGIN_ERROR_USER_BANNED: error = SP_ERROR_USER_BANNED; break; case SP_LOGIN_ERROR_USER_NOT_FOUND: case SP_LOGIN_ERROR_BAD_PASSWORD: error = SP_ERROR_BAD_USERNAME_OR_PASSWORD; break; case SP_LOGIN_ERROR_USER_NEED_TO_COMPLETE_DETAILS: case SP_LOGIN_ERROR_USER_COUNTRY_MISMATCH: case SP_LOGIN_ERROR_OTHER_PERMANENT: error = SP_ERROR_OTHER_PERMANENT; break; case SP_LOGIN_ERROR_SOCKET_ERROR: default: error = SP_ERROR_OTHER_TRANSIENT; break; } login_release(s->login); s->login = NULL; DSFYDEBUG("Login failed with error: %s\n", sp_error_message(error)); return request_set_result(s, req, error, NULL); }