示例#1
0
static int pgsql_get_ip_list(const char *kind, ip_range_list_t * list)
{
	int ret = -1;
	PGconn * pqc = get_pqdb_connection();
	if (pqc) {
		char statement[TURN_LONG_STRING_SIZE];
		snprintf(statement, sizeof(statement), "select ip_range,realm from %s_peer_ip", kind);
		PGresult *res = PQexec(pqc, statement);

		if (!res || (PQresultStatus(res) != PGRES_TUPLES_OK)) {
			static int wrong_table_reported = 0;
			if(!wrong_table_reported) {
				wrong_table_reported = 1;
				TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Error retrieving PostgreSQL DB information: %s; probably, the tables 'allowed_peer_ip' and/or 'denied_peer_ip' have to be upgraded to include the realm column.\n",PQerrorMessage(pqc));
			}
			snprintf(statement, sizeof(statement), "select ip_range,'' from %s_peer_ip", kind);
			res = PQexec(pqc, statement);
		}

		if (res && (PQresultStatus(res) == PGRES_TUPLES_OK)) {
			int i = 0;
			for (i = 0; i < PQntuples(res); i++) {
				char *kval = PQgetvalue(res, i, 0);
				char *rval = PQgetvalue(res, i, 1);
				if (kval) {
					add_ip_list_range(kval, rval, list);
				}
			}
			ret = 0;
		}

		if (res) {
			PQclear(res);
		}
	}
	return ret;
}
示例#2
0
static int mongo_read_realms_ip_lists(const char *kind, ip_range_list_t * list)
{
	int ret = 0;

	char field_name[129];
	sprintf(field_name, "%s_peer_ip", kind);

	mongoc_collection_t * collection = mongo_get_collection("realm");

	if (!collection)
		return ret;

	bson_t query;
	bson_init(&query);

	bson_t fields;
	bson_init(&fields);
	BSON_APPEND_INT32(&fields, "realm", 1);
	BSON_APPEND_INT32(&fields, field_name, 1);

	mongoc_cursor_t * cursor;
	cursor = mongoc_collection_find(collection, MONGOC_QUERY_NONE, 0, 0, 0,
			&query, &fields, NULL);

	if (!cursor) {
		TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,
				"Error querying MongoDB collection 'realm'\n");
		ret = -1;
	} else {
		const bson_t * item;
		uint32_t length;
		bson_iter_t iter;
		char realm[513];

		while (mongoc_cursor_next(cursor, &item)) {

			if (bson_iter_init(&iter, item) && bson_iter_find(&iter, "realm")
					&& BSON_ITER_HOLDS_UTF8(&iter)) {

				STRCPY(realm,bson_iter_utf8(&iter, &length));

				if (bson_iter_init(&iter, item) && bson_iter_find(&iter,
						field_name) && BSON_ITER_HOLDS_ARRAY(&iter)) {
					const uint8_t *docbuf = NULL;
					uint32_t doclen = 0;
					bson_t ip_range_array;
					bson_iter_t ip_range_iter;

					bson_iter_array(&iter, &doclen, &docbuf);
					bson_init_static(&ip_range_array, docbuf, doclen);

					if (bson_iter_init(&ip_range_iter, &ip_range_array)) {
						while (bson_iter_next(&ip_range_iter)) {
							if (BSON_ITER_HOLDS_UTF8(&ip_range_iter)) {
								const char* ip_range = bson_iter_utf8(&ip_range_iter, &length);
								add_ip_list_range(ip_range, realm, list);
							}
						}
					}
				}
			}
		}
		mongoc_cursor_destroy(cursor);
	}
	mongoc_collection_destroy(collection);
	bson_destroy(&query);
	bson_destroy(&fields);

	return ret;
}