void SocketIMEngineGlobal::init () { SCIM_DEBUG_IMENGINE(1) << "Init SocketIMEngine Global.\n"; String address = scim_get_default_socket_imengine_address (); m_socket_timeout = scim_get_default_socket_timeout (); m_socket_address.set_address (address); if (!m_socket_address.valid ()) return; // Connect to SocketFrontEnd. if (!create_connection ()) { SCIM_DEBUG_IMENGINE(2) << " Cannot connect to SocketFrontEnd (" << address << ").\n"; return; } SCIM_DEBUG_IMENGINE(2) << " Connected to SocketFrontEnd (" << address << ") MagicKey (" << m_socket_magic_key << ").\n"; // Init the connection, and get IMEngineFactory list. Transaction trans; // Get IMEngineFactory list. init_transaction (trans); trans.put_command (SCIM_TRANS_CMD_GET_FACTORY_LIST); trans.put_data (String ("")); if (!send_transaction (trans)) return; int cmd; if (trans.read_from_socket (m_socket_client, m_socket_timeout) && trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY && trans.get_data (m_peer_factories) && trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) { SCIM_DEBUG_IMENGINE(2) << " Found " << m_peer_factories.size () << " IMEngine Factories.\n"; } }
/* ** Login to the Authentication server ** ** Returns - 0 - failed to login for some reason. ** 1 - Logged in successfully */ int login(struct session * s) { int err; char credentials[16]; time_t logintime; int authsocket; struct transaction t; INT2 transactiontype; int addrsize; s->localaddr.sin_port = htons(0); authsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); err = bind(authsocket,(struct sockaddr *)&s->localaddr,sizeof(struct sockaddr_in)); if(err) { socketerror(s,"Error binding auth socket"); closesocket(authsocket); return 0; } err = connect(authsocket,(struct sockaddr *)&s->authhost,sizeof(struct sockaddr_in)); if(err) { socketerror(s,"Cant connect to auth server"); closesocket(authsocket); return 0; } addrsize = sizeof(struct sockaddr_in); err = getsockname(authsocket,(struct sockaddr *)&s->localipaddress,&addrsize); /* ** start the negotiation */ start_transaction(&t,T_MSG_PROTOCOL_NEG_REQ,s->sessionid); add_field_INT2(s,&t,T_PARAM_CLIENT_VERSION,LOGIN_VERSION * 100); add_field_string(s,&t,T_PARAM_OS_IDENTITY,s->osname); add_field_string(s,&t,T_PARAM_OS_VERSION,s->osrelease); add_field_INT2(s,&t,T_PARAM_PROTOCOL_LIST,T_PROTOCOL_CHAL); send_transaction(s,authsocket,&t); transactiontype = receive_transaction(s,authsocket,&t); if(transactiontype != T_MSG_PROTOCOL_NEG_RESP) { s->debug(0,"T_MSG_PROTOCOL_NEG_RESP - error transaction type (%d)",transactiontype); return 0; } extract_valueINT2(s,&t,T_PARAM_STATUS_CODE,&s->retcode); extract_valuestring(s,&t,T_PARAM_LOGIN_SERVER_HOST,s->loginserverhost); extract_valueINT2(s,&t,T_PARAM_PROTOCOL_SELECT,&s->protocol); if(s->protocol != T_PROTOCOL_CHAL) { s->debug(0,"T_MSG_PROTOCOL_NEG_RESP - Unsupported protocol (%d)",s->protocol); return 0; } switch(s->retcode) { case T_STATUS_SUCCESS: case T_STATUS_LOGIN_SUCCESS_SWVER: break; case T_STATUS_LOGIN_FAIL_SWVER: { s->debug(0,"T_MSG_PROTOCOL_NEG_RESP - Login failure: software version"); return 0; } case T_STATUS_LOGIN_FAIL_INV_PROT: { s->debug(0,"T_MSG_PROTOCOL_NEG_RESP - Login failure: invalid protocol"); return 0; } case T_STATUS_LOGIN_UNKNOWN: { s->debug(0,"T_MSG_PROTOCOL_NEG_RESP - Login failure: unknown"); return 0; } } closesocket(authsocket); authsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); err = bind(authsocket,(struct sockaddr *)&s->localaddr,sizeof(struct sockaddr_in)); if(err) { socketerror(s,"Error binding auth socket 2"); closesocket(authsocket); return 0; } err = connect(authsocket,(struct sockaddr *)&s->authhost,sizeof(struct sockaddr_in)); if(err) { socketerror(s,"Error connecting auth socket 2"); closesocket(authsocket); return 0; } start_transaction(&t,T_MSG_LOGIN_REQ,s->sessionid); add_field_string(s,&t,T_PARAM_USERNAME,s->username); add_field_INT2(s,&t,T_PARAM_CLIENT_VERSION,LOGIN_VERSION * 100); add_field_string(s,&t,T_PARAM_OS_IDENTITY,s->osname); add_field_string(s,&t,T_PARAM_OS_VERSION,s->osrelease); add_field_INT2(s,&t,T_PARAM_REASON_CODE,T_LOGIN_REASON_CODE_NORMAL); add_field_INT2(s,&t,T_PARAM_REQ_PORT,s->listenport); send_transaction(s,authsocket,&t); transactiontype = receive_transaction(s,authsocket,&t); if(transactiontype == T_MSG_LOGIN_RESP) goto skippo; if(transactiontype != T_MSG_AUTH_RESP) { s->debug(0,"T_MSG_AUTH_RESP - error transaction type (%d)",transactiontype); return 0; } if(!extract_valueINT2(s,&t,T_PARAM_HASH_METHOD,&s->hashmethod)) { s->debug(0,"T_MSG_AUTH_RESP - no hashmethod provided"); return 0; } if(!extract_valuestring(s,&t,T_PARAM_NONCE,s->nonce)) { s->debug(0,"T_MSG_AUTH_RESP - no nonce supplied"); return 0; } if(s->hashmethod == T_AUTH_MD5_HASH) { genmd5(s->password,strlen(s->password),s->password); } start_transaction(&t,T_MSG_LOGIN_AUTH_REQ,s->sessionid); s->timestamp = time(NULL); makecredentials(credentials,s,T_MSG_LOGIN_AUTH_REQ,s->timestamp); add_field_data(s,&t,T_PARAM_AUTH_CREDENTIALS,credentials,16); add_field_INT4(s,&t,T_PARAM_TIMESTAMP,s->timestamp); send_transaction(s,authsocket,&t); transactiontype = receive_transaction(s,authsocket,&t); skippo: if(transactiontype != T_MSG_LOGIN_RESP) { s->debug(0,"T_MSG_LOGIN_RESP - error transaction type (%d)",transactiontype); return 0; } extract_valueINT2(s,&t,T_PARAM_STATUS_CODE,&s->retcode); switch(s->retcode) { case T_STATUS_SUCCESS: case T_STATUS_LOGIN_SUCCESSFUL_SWVER: case T_STATUS_LOGIN_SUCCESSFUL_ALREADY_LOGGED_IN: break; case T_STATUS_USERNAME_NOT_FOUND: { s->debug(0,"T_MSG_LOGIN_RESP - Login failure: username not known"); return 0; } case T_STATUS_INCORRECT_PASSWORD: { s->debug(0,"T_MSG_LOGIN_RESP - Login failure: incorrect password"); return 0; } case T_STATUS_ACCOUNT_DISABLED: { s->debug(0,"T_MSG_LOGIN_RESP - Login failure: Account disabled"); return 0; } case T_STATUS_LOGIN_RETRY_LIMIT: case T_STATUS_USER_DISABLED: case T_STATUS_FAIL_USERNAME_VALIDATE: case T_STATUS_FAIL_PASSWORD_VALIDATE: case T_STATUS_LOGIN_UNKNOWN: { s->debug(0,"T_MSG_LOGIN_RESP - Login failure: other error"); return 0; } } extract_valueINT2(s,&t,T_PARAM_LOGOUT_SERVICE_PORT,&s->logoutport); extract_valueINT2(s,&t,T_PARAM_STATUS_SERVICE_PORT,&s->statusport); extract_valuestring(s,&t,T_PARAM_TSMLIST,s->tsmlist); extract_valuestring(s,&t,T_PARAM_RESPONSE_TEXT,s->resptext); { int i,n; char * p = s->tsmlist; char t[200]; s->tsmcount = 0; while((n = strcspn(p," ,"))!=0) { strncpy(t,p,n); t[n] = 0; p += n +1; strcpy(s->tsmlist_s[s->tsmcount],t); strcat(s->tsmlist_s[s->tsmcount++],s->authdomain); } for(i=0;i<s->tsmcount;i++) { struct hostent * he; he = gethostbyname(s->tsmlist_s[i]); if(he) { s->tsmlist_in[i].sin_addr.s_addr = *((int*)(he->h_addr_list[0])); } else { s->tsmlist_in[i].sin_addr.s_addr = inet_addr(s->tsmlist_s[i]); } s->debug(1,"Will accept heartbeats from %s = %s\n",s->tsmlist_s[i],inet_ntoa(s->tsmlist_in[i].sin_addr)); } } logintime = time(NULL); s->debug(0,"Logged on as %s - successful at %s",s->username,asctime(localtime(&logintime))); s->sequence = 0; s->lastheartbeat = time(NULL); s->recenthb = 0; closesocket(authsocket); return 1; }
/* ** Logout of the BIDS2 system ** ** Returns - 0 - Could not connect to logout. ** 1 - Logout successful. */ int logout(INT2 reason,struct session * s) { int err; char credentials[16]; time_t logintime; int authsocket; struct transaction t; INT2 transactiontype; s->localaddr.sin_port = htons(0); authsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); err = bind(authsocket,(struct sockaddr *)&s->localaddr,sizeof(struct sockaddr_in)); if(err) { socketerror(s,"Error binding logout auth socket"); closesocket(authsocket); return 0; } err = connect(authsocket,(struct sockaddr *)&s->authhost,sizeof(struct sockaddr_in)); if(err) { socketerror(s,"Error connecting logout auth socket"); closesocket(authsocket); return 0; } /* ** start the negotiation */ start_transaction(&t,T_MSG_LOGOUT_REQ,s->sessionid); add_field_string(s,&t,T_PARAM_USERNAME,s->username); add_field_INT2(s,&t,T_PARAM_CLIENT_VERSION,LOGIN_VERSION * 100); add_field_string(s,&t,T_PARAM_OS_IDENTITY,s->osname); add_field_string(s,&t,T_PARAM_OS_VERSION,s->osrelease); add_field_INT2(s,&t,T_PARAM_REASON_CODE,reason); send_transaction(s,authsocket,&t); transactiontype = receive_transaction(s,authsocket,&t); if(transactiontype != T_MSG_AUTH_RESP) { s->critical("logic error"); } if(!extract_valueINT2(s,&t,T_PARAM_HASH_METHOD,&s->hashmethod)) { s->critical("AUTH: no hashmethod"); } if(!extract_valuestring(s,&t,T_PARAM_NONCE,s->nonce)) { s->critical("Auth: no nonce"); } if(s->hashmethod == T_AUTH_MD5_HASH) { genmd5(s->password,strlen(s->password),s->password); } start_transaction(&t,T_MSG_LOGOUT_AUTH_RESP,s->sessionid); s->timestamp = time(NULL); makecredentials(credentials,s,T_MSG_LOGOUT_AUTH_RESP,s->timestamp); add_field_data(s,&t,T_PARAM_AUTH_CREDENTIALS,credentials,16); add_field_INT4(s,&t,T_PARAM_TIMESTAMP,s->timestamp); send_transaction(s,authsocket,&t); transactiontype = receive_transaction(s,authsocket,&t); if(transactiontype != T_MSG_LOGOUT_RESP) { s->critical("logic error"); } extract_valueINT2(s,&t,T_PARAM_STATUS_CODE,&s->retcode); switch(s->retcode) { case T_STATUS_SUCCESS: case T_STATUS_LOGOUT_SUCCESSFUL_ALREADY_DISCONNECTED: break; case T_STATUS_USERNAME_NOT_FOUND: s->critical("Login failure: username not known"); case T_STATUS_INCORRECT_PASSWORD: s->critical("Login failure: incorrect password"); case T_STATUS_ACCOUNT_DISABLED: s->critical("Login failure: disabled"); case T_STATUS_LOGIN_RETRY_LIMIT: case T_STATUS_USER_DISABLED: case T_STATUS_FAIL_USERNAME_VALIDATE: case T_STATUS_FAIL_PASSWORD_VALIDATE: case T_STATUS_LOGIN_UNKNOWN: s->critical("Login failure: other error"); } extract_valueINT2(s,&t,T_PARAM_LOGOUT_SERVICE_PORT,&s->logoutport); extract_valueINT2(s,&t,T_PARAM_STATUS_SERVICE_PORT,&s->statusport); extract_valuestring(s,&t,T_PARAM_TSMLIST,s->tsmlist); extract_valuestring(s,&t,T_PARAM_RESPONSE_TEXT,s->resptext); logintime = time(NULL); s->debug(0,"Logged out successful at %s",asctime(localtime(&logintime))); closesocket(authsocket); return 1; }
String SocketIMEngineGlobal::load_icon (const String &icon) { String local_icon = icon; IconRepository::const_iterator it = m_icon_repository.find (icon); // The icon has been loaded, just return the local copy filename. if (it != m_icon_repository.end ()) local_icon = it->second; // This icon is already available in local system, just return. if (scim_load_file (local_icon, 0) != 0) return local_icon; Transaction trans; int cmd; char *bufptr = 0; size_t filesize = 0; local_icon = String (""); init_transaction (trans); trans.put_command (SCIM_TRANS_CMD_LOAD_FILE); trans.put_data (icon); // Load icon file from remote SocketFrontEnd. if (send_transaction (trans) && receive_transaction (trans) && trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY && trans.get_data (&bufptr, filesize) && trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) { String tempfile; String::size_type pos = icon.rfind (SCIM_PATH_DELIM); if (pos != String::npos) { tempfile = icon.substr (pos + 1, String::npos); } else { tempfile = icon; } char tmp [80]; snprintf (tmp, 80, "%lu", (unsigned long) m_socket_magic_key); tempfile = String (SCIM_TEMPDIR) + String (SCIM_PATH_DELIM_STRING) + String ("scim-") + String (tmp) + String ("-") + tempfile; SCIM_DEBUG_IMENGINE(1) << "Creating temporary icon file: " << tempfile << "\n"; std::ofstream os (tempfile.c_str ()); if (os) { os.write (bufptr, filesize); os.close (); // Check if the file is written correctly. if (scim_load_file (tempfile, 0) == filesize) { m_icon_repository [icon] = tempfile; local_icon = tempfile; } else { unlink (tempfile.c_str ()); } } } delete [] bufptr; return local_icon; }