From d7998b4943374adbf7516a2955e52836699e18d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Sun, 4 May 2008 06:05:49 +0000 Subject: [PATCH] Add missing file --- ajaxui/ajaxui_config_access.c | 322 ++++++++++++++++++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100644 ajaxui/ajaxui_config_access.c diff --git a/ajaxui/ajaxui_config_access.c b/ajaxui/ajaxui_config_access.c new file mode 100644 index 00000000..2982612a --- /dev/null +++ b/ajaxui/ajaxui_config_access.c @@ -0,0 +1,322 @@ +/* + * tvheadend, AJAX / HTML user interface + * Copyright (C) 2008 Andreas Öman + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +#include "tvhead.h" +#include "http.h" +#include "ajaxui.h" +#include "channels.h" +#include "psi.h" +#include "transports.h" + +#include "ajaxui_mailbox.h" + + +static struct strtab accesstypetab[] = { + { "stream", ACCESS_STREAMING }, + { "rec", ACCESS_RECORDER_VIEW }, + { "recedit", ACCESS_RECORDER_CHANGE }, + { "conf", ACCESS_CONFIGURE }, + { "webui", ACCESS_WEB_INTERFACE }, + { "access", ACCESS_ACCESSCONTROL }, +}; + + +/** + * Access configuration + */ +int +ajax_config_access_tab(http_connection_t *hc, http_reply_t *hr) +{ + tcp_queue_t *tq = &hr->hr_tq; + + if(access_verify(hc->hc_username, hc->hc_password, + (struct sockaddr *)&hc->hc_tcp_session.tcp_peer_addr, + AJAX_ACCESS_ACCESSCTRL)) + return HTTP_STATUS_UNAUTHORIZED; + + tcp_qprintf(tq, "
"); + + ajax_box_begin(tq, AJAX_BOX_SIDEBOX, NULL, NULL, "Access control"); + + tcp_qprintf(tq, "
"); + + ajax_js(tq, + "new Ajax.Updater('alist', '/ajax/accesslist', " + "{method: 'get', evalScripts: true});"); + + tcp_qprintf(tq, "
"); + + tcp_qprintf(tq, + "
" + "
" + "" + "" + "
" + "
"); + + tcp_qprintf(tq, "
\r\n"); + + ajax_box_end(tq, AJAX_BOX_SIDEBOX); + + tcp_qprintf(tq, "
"); + http_output_html(hc, hr); + return 0; +} + +static void +ajax_access_checkbox(ajax_table_t *ta, access_entry_t *ae, int mask, + const char *n) +{ + ajax_table_cell(ta, NULL, + "", + ae->ae_rights & mask ? "checked " : "", + ae->ae_tally, n); +} + + +/** + * + */ +static int +ajax_accesslist(http_connection_t *hc, http_reply_t *hr, + const char *remain, void *opaque) +{ + tcp_queue_t *tq = &hr->hr_tq; + access_entry_t *ae; + ajax_table_t ta; + char id[100]; + + ajax_table_top(&ta, hc, tq, + (const char *[]){"User or Prefix", + "Password", + "Streaming", + "Recorder", + "Recorder edit", + "Configure", + "Web UI", + "Accessedit", + "", + NULL}, + (int[]){2, 2, 1, 1, 1, 1, 1, 1, 1, 1}); + + TAILQ_FOREACH(ae, &access_entries, ae_link) { + snprintf(id, sizeof(id), "%d", ae->ae_tally); + ajax_table_row_start(&ta, id); + + ajax_table_cell(&ta, NULL, "%s", ae->ae_title); + if(access_is_prefix(ae)) { + ajax_table_cell(&ta, NULL, "%s", "n/a"); + } else { + ajax_table_cell(&ta, "password", + "" + "%s", + ae->ae_tally, ae->ae_tally, + ae->ae_password != NULL ? "Change..." : "Set..."); + } + + ajax_access_checkbox(&ta, ae, ACCESS_STREAMING, "stream"); + ajax_access_checkbox(&ta, ae, ACCESS_RECORDER_VIEW, "rec"); + ajax_access_checkbox(&ta, ae, ACCESS_RECORDER_CHANGE, "recedit"); + + ajax_access_checkbox(&ta, ae, ACCESS_CONFIGURE, "conf"); + ajax_access_checkbox(&ta, ae, ACCESS_WEB_INTERFACE, "webui"); + ajax_access_checkbox(&ta, ae, ACCESS_ACCESSCONTROL, "access"); + + + ajax_table_cell(&ta, NULL, + "" + "Delete...", + ae->ae_tally, ae->ae_title); + } + + ajax_table_bottom(&ta); + http_output_html(hc, hr); + return 0; +} + + +/** + * + */ +static int +ajax_accessadd(http_connection_t *hc, http_reply_t *hr, + const char *remain, void *opaque) +{ + tcp_queue_t *tq = &hr->hr_tq; + access_entry_t *ae; + const char *t; + + if((t = http_arg_get(&hc->hc_req_args, "name")) == NULL) + return HTTP_STATUS_BAD_REQUEST; + + tcp_qprintf(tq, "$('newuser').clear();\r\n"); + + if(t == NULL || strlen(t) < 1 || strchr(t, '\'') || strchr(t, '"')) { + tcp_qprintf(tq, "alert('Invalid username');\r\n"); + } else { + ae = access_add(t); + if(ae == NULL) { + tcp_qprintf(tq, "alert('Invalid prefix');\r\n"); + } else { + tcp_qprintf(tq, + "new Ajax.Updater('alist', '/ajax/accesslist', " + "{method: 'get', evalScripts: true});\r\n"); + } + } + + http_output(hc, hr, "text/javascript; charset=UTF8", NULL, 0); + + return 0; +} + +/** + * + */ +static int +ajax_accesschange(http_connection_t *hc, http_reply_t *hr, + const char *remain, void *opaque) +{ + // tcp_queue_t *tq = &hr->hr_tq; + access_entry_t *ae; + const char *e, *c; + int bit; + + if(remain == NULL || (ae = access_by_id(atoi(remain))) == NULL) + return HTTP_STATUS_BAD_REQUEST; + + if((e = http_arg_get(&hc->hc_req_args, "entry")) == NULL) + return HTTP_STATUS_BAD_REQUEST; + + if((bit = str2val(e, accesstypetab)) < 0) + return HTTP_STATUS_BAD_REQUEST; + + if((c = http_arg_get(&hc->hc_req_args, "checked")) == NULL) + return HTTP_STATUS_BAD_REQUEST; + + if(!strcasecmp(c, "false")) { + ae->ae_rights &= ~bit; + } else if(!strcasecmp(c, "true")) { + ae->ae_rights |= bit; + } else { + return HTTP_STATUS_BAD_REQUEST; + } + + access_save(); + + http_output(hc, hr, "text/javascript; charset=UTF8", NULL, 0); + return 0; +} + + +/** + * + */ +static int +ajax_accessdel(http_connection_t *hc, http_reply_t *hr, + const char *remain, void *opaque) +{ + tcp_queue_t *tq = &hr->hr_tq; + access_entry_t *ae; + const char *e; + + if((e = http_arg_get(&hc->hc_req_args, "id")) == NULL) + return HTTP_STATUS_BAD_REQUEST; + + if((ae = access_by_id(atoi(e))) == NULL) + return HTTP_STATUS_BAD_REQUEST; + + access_delete(ae); + + tcp_qprintf(tq, + "new Ajax.Updater('alist', '/ajax/accesslist', " + "{method: 'get', evalScripts: true});\r\n"); + + http_output(hc, hr, "text/javascript; charset=UTF8", NULL, 0); + return 0; +} + + + +/** + * + */ +static int +ajax_accesssetpw(http_connection_t *hc, http_reply_t *hr, + const char *remain, void *opaque) +{ + tcp_queue_t *tq = &hr->hr_tq; + access_entry_t *ae; + const char *e; + + if(remain == NULL || (ae = access_by_id(atoi(remain))) == NULL) + return HTTP_STATUS_BAD_REQUEST; + + if((e = http_arg_get(&hc->hc_req_args, "value")) == NULL) + return HTTP_STATUS_BAD_REQUEST; + + free(ae->ae_password); + ae->ae_password = strdup(e); + + access_save(); + + tcp_qprintf(tq, + "$('password_%d').innerHTML= '" + "" + "%s';", + ae->ae_tally, ae->ae_tally, ae->ae_tally, "Change..."); + + http_output(hc, hr, "text/javascript; charset=UTF8", NULL, 0); + return 0; +} + + +/** + * + */ +void +ajax_config_access_init(void) +{ + http_path_add("/ajax/accesslist" , NULL, ajax_accesslist, + AJAX_ACCESS_ACCESSCTRL); + http_path_add("/ajax/accessadd" , NULL, ajax_accessadd, + AJAX_ACCESS_ACCESSCTRL); + http_path_add("/ajax/accesschange" , NULL, ajax_accesschange, + AJAX_ACCESS_ACCESSCTRL); + http_path_add("/ajax/accessdel" , NULL, ajax_accessdel, + AJAX_ACCESS_ACCESSCTRL); + http_path_add("/ajax/accesssetpw" , NULL, ajax_accesssetpw, + AJAX_ACCESS_ACCESSCTRL); +}