int first;
tvh_strlcatf(buf, sizeof(buf), l,
- "%s:%s [%c%c%c%c%c%c%c%c%c%c], conn=%u:s%u:r%u%s",
+ "%s:%s [%c%c%c%c%c%c%c%c%c%c], conn=%u:s%u:r%u:l%u%s",
a->aa_representative ?: "<no-id>",
a->aa_username ?: "<no-user>",
a->aa_rights & ACCESS_STREAMING ? 'S' : ' ',
a->aa_conn_limit,
a->aa_conn_limit_streaming,
a->aa_conn_limit_dvr,
+ a->aa_uilevel,
a->aa_match ? ", matched" : "");
if (a->aa_profiles) {
*/
static access_t *access_alloc(void)
{
- return calloc(1, sizeof(access_t));
+ access_t *a = calloc(1, sizeof(access_t));
+ a->aa_uilevel = -1;
+ return a;
+}
+
+/*
+ *
+ */
+static access_t *access_full(access_t *a)
+{
+ a->aa_rights = ACCESS_FULL;
+ a->aa_uilevel = UILEVEL_EXPERT;
+ return a;
}
/*
break;
}
+ if(ae->ae_uilevel > a->aa_uilevel)
+ a->aa_uilevel = ae->ae_uilevel;
+
if(ae->ae_chmin || ae->ae_chmax) {
uint64_t *p = realloc(a->aa_chrange, (a->aa_chrange_count + 2) * sizeof(uint64_t));
if (p) {
if (a->aa_lang)
a->aa_lang_ui = strdup(a->aa_lang);
}
+ if (a->aa_uilevel < 0)
+ a->aa_uilevel = config.uilevel;
}
/**
a->aa_username = strdup(username);
a->aa_representative = strdup(username);
if(!passwd_verify2(username, password,
- superuser_username, superuser_password)) {
- a->aa_rights = ACCESS_FULL;
- return a;
- }
+ superuser_username, superuser_password))
+ return access_full(a);
} else {
a->aa_representative = malloc(50);
tcp_get_str_from_ip((struct sockaddr*)src, a->aa_representative, 50);
if(!passwd_verify2(username, password,
- superuser_username, superuser_password)) {
- a->aa_rights = ACCESS_FULL;
- return a;
- }
+ superuser_username, superuser_password))
+ return access_full(a);
username = NULL;
}
- if (access_noacl) {
- a->aa_rights = ACCESS_FULL;
- return a;
- }
+ if (access_noacl)
+ return access_full(a);
TAILQ_FOREACH(ae, &access_entries, ae_link) {
a->aa_username = strdup(username);
a->aa_representative = strdup(username);
if(!passwd_verify_digest2(username, digest, challenge,
- superuser_username, superuser_password)) {
- a->aa_rights = ACCESS_FULL;
- return a;
- }
+ superuser_username, superuser_password))
+ return access_full(a);
} else {
a->aa_representative = malloc(50);
tcp_get_str_from_ip((struct sockaddr*)src, a->aa_representative, 50);
if(!passwd_verify_digest2(username, digest, challenge,
- superuser_username, superuser_password)) {
- a->aa_rights = ACCESS_FULL;
- return a;
- }
+ superuser_username, superuser_password))
+ return access_full(a);
username = NULL;
}
- if(access_noacl) {
- a->aa_rights = ACCESS_FULL;
- return a;
- }
+ if(access_noacl)
+ return access_full(a);
TAILQ_FOREACH(ae, &access_entries, ae_link) {
a->aa_username = strdup(username);
a->aa_representative = strdup(username);
- if(access_noacl) {
- a->aa_rights = ACCESS_FULL;
- return a;
- }
+ if(access_noacl)
+ return access_full(a);
if (username[0] == '\0')
return a;
a->aa_representative = malloc(50);
tcp_get_str_from_ip(src, a->aa_representative, 50);
- if(access_noacl) {
- a->aa_rights = ACCESS_FULL;
- return a;
- }
+ if(access_noacl)
+ return access_full(a);
if (access_ip_blocked(src))
return a;
return m;
}
+static htsmsg_t *
+uilevel_get_list ( void *o, const char *lang )
+{
+ static const struct strtab tab[] = {
+ { N_("Default"), UILEVEL_DEFAULT },
+ { N_("Basic"), UILEVEL_BASIC },
+ { N_("Advanced"), UILEVEL_ADVANCED },
+ { N_("Expert"), UILEVEL_EXPERT },
+ };
+ return strtab2htsmsg(tab, 1, lang);
+}
+
const idclass_t access_entry_class = {
.ic_class = "access",
.ic_caption = N_("Access"),
.set = access_entry_class_prefix_set,
.get = access_entry_class_prefix_get,
},
+ {
+ .type = PT_INT,
+ .id = "uilevel",
+ .name = N_("User interface level"),
+ .off = offsetof(access_entry_t, ae_uilevel),
+ .list = uilevel_get_list,
+ .opts = PO_HIDDEN
+ },
{
.type = PT_STR,
.id = "lang",
return strtab2htsmsg(tab, 1, lang);
}
+static htsmsg_t *
+config_class_uilevel ( void *o, const char *lang )
+{
+ static const struct strtab tab[] = {
+ { N_("Basic"), UILEVEL_BASIC },
+ { N_("Advanced"), UILEVEL_ADVANCED },
+ { N_("Expert"), UILEVEL_EXPERT },
+ };
+ return strtab2htsmsg(tab, 1, lang);
+}
+
const idclass_t config_class = {
.ic_snode = &config.idnode,
.ic_class = "config",
.off = offsetof(config_t, server_name),
.group = 1
},
+ {
+ .type = PT_INT,
+ .id = "uilevel",
+ .name = N_("User interface level"),
+ .off = offsetof(config_t, uilevel),
+ .list = config_class_uilevel,
+ .group = 1
+ },
{
.type = PT_U32,
.id = "cookie_expires",