📄 usmuser.c
字号:
} return NULL; case USMUSERCLONEFROM: *write_method = write_usmUserCloneFrom; if (uptr) { objid[0] = 0; /* "When this object is read, the ZeroDotZero OID */ objid[1] = 0; /* is returned." */ *var_len = sizeof(oid) * 2; return (unsigned char *) objid; } return NULL; case USMUSERAUTHPROTOCOL: *write_method = write_usmUserAuthProtocol; if (uptr) { *var_len = uptr->authProtocolLen * sizeof(oid); return (u_char *) uptr->authProtocol; } return NULL; case USMUSERAUTHKEYCHANGE: case USMUSEROWNAUTHKEYCHANGE: /* * we treat these the same, and let the calling module * distinguish between them */ *write_method = write_usmUserAuthKeyChange; if (uptr) { *string = 0; /* always return a NULL string */ *var_len = 0; return string; } return NULL; case USMUSERPRIVPROTOCOL: *write_method = write_usmUserPrivProtocol; if (uptr) { *var_len = uptr->privProtocolLen * sizeof(oid); return (u_char *) uptr->privProtocol; } return NULL; case USMUSERPRIVKEYCHANGE: case USMUSEROWNPRIVKEYCHANGE: /* * we treat these the same, and let the calling module * distinguish between them */ *write_method = write_usmUserPrivKeyChange; if (uptr) { *string = 0; /* always return a NULL string */ *var_len = 0; return string; } return NULL; case USMUSERPUBLIC: *write_method = write_usmUserPublic; if (uptr) { if (uptr->userPublicString) { *var_len = strlen((char *) uptr->userPublicString); return uptr->userPublicString; } *string = 0; *var_len = 0; /* return an empty string if the public * string hasn't been defined yet */ return string; } return NULL; case USMUSERSTORAGETYPE: *write_method = write_usmUserStorageType; if (uptr) { long_ret = uptr->userStorageType; return (unsigned char *) &long_ret; } return NULL; case USMUSERSTATUS: *write_method = write_usmUserStatus; if (uptr) { long_ret = uptr->userStatus; return (unsigned char *) &long_ret; } return NULL; default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_usmUser\n", vp->magic)); } return 0;} /* end var_usmUser() *//* * write_usmUserSpinLock(): called when a set is performed on the * usmUserSpinLock object */intwrite_usmUserSpinLock(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len){ /* * variables we may use later */ static long long_ret; if (var_val_type != ASN_INTEGER) { DEBUGMSGTL(("usmUser", "write to usmUserSpinLock not ASN_INTEGER\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len > sizeof(long_ret)) { DEBUGMSGTL(("usmUser", "write to usmUserSpinLock: bad length\n")); return SNMP_ERR_WRONGLENGTH; } long_ret = *((long *) var_val); if (long_ret != (long) usmUserSpinLock) return SNMP_ERR_INCONSISTENTVALUE; if (action == COMMIT) { if (usmUserSpinLock == 2147483647) usmUserSpinLock = 0; else usmUserSpinLock++; } return SNMP_ERR_NOERROR;} /* end write_usmUserSpinLock() *//*******************************************************************-o-****** * write_usmUserCloneFrom * * Parameters: * action * *var_val * var_val_type * var_val_len * *statP (UNUSED) * *name OID of user to clone from. * name_len * * Returns: * SNMP_ERR_NOERROR On success -OR- If user exists * and has already been cloned. * SNMP_ERR_GENERR Local function call failures. * SNMP_ERR_INCONSISTENTNAME 'name' does not exist in user list * -OR- user to clone from != RS_ACTIVE. * SNMP_ERR_WRONGLENGTH OID length > than local buffer size. * SNMP_ERR_WRONGTYPE ASN_OBJECT_ID is wrong. * * * XXX: should handle action=UNDO's. */intwrite_usmUserCloneFrom(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len){ struct usmUser *uptr, *cloneFrom; if (action == RESERVE1) { if (var_val_type != ASN_OBJECT_ID) { DEBUGMSGTL(("usmUser", "write to usmUserCloneFrom not ASN_OBJECT_ID\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len > USM_LENGTH_OID_MAX * sizeof(oid) || var_val_len % sizeof(oid) != 0) { DEBUGMSGTL(("usmUser", "write to usmUserCloneFrom: bad length\n")); return SNMP_ERR_WRONGLENGTH; } } else if (action == RESERVE2) { if ((uptr = usm_parse_user(name, name_len)) == NULL) { /* * We don't allow creations here. */ return SNMP_ERR_INCONSISTENTNAME; } /* * Has the user already been cloned? If so, writes to this variable * are defined to have no effect and to produce no error. */ if (uptr->cloneFrom != NULL) { return SNMP_ERR_NOERROR; } cloneFrom = usm_parse_user((oid *) var_val, var_val_len / sizeof(oid)); if (cloneFrom == NULL || cloneFrom->userStatus != SNMP_ROW_ACTIVE) { return SNMP_ERR_INCONSISTENTNAME; } uptr->cloneFrom = snmp_duplicate_objid((oid *) var_val, var_val_len / sizeof(oid)); usm_cloneFrom_user(cloneFrom, uptr); if (usmStatusCheck(uptr) && uptr->userStatus == SNMP_ROW_NOTREADY) { uptr->userStatus = SNMP_ROW_NOTINSERVICE; } } return SNMP_ERR_NOERROR;}/*******************************************************************-o-****** * write_usmUserAuthProtocol * * Parameters: * action * *var_val OID of auth transform to set. * var_val_type * var_val_len * *statP * *name OID of user upon which to perform set operation. * name_len * * Returns: * SNMP_ERR_NOERROR On success. * SNMP_ERR_GENERR * SNMP_ERR_INCONSISTENTVALUE * SNMP_ERR_NOSUCHNAME * SNMP_ERR_WRONGLENGTH * SNMP_ERR_WRONGTYPE */intwrite_usmUserAuthProtocol(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len){ static oid *optr; static size_t olen; static int resetOnFail; struct usmUser *uptr; if (action == RESERVE1) { resetOnFail = 0; if (var_val_type != ASN_OBJECT_ID) { DEBUGMSGTL(("usmUser", "write to usmUserAuthProtocol not ASN_OBJECT_ID\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len > USM_LENGTH_OID_MAX * sizeof(oid) || var_val_len % sizeof(oid) != 0) { DEBUGMSGTL(("usmUser", "write to usmUserAuthProtocol: bad length\n")); return SNMP_ERR_WRONGLENGTH; } } else if (action == RESERVE2) { if ((uptr = usm_parse_user(name, name_len)) == NULL) { return SNMP_ERR_INCONSISTENTNAME; } if (uptr->userStatus == RS_ACTIVE || uptr->userStatus == RS_NOTREADY || uptr->userStatus == RS_NOTINSERVICE) { /* * The authProtocol is already set. It is only legal to CHANGE it * to usmNoAuthProtocol... */ if (snmp_oid_compare ((oid *) var_val, var_val_len / sizeof(oid), usmNoAuthProtocol, sizeof(usmNoAuthProtocol) / sizeof(oid)) == 0) { /* * ... and then only if the privProtocol is equal to * usmNoPrivProtocol. */ if (snmp_oid_compare (uptr->privProtocol, uptr->privProtocolLen, usmNoPrivProtocol, sizeof(usmNoPrivProtocol) / sizeof(oid)) != 0) { return SNMP_ERR_INCONSISTENTVALUE; } optr = uptr->authProtocol; olen = uptr->authProtocolLen; resetOnFail = 1; uptr->authProtocol = snmp_duplicate_objid((oid *) var_val, var_val_len / sizeof(oid)); if (uptr->authProtocol == NULL) { return SNMP_ERR_RESOURCEUNAVAILABLE; } uptr->authProtocolLen = var_val_len / sizeof(oid); } else if (snmp_oid_compare ((oid *) var_val, var_val_len / sizeof(oid), uptr->authProtocol, uptr->authProtocolLen) == 0) { /* * But it's also okay to set it to the same thing as it * currently is. */ return SNMP_ERR_NOERROR; } else { return SNMP_ERR_INCONSISTENTVALUE; } } else { /* * This row is under creation. It's okay to set * usmUserAuthProtocol to any valid authProtocol but it will be * overwritten when usmUserCloneFrom is set (so don't write it if * that has already been set). */ if (snmp_oid_compare ((oid *) var_val, var_val_len / sizeof(oid), usmNoAuthProtocol, sizeof(usmNoAuthProtocol) / sizeof(oid)) == 0#ifndef DISABLE_MD5 || snmp_oid_compare((oid *) var_val, var_val_len / sizeof(oid), usmHMACMD5AuthProtocol, sizeof(usmHMACMD5AuthProtocol) / sizeof(oid)) == 0#endif || snmp_oid_compare((oid *) var_val, var_val_len / sizeof(oid), usmHMACSHA1AuthProtocol, sizeof(usmHMACSHA1AuthProtocol) / sizeof(oid)) == 0) { if (uptr->cloneFrom != NULL) { optr = uptr->authProtocol; olen = uptr->authProtocolLen; resetOnFail = 1; uptr->authProtocol = snmp_duplicate_objid((oid *) var_val, var_val_len / sizeof(oid)); if (uptr->authProtocol == NULL) { return SNMP_ERR_RESOURCEUNAVAILABLE; } uptr->authProtocolLen = var_val_len / sizeof(oid); } } else { /* * Unknown authentication protocol. */ return SNMP_ERR_WRONGVALUE; } } } else if (action == COMMIT) { SNMP_FREE(optr); optr = NULL; } else if (action == FREE || action == UNDO) { if ((uptr = usm_parse_user(name, name_len)) != NULL) { if (resetOnFail) { SNMP_FREE(uptr->authProtocol); uptr->authProtocol = optr; uptr->authProtocolLen = olen; } } } return SNMP_ERR_NOERROR;} /* end write_usmUserAuthProtocol() *//*******************************************************************-o-****** * write_usmUserAuthKeyChange * * Parameters: * action * *var_val Octet string representing new KeyChange value. * var_val_type * var_val_len * *statP (UNUSED) * *name OID of user upon which to perform set operation. * name_len * * Returns: * SNMP_ERR_NOERR Success. * SNMP_ERR_WRONGTYPE * SNMP_ERR_WRONGLENGTH * SNMP_ERR_NOSUCHNAME * SNMP_ERR_GENERR * * Note: This function handles both the usmUserAuthKeyChange and * usmUserOwnAuthKeyChange objects. We are not passed the name * of the user requseting the keychange, so we leave this to the * calling module to verify when and if we should be called. To * change this would require a change in the mib module API to * pass in the securityName requesting the change. * * XXX: should handle action=UNDO's. */intwrite_usmUserAuthKeyChange(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -