📄 usmuser.c
字号:
} /* Change the key. */ DEBUGMSGTL(("usmUser","%s: changing auth key for user %s\n", fname, uptr->secName)); if (decode_keychange(uptr->authProtocol, uptr->authProtocolLen, uptr->authKey, uptr->authKeyLen, var_val, var_val_len, buf, &buflen) != SNMPERR_SUCCESS) { DEBUGMSGTL(("usmUser","%s: ... failed\n", fname)); return SNMP_ERR_GENERR; } DEBUGMSGTL(("usmUser","%s: ... succeeded\n", fname)); SNMP_FREE(uptr->authKey); memdup(&uptr->authKey, buf, buflen); uptr->authKeyLen = buflen; } return SNMP_ERR_NOERROR;} /* end write_usmUserAuthKeyChange() */intwrite_usmUserPrivProtocol( 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 oid objid[USM_LENGTH_OID_MAX]; static oid *optr; struct usmUser *uptr; size_t size; if (var_val_type != ASN_OBJECT_ID){ DEBUGMSGTL(("usmUser","write to usmUserPrivProtocol not ASN_OBJECT_ID\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len > sizeof(objid)){ DEBUGMSGTL(("usmUser","write to usmUserPrivProtocol: bad length\n")); return SNMP_ERR_WRONGLENGTH; } if (action == COMMIT){ size = var_val_len/sizeof(oid); memcpy(objid, var_val, var_val_len); /* don't allow creations here */ if ((uptr = usm_parse_user(name, name_len)) == NULL) return SNMP_ERR_NOSUCHNAME; /* check the objid for validity */ /* only allow sets to perform a change to usmNoPrivProtocol */ if (snmp_oid_compare(objid, size, usmNoPrivProtocol, sizeof(usmNoPrivProtocol)/sizeof(oid)) != 0) return SNMP_ERR_INCONSISTENTVALUE; /* finally, we can do it */ optr = uptr->privProtocol; if ((uptr->privProtocol = snmp_duplicate_objid(objid, size)) == NULL) { uptr->privProtocol = optr; return SNMP_ERR_GENERR; } free(optr); uptr->privProtocolLen = size; } return SNMP_ERR_NOERROR;} /* end write_usmUserPrivProtocol() *//* * Note: This function handles both the usmUserPrivKeyChange and * usmUserOwnPrivKeyChange 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. * */intwrite_usmUserPrivKeyChange( 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 unsigned char string[SNMP_MAXBUF_SMALL]; struct usmUser *uptr; unsigned char buf[SNMP_MAXBUF_SMALL]; size_t buflen = SNMP_MAXBUF_SMALL; char fnPrivKey[] = "write_usmUserPrivKeyChange", fnOwnPrivKey[] = "write_usmUserOwnPrivKeyChange", *fname; if (name[USM_MIB_LENGTH-1] == 9) fname = fnPrivKey; else fname = fnOwnPrivKey; if (var_val_type != ASN_OCTET_STR) { DEBUGMSGTL(("usmUser","write to %s not ASN_OCTET_STR\n", fname)); return SNMP_ERR_WRONGTYPE; } if (var_val_len > sizeof(string)) { DEBUGMSGTL(("usmUser","write to %s: bad length\n", fname)); return SNMP_ERR_WRONGLENGTH; } if (action == COMMIT) { /* don't allow creations here */ if ((uptr = usm_parse_user(name, name_len)) == NULL) { return SNMP_ERR_NOSUCHNAME; } /* Change the key. */ DEBUGMSGTL(("usmUser","%s: changing priv key for user %s\n", fname, uptr->secName)); if (decode_keychange(uptr->authProtocol, uptr->authProtocolLen, uptr->privKey, uptr->privKeyLen, var_val, var_val_len, buf, &buflen) != SNMPERR_SUCCESS) { DEBUGMSGTL(("usmUser","%s: ... failed\n", fname)); return SNMP_ERR_GENERR; } DEBUGMSGTL(("usmUser","%s: ... succeeded\n", fname)); SNMP_FREE(uptr->privKey); memdup(&uptr->privKey, buf, buflen); uptr->privKeyLen = buflen; } return SNMP_ERR_NOERROR;} /* end write_usmUserPrivKeyChange() */intwrite_usmUserPublic( 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 unsigned char string[SNMP_MAXBUF]; struct usmUser *uptr; if (var_val_type != ASN_OCTET_STR){ DEBUGMSGTL(("usmUser","write to usmUserPublic not ASN_OCTET_STR\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len > sizeof(string)){ DEBUGMSGTL(("usmUser","write to usmUserPublic: bad length\n")); return SNMP_ERR_WRONGLENGTH; } if (action == COMMIT) { /* don't allow creations here */ if ((uptr = usm_parse_user(name, name_len)) == NULL) { return SNMP_ERR_NOSUCHNAME; } if (uptr->userPublicString) free(uptr->userPublicString); uptr->userPublicString = (u_char *) malloc(var_val_len+1); if (uptr->userPublicString == NULL) { return SNMP_ERR_GENERR; } memcpy(uptr->userPublicString, var_val, var_val_len); uptr->userPublicString[var_val_len] = 0; DEBUGMSG(("usmUser", "setting public string: %d - %s\n", var_val_len, uptr->userPublicString)); } return SNMP_ERR_NOERROR;} /* end write_usmUserPublic() */intwrite_usmUserStorageType( 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; struct usmUser *uptr; if (var_val_type != ASN_INTEGER){ DEBUGMSGTL(("usmUser","write to usmUserStorageType not ASN_INTEGER\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len > sizeof(long_ret)){ DEBUGMSGTL(("usmUser","write to usmUserStorageType: bad length\n")); return SNMP_ERR_WRONGLENGTH; } if (action == COMMIT){ /* don't allow creations here */ if ((uptr = usm_parse_user(name, name_len)) == NULL) { return SNMP_ERR_NOSUCHNAME; } long_ret = *((long *) var_val); if ((long_ret == ST_VOLATILE || long_ret == ST_NONVOLATILE) && (uptr->userStorageType == ST_VOLATILE || uptr->userStorageType == ST_NONVOLATILE)) uptr->userStorageType = long_ret; else return SNMP_ERR_INCONSISTENTVALUE; } return SNMP_ERR_NOERROR;} /* end write_usmUserStorageType() *//*******************************************************************-o-****** * write_usmUserStatus * * Parameters: * action * *var_val * var_val_type * var_val_len * *statP * *name * name_len * * Returns: * SNMP_ERR_NOERROR On success. * SNMP_ERR_GENERR * SNMP_ERR_INCONSISTENTNAME * SNMP_ERR_INCONSISTENTVALUE * SNMP_ERR_WRONGLENGTH * SNMP_ERR_WRONGTYPE */intwrite_usmUserStatus( 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; unsigned char *engineID; size_t engineIDLen; char *newName; size_t nameLen; struct usmUser *uptr; if (var_val_type != ASN_INTEGER){ DEBUGMSGTL(("usmUser","write to usmUserStatus not ASN_INTEGER\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len > sizeof(long_ret)){ DEBUGMSGTL(("usmUser","write to usmUserStatus: bad length\n")); return SNMP_ERR_WRONGLENGTH; } if (action == COMMIT){ long_ret = *((long *) var_val); /* ditch illegal values now */ /* notReady can not be used, but the return error code is not mentioned */ if (long_ret == RS_NOTREADY || long_ret < 1 || long_ret > 6) return SNMP_ERR_INCONSISTENTVALUE; /* see if we can parse the oid for engineID/name first */ if (usm_parse_oid(&name[USM_MIB_LENGTH], name_len-USM_MIB_LENGTH, &engineID, &engineIDLen, (u_char **)&newName, &nameLen)) return SNMP_ERR_INCONSISTENTNAME; /* Now see if a user already exists with these index values */ uptr = usm_get_user(engineID, engineIDLen, newName); if (uptr) { /* If so, we set the appropriate value... */ free(engineID); free(newName); if (long_ret == RS_CREATEANDGO || long_ret == RS_CREATEANDWAIT) { return SNMP_ERR_INCONSISTENTVALUE; } if (long_ret == RS_DESTROY) { usm_remove_user(uptr); usm_free_user(uptr); } else { uptr->userStatus = long_ret; } } else { /* ...else we create a new user */ /* check for a valid status column set */ if (long_ret == RS_ACTIVE || long_ret == RS_NOTINSERVICE) { free(engineID); free(newName); return SNMP_ERR_INCONSISTENTVALUE; } if (long_ret == RS_DESTROY) { /* destroying a non-existent row is actually legal */ free(engineID); free(newName); return SNMP_ERR_NOERROR; } /* generate a new user */ if ((uptr = usm_create_user()) == NULL) { free(engineID); free(newName); return SNMP_ERR_GENERR; } /* copy in the engineID */ uptr->engineID = (unsigned char *) malloc(engineIDLen); if (uptr->engineID == NULL) { free(engineID); free(newName); usm_free_user(uptr); return SNMP_ERR_GENERR; } uptr->engineIDLen = engineIDLen; memcpy(uptr->engineID, engineID, engineIDLen); free(engineID); /* copy in the name and secname */ if ((uptr->name = strdup(newName)) == NULL) { free(newName); usm_free_user(uptr); return SNMP_ERR_GENERR; } free(newName); if ((uptr->secName = strdup(uptr->name)) == NULL) { usm_free_user(uptr); return SNMP_ERR_GENERR; } /* set the status of the row based on the request */ if (long_ret == RS_CREATEANDGO) uptr->userStatus = RS_ACTIVE; else if (long_ret == RS_CREATEANDWAIT) uptr->userStatus = RS_NOTINSERVICE; /* finally, add it to our list of users */ usm_add_user(uptr); } /* endif -- uptr */ } /* endif -- action==COMMIT */ return SNMP_ERR_NOERROR;} /* end write_usmUserStatus() */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -