From d8788062abb92c495588c1005d7df80bc107ef77 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 1 Mar 2012 17:37:07 +0100 Subject: [PATCH 1/3] Allow restriction for one DVR configuration mapped to one user In some use cases, it may be usefull to not allow selection of the DVR configuration for the end-users. Map the DVR configuration by name matching the username for these restricted users (DVR configuration must be identical to the username, otherwise the default configuration is used). Signed-off-by: Jaroslav Kysela --- src/access.c | 4 ++++ src/access.h | 3 ++- src/webui/extjs.c | 28 ++++++++++++++++++++++++++++ src/webui/static/app/acleditor.js | 11 +++++++++-- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/access.c b/src/access.c index 080d6d84..f40c1ab3 100644 --- a/src/access.c +++ b/src/access.c @@ -391,6 +391,7 @@ access_record_build(access_entry_t *ae) htsmsg_add_u32(e, "streaming", ae->ae_rights & ACCESS_STREAMING ? 1 : 0); htsmsg_add_u32(e, "dvr" , ae->ae_rights & ACCESS_RECORDER ? 1 : 0); + htsmsg_add_u32(e, "dvrallcfg", ae->ae_rights & ACCESS_RECORDER_ALL ? 1 : 0); htsmsg_add_u32(e, "webui" , ae->ae_rights & ACCESS_WEB_INTERFACE ? 1 : 0); htsmsg_add_u32(e, "admin" , ae->ae_rights & ACCESS_ADMIN ? 1 : 0); @@ -480,6 +481,9 @@ access_record_update(void *opaque, const char *id, htsmsg_t *values, if(!htsmsg_get_u32(values, "dvr", &u32)) access_update_flag(ae, ACCESS_RECORDER, u32); + if(!htsmsg_get_u32(values, "dvrallcfg", &u32)) + access_update_flag(ae, ACCESS_RECORDER_ALL, u32); + if(!htsmsg_get_u32(values, "admin", &u32)) access_update_flag(ae, ACCESS_ADMIN, u32); diff --git a/src/access.h b/src/access.h index 7af118e2..37f42a08 100644 --- a/src/access.h +++ b/src/access.h @@ -58,7 +58,8 @@ typedef struct access_ticket { #define ACCESS_STREAMING 0x1 #define ACCESS_WEB_INTERFACE 0x2 #define ACCESS_RECORDER 0x4 -#define ACCESS_ADMIN 0x8 +#define ACCESS_RECORDER_ALL 0x8 +#define ACCESS_ADMIN 0x10 #define ACCESS_FULL 0x3f /** diff --git a/src/webui/extjs.c b/src/webui/extjs.c index 3ed9f8b4..b4677e22 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -624,6 +624,9 @@ extjs_confignames(http_connection_t *hc, const char *remain, void *opaque) out = htsmsg_create_map(); array = htsmsg_create_list(); + if (http_access_verify(hc, ACCESS_RECORDER_ALL)) + goto skip; + LIST_FOREACH(cfg, &dvrconfigs, config_link) { e = htsmsg_create_map(); htsmsg_add_str(e, "identifier", cfg->dvr_config_name); @@ -634,6 +637,7 @@ extjs_confignames(http_connection_t *hc, const char *remain, void *opaque) htsmsg_add_msg(array, NULL, e); } +skip: htsmsg_add_msg(out, "entries", array); } else { @@ -787,6 +791,18 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque) return HTTP_STATUS_BAD_REQUEST; } + if (http_access_verify(hc, ACCESS_RECORDER_ALL)) { + config_name = NULL; + LIST_FOREACH(cfg, &dvrconfigs, config_link) { + if (strcmp(cfg->dvr_config_name, hc->hc_username) == 0) { + config_name = cfg->dvr_config_name; + break; + } + } + if (config_name == NULL) + tvhlog(LOG_INFO,"dvr","User '%s' has no dvr config with identical name, using default...", hc->hc_username); + } + dvr_entry_create_by_event(config_name, e, hc->hc_representative, NULL, DVR_PRIO_NORMAL); @@ -857,6 +873,18 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque) if(stop < start) stop += 86400; + if (http_access_verify(hc, ACCESS_RECORDER_ALL)) { + config_name = NULL; + LIST_FOREACH(cfg, &dvrconfigs, config_link) { + if (strcmp(cfg->dvr_config_name, hc->hc_username) == 0) { + config_name = cfg->dvr_config_name; + break; + } + } + if (config_name == NULL) + tvhlog(LOG_INFO,"dvr","User '%s' has no dvr config with identical name, using default...", hc->hc_username); + } + dvr_entry_create(config_name, ch, start, stop, title, NULL, hc->hc_representative, NULL, NULL, 0, dvr_pri2val(pri)); diff --git a/src/webui/static/app/acleditor.js b/src/webui/static/app/acleditor.js index d9864d83..eaeddbf4 100644 --- a/src/webui/static/app/acleditor.js +++ b/src/webui/static/app/acleditor.js @@ -20,6 +20,12 @@ tvheadend.acleditor = function() { width: 100 }); + var dvrallcfgColumn = new Ext.grid.CheckColumn({ + header: "All Configs (VR)", + dataIndex: 'dvrallcfg', + width: 100 + }); + var webuiColumn = new Ext.grid.CheckColumn({ header: "Web Interface", dataIndex: 'webui', @@ -52,6 +58,7 @@ tvheadend.acleditor = function() { }, streamingColumn, dvrColumn, + dvrallcfgColumn, webuiColumn, adminColumn, { @@ -63,14 +70,14 @@ tvheadend.acleditor = function() { ]); var UserRecord = Ext.data.Record.create([ - 'enabled','streaming','dvr','admin','webui','username', + 'enabled','streaming','dvr','dvrallcfg','admin','webui','username', 'prefix','password','comment' ]); return new tvheadend.tableEditor('Access control', 'accesscontrol', cm, UserRecord, [enabledColumn, streamingColumn, - dvrColumn, webuiColumn, + dvrColumn, dvrallcfgColumn, webuiColumn, adminColumn], null, 'config_access.html', 'group'); From e4b88cfc39354043ce7bcaf09a28f0ea44a0983b Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 21 Mar 2012 09:29:49 +0100 Subject: [PATCH 2/3] Fix crash when cfg->dvr_config_name is NULL (default config) As suggested by opdenkamp - the cfg->dvr_config_name may be NULL in some cases. Add more restrictive checks in extjs_dvr() . --- src/webui/extjs.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/webui/extjs.c b/src/webui/extjs.c index b4677e22..647f28ff 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -794,12 +794,13 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque) if (http_access_verify(hc, ACCESS_RECORDER_ALL)) { config_name = NULL; LIST_FOREACH(cfg, &dvrconfigs, config_link) { - if (strcmp(cfg->dvr_config_name, hc->hc_username) == 0) { + if (cfg->dvr_config_name && hc->hc_username && + strcmp(cfg->dvr_config_name, hc->hc_username) == 0) { config_name = cfg->dvr_config_name; break; } } - if (config_name == NULL) + if (config_name == NULL && hc->hc_username) tvhlog(LOG_INFO,"dvr","User '%s' has no dvr config with identical name, using default...", hc->hc_username); } From 6097dcd6d12e1b37fadc12d7dc14e47125c3b351 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 21 Mar 2012 09:34:23 +0100 Subject: [PATCH 3/3] Fix crash when cfg->dvr_config_name is NULL (default config) As suggested by opdenkamp - the cfg->dvr_config_name may be NULL in some cases. Add more restrictive checks in extjs_dvr() . This patch fixes the second location for the user check. --- src/webui/extjs.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/webui/extjs.c b/src/webui/extjs.c index 647f28ff..2505232f 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -877,12 +877,13 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque) if (http_access_verify(hc, ACCESS_RECORDER_ALL)) { config_name = NULL; LIST_FOREACH(cfg, &dvrconfigs, config_link) { - if (strcmp(cfg->dvr_config_name, hc->hc_username) == 0) { + if (cfg->dvr_config_name && hc->hc_username && + strcmp(cfg->dvr_config_name, hc->hc_username) == 0) { config_name = cfg->dvr_config_name; break; } } - if (config_name == NULL) + if (config_name == NULL && hc->hc_username) tvhlog(LOG_INFO,"dvr","User '%s' has no dvr config with identical name, using default...", hc->hc_username); }