Ejemplo n.º 1
0
static bool
hhmm_to_seconds(const std::string & HHMM,
                unsigned long & seconds)
{
        unsigned long tmp;
        std::string hours;
        std::string minutes;

        if (!split(HHMM, hours, minutes, ':'))
                return false;
        if (!str_to_ulong(hours.c_str(), seconds))
                return false;
        if (23 < seconds)
                return false;
        seconds = seconds * SECONDS_IN_HOUR;

        if (!str_to_ulong(minutes.c_str(), tmp))
                return false;
        if (59 < tmp)
                return false;
        tmp = tmp * 60;

        seconds += tmp;

        return true;
}
Ejemplo n.º 2
0
Archivo: str.c Proyecto: Distrotech/nut
int	str_to_uint(const char *string, unsigned int *number, const int base)
{
	unsigned long	num;

	*number = 0;

	if (!str_to_ulong(string, &num, base))
		return 0;

	if (num > UINT_MAX) {
		errno = ERANGE;
		return 0;
	}

	*number = num;
	return 1;
}
Ejemplo n.º 3
0
static int
mail_export_parse_filter(const char *const *args, pool_t pool,
			 struct mail_export_filter *filter_r,
			 const char **error_r)
{
	unsigned long l;

	/* filters:
	   user=<wildcard> | domain=<wildcard>
	   ip=<ip>[/<mask>]
	   since=<timestamp>
	   connected
	*/
	memset(filter_r, 0, sizeof(*filter_r));
	for (; *args != NULL; args++) {
		if (strncmp(*args, "user="******"domain=", 7) == 0)
			filter_r->domain = p_strdup(pool, *args + 7);
		else if (strncmp(*args, "ip=", 3) == 0) {
			if (net_parse_range(*args + 3, &filter_r->ip,
					    &filter_r->ip_bits) < 0) {
				*error_r = "Invalid ip filter";
				return -1;
			}
		} else if (strncmp(*args, "since=", 6) == 0) {
			if (str_to_ulong(*args + 6, &l) < 0) {
				*error_r = "Invalid since filter";
				return -1;
			}
			filter_r->since = (time_t)l;
		} else if (strcmp(*args, "connected") == 0) {
			filter_r->connected = TRUE;
		}
	}
	return 0;
}
Ejemplo n.º 4
0
static bool auth_handle_response(struct digest_auth_request *request,
				 char *key, char *value, const char **error)
{
	unsigned int i;

	(void)str_lcase(key);

	if (strcmp(key, "realm") == 0) {
		if (request->auth_request.realm == NULL && *value != '\0')
			request->auth_request.realm =
				p_strdup(request->pool, value);
		return TRUE;
	}

	if (strcmp(key, "username") == 0) {
		if (request->username != NULL) {
			*error = "username must not exist more than once";
			return FALSE;
		}

		if (*value == '\0') {
			*error = "empty username";
			return FALSE;
		}

		request->username = p_strdup(request->pool, value);
		return TRUE;
	}

	if (strcmp(key, "nonce") == 0) {
		/* nonce must be same */
		if (strcmp(value, request->nonce) != 0) {
			*error = "Invalid nonce";
			return FALSE;
		}

		request->nonce_found = TRUE;
		return TRUE;
	}

	if (strcmp(key, "cnonce") == 0) {
		if (request->cnonce != NULL) {
			*error = "cnonce must not exist more than once";
			return FALSE;
		}

		if (*value == '\0') {
			*error = "cnonce can't contain empty value";
			return FALSE;
		}

		request->cnonce = p_strdup(request->pool, value);
		return TRUE;
	}

	if (strcmp(key, "nc") == 0) {
		unsigned int nc;

		if (request->nonce_count != NULL) {
			*error = "nonce-count must not exist more than once";
			return FALSE;
		}

		if (str_to_uint(value, &nc) < 0) {
			*error = "nonce-count value invalid";
			return FALSE;
		}

		if (nc != 1) {
			*error = "re-auth not supported currently";
			return FALSE;
		}

		request->nonce_count = p_strdup(request->pool, value);
		return TRUE;
	}

	if (strcmp(key, "qop") == 0) {
		for (i = 0; i < QOP_COUNT; i++) {
			if (strcasecmp(qop_names[i], value) == 0)
				break;
		}

		if (i == QOP_COUNT) {
			*error = t_strdup_printf("Unknown QoP value: %s",
					str_sanitize(value, 32));
			return FALSE;
		}

		request->qop &= (1 << i);
		if (request->qop == 0) {
			*error = "Nonallowed QoP requested";
			return FALSE;
		} 

		request->qop_value = p_strdup(request->pool, value);
		return TRUE;
	}

	if (strcmp(key, "digest-uri") == 0) {
		/* type / host / serv-name */
		const char *const *uri = t_strsplit(value, "/");

		if (uri[0] == NULL || uri[1] == NULL) {
			*error = "Invalid digest-uri";
			return FALSE;
		}

		/* FIXME: RFC recommends that we verify the host/serv-type.
		   But isn't the realm enough already? That'd be just extra
		   configuration.. Maybe optionally list valid hosts in
		   config file? */
		request->digest_uri = p_strdup(request->pool, value);
		return TRUE;
	}

	if (strcmp(key, "maxbuf") == 0) {
		if (request->maxbuf != 0) {
			*error = "maxbuf must not exist more than once";
			return FALSE;
		}

		if (str_to_ulong(value, &request->maxbuf) < 0 ||
		    request->maxbuf == 0) {
			*error = "Invalid maxbuf value";
			return FALSE;
		}
		return TRUE;
	}

	if (strcmp(key, "charset") == 0) {
		if (strcasecmp(value, "utf-8") != 0) {
			*error = "Only utf-8 charset is allowed";
			return FALSE;
		}

		return TRUE;
	}

	if (strcmp(key, "response") == 0) {
		if (strlen(value) != 32) {
			*error = "Invalid response value";
			return FALSE;
		}

		memcpy(request->response, value, 32);
		return TRUE;
	}

	if (strcmp(key, "cipher") == 0) {
		/* not supported, ignore */
		return TRUE;
	}

	if (strcmp(key, "authzid") == 0) {
		if (request->authzid != NULL) {
		    *error = "authzid must not exist more than once";
		    return FALSE;
		}

		if (*value == '\0') {
		    *error = "empty authzid";
		    return FALSE;
		}

		request->authzid = p_strdup(request->pool, value);
		return TRUE;
	}

	/* unknown key, ignore */
	return TRUE;
}
Ejemplo n.º 5
0
bool
ConfigItemFIXSession::get(struct FIX_Session_Config & session_config)
{
        std::vector<std::string> items;
        std::map<std::string, std::string> session_props;
        ConfigItemNetwork ci_network;
        std::vector<endpoint_t> enpoints;

        if (!config_vector_item_.get(items)) {
                M_ERROR("could not get vector item");
                return false;
        }

        std::string token;
        std::string value;
        for (size_t n = 0; n < items.size(); ++n) {
                if (!split(items[n], token, value, ':'))
                        return false;
                if (token.size() && value.size())
                        session_props[token] = value;;
        }
        if (!check_session_props(session_props))
                return false;

        if ("YES" == session_props[DUPLEX_KEY]) {
                session_config.is_duplex = true;
        } else {
                session_config.is_duplex = false;
        }
        session_config.must_initiate_logon = ("YES" == session_props[MUST_INITIATE_LOGON_KEY]);
        session_config.reset_seq_numbers_at_logon = ("YES" == session_props[RESET_SEQ_NUMBERS_AT_LOGON_KEY]);

        std::vector<std::string> days;
        if (!make_vector(days, session_props[SESSION_DAYS_KEY].c_str(), ","))
                goto err;
        for (size_t n = 0; n < 7; ++n) {
                session_config.session_days_[n] = false;
        }
        for (size_t n = 0; n < days.size(); ++n) {
                if (SUNDAY == days[n]) {
                        session_config.session_days_[0] = true;
                        continue;
                }
                if (MONDAY == days[n]) {
                        session_config.session_days_[1] = true;
                        continue;
                }
                if (TUESDAY == days[n]) {
                        session_config.session_days_[2] = true;
                        continue;
                }
                if (WEDNESDAY == days[n]) {
                        session_config.session_days_[3] = true;
                        continue;
                }
                if (THURSDAY == days[n]) {
                        session_config.session_days_[4] = true;
                        continue;
                }
                if (FRIDAY == days[n]) {
                        session_config.session_days_[5] = true;
                        continue;
                }
                if (SATURDAY == days[n]) {
                        session_config.session_days_[6] = true;
                        continue;
                }

                goto err;
        }

        do {
                if (FIX_4_0_VAL == session_props[FIX_APPLICATION_VER_KEY]) {
                        session_config.fixA_ver = FIX_4_0;
                        break;
                }
                if (FIX_4_1_VAL == session_props[FIX_APPLICATION_VER_KEY]) {
                        session_config.fixA_ver = FIX_4_1;
                        break;
                }
                if (FIX_4_2_VAL == session_props[FIX_APPLICATION_VER_KEY]) {
                        session_config.fixA_ver = FIX_4_2;
                        break;
                }
                if (FIX_4_3_VAL == session_props[FIX_APPLICATION_VER_KEY]) {
                        session_config.fixA_ver = FIX_4_3;
                        break;
                }
                if (FIX_4_4_VAL == session_props[FIX_APPLICATION_VER_KEY]) {
                        session_config.fixA_ver = FIX_4_4;
                        break;
                }
                if (FIX_5_0_VAL == session_props[FIX_APPLICATION_VER_KEY]) {
                        session_config.fixA_ver = FIX_5_0;
                        break;
                }
                if (FIX_5_0_SP1_VAL == session_props[FIX_APPLICATION_VER_KEY]) {
                        session_config.fixA_ver = FIX_5_0_SP1;
                        break;
                }
                if (FIX_5_0_SP2_VAL == session_props[FIX_APPLICATION_VER_KEY]) {
                        session_config.fixA_ver = FIX_5_0_SP2;
                        break;
                }

                goto err;
        } while (false);

        do {
                if (NO_FIXT_VAL == session_props[FIX_SESSION_VER_KEY]) {
                        session_config.fixT_ver = NO_FIXT;
                        break;
                }
                if (FIXT_1_1_VAL == session_props[FIX_SESSION_VER_KEY]) {
                        session_config.fixT_ver = FIXT_1_1;
                        break;
                }

                goto err;
        } while (false);

        if (!str_to_ulong(session_props[HEARTBEAT_INTERVAL_KEY].c_str(), session_config.heartbeat_interval))
                goto err;

        if (!str_to_ulong(session_props[TEST_REQUEST_DELAY_KEY].c_str(), session_config.test_request_delay))
                goto err;

        if (!str_to_ulong(session_props[SESSION_WARM_UP_TIME_KEY].c_str(), session_config.session_warm_up_time))
                goto err;

        if (!hhmm_to_seconds(session_props[SESSION_START_KEY], session_config.session_start))
                goto err;

        if (!hhmm_to_seconds(session_props[SESSION_END_KEY], session_config.session_end))
                goto err;

        if (!session_props[TIMEZONE_KEY].size())
                goto err;
        session_config.timezone = strdup(session_props[TIMEZONE_KEY].c_str());
        if (!session_config.timezone)
                goto err;

        switch (session_config.is_duplex) {
        case true:
                ci_network.fill(data_source_, session_props[ENDPOINT_IN_OUT_KEY].c_str());
                ci_network.get(enpoints);
                if (1 != enpoints.size())
                        goto err;
                session_config.in_going.kind = enpoints[0].kind;
                session_config.in_going.interface = enpoints[0].interface;
                session_config.in_going.port = enpoints[0].port;
                session_config.in_going.pf_family = enpoints[0].pf_family;

                session_config.out_going.kind = enpoints[0].kind;
                session_config.out_going.interface = enpoints[0].interface;
                session_config.out_going.port = enpoints[0].port;
                session_config.out_going.pf_family = enpoints[0].pf_family;
		break;
        case false:
                ci_network.fill(data_source_, session_props[ENDPOINT_IN_GOING_KEY].c_str());
                ci_network.get(enpoints);
                if (1 != enpoints.size())
                        goto err;
                session_config.in_going.kind = enpoints[0].kind;
                session_config.in_going.interface = enpoints[0].interface;
                session_config.in_going.port = enpoints[0].port;
                session_config.in_going.pf_family = enpoints[0].pf_family;

                ci_network.fill(data_source_, session_props[ENDPOINT_OUT_GOING_KEY].c_str());
                ci_network.get(enpoints);
                if (1 != enpoints.size())
                        goto err;
                session_config.out_going.kind = enpoints[0].kind;
                session_config.out_going.interface = enpoints[0].interface;
                session_config.out_going.port = enpoints[0].port;
                session_config.out_going.pf_family = enpoints[0].pf_family;
		break;
        default:
                goto err;
        }

        return true;
err:
        return false;
}
Ejemplo n.º 6
0
Archivo: str.c Proyecto: Distrotech/nut
int	str_is_ulong(const char *string, const int base)
{
	unsigned long	number;

	return str_to_ulong(string, &number, base);
}
Ejemplo n.º 7
0
static
int
advert_parse(int c, char **argv, int invert, unsigned int *flags,
             const void *entry, struct xt_entry_target **target)
{
        struct xt_advert_tginfo *info = (void*)(*target)->data;

        if (info->count == MAX_NETS)
                xtables_error(PARAMETER_PROBLEM, "ADVERT: too many nets");

        struct ipnet *net = info->ipnets + info->count;

        switch (c) {
        case 'n':
                if (-1 == parse_ipnet(optarg, net))
                        xtables_error(PARAMETER_PROBLEM, "ADVERT: bad network given");

                if (net->masklen < MIN_MASKLEN)
                        xtables_error(PARAMETER_PROBLEM, "ADVERT: too big network");

                // printf("%s parsed %s/%d\n", optarg, ip_to_sa(net->ip), net->masklen);

                info->count++;

                *flags |= NETS_PRESENT;

                return true;

        case 'u':
                if (*flags & URL_PRESENT)
                        xtables_error(PARAMETER_PROBLEM, "ADVERT: url already set");

                __u32 len = strlen(optarg);

                if (len > MAX_URLLEN)
                        xtables_error(PARAMETER_PROBLEM, "ADVERT: url too long");

                // info->url_len = len;

                memcpy(info->url, optarg, len+1);

                *flags |= URL_PRESENT;

                return true;
        case 'i':
                if (*flags & INTERVAL_PRESENT)
                        xtables_error(PARAMETER_PROBLEM, "ADVERT: interval already set");

                {
                        char *endptr;
                        unsigned long n;

                        if (-1 == str_to_ulong(optarg, &endptr, &n, INTERVAL_MAX) || *endptr)
                                xtables_error(PARAMETER_PROBLEM, "ADVERT: incorrect interval");

                        info->interval = n;
                }

                *flags |= INTERVAL_PRESENT;

                return true;

        default:
                return false;
        }

        return false;
}