예제 #1
0
파일: rtsp.c 프로젝트: dparnell/raopd
static utility_retcode_t parse_one_header(struct rtsp_response *response)
{
	utility_retcode_t ret = UTILITY_SUCCESS;
	char *start_value;
	char *header_name = response->current_header.name;
	char *header_value = response->current_header.value;

	FUNC_ENTER;

	ret = utility_copy_token(header_name,
				 MAX_HEADER_NAME_LEN,
				 response->parsep,
				 ": ",
				 NULL);
	if (UTILITY_SUCCESS != ret) {
		ERRR("Failed to copy header name\n");
		goto out;
	}

	start_value = begin_token(response->parsep, ": ");
	ret = utility_copy_token(header_value,
				 MAX_HEADER_VALUE_LEN,
				 start_value,
				 "\r\n",
				 NULL);
	if (UTILITY_SUCCESS != ret) {
		ERRR("Failed to copy header value\n");
		goto out;
	}

	DEBG("Found header name: \"%s\" value: \"%s\"\n",
	     header_name, header_value);

	if (0 == syscalls_strcmp(header_name, "Content-Length")) {
		ret = parse_content_length(response);
	} else if (0 == syscalls_strcmp(header_name, "Apple-Response")) {
		ret = parse_apple_response(response);
	} else if (0 == syscalls_strcmp(header_name, "Audio-Jack-Status")) {
		ret = parse_audio_jack_status(response);
	} else if (0 == syscalls_strcmp(header_name, "Session")) {
		ret = parse_session(response);
	} else if (0 == syscalls_strcmp(header_name, "Transport")) {
		ret = parse_transport(response);
	} else if (0 == syscalls_strcmp(header_name, "Public")) {
		ret = parse_public(response);
	} else {
		parse_unknown_header(response);
	}

out:
	FUNC_RETURN;
	return ret;
}
예제 #2
0
파일: satip.c 프로젝트: etix/vlc
static enum rtsp_result rtsp_handle(access_t *access, bool *interrupted) {
    access_sys_t *sys = access->p_sys;
    uint8_t buffer[512];
    int rtsp_result = 0;
    bool have_header = false;
    size_t content_length = 0;
    size_t read = 0;
    char *in, *val;

    /* Parse header */
    while (!have_header) {
        in = net_readln_timeout((vlc_object_t*)access, sys->tcp_sock, 5000,
                interrupted);
        if (in == NULL)
            break;

        if (strncmp(in, "RTSP/1.0 ", 9) == 0) {
            rtsp_result = atoi(in + 9);
        } else if (strncmp(in, "Content-Base:", 13) == 0) {
            free(sys->content_base);

            val = in + 13;
            skip_whitespace(val);

            sys->content_base = strdup(val);
        } else if (strncmp(in, "Content-Length:", 15) == 0) {
            val = in + 16;
            skip_whitespace(val);

            content_length = atoi(val);
        } else if (strncmp("Session:", in, 8) == 0) {
            val = in + 8;
            skip_whitespace(val);

            parse_session(val, sys->session_id, 64, &sys->keepalive_interval);
        } else if (strncmp("Transport:", in, 10) == 0) {
            val = in + 10;
            skip_whitespace(val);

            if (parse_transport(access, val) != 0) {
                rtsp_result = VLC_EGENERIC;
                break;
            }
        } else if (strncmp("com.ses.streamID:", in, 17) == 0) {
            val = in + 17;
            skip_whitespace(val);

            sys->stream_id = atoi(val);
        } else if (in[0] == '\0') {
            have_header = true;
        }

        free(in);
    }

    /* Discard further content */
    while (content_length > 0 &&
            (read = net_Read(access, sys->tcp_sock, buffer, __MIN(sizeof(buffer), content_length))))
        content_length -= read;

