📄 usmdhuserkeytable_data_set.c
字号:
/* * Note: this file originally auto-generated by mib2c using * version : 1.19 $ of : mfd-data-set.m2c,v $ * * $Id: usmDHUserKeyTable_data_set.c 14169 2006-01-25 16:28:12Z dts12 $ * *//* * standard Net-SNMP includes */#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include <openssl/dh.h>/* * include our parent header */#define NEED_USMDH_FUNCTIONS#include "usmDHUserKeyTable.h"intusmDHUserCheckValue(struct usmUser *user, int for_auth_key, char *val, size_t val_len){ /* * The set value must be composed of 2 parts, the first being the * current value */ char *current_value; size_t current_value_len; DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserCheckValue", "called\n")); usmDHGetUserKeyChange(user, for_auth_key, ¤t_value, ¤t_value_len); if (!current_value) return MFD_ERROR; if (val_len != current_value_len * 2) return MFD_NOT_VALID_NOW; if (memcmp(current_value, val, current_value_len) != 0) return SNMP_ERR_WRONGVALUE; /* mandated error string */ return MFD_SUCCESS;}intusmDHSetKey(struct usmUser *user, int for_auth_key, char *val, size_t val_len){ DH *dh; BIGNUM *other_pub; char *key; size_t key_len; DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHSetKey", "called\n")); /* * XXX: mem leaks on errors abound */ dh = usmDHGetUserDHptr(user, for_auth_key); if (!dh) return MFD_ERROR; other_pub = BN_bin2bn(val + val_len / 2, val_len / 2, NULL); if (!other_pub) return MFD_ERROR; /* * Set the new key for a user */ key_len = DH_size(dh); key = malloc(DH_size(dh)); if (!key) return MFD_ERROR; if (DH_compute_key(key, other_pub, dh)) { u_char **replkey; size_t replkey_size; if (for_auth_key) { replkey_size = user->authKeyLen; replkey = &user->authKey; } else { replkey_size = user->privKeyLen; replkey = &user->privKey; } /* * is it large enough? */ if (key_len < replkey_size) return MFD_ERROR; /* * copy right most bits, per the object requirements */ SNMP_FREE(*replkey); memdup(replkey, key + key_len - replkey_size, replkey_size); return MFD_SUCCESS; } return MFD_ERROR;}/** @ingroup data_access * @defgroup data_set data_set: Routines to set data * * These routines are used to set the value for individual objects. The * row context is passed, along with the new value. * * @{ *//********************************************************************** ********************************************************************** *** *** Table usmDHUserKeyTable *** ********************************************************************** **********************************************************************//* * SNMP-USM-DH-OBJECTS-MIB::usmDHUserKeyTable is subid 2 of usmDHPublicObjects. * Its status is Current. * OID: .1.3.6.1.3.101.1.1.2, length: 9 */ /* * NOTE: if you update this chart, please update the versions in * local/mib2c-conf.d/parent-set.m2i * agent/mibgroup/helpers/baby_steps.c * while you're at it. */ /* *********************************************************************** * Baby Steps Flow Chart (2004.06.05) * * * * +--------------+ +================+ U = unconditional path * * |optional state| ||required state|| S = path for success * * +--------------+ +================+ E = path for error * *********************************************************************** * * +--------------+ * | pre | * | request | * +--------------+ * | U * +==============+ * +----------------|| object || * | E || lookup || * | +==============+ * | | S * | +==============+ * | E || check || * |<---------------|| values || * | +==============+ * | | S * | +==============+ * | +<-------|| undo || * | | E || setup || * | | +==============+ * | | | S * | | +==============+ * | | || set ||-------------------------->+ * | | || value || E | * | | +==============+ | * | | | S | * | | +--------------+ | * | | | check |-------------------------->| * | | | consistency | E | * | | +--------------+ | * | | | S | * | | +==============+ +==============+ | * | | || commit ||-------->|| undo || | * | | || || E || commit || | * | | +==============+ +==============+ | * | | | S U |<--------+ * | | +--------------+ +==============+ * | | | irreversible | || undo || * | | | commit | || set || * | | +--------------+ +==============+ * | | | U U | * | +-------------->|<------------------------+ * | +==============+ * | || undo || * | || cleanup || * | +==============+ * +---------------------->| U * +--------------+ * | post | * | request | * +--------------+ * *//** * Setup up context with information needed to undo a set request. * * This function will be called before the individual node undo setup * functions are called. If you need to do any undo setup that is not * related to a specific column, you can do it here. * * Note that the undo context has been allocated with * usmDHUserKeyTable_allocate_data(), but may need extra * initialization similar to what you may have done in * usmDHUserKeyTable_rowreq_ctx_init(). * Note that an individual node's undo_setup function will only be called * if that node is being set to a new value. * * If there is any setup specific to a particular column (e.g. allocating * memory for a string), you should do that setup in the node's undo_setup * function, so it won't be done unless it is necessary. * * @param rowreq_ctx * Pointer to the table context (usmDHUserKeyTable_rowreq_ctx) * * @retval MFD_SUCCESS : success * @retval MFD_ERROR : error. set will fail. */intusmDHUserKeyTable_undo_setup(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx){ int rc = MFD_SUCCESS; DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserKeyTable_undo_setup", "called\n")); /** we should have a non-NULL pointer */ netsnmp_assert(NULL != rowreq_ctx); /* * TODO:451:M: |-> Setup usmDHUserKeyTable undo. * set up usmDHUserKeyTable undo information, in preparation for a set. * Undo storage is in (* usmDHUserOwnPrivKeyChange_val_ptr_ptr )* */ return rc;} /* usmDHUserKeyTable_undo_setup *//** * Undo a set request. * * This function will be called before the individual node undo * functions are called. If you need to do any undo that is not * related to a specific column, you can do it here. * * Note that an individual node's undo function will only be called * if that node is being set to a new value. * * If there is anything specific to a particular column (e.g. releasing * memory for a string), you should do that setup in the node's undo * function, so it won't be done unless it is necessary. * * @param rowreq_ctx * Pointer to the table context (usmDHUserKeyTable_rowreq_ctx) * * @retval MFD_SUCCESS : success * @retval MFD_ERROR : error. set will fail. */intusmDHUserKeyTable_undo(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx){ int rc = MFD_SUCCESS; DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserKeyTable_undo", "called\n")); /** we should have a non-NULL pointer */ netsnmp_assert(NULL != rowreq_ctx); /* * TODO:451:M: |-> usmDHUserKeyTable undo. * usmDHUserKeyTable undo information, in response to a failed set. * Undo storage is in (* usmDHUserOwnPrivKeyChange_val_ptr_ptr )* */ return rc;} /* usmDHUserKeyTable_undo_setup *//** * Cleanup up context undo information. * * This function will be called after set/commit processing. If you * allocated any resources in undo_setup, this is the place to release * those resources. * * This function is called regardless of the success or failure of the set * request. If you need to perform different steps for cleanup depending * on success or failure, you can add a flag to the rowreq_ctx. * * @param rowreq_ctx * Pointer to the table context (usmDHUserKeyTable_rowreq_ctx) * * @retval MFD_SUCCESS : success * @retval MFD_ERROR : error */intusmDHUserKeyTable_undo_cleanup(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx){ int rc = MFD_SUCCESS; DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserKeyTable_undo_cleanup", "called\n")); /** we should have a non-NULL pointer */ netsnmp_assert(NULL != rowreq_ctx); /* * TODO:452:M: |-> Cleanup usmDHUserKeyTable undo. * Undo storage is in (* usmDHUserOwnPrivKeyChange_val_ptr_ptr )* */ return rc;} /* usmDHUserKeyTable_undo_cleanup *//** * commit new values. * * At this point, you should have done everything you can to ensure that * this commit will not fail. * * Should you need different behavior depending on which columns were * set, rowreq_ctx->column_set_flags will indicate which writeable columns were * set. The definitions for the COLUMN_*_FLAG bits can be found in * usmDHUserKeyTable_oids.h. * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags. * * @param rowreq_ctx * Pointer to the users context. * * @retval MFD_SUCCESS : success * @retval MFD_ERROR : error */intusmDHUserKeyTable_commit(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx){ int rc = MFD_SUCCESS; int save_flags; DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserKeyTable_commit", "called\n")); /** we should have a non-NULL pointer */ netsnmp_assert(NULL != rowreq_ctx); /* * nothing to do; we wait for the irreversible commit */ /* * if we successfully commited this row, set the dirty flag. */ if (MFD_SUCCESS == rc) { rowreq_ctx->rowreq_flags |= MFD_ROW_DIRTY; } return rc;} /* usmDHUserKeyTable_commit *//** * undo commit new values. * * Should you need different behavior depending on which columns were * set, rowreq_ctx->column_set_flags will indicate which writeable columns were * set. The definitions for the COLUMN_*_FLAG bits can be found in * usmDHUserKeyTable_oids.h. * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags. * * @param rowreq_ctx * Pointer to the users context. * * @retval MFD_SUCCESS : success * @retval MFD_ERROR : error */intusmDHUserKeyTable_undo_commit(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx){ int rc = MFD_SUCCESS; DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserKeyTable_undo_commit", "called\n")); /** we should have a non-NULL pointer */ netsnmp_assert(NULL != rowreq_ctx); /* * TODO:485:M: |-> Undo usmDHUserKeyTable commit. * check the column's flag in rowreq_ctx->column_set_flags to see * if it was set during commit, then undo it. * * eg: if (rowreq_ctx->column_set_flags & COLUMN__FLAG) {} */ /* * if we successfully un-commited this row, clear the dirty flag. */ if (MFD_SUCCESS == rc) { rowreq_ctx->rowreq_flags &= ~MFD_ROW_DIRTY; } return rc;} /* usmDHUserKeyTable_undo_commit *//** * perform commit actions that are not reversible * * THERE IS NO ATTEMPT AT RECOVERY FOR ERRORS FROM THIS STATE! * * @param rowreq_ctx * Pointer to the users context. * * @retval MFD_SUCCESS : success * @retval MFD_ERROR : other error */intusmDHUserKeyTable_irreversible_commit(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx){ struct usmUser *user; int flags; DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserKeyTable_irreversible_commit", "called\n")); /** we should have a non-NULL pointer */ netsnmp_assert(NULL != rowreq_ctx);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -