コード例 #1
0
ファイル: radius.c プロジェクト: intersvyaz/zerod
/**
 * Log session authorization.
 * @param[in] session Session.
 * @param[in] attrs Authorization reply attributes.
 */
static void zrad_auth_log(const zscope_t *scope, const zsession_t *session, const VALUE_PAIR *attrs)
{
    UT_string rules_str;
    utstring_init(&rules_str);
    utstring_reserve(&rules_str, 1024);

    for (; likely(NULL != attrs); attrs = attrs->next) {
        switch (attrs->attribute) {
            case PW_FILTER_ID:
                utstring_printf(&rules_str, " %s", attrs->strvalue);
                break;
            default:
                break;
        }
    }

    zsyslog(LOG_INFO, "%s: Authenticated session %s (rules:%s)",
            scope->cfg->name, session->ip_str, utstring_body(&rules_str));
    utstring_done(&rules_str);
}
コード例 #2
0
ファイル: kvsp-tpub.c プロジェクト: JHUAPL/kvspool
int accept_client() {
  int rc=-1, i=0;

  struct sockaddr_in cin;
  socklen_t cin_sz = sizeof(cin);
  int fd = accept(cfg.listener_fd,(struct sockaddr*)&cin, &cin_sz);
  if (fd == -1) {
    fprintf(stderr,"accept: %s\n", strerror(errno));
    goto done;
  }
  if (sizeof(cin)==cin_sz) fprintf(stderr,"connection from %s:%d\n", 
    inet_ntoa(cin.sin_addr), (int)ntohs(cin.sin_port));
  utarray_push_back(cfg.clients,&fd);
  /* set up client output buffer. reserve space for full buffer */
  UT_string *s; utstring_new(s); utstring_reserve(s,cfg.mb_per_client*1024*1024); 
  utarray_push_back(cfg.outbufs,&s);
  utarray_push_back(cfg.outidxs,&i);
  new_epoll(EPOLLIN, fd);

  rc=0;

 done:
  return rc;
}
コード例 #3
0
ファイル: overlord.c プロジェクト: carriercomm/zerod
/**
 * Authenticate and set client info.
 * @param[in] sess Client session.
 * @return Zero on success (or one of *_RC).
 */
static int session_authenticate(struct zsession *sess)
{
    int ret = OTHER_RC;
    VALUE_PAIR *request_attrs = NULL, *response_attrs = NULL, *attrs = NULL;
    char msg[8192]; // WARNING: libfreeradius-client has unsafe working with this buffer.
    rc_handle *rh = zinst()->radh;
    struct in_addr ip_addr;
    char ip_str[INET_ADDRSTRLEN];
    struct zcrules rules;

    crules_init(&rules);

    ip_addr.s_addr = htonl(sess->ip);
    if (unlikely(NULL == inet_ntop(AF_INET, &ip_addr, ip_str, sizeof(ip_str)))) {
        goto end;
    }

    if (unlikely(NULL == rc_avpair_add(rh, &request_attrs, PW_USER_NAME, ip_str, -1, 0))) {
        goto end;
    }
    if (unlikely(NULL == rc_avpair_add(rh, &request_attrs, PW_USER_PASSWORD, "", -1, 0))) {
        goto end;
    }
    if (unlikely(NULL == rc_avpair_add(rh, &request_attrs, PW_NAS_IDENTIFIER, zcfg()->radius_nas_identifier, -1, 0))) {
        goto end;
    }
    if (unlikely(NULL == rc_avpair_add(rh, &request_attrs, PW_CALLING_STATION_ID, ip_str, -1, 0))) {
        goto end;
    }

    ret = rc_auth(rh, 0, request_attrs, &response_attrs, msg);
    if (OK_RC != ret) {
        ZERO_LOG(LOG_ERR, "Session authentication failed for %s (code:%d)", ip_str, ret);
        goto end;
    }

    attrs = response_attrs;
    while (likely(NULL != attrs)) {
        switch (attrs->attribute) {
            case PW_FILTER_ID:
                crules_parse(&rules, attrs->strvalue);
                break;
            case PW_SESSION_TIMEOUT:
                atomic_store_explicit(&sess->max_duration, SEC2USEC(attrs->lvalue), memory_order_release);
                break;
            case PW_ACCT_INTERIM_INTERVAL:
                atomic_store_explicit(&sess->acct_interval, SEC2USEC(attrs->lvalue), memory_order_release);
                break;
        }
        attrs = attrs->next;
    }

    if (likely(rules.have.user_id && rules.have.login)) {
        struct zclient *client = sess->client;

        client_db_find_or_set_id(zinst()->client_db, rules.user_id, &client);
        if (client != sess->client) {
            // found
            pthread_rwlock_wrlock(&sess->lock_client);
            atomic_fetch_add_explicit(&client->refcnt, 1, memory_order_relaxed);
            client_release(sess->client);
            sess->client = client;
            client_session_add(sess->client, sess);
            pthread_rwlock_unlock(&sess->lock_client);
        } else {
            client_apply_rules(sess->client, &rules);
        }

        atomic_fetch_sub_explicit(&zinst()->unauth_sessions_cnt, 1, memory_order_release);

        // log successful authentication
        {
            UT_string rules_str;
            utstring_init(&rules_str);
            utstring_reserve(&rules_str, 1024);

            attrs = response_attrs;
            while (likely(NULL != attrs)) {
                switch (attrs->attribute) {
                    case PW_FILTER_ID:
                        utstring_printf(&rules_str, " %s", attrs->strvalue);
                        break;
                    default:
                        break;
                }
                attrs = attrs->next;
            }

            zero_syslog(LOG_INFO, "Authenticated session %s (rules:%s)", ip_str, utstring_body(&rules_str));
            utstring_done(&rules_str);
        }
    } else {
        ret = OTHER_RC;
        ZERO_LOG(LOG_ERR, "Session authentication failed for %s (code:%d)", ip_str, ret);
    }

    end:
    crules_free(&rules);
    if (request_attrs) rc_avpair_free(request_attrs);
    if (response_attrs) rc_avpair_free(response_attrs);

    return ret;
}