123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635 |
- /*****************************************************************
- *****************************************************************
- *** **
- *** (C)Copyright 2005-2006, American Megatrends Inc. **
- *** **
- *** All Rights Reserved. **
- *** **
- *** 6145-F, Northbelt Parkway, Norcross, **
- *** **
- *** Georgia - 30071, USA. Phone-(770)-246-8600. **
- *** **
- *****************************************************************
- *****************************************************************
- ******************************************************************
- *
- * AMIResetPass.c
- * AMI REset password related implementation.
- *
- * Author: Gokula Kannan. S <gokulakannans@amiindia.co.in>
- ******************************************************************/
- #include "Debug.h"
- #include "Support.h"
- #include "SharedMem.h"
- #include "PMConfig.h"
- #include "NVRData.h"
- #include "NVRAccess.h"
- #include "IPMIDefs.h"
- #include "IPMI_AMIResetPass.h"
- #include "AMIResetPass.h"
- #include "AppDevice.h"
- #include "IPMI_AppDevice.h"
- #include "IPMI_AMIDevice.h"
- #include "ipmi_userifc.h"
- #include "smtpclient.h"
- #include "nwcfg.h"
- #include "Session.h"
- #include "IPMI_AMISmtp.h"
- #include "AMISmtp.h"
- #include "Ethaddr.h"
- //#include "IPMIConf.h"
- #include "userprivilege.h"
- #include "featuredef.h"
- #include "blowfish.h"
- //Local Macros for Linux root user access
- #define LINUX_USER_MIN_PASSWORD_LEN 8
- #define LINUX_USER_MAX_PASSWORD_LEN 64
- #define OP_ONLY_CMD_LENGTH 1
- #define OP_SET_ROOT_PASSWD 2
- #define OP_ENABLE_USER_ID 1
- #define OP_DISABLE_USER_ID 0
- #define LINUX_ROOT_USER_UID 0
- static int validate_email(const char *emailaddr)
- {
- int valid = 0;
- const char *pTemp, *domain;
- static char *special_char = "()<>@,;:\\\"[]";
- /* first we validate the name portion (name@domain) */
- for (pTemp= emailaddr; *pTemp; pTemp++)
- {
- if (*pTemp == '\"' && (pTemp == emailaddr || *(pTemp - 1) == '.' || *(pTemp - 1) ==
- '\"')) {
- while (*++pTemp) {
- if (*pTemp == '\"') break;
- else if (*pTemp == '\\' && (*++pTemp == ' ')) continue;
- else if (*pTemp < ' ' || *pTemp >= 127) return 0;
- }
- if (!*pTemp++) return 0;
- else if (*pTemp == '@') break;
- else if (*pTemp != '.') return 0;
- continue;
- }
- else if (*pTemp == '@') break;
- else if (*pTemp <= ' ' || *pTemp >= 127) return 0;
- else if (strchr(special_char, *pTemp)) return 0;
- }
- if (pTemp == emailaddr || *(pTemp - 1) == '.') return 0;
- /* next we validate the domain portion (name@domain) */
- if (!*(domain = ++pTemp)) return 0;
- while (*pTemp)
- {
- if (*pTemp == '.')
- {
- if (pTemp == domain || *(pTemp - 1) == '.') return 0;
- else if(!*(pTemp +1))return 0;
- }
- else if (*pTemp <= ' ' || *pTemp >= 127) return 0;
- else if (strchr(special_char, *pTemp)) return 0;
- pTemp++;
- };
- if(!*pTemp)
- valid++;
- return (valid >= 1);
- }
- int AMISetEmailForUser(_NEAR_ INT8U* pReq, INT32U ReqLen, _NEAR_ INT8U* pRes, int BMCInst)
- {
- AMISetUserEmailReq_T *pSetUserEmail = (AMISetUserEmailReq_T *)pReq;
- _FAR_ UserInfo_T* pUserInfo;
- BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
- TDBG("Inside AMISetEmailForUser %d \n", pSetUserEmail->UserID);
- if ( (0 != pSetUserEmail->EMailID[0]) && (0 == validate_email(pSetUserEmail->EMailID)) )
- {
- IPMI_WARNING ("Invalid Email address \n");
- *pRes = CC_INV_DATA_FIELD;
- return sizeof(*pRes);
- }
- OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->ChUserMutex,WAIT_INFINITE);
- pUserInfo = getUserIdInfo (pSetUserEmail->UserID, BMCInst);
- if ( (NULL == pUserInfo) || (pUserInfo->ID != USER_ID) )
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- IPMI_WARNING ("Invalid User Id \n");
- *pRes = CC_INV_DATA_FIELD;
- return sizeof(*pRes);
- }
- _fmemcpy (pUserInfo->UserEMailID, pSetUserEmail->EMailID, EMAIL_ADDR_SIZE);
- FlushIPMI((INT8U*)&pBMCInfo->UserInfo[0],(INT8U*)&pBMCInfo->UserInfo[0],pBMCInfo->IPMIConfLoc.UserInfoAddr,
- sizeof(UserInfo_T)*MAX_USER_CFG_MDS,BMCInst);
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- *pRes = CC_NORMAL;
- return sizeof(*pRes);
- }
- int AMIGetEmailForUser(_NEAR_ INT8U* pReq, INT32U ReqLen, _NEAR_ INT8U* pRes, int BMCInst)
- {
- BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
- int UserID = *(INT8U *)pReq;
- _FAR_ UserInfo_T* pUserInfo;
- TDBG("Inside AMIGetEmailForUser %d \n", UserID);
- OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->ChUserMutex,WAIT_INFINITE);
- pUserInfo = getUserIdInfo (UserID, BMCInst);
- if ( (NULL == pUserInfo) || (pUserInfo->ID != USER_ID))
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- IPMI_WARNING ("Invalid User Id \n");
- *pRes = CC_INV_DATA_FIELD;
- goto end;
- }
- *pRes = CC_NORMAL;
- if( pUserInfo->UserEMailID[0] != 0 )
- {
- _fmemcpy ((pRes+1), pUserInfo->UserEMailID, EMAIL_ADDR_SIZE);
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- return sizeof(AMIGetUserEmailRes_T);
- }
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- end:
- return sizeof(*pRes);
- }
- int AMIResetPassword(_NEAR_ INT8U* pReq, INT32U ReqLen, _NEAR_ INT8U* pRes, int BMCInst)
- {
- AMIResetPasswordReq_T *pCmdReq = (AMIResetPasswordReq_T *)pReq;
- char eMailAdd[EMAIL_ADDR_SIZE];
- char userName[MAX_USERNAME_LEN];
- SetUserPswdReq_T ReqSetUserPswd;
- SetUserPswdRes_T ResSetUserPswd;
- char ClearPswd[MAX_PASSWORD_LEN];
- _FAR_ UserInfo_T* pUserInfo = NULL;
- char OldPswd[MAX_PASSWORD_LEN];
- int ret;
- int smtpServerFlag=0;// 0 - primary 1- secondary
- SMTP_STRUCT mail;
- int i, retVal = 0, ethIndex = 0;
- char letters_numbers[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
- char PassLength = 0;
- INT8S DecryptedUserPswd[MAX_PASSWORD_LEN] = {0};
- INT8U PwdEncKey[MAX_SIZE_KEY] = {0};
- BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
- OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->ChUserMutex,WAIT_INFINITE);
- /* Get the username and E-Mail address */
- pUserInfo = getUserIdInfo (pCmdReq->UserID, BMCInst);
- if ( (NULL == pUserInfo) || (pUserInfo->ID != USER_ID))
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- IPMI_WARNING ("Invalid User Id \n");
- *(pRes) = CC_INV_DATA_FIELD;
- goto end;
- }
- if( pUserInfo->UserEMailID[0] == 0 )
- {
- IPMI_ERROR("Email not configured for the user\n");
- *(pRes) = OEMCC_EMAIL_NOT_CONFIGURED;
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- goto end;
- }
- _fmemcpy (eMailAdd, pUserInfo->UserEMailID, EMAIL_ADDR_SIZE);
- _fmemcpy (userName, pUserInfo->UserName, MAX_USERNAME_LEN);
- if (g_corefeatures.userpswd_encryption == ENABLED)
- {
- /* Get Encryption Key from the MBMCInfo_t structure */
- memcpy(PwdEncKey, &(g_MBMCInfo.PwdEncKey), MAX_SIZE_KEY);
- if(DecryptPassword((INT8S *)(pBMCInfo->EncryptedUserInfo[pCmdReq->UserID - 1].EncryptedPswd), MAX_PASSWORD_LEN, DecryptedUserPswd, MAX_PASSWORD_LEN, PwdEncKey))
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- TCRIT("Error in decrypting the IPMI User password for user with ID:%d.\n", pCmdReq->UserID);
- *pRes = CC_UNSPECIFIED_ERR;
- goto end;
- }
- memcpy(OldPswd, DecryptedUserPswd, MAX_PASSWORD_LEN);
- }
- else
- {
- _fmemcpy (OldPswd, pUserInfo->UserPassword, MAX_PASSWORD_LEN);
- }
- ethIndex = GetEthIndex(pCmdReq->Channel, BMCInst);
- if (ethIndex == 0xff)
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- *(pRes) = CC_INV_DATA_FIELD;
- goto end;
- }
- if((ret=GetSMTP_PrimaryServer(&mail,0,ethIndex,BMCInst))<0)
- {
- smtpServerFlag=1;
- if(GetSMTP_SecondaryServer(&mail,0,ethIndex,BMCInst)<0)
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- *(pRes) = OEMCC_SMTP_DISABLED;
- goto end;
- }
- }
- /* Generate password */
- TDBG("\n The previous user length %d \n",pUserInfo->MaxPasswordSize);
- if (pUserInfo->MaxPasswordSize == MAX_PASSWORD_LEN)
- {
- ReqSetUserPswd.UserID = pCmdReq->UserID | 0x80 ;
- PassLength = IPMI_20_PASSWORD_LEN;
- }
- else
- {
- ReqSetUserPswd.UserID = pCmdReq->UserID;
- PassLength = IPMI_15_PASSWORD_LEN;
- }
- ReqSetUserPswd.Operation = 0x02;
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- memset(&ClearPswd, 0, MAX_PASSWORD_LEN);
- srand(time(0));
- i = (rand() % (MAX_PASSWORD_LEN-13)) + 8;
- TINFO("Random Number Length for Password : %d\n", i);
- for (i--; i >= 0; i--)
- {
- ClearPswd[i] = letters_numbers[(rand() % (sizeof(letters_numbers ) - 1))];
- }
- strncpy((char*)ReqSetUserPswd.Password, (char*)ClearPswd, MAX_PASSWORD_LEN);
- retVal = smtp_test(&mail);
- if(smtpServerFlag == 0)
- {
- if (retVal == ERR_UNABLE_TO_CONNECT_SMTPSERVER)
- {
- if(GetSMTP_SecondaryServer(&mail,0,ethIndex,BMCInst)<0)
- {
- *(pRes) = OEMCC_SMTP_DISABLED;
- goto end;
- }
- retVal = smtp_test(&mail);
- }
- }
- if ((retVal) != EMAIL_UNKNOWN)
- {
- if (retVal == ERR_AUTHENTICATION_FAILURE)
- *(pRes) = OEMCC_SEND_EMAIL_AUTH_FAILED;
- else if (retVal == ERR_UNABLE_TO_CONNECT_SMTPSERVER)
- *(pRes) = OEMCC_UNABLE_TO_CONNECT_SMTPSERVER;
- else if(retVal == ERR_UNSUPPORTED_AUTHTYPE)
- *(pRes) = OEMCC_UNSUPPORTED_AUTH_TYPE;
- else
- *(pRes) = OEMCC_SEND_EMAIL_FAILED;
- IPMI_ERROR("Test mail Server failed (%s) : %d\n", mail.smtp_server, retVal);
- goto end;
- }
- strcpy((char *)mail.to_addr, eMailAdd);
- sprintf((char *)mail.subject, "The %s Login Password has been changed",mail.local_host);
- sprintf((char *)mail.message_body, "The password has been reset for %s (host)\nUserName : %s\nPassword : %s\n",
- mail.local_host, userName, ClearPswd);
- TDBG("UserName : %s, Password : %s, To : %s, From : %s\n", mail.username,
- mail.password, mail.to_addr, mail.from_addr);
- TDBG("Subject : %s\n", mail.subject);
- TDBG("Mail : %s\n", mail.message_body);
- TDBG("SMTP Server : %s\n", mail.smtp_server);
- TDBG("The %s Login Password has been changed\n", mail.local_host);
- TDBG("The password has been reset for %s (host)\n\tUserName : %s\n\tPassword : %s\n",
- mail.local_host, userName, ClearPswd);
- /* Set user password */
- SetUserPassword((INT8U *)&ReqSetUserPswd, PassLength, (INT8U *)&ResSetUserPswd,BMCInst);
- if(ResSetUserPswd.CompletionCode != CC_NORMAL)
- {
- *(pRes) = ResSetUserPswd.CompletionCode;
- goto end;
- }
- /* Send mail */
- if ((retVal = smtp_mail(&mail)) != EMAIL_UNKNOWN)
- {
- if (retVal == ERR_AUTHENTICATION_FAILURE)
- *(pRes) = OEMCC_SEND_EMAIL_AUTH_FAILED;
- else if (retVal == ERR_UNABLE_TO_CONNECT_SMTPSERVER)
- *(pRes) = OEMCC_UNABLE_TO_CONNECT_SMTPSERVER;
- else if(retVal == ERR_UNSUPPORTED_AUTHTYPE)
- *(pRes) = OEMCC_UNSUPPORTED_AUTH_TYPE;
- else
- *(pRes) = OEMCC_SEND_EMAIL_FAILED;
- strncpy((char*)ReqSetUserPswd.Password, (char*)OldPswd, MAX_PASSWORD_LEN);
- /* Preserve Old password */
- SetUserPassword((INT8U *)&ReqSetUserPswd, sizeof(SetUserPswdReq_T), (INT8U *)&ResSetUserPswd,BMCInst);
- if(ResSetUserPswd.CompletionCode != CC_NORMAL)
- {
- *(pRes) = ResSetUserPswd.CompletionCode;
- goto end;
- }
- IPMI_ERROR("Send mail failed with the server (%s) : %d\n", mail.smtp_server, retVal);
- }
- else
- {
- *(pRes) = CC_NORMAL;
- }
- end:
- return sizeof(*(pRes));
- }
- int AMISetEmailFormatUser(_NEAR_ INT8U* pReq, INT32U ReqLen, _NEAR_ INT8U* pRes, int BMCInst)
- {
- AMISetUserEmailFormatReq_T *pSetUserEmail = (AMISetUserEmailFormatReq_T *)pReq;
- _FAR_ UserInfo_T* pUserInfo;
- BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
- int cnt=0;
- char nulldata[EMAIL_FORMAT_SIZE]={0};
- TDBG("Inside AMISetEmailFormatUser %d \n", pSetUserEmail->UserID);
- OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->ChUserMutex,WAIT_INFINITE);
- pUserInfo = getUserIdInfo (pSetUserEmail->UserID, BMCInst);
- if ( (NULL == pUserInfo) || (pUserInfo->ID != USER_ID) )
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- IPMI_WARNING ("Invalid User Id \n");
- *pRes = CC_INV_DATA_FIELD;
- return sizeof(*pRes);
- }
-
- for(cnt=0;cnt< EmailformatCount;cnt++)
- {
- if(memcmp(g_PDKEmailFormat[cnt].EmailFormat,pSetUserEmail->EMailFormat,EMAIL_FORMAT_SIZE)==0)
- {
- break;
- }
- }
- if(cnt==EmailformatCount && (memcmp(pSetUserEmail->EMailFormat,nulldata,EMAIL_FORMAT_SIZE)!=0))//Disabling the EmailFormat if the data contains all zeroes.
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- IPMI_WARNING ("Invalid Email Format \n");
- *pRes = CC_INV_DATA_FIELD;
- return sizeof(*pRes);
- }
- _fmemcpy (pUserInfo->EmailFormat, pSetUserEmail->EMailFormat, EMAIL_FORMAT_SIZE);
- FlushIPMI((INT8U*)&pBMCInfo->UserInfo[0],(INT8U*)&pBMCInfo->UserInfo[0],pBMCInfo->IPMIConfLoc.UserInfoAddr,
- sizeof(UserInfo_T)*MAX_USER_CFG_MDS,BMCInst);
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- *pRes = CC_NORMAL;
- return sizeof(*pRes);
- }
- int AMIGetEmailFormatUser(_NEAR_ INT8U* pReq, INT32U ReqLen, _NEAR_ INT8U* pRes, int BMCInst)
- {
- BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
- int UserID = *(INT8U *)pReq;
- _FAR_ UserInfo_T* pUserInfo;
- TDBG("Inside AMIGetEmailFormatUser %d \n", UserID);
- OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->ChUserMutex,WAIT_INFINITE);
- pUserInfo = getUserIdInfo (UserID, BMCInst);
- if ( (NULL == pUserInfo) || (pUserInfo->ID != USER_ID))
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- IPMI_WARNING ("Invalid User Id \n");
- *pRes = CC_INV_DATA_FIELD;
- return sizeof(*pRes);
- }
- *pRes = CC_NORMAL;
- if( pUserInfo->EmailFormat[0] != 0 )
- {
- _fmemcpy ((pRes+1), pUserInfo->EmailFormat, EMAIL_FORMAT_SIZE);
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- return EMAIL_FORMAT_SIZE+1;
- }
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- return sizeof(*pRes);
- }
- /*
- *@fn AMIGetRootUserAccess
- *@brief This command helps to get linux root user access state
- * @param pReq - Request for the command
- * @param ReqLen - Request length for the command
- * @param pRes - Respose for the command
- * @param BMCInst- BMC Instance
- * @return Returns size of AMISetRootPasswordRes_T
- */
- int AMIGetRootUserAccess (_NEAR_ INT8U* pReq, INT32U ReqLen, _NEAR_ INT8U* pRes, int BMCInst)
- {
- _NEAR_ AMIGetRootUserAccessRes_T* pGetRootUserAccessRes = (_NEAR_ AMIGetRootUserAccessRes_T*)pRes;
- INT8U UserId,UserAccessState;
- INT16S Err = 0;
- UserId = LINUX_ROOT_USER_UID;
- pGetRootUserAccessRes->CompletionCode = CC_NORMAL;
- Err = LINUX_GetUserAccess (UserId,&UserAccessState);
- if (0 != Err)
- {
- IPMI_ERROR ("AMIResetPass.c : Setting password to Linux database failed\n");
- *pRes = abs (Err);
- return sizeof (*pRes);
- }
- else
- pGetRootUserAccessRes->CurrentUserIDState = UserAccessState ;
- return sizeof (AMIGetRootUserAccessRes_T);
- }
- /*
- *@fn SetRootPassword
- *@brief This command helps to set linux root user password,enabling root user,
- * disabling root user.
- * @param pReq - Request for the command
- * @param ReqLen - Request length for the command
- * @param pRes - Respose for the command
- * @param BMCInst- BMC Instance
- * @return Returns size of AMISetRootPasswordRes_T
- */
- int AMISetRootPassword (_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
- {
- _NEAR_ AMISetRootPasswordReq_T* pSetRootPswdReq = (_NEAR_ AMISetRootPasswordReq_T*)pReq;
- INT16S Err = 0;
- if(ReqLen < OP_ONLY_CMD_LENGTH) //Checking for minimum command Request length
- {
- *pRes = CC_REQ_INV_LEN;
- return sizeof (*pRes);
- }
-
- //Checking for Valid operation
- if (ReqLen == OP_ONLY_CMD_LENGTH)
- {
- if ((pSetRootPswdReq->Operation != OP_ENABLE_USER_ID) && (pSetRootPswdReq->Operation != OP_DISABLE_USER_ID))
- {
- if(pSetRootPswdReq->Operation == OP_SET_ROOT_PASSWD)
- *pRes = CC_REQ_INV_LEN;
- else
- *pRes = CC_INV_DATA_FIELD;
- return sizeof (*pRes); //Invalid operation.
- }
- }
- if(ReqLen > OP_ONLY_CMD_LENGTH) //Checking for passwd length
- {
- if( ( (ReqLen-1) < LINUX_USER_MIN_PASSWORD_LEN) || ( (ReqLen-1) > LINUX_USER_MAX_PASSWORD_LEN) )
- {
- *pRes = CC_REQ_INV_LEN;
- return sizeof (*pRes);
- }
- pSetRootPswdReq->Password[ReqLen-1] = '\0';
- }
- *pRes = CC_NORMAL;
- Err = LINUX_SetRootPassword( pSetRootPswdReq->Operation, pSetRootPswdReq->Password);
- if (0 != Err)
- {
- IPMI_ERROR ("AMIResetPass.c : Setting password to Linux database failed\n");
- *pRes = abs (Err);
- return sizeof (*pRes);
- }
- return sizeof (*pRes);
- }
- /*
- *@fn AMIGetUserShelltype
- *@brief This command helps to get users shell
- * @param pReq - Request for the command
- * @param ReqLen - Request length for the command
- * @param pRes - Respose for the command
- * @param BMCInst- BMC Instance
- * @return Returns size of AMIGetUserShelltypeRes_T
- */
- int AMIGetUserShelltype(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
- {
- _NEAR_ AMIGetUserShelltypeReq_T* pGetUserShellReq = (_NEAR_ AMIGetUserShelltypeReq_T*)pReq;
- _NEAR_ AMIGetUserShelltypeRes_T* pGetUserShellRes = (_NEAR_ AMIGetUserShelltypeRes_T*)pRes;
- _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
- _FAR_ UserInfo_T* pUserInfo = NULL;
- INT8U UserId=0;
- UserId = pGetUserShellReq->UserID & 0x3F;
- /* if user ID exceeded the Max limit */
- if (pGetUserShellReq->UserID > pBMCInfo->IpmiConfig.MaxUsers)
- {
- pGetUserShellRes->CompletionCode = CC_INV_DATA_FIELD ;
- return sizeof (*pRes);/* Invalied user id */
- }
- OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->ChUserMutex,WAIT_INFINITE);
- pUserInfo = getUserIdInfo(UserId, BMCInst);
- /* User with given ID is not created */
- if ( NULL == pUserInfo )
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- *pRes = CC_INV_DATA_FIELD;
- return sizeof (*pRes);
- }
- pGetUserShellRes->CompletionCode = CC_NORMAL;
- pGetUserShellRes->Shelltype = pUserInfo->UserShell;
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- return sizeof (AMIGetUserShelltypeRes_T);
- }
- /*
- *@fn AMISetUserShelltype
- *@brief This command helps to set users shell
- * @param pReq - Request for the command
- * @param ReqLen - Request length for the command
- * @param pRes - Respose for the command
- * @param BMCInst- BMC Instance
- * @return Returns size of AMISetUserShelltypeRes_T
- */
- int AMISetUserShelltype(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
- {
- _NEAR_ AMISetUserShelltypeReq_T* pSetUserShellReq = (_NEAR_ AMISetUserShelltypeReq_T*)pReq;
- _FAR_ UserInfo_T* pUserInfo = NULL;
- _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
- INT8U UserId=0, ShellType;
- INT8U oldshell = -1, newshell = -1;
- UserId = pSetUserShellReq->UserID & 0x3F;
- ShellType = pSetUserShellReq->Shelltype;
-
- /* if user ID exceeded the Max limit */
- if (pSetUserShellReq->UserID > pBMCInfo->IpmiConfig.MaxUsers)
- {
- *pRes = CC_INV_DATA_FIELD ;
- return sizeof (*pRes);/* Invalied user id */
- }
- if((ShellType < 0) || (ShellType > MAX_SHELL_TYPES-1))
- {
- *pRes = CC_INV_DATA_FIELD;
- return sizeof (*pRes); //Invalid shell type
- }
- OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->ChUserMutex,WAIT_INFINITE);
- pUserInfo = getUserIdInfo(UserId, BMCInst);
- /* if User is not created */
- if ( NULL == pUserInfo )
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- *pRes = CC_INV_DATA_FIELD;
- return sizeof (*pRes);
- }
-
- /*if the user is fixed user */
- if (((pUserInfo != NULL) && (pUserInfo->FixedUser == TRUE)))
- {
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- *pRes = CC_INV_DATA_FIELD ;
- return sizeof (*pRes);
- }
- newshell = ShellType;
- oldshell = pUserInfo->UserShell;
- pUserInfo->UserShell = newshell;
- AddIPMIUsrtoShellGrp((char *)pUserInfo->UserName, oldshell, newshell);
- FlushIPMI((INT8U*)&pBMCInfo->UserInfo[0],(INT8U*)&pBMCInfo->UserInfo[0],pBMCInfo->IPMIConfLoc.UserInfoAddr,
- sizeof(UserInfo_T)*MAX_USER_CFG_MDS,BMCInst);
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
- *pRes = CC_NORMAL;
- return sizeof (*pRes);
- }
|