📄 usmuser.c
字号:
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 fnAuthKey[] = "write_usmUserAuthKeyChange",
fnOwnAuthKey[] = "write_usmUserOwnAuthKeyChange",
*fname;
if (name[USM_MIB_LENGTH-1] == 6)
fname = fnAuthKey;
else
fname = fnOwnAuthKey;
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 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() */
int
write_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.
*
*/
int
write_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() */
int
write_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() */
int
write_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
*/
int
write_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() */
#endif /* CYGPKG_SNMPAGENT_V3_SUPPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -