📄 passport.cc
字号:
// Passport.cpp: implementation of the Passport class.////////////////////////////////////////////////////////////////////////#include <unistd.h>#include <sys/socket.h>#include <arpa/inet.h>#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <stdio.h>#include <string.h>#include "Passport.h"//#define _DEBUG_//////////////////////////////////////////////////////////////////////// Construction/Destruction////////////////////////////////////////////////////////////////////////Passport::Passport():utf8_to_gbk("utf-8","gbk")Passport::Passport() { m_ConnectionTimeout = 5; //Default... //----------------------------------- m_Buffer = NULL; m_CookieList = NULL; //------------------------------ //m_User[30] = NULL; //m_Pass[20] = NULL; memset(m_User,0,sizeof(m_User)); memset(m_Pass,0,sizeof(m_Pass)); //------------------------------ memset(m_ErrorText,0,sizeof(m_ErrorText)); strcpy(m_ErrorText, "欢迎您使用Kpassport 0.01\n"); m_International = false; m_Address = inet_addr("202.104.245.179"); strcpy(m_Host, "auth.stu.edu.cn"); strcpy(m_LoginASPX, "/auth/login.aspx"); strcpy(m_SuccessASPX, "/auth/logonSuccess.aspx");}Passport::~Passport(){ CookieList * CL; if (m_Buffer != NULL){ delete(m_Buffer); m_Buffer = NULL; } CL = m_CookieList; while (CL != NULL){ delete(CL->Name); delete(CL->Value); CL = CL->Next; }}int Passport::Login(char *User,char *Pass){ char HTTP[2048] = {0,}; char BODY[1024] = {0,}; int i; char * Temp; Temp = User; i = 0; while (i < 30){ i = EncodeData(m_User, i, *Temp); Temp++; //------------------------------------------------------------------ // if (*Temp == NULL) break; if (*Temp == '\0') break; //------------------------------------------------------------------ } //------------------------- //m_User[i] = NULL; m_User[i] = '\0'; //--------------------------- Temp = Pass; i = 0; while (i < 30){ i = EncodeData(m_Pass, i, *Temp); Temp++; //if (*Temp == NULL) break;---------------------------------- if (*Temp == '\0') break; //----------------------------------------------------------- } //m_Pass[i] = NULL; m_Pass[i] = '\0'; //---------------------------------------------------#ifdef _DEBUG_ printf("\nUser===: %s Pass====: %s\n\n", m_User, m_Pass);#endif //----------------------------- // GetStart ViewState //----------------------------- sprintf(HTTP, HTTP_GET, m_LoginASPX, m_Host, "");#ifdef _DEBUG_ printf("GET Header:\n%s\n\n", HTTP);#endif if (Post(HTTP) != 0) return false;#ifdef _DEBUG_ printf("Buffer Data:\n%s\n", m_Buffer);#endif if (!GetViewState()) return false;#ifdef _DEBUG_ printf("ViewState: %s\n", m_ViewState);#endif //----------------------------- // Post Login Message //----------------------------- // %1 : Password (S) // %2 : UserName (S) // %3 : Image X (D) // %4 : Image Y (D) // %5 : ViewState (S) sprintf(BODY, LOGIN_BODY, m_Pass, m_User, 10, 11, m_ViewState); //----------------------------- // Visit International Web? //----------------------------- if (m_International){ strcat(BODY, "&inland=1"); } // %1 : URI Address (S) // %2 : Host Name (auth.stu.edu.cn) (S) // %3 : Body Length (D) // %4 : Cookie (S) sprintf(HTTP, HTTP_POST, m_LoginASPX, m_Host, strlen(BODY), m_Cookie); strcat(HTTP, BODY);#ifdef _DEBUG_ printf("POST Header:\n%s\n", HTTP);#endif if (Post(HTTP) != 0) return false;#ifdef _DEBUG_ printf("Buffer Data:\n%s\n", m_Buffer);#endif switch (m_ReplyCode){ case 2: // Maybe Pass Or Name Error switch (GetMsg("error", BODY)){ case 0: strcpy(m_ErrorText, BODY); case 1: return false; default: strcpy(m_ErrorText, "未知的服务器错误!"); return false; }; case 3: // Maybe Login Success if (!GetLocation(BODY)) return false;#ifdef _DEBUG_ printf("Location: %s\n", BODY);#endif strcpy(m_RefreshURL, BODY); return Refresh(); case 4: // Data Error strcpy(m_ErrorText, "服务器拒绝访问!"); return false; case 5: strcpy(m_ErrorText, "服务器错误! 请联系网络中心修理服务器!"); return false; default: return false; };}int Passport::Logout()//void Passport::LOgout(int noreturn){ char HTTP[2048] = {0,}; char BODY[1024] = {0,}; //----------------------------- // %1 : UserName (S) // %2 : Image X (D) // %3 : Image Y (D) // %4 : ViewState (S) //-----------------------------#ifdef _DEBUG_ printf("Buffer Data:\n%s\n", m_Buffer);#endif if (GetViewState()){ sprintf(BODY, LOGOUT_BODY, m_User, 3, 5, m_ViewState); sprintf(HTTP, HTTP_POST, m_RefreshURL, m_Host, strlen(BODY), m_Cookie); strcat(HTTP, BODY);#ifdef _DEBUG_ printf("Post Header:\n%s\n", HTTP);#endif if (Post(HTTP) == 0){#ifdef _DEBUG_ printf("Buffer Data:\n%s\n", m_Buffer);#endif strcpy(m_ErrorText, "已经向服务器发送Logout请求!"); return true; } } return false;}int Passport::Refresh(){ char Msg[128] = {0,}; char HTTP[2048] = {0,}; //---------------------------- // Refresh OnLine Page //---------------------------- sprintf(HTTP, HTTP_GET, m_RefreshURL, m_Host, m_Cookie);#ifdef _DEBUG_ printf("GET Header:\n%s\n\n", HTTP);#endif if (Post(HTTP) != 0) return false;#ifdef _DEBUG_ printf("Buffer Data:\n%s\n", m_Buffer);#endif //if (stricmp(m_SuccessASPX, m_RefreshURL) <= 0){ if (strstr(m_Buffer, "<title>Internet Online</title>")){ switch (m_ReplyCode){ case 2: //if (strstr(m_Buffer, "<title>Internet Online</title>")){ if (GetMsg("showMessage", Msg) == 0){ strcpy(m_ErrorText, Msg); }else { strcpy(m_ErrorText, "你已经成功登录!"); } return true; default: strcpy(m_ErrorText, "登录失败!"); return false; }; }else { switch (GetMsg("error", Msg)){ case 0: strcpy(m_ErrorText, Msg); case 1: return false; default: strcpy(m_ErrorText, "未知的服务器错误!"); return false; }; }}char * Passport::GetLastError(){ if (strlen(m_ErrorText) > 0){ return m_ErrorText; }else { return NULL; }}int Passport::Post(char *Data){ //-------------------------------------------------------------------- //初始化socket - //-------------------------------------------------------------------- int sk; struct sockaddr_in server; int Ret, Len, Sum; char *Found = NULL; //====================NON-BLUCKING SOCKET===================== int flags, n, error; socklen_t len; fd_set rset, wset; struct timeval tval; //============================================================= sk = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if( sk== -1 ) { strcpy(m_ErrorText, "创建Socket连接变量错误!"); return 1; //NetWork Error }#ifdef _DEBUG_ printf("Socket Created!\n");#endif server.sin_family = AF_INET; server.sin_port = htons(80); server.sin_addr.s_addr = m_Address; //--------------------------------------------------------------------------------- // 要加入域名解析部分 //--------------------------------------------------------------------------------- //设置为非阻塞 flags = fcntl(sk, F_GETFL,0); fcntl(sk, F_SETFL, flags | O_NONBLOCK); error = 0; //============================================================ if (connect(sk, (struct sockaddr *)&server, sizeof(server)) == -1 ) { if (errno != EINPROGRESS) { close(sk); strcpy(m_ErrorText, "连接服务器错误!"); return 2; //NetWork Error } //========================================= FD_ZERO(&rset); FD_SET(sk, &rset); wset = rset; tval.tv_sec = m_ConnectionTimeout; tval.tv_usec = 0; if ( (n = select(sk + 1, &rset, &wset, NULL, m_ConnectionTimeout ? &tval : NULL)) == 0) { close(sk); /* timeout */ errno = ETIMEDOUT; strcpy(m_ErrorText, "连接服务器错误!"); return 2; //NetWork Error???????????????????????????????? //return (-1); } if (FD_ISSET(sk, &rset) || FD_ISSET(sk, &wset)) { len = sizeof(error); if (getsockopt(sk, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { //return (-1); /* Solaris pending error */ close(sk); /* timeout */ errno = ETIMEDOUT; strcpy(m_ErrorText, "连接服务器错误!"); return 2; //NetWork Error } } else { // printf("select error: sockfd not set"); //close(sk); /* timeout */ errno = ETIMEDOUT; strcpy(m_ErrorText, "连接服务器错误!:socket not set"); return 2; //NetWork Error ///exit(1); } } //==================Set Blocked================================= /* restore file status flags */ fcntl(sk, F_SETFL, flags); //====================================================#ifdef _DEBUG_ printf("Server Connected!\n");#endif //--------------------------------------------------------------------------------- // 发送请求信息 //-------------------------------------------------------------------------------- Sum = 0; Len = strlen(Data); while (Len > 0) { Ret = send(sk, (Data + Sum), Len, 0); if (Ret <= 0) { close(sk); strcpy(m_ErrorText, "发送请求出错!"); return 3; } else { Sum += Ret; Len -= Ret; } }#ifdef _DEBUG_ printf("Data Sent OK! [%d]\n", Sum);#endif //---------------------------------------------------------------------------------- // Begin Recv Data //---------------------------------------------------------------------------------- if (m_Buffer == NULL) { m_Buffer = new(char[KP_BUFFER_SIZE + 1]); //m_Buffer[KP_BUFFER_SIZE] = NULL;#ifdef _DEBUG_ printf("Buffer Created! \n");#endif } Sum = 0; while (Sum < KP_BUFFER_SIZE) { Ret = recv(sk, (m_Buffer + Sum), (KP_BUFFER_SIZE - Sum), 0); if (Ret <= 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -