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; }
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; }
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; }
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; }