    return rtsp_result;
}
예제 #3
0
파일: mod_openaaa.c 프로젝트: n13l/openaaa
static int
post_read_request(request_rec *r)
{
	if (!ap_is_initial_req(r))
		return DECLINED;

	ap_module_trace_rcall(r);
/*
	if ( !ssl_keying_material)
		return DECLINED;
*/
	if (!ssl_is_https)
		return DECLINED;
	if (!ssl_var_lookup || !ssl_is_https(r->connection))
		return DECLINED;

	struct req *req = ap_req_config_get(r);
	struct srv *srv = ap_srv_config_get(r);
	struct aaa *aaa = srv->aaa;

	r_info(r, "uri: %s", r->uri);

	const char *pub = export_public_key(r);
	const char *key = aaa_attr_get(aaa, "sess.key");
	const char *sec = aaa_attr_get(aaa, "sess.sec");
	const char *id = aaa_attr_get(aaa, "sess.id");

	r_info(r, "sess.id: %s", id);

	if (key)
		r_info(r, "sess.key: %s", key);
	if (sec)
		r_info(r, "sess.sec: %s", sec);

	apr_table_t *t = r->subprocess_env;
        apr_table_setn(t, "AAA_SESS_KEY",  aaa_attr_get(aaa, "sess.key"));
        apr_table_setn(t, "AAA_SESS_SEC",  aaa_attr_get(aaa, "sess.sec"));

	if (sec) {
		const char *file = stk_printf("/tmp/aaa-%s", sec);
		r_info(r, "authentized session file=%s", file);
		parse_session(r, file);
	}


	if (!tls_authentication_signal(r))
		return DECLINED;

	key = export_keying_material(r);
	sec = export_keying_derivate(r, pub, key);

        if (key)
		r_info(r, "sess.key: %s", key);
	if (sec)
		r_info(r, "sess.sec: %s", sec);

	apr_table_setn(t, "AAA_SESS_KEY",  aaa_attr_get(aaa, "sess.key"));
	apr_table_setn(t, "AAA_SESS_SEC",  aaa_attr_get(aaa, "sess.sec"));	

	aaa_attr_set(srv->aaa, "sess.key", (char *)key);
	aaa_attr_set(srv->aaa, "sess.sec", (char *)sec);
	aaa_commit(srv->aaa);

	return DECLINED;
}
예제 #4
0
파일: mod_openaaa.c 프로젝트: n13l/openaaa
static int
external_aaa(request_rec *r)
{
        struct srv *srv = ap_srv_config_get(r);
        struct aaa *aaa = srv->aaa;

        const char *sid = aaa_attr_get(aaa, "sess.key");
        const char *key = sid;

	const char *authority = "orange.alucid.eu";

        byte *enkey = alloca(512);
        memset(enkey, 0, 511);
        base64_encode(enkey, (byte *)key, strlen(key));

        sha1_context sha1;
        sha1_init(&sha1);
        sha1_update(&sha1, (byte *)key, strlen(key));
        char *id = stk_mem_to_hex((char *)sha1_final(&sha1), SHA1_SIZE / 2);

	aaa_attr_set(aaa,"sess.sec", id);
	aaa_commit(aaa);

        byte *enid = alloca(512);
        memset(enid, 0, 511);
        base64_encode(enid, (byte *)id, strlen(id));

        char *bind_id = "MQ%3D%3D";
        char *uri_id  = url_encode(enid);
        char *uri_key = url_encode(enkey);

        char *r3 = stk_printf("http%%3A%%2F%%2F%s%%2FAIM%%2Fservices%%2FR3", authority);

        char *uri_win32 = stk_printf("alucid://callback?authId=%s^&r3Url=%s^&bindingId=%s^&bindingKey=%s",
	                             uri_id, r3, bind_id, uri_key);

	char *uri_unix = stk_printf("alucid://callback?authId=%s\\&r3Url=%s\\&bindingId=%s\\&bindingKey=%s",
	                             uri_id, r3, bind_id, uri_key);

	r_info(r, "uri: %s", uri_unix);

        pid_t fk = fork();
        if (!fk) {

		r_info(r, "external authentication uri: %s", uri_unix);
		int status = system(stk_printf("%s %s", 
					"/usr/local/bin/aducidr3", uri_unix));
                int rv = WEXITSTATUS(status);
		r_info(r, "auth status=%d", rv);
		if (status != 0)
			_exit(127);

		const char *file = stk_printf("/tmp/aaa-%s", id);
		r_info(r, "authentized session file=%s", file);
		parse_session(r, file);

		//execl("/usr/local/bin/aducidr3", uri_unix);
		_exit(127);
	}

        free(uri_id);
        free(uri_key);	
	return DECLINED;
}