int auth_get_url_auth (auth_t *authenticator, config_options_t *options) { auth_url *url_info; authenticator->free = auth_url_clear; authenticator->adduser = auth_url_adduser; authenticator->deleteuser = auth_url_deleteuser; authenticator->listuser = auth_url_listuser; url_info = calloc(1, sizeof(auth_url)); authenticator->state = url_info; /* default headers */ url_info->auth_header = strdup ("icecast-auth-user: 1\r\n"); url_info->timelimit_header = strdup ("icecast-auth-timelimit:"); /* force auth thread to call function. this makes sure the auth_t is attached to client */ authenticator->authenticate = url_add_listener; while(options) { if(!strcmp(options->name, "username")) { free (url_info->username); url_info->username = strdup (options->value); } if(!strcmp(options->name, "password")) { free (url_info->password); url_info->password = strdup (options->value); } if(!strcmp(options->name, "headers")) { free (url_info->pass_headers); url_info->pass_headers = strdup (options->value); } if(!strcmp(options->name, "header_prefix")) { free (url_info->prefix_headers); url_info->prefix_headers = strdup (options->value); } if(!strcmp(options->name, "listener_add")) { free (url_info->addurl); url_info->addurl = strdup (options->value); } if(!strcmp(options->name, "listener_remove")) { authenticator->release_listener = url_remove_listener; free (url_info->removeurl); url_info->removeurl = strdup (options->value); } if(!strcmp(options->name, "mount_add")) { authenticator->stream_start = url_stream_start; free (url_info->stream_start); url_info->stream_start = strdup (options->value); } if(!strcmp(options->name, "mount_remove")) { authenticator->stream_end = url_stream_end; free (url_info->stream_end); url_info->stream_end = strdup (options->value); } if(!strcmp(options->name, "stream_auth")) { authenticator->stream_auth = url_stream_auth; free (url_info->stream_auth); url_info->stream_auth = strdup (options->value); } if(!strcmp(options->name, "auth_header")) { free (url_info->auth_header); url_info->auth_header = strdup (options->value); } if (strcmp(options->name, "timelimit_header") == 0) { free (url_info->timelimit_header); url_info->timelimit_header = strdup (options->value); } options = options->next; } url_info->handle = curl_easy_init (); if (url_info->handle == NULL) { auth_url_clear (authenticator); return -1; } if (url_info->auth_header) url_info->auth_header_len = strlen (url_info->auth_header); if (url_info->timelimit_header) url_info->timelimit_header_len = strlen (url_info->timelimit_header); curl_easy_setopt (url_info->handle, CURLOPT_USERAGENT, ICECAST_VERSION_STRING); curl_easy_setopt (url_info->handle, CURLOPT_HEADERFUNCTION, handle_returned_header); curl_easy_setopt (url_info->handle, CURLOPT_WRITEFUNCTION, handle_returned_data); curl_easy_setopt (url_info->handle, CURLOPT_WRITEDATA, url_info->handle); curl_easy_setopt (url_info->handle, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt (url_info->handle, CURLOPT_TIMEOUT, 15L); #ifdef CURLOPT_PASSWDFUNCTION curl_easy_setopt (url_info->handle, CURLOPT_PASSWDFUNCTION, my_getpass); #endif curl_easy_setopt (url_info->handle, CURLOPT_ERRORBUFFER, &url_info->errormsg[0]); if (url_info->username && url_info->password) { int len = strlen (url_info->username) + strlen (url_info->password) + 2; url_info->userpwd = malloc (len); snprintf (url_info->userpwd, len, "%s:%s", url_info->username, url_info->password); } ICECAST_LOG_INFO("URL based authentication setup"); return 0; }
int auth_get_url_auth(auth_t *authenticator, config_options_t *options) { auth_url *url_info; const char *addaction = "listener_add"; const char *removeaction = "listener_remove"; authenticator->free = auth_url_clear; authenticator->adduser = auth_url_adduser; authenticator->deleteuser = auth_url_deleteuser; authenticator->listuser = auth_url_listuser; url_info = calloc(1, sizeof(auth_url)); authenticator->state = url_info; /* default headers */ url_info->auth_header = strdup("icecast-auth-user: 1\r\n"); url_info->timelimit_header = strdup("icecast-auth-timelimit:"); /* force auth thread to call function. this makes sure the auth_t is attached to client */ authenticator->authenticate_client = url_add_client; while(options) { if(strcmp(options->name, "username") == 0) { free(url_info->username); url_info->username = strdup(options->value); } else if(strcmp(options->name, "password") == 0) { free(url_info->password); url_info->password = strdup(options->value); } else if(strcmp(options->name, "headers") == 0) { free(url_info->pass_headers); url_info->pass_headers = strdup(options->value); } else if(strcmp(options->name, "header_prefix") == 0) { free(url_info->prefix_headers); url_info->prefix_headers = strdup(options->value); } else if(strcmp(options->name, "client_add") == 0) { free(url_info->addurl); url_info->addurl = strdup(options->value); } else if(strcmp(options->name, "client_remove") == 0) { authenticator->release_client = url_remove_client; free(url_info->removeurl); url_info->removeurl = strdup(options->value); } else if(strcmp(options->name, "action_add") == 0) { addaction = options->value; } else if(strcmp(options->name, "action_remove") == 0) { removeaction = options->value; } else if(strcmp(options->name, "auth_header") == 0) { free(url_info->auth_header); url_info->auth_header = strdup(options->value); } else if (strcmp(options->name, "timelimit_header") == 0) { free(url_info->timelimit_header); url_info->timelimit_header = strdup(options->value); } else { ICECAST_LOG_ERROR("Unknown option: %s", options->name); } options = options->next; } url_info->addaction = util_url_escape(addaction); url_info->removeaction = util_url_escape(removeaction); url_info->handle = icecast_curl_new(NULL, &url_info->errormsg[0]); if (url_info->handle == NULL) { auth_url_clear(authenticator); return -1; } if (url_info->auth_header) url_info->auth_header_len = strlen (url_info->auth_header); if (url_info->timelimit_header) url_info->timelimit_header_len = strlen (url_info->timelimit_header); curl_easy_setopt(url_info->handle, CURLOPT_HEADERFUNCTION, handle_returned_header); if (url_info->username && url_info->password) { int len = strlen(url_info->username) + strlen(url_info->password) + 2; url_info->userpwd = malloc(len); snprintf(url_info->userpwd, len, "%s:%s", url_info->username, url_info->password); } ICECAST_LOG_INFO("URL based authentication setup"); return 0; }