funcs.c
来自「RADIUS协议的认证计费服务」· C语言 代码 · 共 2,608 行 · 第 1/5 页
C
2,608 行
"%s: FATAL: Couldn't find attribute %d(%ld)", func, attr, vendor_id); dumpcore = 1; /* Force a core dump to find out why */ abort (); } if ((attribute->flags & ATTR_ENCAPS) != 0) { av_flags |= VPF_ENCAPS; } ret = insert_attribute (attribute, auth, max, valptr, len, av_flags, veps, tag); if (ret <= 0) { logit (LOG_DAEMON, LOG_ALERT, "%s: insert_attribute(%s(%d), ..., %d, 0x%p, %d, 0x%x, %s) returns %d", func, attribute->name, attr, max, valptr, len, av_flags, vendor_list_toa (veps), ret); } return ret;} /* end of attribute_out_tag () *//****************************************************************************** * * Function: attribute_pw_out * * Purpose: Directly add a password attribute (w/o an avpair) * to the output buffer * * Returns: Length of output buffer. * *****************************************************************************/intattribute_pw_out (auth, maxlen, passwd, secret)AUTH_HDR *auth;UINT4 maxlen;char *passwd;char *secret;{ int i; int len; int pass; int passes; int secretlen; u_char *ptr; u_char *vector_ptr; u_char digest[AUTH_VECTOR_LEN]; u_char md5buf[MAX_SECRET_LENGTH + AUTH_VECTOR_LEN]; u_char passbuf[AUTH_PASS_LEN]; static char *func = "attribute_pw_out"; dprintf(3, (LOG_DAEMON, LOG_DEBUG, "%s: entered", func)); if (auth->code == PW_EXTENDED_FORMAT) { vector_ptr = auth->vector; } else { vector_ptr = ((AUTH_HDR1 *) auth)->vector; } /* Encrypt the Password */ len = strlen (passwd); if (len > AUTH_PASS_LEN) { len = AUTH_PASS_LEN; } memset ((char *) passbuf, '\0', AUTH_PASS_LEN); memcpy ((char *) passbuf, passwd, len); /* Calculate the MD5 Digest */ secretlen = strlen (secret); strcpy ((char *) md5buf, secret); memcpy ((char *) md5buf + secretlen, vector_ptr, AUTH_VECTOR_LEN); /* Compute number of encryption passes needed */ passes = MAX(1, (len + AUTH_VECTOR_LEN - 1) / AUTH_VECTOR_LEN); ptr = passbuf; for (pass = 0; pass < passes; pass++) { md5_calc (digest, md5buf, secretlen + AUTH_VECTOR_LEN); /* Xor the password into the MD5 digest */ for (i = 0; i < AUTH_VECTOR_LEN; i++) { ptr[i] ^= digest[i]; } memcpy ((char *) md5buf + secretlen, (char *) ptr, AUTH_VECTOR_LEN); ptr += AUTH_VECTOR_LEN; } memset (md5buf, 0, secretlen); pass = attribute_out (auth, maxlen, PW_USER_PASSWORD, 0, passbuf, ptr - passbuf, 0, (VENDOR_LIST *) NULL); if (pass <= 0) { logit (LOG_DAEMON, LOG_ALERT, "%s: attribute_out(..., %d, PW_USER_PASSWORD, 0, 0x%p, %d, NULL) returns %d)", func, maxlen, passbuf, (int) (ptr - passbuf), pass); } return pass;} /* end of attribute_pw_out () *//****************************************************************************** * * Function: authtype_toa * * Purpose: Return a string representation of the authreq code. * * Returns: pointer to static string. * *****************************************************************************/char *authtype_toa (code)int code; /* code indicating authen, acct, etc. */{ static char *typelist[] = { "invalid(0)", /* 0 invalid */ "access", /* 1 PW_ACCESS_REQUEST */ "accept", /* 2 PW_ACCESS_ACCEPT */ "reject", /* 3 PW_ACCESS_REJECT */ "acct-req", /* 4 PW_ACCOUNTING_REQUEST */ "acct-resp", /* 5 PW_ACCOUNTING_RESPONSE */ "acct-status", /* 6 PW_ACCOUNTING_STATUS */ "pw-request", /* 7 PW_PASSWORD_REQUEST */ "pw-ack", /* 8 PW_PASSWORD_ACK */ "pw-reject", /* 9 PW_PASSWORD_REJECT */ "acct-msg", /* 10 PW_ACCOUNTING_MESSAGE */ "access-challenge", /* 11 PW_ACCESS_CHALLENGE */ "status-server", /* 12 PW_STATUS_SERVER */ "status-client", /* 13 PW_STATUS_CLIENT */ "unknown(14)", /* 14 *unknown* */ "unknown(15)", /* 15 *unknown* */ "unknown(16)", /* 16 *unknown* */ "unknown(17)", /* 17 *unknown* */ "unknown(18)", /* 18 *unknown* */ "unknown(19)", /* 19 *unknown* */ "unknown(20)", /* 20 *unknown* */ "resource-free-req", /* 21 PW_RESOURCE_FREE_REQ */ "resource-free-resp", /* 22 PW_RESOURCE_FREE_RESP */ "resource-query-req", /* 23 PW_RESOURCE_QUERY_REQ */ "resource-query-resp", /* 24 PW_RESOURCE_QUERY_RESP */ "unknown(25)", /* 25 *unknown* */ "nas-reb-req", /* 26 PW_NAS_REB_REQ */ "nas-reb-resp", /* 27 PW_NAS_REB_RESP */ "unknown(28)", /* 28 *unknown* */ "unknown(29)", /* 29 *unknown* */ "unknown(30)", /* 30 *unknown* */ "ascend-term-sess", /* 31 PW_TERMINATE_SESSION */ "ascend-pw-exp", /* 32 PW_PASSWORD_EXPIRED */ "ascend-ev-req", /* 33 PW_ASCEND_EVENT_REQUEST */ "ascend-ev-resp", /* 34 PW_ASCEND_EVENT_RESPONSE */ "unknown(35)", /* 35 *unknown* */ "unknown(36)", /* 36 *unknown* */ "unknown(37)", /* 37 *unknown* */ "unknown(38)", /* 38 *unknown* */ "unknown(39)", /* 39 *unknown* */ "unknown(40)", /* 40 *unknown* */ "unknown(41)", /* 41 *unknown* */ "unknown(42)", /* 42 *unknown* */ "unknown(43)", /* 43 *unknown* */ "unknown(44)", /* 44 *unknown* */ "unknown(45)", /* 45 *unknown* */ "unknown(46)", /* 46 *unknown* */ "unknown(47)", /* 47 *unknown* */ "unknown(48)", /* 48 *unknown* */ "unknown(49)", /* 49 *unknown* */ "ascend-ip-alloc", /* 50 PW_ASCEND_RADIPA_ALLOCATE */ "ascend-ip-rel", /* 51 PW_ASCEND_RADIPA_RELEASE */ }; static char *v2_typelist[] = { "v2-unknown(256)", /* 256 *unknown* */ "v2-unknown(257)", /* 257 *unknown* */ "v2-unknown(258)", /* 258 *unknown* */ "v2-unknown(259)", /* 259 *unknown* */ "v2-unknown(260)", /* 260 *unknown* */ "v2-resource-free-req", /* 261 PW_RESOURCE_FREE_REQ */ "v2-resource-free-resp",/* 262 PW_RESOURCE_FREE_RESP */ "v2-resource-query-req", /* 263 PW_RESOURCE_QUERY_REQ */ "v2-resource-query-resp", /* 264 PW_RESOURCE_QUERY_RESP */ "v2-resource-reclaim-req", /* 265 PW_RESOURCE_RECLAIM_REQ */ "v2-resource-reclaim-resp", /* 266 PW_RESOURCE_RECLAIM_RESP */ "v2-nas-reb-req", /* 267 PW_NAS_REB_REQ */ "v2-nas-reb-resp", /* 268 PW_NAS_REB_RESP */ "v2-change-filter-req", /* 304 PW_CHANGE_FILTER_REQ */ "v2-change-filter-ack", /* 305 PW_CHANGE_FILTER_ACK */ "v2-change-filter-nak", /* 306 PW_CHANGE_FILTER_NAK */ "v2-access-error", /* 402 PW_ACCESS_ERROR */ "v2-acct-error", /* 405 PW_ACCOUNTING_ERROR */ }; static char unknown[20]; static char *func = "authtype_toa"; dprintf(4, (LOG_DAEMON, LOG_DEBUG, "%s: entered", func)); if ((code <= 0) || ((sizeof (typelist) / sizeof (typelist[0])) <= code)) { if (code == PW_FORWARDING) { return "forwarding"; } else if (code >= 256) { if ((sizeof (v2_typelist) / sizeof (v2_typelist[0])) > (code - 256)) { return v2_typelist[code-256]; } } sprintf (unknown, "invalid(%d)", code); return unknown; } return typelist[code];} /* end of authtype_toa () */#define AUTH_VECTORTOA_BUFS 20/************************************************************************* * * Function: auth_vectortoa * * Purpose: Produce hexadecimal dump of authreq->vector. * * Returns: pointer to auth_vector hex buffer. * *************************************************************************/char *auth_vectortoa (authvec, sws)u_char *authvec;int sws;{ int i; static char buffers[AUTH_VECTORTOA_BUFS][(3*AUTH_VECTOR_LEN)+1]; static int ndx = 0; char *buffer = buffers[ndx]; char *put = buffer; ndx++; if (ndx >= AUTH_VECTORTOA_BUFS) { ndx = 0; } for (i = 0; i <= AUTH_VECTOR_LEN; i++) { if ((sws & 0x01) && ((i % 4) == 3)) { *put = ' '; put++; } sprintf (put, "%2.2X", *authvec); authvec++; put += 2; } *put = '\0'; return (buffer);} /* end of auth_vectortoa () *//****************************************************************************** * * Function: avpair_add * * Purpose: Add an attribute-value pair to the given list. * * Returns: pointer to added a/v pair upon success, * NULL pointer, upon failure. * * Remarks: Always appends the new pair to the end of the list. * *****************************************************************************/VALUE_PAIR *avpair_add (list, attrid, pval, len)VALUE_PAIR **list; /* A list of attribute-value pairs. */int attrid; /* Attribute id number. */void *pval; /* Pointer to value. */int len; /* for strings: */ /* len < 0 ==> null-terminated ASCII string */ /* len == 0 ==> this is a zero length string (!) */ /* len > 0 ==> len is length of raw binary data */ /* for non-strings: */ /* len == 0 ==> just plain data, just gets copied */ /* len > 0 ==> convert data from network ... */ /* ... representation before copying */{ DICT_ATTR *pda; static char *func = "avpair_add"; dprintf(3, (LOG_DAEMON, LOG_DEBUG, "%s: entered", func)); if ((pda = dict_attrget (attrid, VC_RADIUS)) == (DICT_ATTR *) NULL) { logit (LOG_DAEMON, LOG_ERR, "%s: Unknown standard attribute %d", func, attrid); return NULL_VP; } if (pda->type == PW_TYPE_TAG_INT) { logit (LOG_DAEMON, LOG_ALERT, "%s: Doesn't support type tag-int for %s", func, pda->name); return (NULL_VP); } else { if (pda->type == PW_TYPE_TAG_STR) { logit (LOG_DAEMON, LOG_ALERT, "%s: Doesn't support type tag-str for %s", func, pda->name); return (NULL_VP); } } return avpair_add_attr_tag (list, pda, pval, len, 0);} /* end of avpair_add *//****************************************************************************** * * Function: avpair_add_attr_tag * * Purpose: Add a Vendor Specific attribute-value pair to the given list. * * Returns: pointer to added a/v pair upon success, * NULL pointer, upon failure. * * Remarks: Always appends the new pair to the end of the list. * *****************************************************************************/VALUE_PAIR *avpair_add_attr_tag (list, attr, pval, len, tag)VALUE_PAIR **list; /* A list of attribute-value pairs. */DICT_ATTR *attr; /* Dictionary entry for attribute */void *pval; /* Pointer to value. */int len; /* for strings: */ /* len < 0 ==> null-terminated ASCII string */ /* len == 0 ==> this is a zero length string (!) */ /* len > 0 ==> len is length of raw binary data */ /* for non-strings: */ /* len == 0 ==> just plain data, just gets copied */ /* len > 0 ==> convert data from network ... */ /* ... representation before copying */int tag; /* The tag for tagged attributes */{ VALUE_PAIR *vp;#ifdef BINARY_FILTERS radgenfilter *gen; radfilter *last; radfilter *this;#endif /* BINARY_FILTERS */ static char *func = "avpair_add_attr_tag"; dprintf(3, (LOG_DAEMON, LOG_DEBUG, "%s: entered", func));#ifdef PW_TYPE_FILTER_BINARY if (attr->value == PW_TYPE_FILTER_BINARY) /* do sanity checking */ { this = (radfilter *) pval; if (this->type == FILTER_GENERIC_TYPE) { vp = get_last_vp_vend (*list, attr->value, attr->vendor_id); if (vp != NULL_VP) { last = (radfilter *) vp->strvalue; if ((last->type != FILTER_GENERIC_TYPE) || (len <= 0) || (last->input != this->input) || (last->forward != this->forward)) { gen = &last->u.generic; gen->more = FALSE; logit (LOG_DAEMON, LOG_ERR, "%s: 'more' of previous generic filter entry doesn't match this one %s", func, binary_vtoa (this)); } } } }#endif /* PW_TYPE_FILTER_BINARY */ vp = avpair_assign_tag (attr, pval, len, tag); if (debug_flag >= 2) { debug_pair (stdout, vp); } if (list != (VALUE_PAIR **) NULL && vp != NULL_VP) { insert_vp (list, NULL_VP, vp); } return vp;} /* end of avpair_add_attr_tag () *//****************************************************************************** * * Function: avpair_add_tag * * Purpose: Add an attribute-value pair to the given list. * * Returns: pointer to added a/v pair upon success, * NULL pointer, upon failure. * * Remarks: Always appends the new pair to the end of the list. * *****************************************************************************/VALUE_PAIR *avpair_add_tag (list, attrid, pval, len, tag)VALUE_PAIR **list; /* A list of attribute-value pairs. */int attrid; /* Attribute id number. */void *pval; /* Pointer to value. */int len; /* for strings: */ /* len < 0 ==> null-terminated ASCII string */ /* len == 0 ==> this is a zero length string (!) */ /* len > 0 ==> len is length of raw binary data */ /* for non-strings: */ /* len == 0 ==> just plain data, just gets copied */ /* len > 0 ==> convert data from network ... */ /* ... representation before copying */int tag; /* The tag for tagged attributes */{ DICT_ATTR *pda; static char *func = "avpair_add_tag"; dprintf(3, (LOG_DAEMON, LOG_DEBUG, "%s: entered", func)); if ((pda = dict_attrget (attrid, VC_RADIUS)) == (DICT_ATTR *) NULL) { logit (LOG_DAEMON, LOG_ERR, "%s: Unknown standard attribute %d", func, attrid); return NULL_VP; } return avpair_add_attr_tag (list, pda, pval, len, tag);} /* end of avpair_add_tag *//****************************************************************************** * * Function: avpair_add_vend * * Purpose: Add a Vendor Specific attribute-value pair to the given list. * * Returns: pointer to added a/v pair upon success, * NULL pointer, upon failure. * * Remarks: Always appends the new pair to the end of the list. * *****************************************************************************/VALUE_PAIR *avpair_add_vend (list, attrid, pval, len, vend_id)VALUE_PAIR **list; /* A list of attribute-value pairs. */int attrid; /* Attribute id number. */void *pval; /* Pointer to value. */int len; /* for strings: */ /* len < 0 ==> null-terminated ASCII string */ /* len == 0 ==> this is a zero length string (!) */ /* len > 0 ==> len is length of raw binary data */ /* for non-strings: */ /* len == 0 ==> just plain data, just gets copied */ /* len > 0 ==> convert data from network ... */ /* ... representation before copying */UINT4 vend_id; /* Vendor ID */{ DICT_ATTR *pda; static char *func = "avpair_add_vend"; dprintf(3, (LOG_DAEMON, LOG_DEBUG, "%s: entered", func)); if ((pda = dict_attrget (attrid, vend_id)) == (DICT_ATTR *) NULL) { logit (LOG_DAEMON, LOG_ERR, "%s: Unknown vendor %ld attribute %d", func, vend_id, attrid); return NULL_VP; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?