From d55a3b91158abf8b076d1b4fb21957c0f706f0d5 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Tue, 28 Nov 2017 09:01:42 -0500 Subject: [PATCH] 2017-11-28 Fred Gleason * Added a 'USER_SERVICE_PERMS' table to the database. * Incremented the database version to 272. * Added a 'Service Permissions' button to the Edit User dialog in rdadmin(1). --- ChangeLog | 5 + docs/tables/Makefile.am | 1 + docs/tables/user_service_perms.txt | 11 ++ lib/dbversion.h | 2 +- lib/librd_cs.ts | 4 - lib/librd_de.ts | 2 +- lib/librd_es.ts | 4 - lib/librd_fr.ts | 4 - lib/librd_nb.ts | 2 +- lib/librd_nn.ts | 2 +- lib/librd_pt_BR.ts | 2 +- lib/rdadd_log.cpp | 69 +++---- lib/rdadd_log.h | 14 +- lib/rdlist_logs.cpp | 19 +- lib/rdlist_logs.h | 6 +- lib/rdlogfilter.cpp | 293 ++++++++++++++++------------ lib/rdlogfilter.h | 9 +- rdadmin/Makefile.am | 2 + rdadmin/createdb.cpp | 45 ++++- rdadmin/edit_rdairplay.cpp | 3 +- rdadmin/edit_svc_perms.cpp | 50 ++--- rdadmin/edit_svc_perms.h | 6 +- rdadmin/edit_user.cpp | 26 ++- rdadmin/edit_user.h | 2 + rdadmin/edit_user_perms.cpp | 48 ++--- rdadmin/edit_user_perms.h | 3 +- rdadmin/edit_user_service_perms.cpp | 161 +++++++++++++++ rdadmin/edit_user_service_perms.h | 49 +++++ rdadmin/rdadmin_cs.ts | 19 +- rdadmin/rdadmin_de.ts | 19 +- rdadmin/rdadmin_es.ts | 19 +- rdadmin/rdadmin_fr.ts | 25 ++- rdadmin/rdadmin_nb.ts | 19 +- rdadmin/rdadmin_nn.ts | 19 +- rdadmin/rdadmin_pt_BR.ts | 19 +- rdairplay/list_logs.cpp | 7 +- rdlogedit/edit_chain.cpp | 3 +- rdlogedit/edit_log.cpp | 3 +- rdlogedit/rdlogedit.cpp | 10 +- utils/rdrevert/rdrevert.cpp | 18 +- utils/rdrevert/rdrevert.h | 1 + web/rdxport/logs.cpp | 60 +++++- web/rdxport/rdxport.h | 3 + web/rdxport/services.cpp | 16 +- 44 files changed, 777 insertions(+), 327 deletions(-) create mode 100644 docs/tables/user_service_perms.txt create mode 100644 rdadmin/edit_user_service_perms.cpp create mode 100644 rdadmin/edit_user_service_perms.h diff --git a/ChangeLog b/ChangeLog index 8ed17793..7a18b5ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16380,3 +16380,8 @@ for 'By Order' scheduling to be skipped. 2017-11-20 Fred Gleason * Incremented the package version to 2.17.0int05. +2017-11-28 Fred Gleason + * Added a 'USER_SERVICE_PERMS' table to the database. + * Incremented the database version to 272. + * Added a 'Service Permissions' button to the Edit User dialog in + rdadmin(1). diff --git a/docs/tables/Makefile.am b/docs/tables/Makefile.am index 319d2c7f..5f09446b 100644 --- a/docs/tables/Makefile.am +++ b/docs/tables/Makefile.am @@ -74,6 +74,7 @@ EXTRA_DIST = audio_perms.txt\ triggers.txt\ ttys.txt\ user_perms.txt\ + user_service_perms.txt\ users.txt\ version.txt\ vguest_resources.txt\ diff --git a/docs/tables/user_service_perms.txt b/docs/tables/user_service_perms.txt new file mode 100644 index 00000000..1e74bd8d --- /dev/null +++ b/docs/tables/user_service_perms.txt @@ -0,0 +1,11 @@ + USER_SERVICE_PERMS Table Layout for Rivendell + +The USER_SERVICE_PERMS table holds data concerning which services are +are allowed to be accessed by which users. + + +FIELD NAME TYPE REMARKS +--------------------------------------------------------------- +ID int(11) signed Primary key, auto increment +USER_NAME char(255) From USERS.LOGIN_NAME +SERVICE_NAME char(10) From SERVICES.NAME diff --git a/lib/dbversion.h b/lib/dbversion.h index eee18957..d9652274 100644 --- a/lib/dbversion.h +++ b/lib/dbversion.h @@ -24,7 +24,7 @@ /* * Current Database Version */ -#define RD_VERSION_DATABASE 271 +#define RD_VERSION_DATABASE 272 #endif // DBVERSION_H diff --git a/lib/librd_cs.ts b/lib/librd_cs.ts index 42d26f5c..c1da74f8 100644 --- a/lib/librd_cs.ts +++ b/lib/librd_cs.ts @@ -1911,10 +1911,6 @@ Bitte Kofiguration prüfen und erneut versuchen. Cancel Zrušit - - ALL - - RDListSelector diff --git a/lib/librd_de.ts b/lib/librd_de.ts index 76e8bdc8..a14d155d 100644 --- a/lib/librd_de.ts +++ b/lib/librd_de.ts @@ -1904,7 +1904,7 @@ Bitte Kofiguration prüfen und erneut versuchen. ALL - ALLE + ALLE diff --git a/lib/librd_es.ts b/lib/librd_es.ts index ed43456a..d231dd90 100644 --- a/lib/librd_es.ts +++ b/lib/librd_es.ts @@ -1908,10 +1908,6 @@ Do you still want to proceed? Cancel Cancelar - - ALL - - RDListSelector diff --git a/lib/librd_fr.ts b/lib/librd_fr.ts index 451d685f..75d6a127 100644 --- a/lib/librd_fr.ts +++ b/lib/librd_fr.ts @@ -1727,10 +1727,6 @@ Do you want to overwrite it? Select Log - - ALL - - RDListSelector diff --git a/lib/librd_nb.ts b/lib/librd_nb.ts index 1ec5940e..06f850ec 100644 --- a/lib/librd_nb.ts +++ b/lib/librd_nb.ts @@ -1902,7 +1902,7 @@ Sjekk eksportoppsettet ditt og prøv att. ALL - ALLE + ALLE diff --git a/lib/librd_nn.ts b/lib/librd_nn.ts index 1ec5940e..06f850ec 100644 --- a/lib/librd_nn.ts +++ b/lib/librd_nn.ts @@ -1902,7 +1902,7 @@ Sjekk eksportoppsettet ditt og prøv att. ALL - ALLE + ALLE diff --git a/lib/librd_pt_BR.ts b/lib/librd_pt_BR.ts index 16a96129..e254a77a 100644 --- a/lib/librd_pt_BR.ts +++ b/lib/librd_pt_BR.ts @@ -1908,7 +1908,7 @@ Por Favor, cheque suas configurações e tenbte outra vez. ALL - TODOS + TODOS diff --git a/lib/rdadd_log.cpp b/lib/rdadd_log.cpp index 14a91bc9..ef1385fc 100644 --- a/lib/rdadd_log.cpp +++ b/lib/rdadd_log.cpp @@ -2,7 +2,7 @@ // // Create a Rivendell Log // -// (C) Copyright 2002-2004,2016 Fred Gleason +// (C) Copyright 2002-2004,2016-2017 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -20,27 +20,21 @@ #include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include +#include "rddb.h" +#include "rdescape_string.h" +#include "rdidvalidator.h" +#include "rdadd_log.h" -RDAddLog::RDAddLog(QString *logname,QString *svcname,RDStation *station, - QString caption,QWidget *parent,RDUser *rduser) +RDAddLog::RDAddLog(QString *logname,QString *svcname, + RDLogFilter::FilterMode mode,RDUser *user,RDStation *station, + const QString &caption,QWidget *parent) : QDialog(parent,"",true) { QStringList services_list; + QString sql; + RDSqlQuery *q; log_name=logname; log_svc=svcname; log_station=station; @@ -115,32 +109,27 @@ RDAddLog::RDAddLog(QString *logname,QString *svcname,RDStation *station, // // Populate Data // - if (rduser != 0) { // RDStation::UserSec - services_list = rduser->services(); - } else { // RDStation::HostSec - QString sql; - if(station==NULL) { - sql="select NAME from SERVICES order by NAME"; - } - else { - sql=QString().sprintf("select SERVICE_NAME from SERVICE_PERMS \ - where STATION_NAME=\"%s\" order by SERVICE_NAME", - (const char *)station->name()); - } - RDSqlQuery *q=new RDSqlQuery(sql); - while(q->next()) { - services_list.append( q->value(0).toString() ); - } - delete q; - } + switch(mode) { + case RDLogFilter::NoFilter: + sql=QString("select NAME from SERVICES order by NAME"); + break; - for ( QStringList::Iterator it = services_list.begin(); - it != services_list.end(); - ++it ) { - add_service_box->insertItem(*it); - if(*svcname==*it) { - add_service_box->setCurrentItem(add_service_box->count()-1); + case RDLogFilter::UserFilter: + if(user!=NULL) { + sql=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+ + "USER_NAME=\""+RDEscapeString(user->name())+"\" order by SERVICE_NAME"; } + break; + + case RDLogFilter::StationFilter: + sql=QString("select SERVICE_NAME from SERVICE_PERMS where ")+ + "STATION_NAME=\""+RDEscapeString(station->name())+"\" "+ + "order by SERVICE_NAME"; + break; + } + q=new RDSqlQuery(sql); + while(q->next()) { + add_service_box->insertItem(q->value(0).toString()); } } diff --git a/lib/rdadd_log.h b/lib/rdadd_log.h index 14dcefe8..e85f9d49 100644 --- a/lib/rdadd_log.h +++ b/lib/rdadd_log.h @@ -5,7 +5,7 @@ // This class creates a basic dialog requesting from the user a name and // corresponding service that is later used to create a new log. // -// (C) Copyright 2002-2003,2016 Fred Gleason +// (C) Copyright 2002-2003,2016-2017 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -31,6 +31,7 @@ #include #include +#include #include @@ -38,14 +39,9 @@ class RDAddLog : public QDialog { Q_OBJECT public: - /** - * Constructor for the RDAddLog object. - * - * NOTE: the presence of the optional rduser parameter is used to flag if - * user security should be used instead of host based security. - */ - RDAddLog(QString *logname,QString *svcname,RDStation *station, - QString caption,QWidget *parent=0,RDUser *rduser=0); + RDAddLog(QString *logname,QString *svcname,RDLogFilter::FilterMode mode, + RDUser *user,RDStation *station,const QString &caption, + QWidget *parent=0); ~RDAddLog(); QSize sizeHint() const; QSizePolicy sizePolicy() const; diff --git a/lib/rdlist_logs.cpp b/lib/rdlist_logs.cpp index 5d262cb8..8f9dcc37 100644 --- a/lib/rdlist_logs.cpp +++ b/lib/rdlist_logs.cpp @@ -24,11 +24,11 @@ #include #include -RDListLogs::RDListLogs(QString *logname,const QString &stationname, - QWidget *parent) +RDListLogs::RDListLogs(QString *logname,RDLogFilter::FilterMode mode, + RDUser *user,RDConfig *config,QWidget *parent) : QDialog(parent,"",true) { - list_stationname=stationname; + list_config=config; list_logname=logname; // @@ -50,18 +50,7 @@ RDListLogs::RDListLogs(QString *logname,const QString &stationname, // // Log Filter // - list_filter_widget=new RDLogFilter(this); - QString sql=QString("select ")+ - "SERVICE_NAME from SERVICE_PERMS where "+ - "STATION_NAME=\""+RDEscapeString(list_stationname)+"\""; - RDSqlQuery *q=new RDSqlQuery(sql); - QStringList services_list; - services_list.push_back(tr("ALL")); - while(q->next()) { - services_list.push_back(q->value(0).toString()); - } - delete q; - list_filter_widget->setServices(services_list); + list_filter_widget=new RDLogFilter(mode,user,config,this); connect(list_filter_widget,SIGNAL(filterChanged(const QString &)), this,SLOT(filterChangedData(const QString &))); diff --git a/lib/rdlist_logs.h b/lib/rdlist_logs.h index 0c6fd899..9243775a 100644 --- a/lib/rdlist_logs.h +++ b/lib/rdlist_logs.h @@ -32,13 +32,15 @@ #include #include +#include class RDListLogs : public QDialog { Q_OBJECT public: - RDListLogs(QString *logname,const QString &stationname,QWidget *parent=0); + RDListLogs(QString *logname,RDLogFilter::FilterMode mode, + RDUser *user,RDConfig *config,QWidget *parent=0); QSize sizeHint() const; QSizePolicy sizePolicy() const; @@ -56,7 +58,7 @@ class RDListLogs : public QDialog void RefreshList(); QListView *list_log_list; QString *list_logname; - QString list_stationname; + RDConfig *list_config; QPushButton *list_ok_button; QPushButton *list_cancel_button; RDLogFilter *list_filter_widget; diff --git a/lib/rdlogfilter.cpp b/lib/rdlogfilter.cpp index 1f7b734c..59dfc719 100644 --- a/lib/rdlogfilter.cpp +++ b/lib/rdlogfilter.cpp @@ -23,142 +23,181 @@ #include "rdescape_string.h" #include "rdlogfilter.h" -RDLogFilter::RDLogFilter(QWidget *parent) +RDLogFilter::RDLogFilter(RDLogFilter::FilterMode mode,RDUser *user, + RDConfig *config,QWidget *parent) : QWidget(parent) - { - QFont label_font(font().family(),font().pointSize(),QFont::Bold); - QFont check_font(font().family(),font().pointSize()-2,QFont::DemiBold); +{ + QString sql; + RDSqlQuery *q; - // - // Service - // - filter_service_label=new QLabel(tr("Service")+":",this); - filter_service_label->setFont(label_font); - filter_service_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - filter_service_box=new QComboBox(this); - filter_service_label->setBuddy(filter_service_box); - filter_service_box->insertItem(tr("ALL")); - QString sql=QString("select NAME from SERVICES order by NAME"); - RDSqlQuery *q=new RDSqlQuery(sql); - while(q->next()) { - filter_service_box->insertItem(q->value(0).toString()); - } - delete q; - connect(filter_service_box,SIGNAL(activated(int)), + filter_filter_mode=mode; + + QFont label_font(font().family(),font().pointSize(),QFont::Bold); + QFont check_font(font().family(),font().pointSize()-2,QFont::DemiBold); + + // + // Service + // + filter_service_label=new QLabel(tr("Service")+":",this); + filter_service_label->setFont(label_font); + filter_service_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); + filter_service_box=new QComboBox(this); + filter_service_label->setBuddy(filter_service_box); + switch(mode) { + case RDLogFilter::NoFilter: + filter_service_box->insertItem(tr("ALL")); + sql=QString("select NAME from SERVICES order by NAME"); + q=new RDSqlQuery(sql); + while(q->next()) { + filter_service_box->insertItem(q->value(0).toString()); + } + delete q; + break; + + case RDLogFilter::UserFilter: + if(user!=NULL) { + setUser(user); + } + break; + + case RDLogFilter::StationFilter: + filter_service_box->insertItem(tr("ALL")); + sql=QString("select SERVICE_NAME from SERVICE_PERMS where ")+ + "STATION_NAME=\""+RDEscapeString(config->stationName())+"\""; + q=new RDSqlQuery(sql); + while(q->next()) { + filter_service_box->insertItem(q->value(0).toString()); + } + delete q; + break; + } + connect(filter_service_box,SIGNAL(activated(int)), this,SLOT(serviceChangedData(int))); - // - // Filter - // - filter_filter_label=new QLabel(tr("Filter")+":",this); - filter_filter_label->setFont(label_font); - filter_filter_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - filter_filter_edit=new QLineEdit(this); - filter_clear_button=new QPushButton(tr("Clear"),this); - filter_filter_label->setBuddy(filter_filter_edit); - connect(filter_filter_edit,SIGNAL(textChanged(const QString &)), + // + // Filter + // + filter_filter_label=new QLabel(tr("Filter")+":",this); + filter_filter_label->setFont(label_font); + filter_filter_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); + filter_filter_edit=new QLineEdit(this); + filter_clear_button=new QPushButton(tr("Clear"),this); + filter_filter_label->setBuddy(filter_filter_edit); + connect(filter_filter_edit,SIGNAL(textChanged(const QString &)), this,SLOT(filterChangedData(const QString &))); - connect(filter_clear_button,SIGNAL(clicked()),this,SLOT(filterChangedData())); - - // - // Show Recent - // - filter_recent_check=new QCheckBox(this); - filter_recent_label=new QLabel(tr("Show Only Recent Logs"),this); - filter_recent_label->setFont(check_font); - filter_recent_label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter); - connect(filter_recent_check,SIGNAL(clicked()), - this,SLOT(filterChangedData())); - } + connect(filter_clear_button,SIGNAL(clicked()),this,SLOT(filterChangedData())); + + // + // Show Recent + // + filter_recent_check=new QCheckBox(this); + filter_recent_label=new QLabel(tr("Show Only Recent Logs"),this); + filter_recent_label->setFont(check_font); + filter_recent_label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter); + connect(filter_recent_check,SIGNAL(clicked()), + this,SLOT(filterChangedData())); +} - RDLogFilter::~RDLogFilter() - { - delete filter_clear_button; - delete filter_filter_edit; - delete filter_filter_label; - delete filter_recent_label; - } - - - QSize RDLogFilter::sizeHint() const - { - return QSize(400,60); - } - - - QSizePolicy RDLogFilter::sizePolicy() const - { - return QSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::Fixed); - } - - - QString RDLogFilter::whereSql() const - { - QString sql=""; - - if(filter_service_box->currentItem()!=0) { - sql+="&&(LOGS.SERVICE=\""+ - RDEscapeString(filter_service_box->currentText())+"\")"; - } - QString filter=filter_filter_edit->text(); - if(!filter.isEmpty()) { - if(filter_service_box->currentItem()==0) { - sql+="&&((LOGS.NAME like \"%%"+RDEscapeString(filter)+"%%\")||"; - sql+="(LOGS.DESCRIPTION like \"%%"+RDEscapeString(filter)+"%%\")||"; - sql+="(LOGS.SERVICE like \"%%"+RDEscapeString(filter)+"%%\"))"; - } - else { - sql+="&&((LOGS.NAME like \"%%"+RDEscapeString(filter)+"%%\")||"; - sql+="(LOGS.DESCRIPTION like \"%%"+RDEscapeString(filter)+"%%\"))"; - } - } - if(filter_recent_check->isChecked()) { - sql+=QString().sprintf("order by LOGS.ORIGIN_DATETIME desc limit %d", - RD_LOGFILTER_LIMIT_QUAN); - } - - return sql; - } - - -void RDLogFilter::setServices(const QStringList &svc_names) +RDLogFilter::~RDLogFilter() { - filter_service_box->clear(); - for(unsigned i=0;iinsertItem(svc_names[i]); - } + delete filter_clear_button; + delete filter_filter_edit; + delete filter_filter_label; + delete filter_recent_label; } - void RDLogFilter::filterChangedData(const QString &str) - { - emit filterChanged(whereSql()); - } - - - void RDLogFilter::filterChangedData() - { - emit filterChanged(whereSql()); - } - - - void RDLogFilter::serviceChangedData(int n) - { - emit filterChanged(whereSql()); - } - - - void RDLogFilter::resizeEvent(QResizeEvent *e) - { - filter_service_label->setGeometry(0,2,70,20); - filter_service_box->setGeometry(75,2,140,20); - - filter_filter_label->setGeometry(220,2,50,20); - filter_filter_edit->setGeometry(275,2,size().width()-360,20); - - filter_clear_button->setGeometry(size().width()-70,0,50,25); - - filter_recent_check->setGeometry(275,27,15,15); - filter_recent_label->setGeometry(295,25,200,20); +QSize RDLogFilter::sizeHint() const +{ + return QSize(400,60); +} + + +QSizePolicy RDLogFilter::sizePolicy() const +{ + return QSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::Fixed); +} + + +QString RDLogFilter::whereSql() const +{ + QString sql=""; + + if(filter_service_box->currentItem()!=0) { + sql+="&&(LOGS.SERVICE=\""+ + RDEscapeString(filter_service_box->currentText())+"\")"; + } + else { + sql+="&&("; + for(int i=1;icount();i++) { + sql+="(SERVICE=\""+RDEscapeString(filter_service_box->text(i))+"\")||"; + } + sql=sql.left(sql.length()-2); + sql+=")"; + } + QString filter=filter_filter_edit->text(); + if(!filter.isEmpty()) { + if(filter_service_box->currentItem()==0) { + sql+="&&((LOGS.NAME like \"%%"+RDEscapeString(filter)+"%%\")||"; + sql+="(LOGS.DESCRIPTION like \"%%"+RDEscapeString(filter)+"%%\")||"; + sql+="(LOGS.SERVICE like \"%%"+RDEscapeString(filter)+"%%\"))"; + } + else { + sql+="&&((LOGS.NAME like \"%%"+RDEscapeString(filter)+"%%\")||"; + sql+="(LOGS.DESCRIPTION like \"%%"+RDEscapeString(filter)+"%%\"))"; + } + } + if(filter_recent_check->isChecked()) { + sql+=QString().sprintf("order by LOGS.ORIGIN_DATETIME desc limit %d", + RD_LOGFILTER_LIMIT_QUAN); + } + + return sql; +} + + +void RDLogFilter::setUser(RDUser *user) +{ + filter_service_box->clear(); + filter_service_box->insertItem(tr("ALL")); + QString sql=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+ + "USER_NAME=\""+RDEscapeString(user->name())+"\""; + RDSqlQuery *q=new RDSqlQuery(sql); + while(q->next()) { + filter_service_box->insertItem(q->value(0).toString()); + } + delete q; +} + +void RDLogFilter::filterChangedData(const QString &str) +{ + emit filterChanged(whereSql()); +} + + +void RDLogFilter::filterChangedData() +{ + emit filterChanged(whereSql()); +} + + +void RDLogFilter::serviceChangedData(int n) +{ + emit filterChanged(whereSql()); +} + + +void RDLogFilter::resizeEvent(QResizeEvent *e) +{ + filter_service_label->setGeometry(0,2,70,20); + filter_service_box->setGeometry(75,2,140,20); + + filter_filter_label->setGeometry(220,2,50,20); + filter_filter_edit->setGeometry(275,2,size().width()-360,20); + + filter_clear_button->setGeometry(size().width()-70,0,50,25); + + filter_recent_check->setGeometry(275,27,15,15); + filter_recent_label->setGeometry(295,25,200,20); } diff --git a/lib/rdlogfilter.h b/lib/rdlogfilter.h index c7c44830..6e6dc9fa 100644 --- a/lib/rdlogfilter.h +++ b/lib/rdlogfilter.h @@ -29,16 +29,20 @@ #include #include +#include +#include + class RDLogFilter : public QWidget { Q_OBJECT; public: - RDLogFilter(QWidget *parent=0); + enum FilterMode {NoFilter=0,UserFilter=1,StationFilter=2}; + RDLogFilter(FilterMode mode,RDUser *user,RDConfig *config,QWidget *parent=0); ~RDLogFilter(); QSize sizeHint() const; QSizePolicy sizePolicy() const; QString whereSql() const; - void setServices(const QStringList &svc_names); + void setUser(RDUser *user); signals: void filterChanged(const QString &where_sql); @@ -52,6 +56,7 @@ class RDLogFilter : public QWidget void resizeEvent(QResizeEvent *e); private: + FilterMode filter_filter_mode; QLabel *filter_service_label; QComboBox *filter_service_box; QLabel *filter_filter_label; diff --git a/rdadmin/Makefile.am b/rdadmin/Makefile.am index 0fdbe686..3869d017 100644 --- a/rdadmin/Makefile.am +++ b/rdadmin/Makefile.am @@ -94,6 +94,7 @@ dist_rdadmin_SOURCES = add_aux_field.cpp add_aux_field.h\ edit_ttys.cpp edit_ttys.h\ edit_user.cpp edit_user.h\ edit_user_perms.cpp edit_user_perms.h\ + edit_user_service_perms.cpp edit_user_service_perms.h\ edit_vguest_resource.cpp edit_vguest_resource.h\ globals.h\ help_audios.cpp help_audios.h\ @@ -178,6 +179,7 @@ nodist_rdadmin_SOURCES = moc_add_aux_field.cpp\ moc_edit_ttys.cpp\ moc_edit_user.cpp\ moc_edit_user_perms.cpp\ + moc_edit_user_service_perms.cpp\ moc_edit_vguest_resource.cpp\ moc_help_audios.cpp\ moc_importfields.cpp\ diff --git a/rdadmin/createdb.cpp b/rdadmin/createdb.cpp index f87ab79c..f23ab6d7 100644 --- a/rdadmin/createdb.cpp +++ b/rdadmin/createdb.cpp @@ -2439,6 +2439,18 @@ bool CreateDb(QString name,QString pwd) return false; } + // + // Create USER_SERVICE_PERMS table + // + sql=QString("create table if not exists USER_SERVICE_PERMS (")+ + "ID int auto_increment not null primary key,"+ + "USER_NAME char(255) not null,"+ + "SERVICE_NAME char(10) not null,"+ + "index USER_NAME_IDX(USER_NAME))"; + if(!RunQuery(sql)) { + return false; + } + return true; } @@ -2595,11 +2607,16 @@ bool InitDb(QString name,QString pwd,QString station_name) svc->create(""); svc->setDescription(RD_SERVICE_DESCRIPTION); delete svc; + sql=QString("insert into USER_SERVICE_PERMS set ")+ + "USER_NAME=\""+RDEscapeString(RD_USER_LOGIN_NAME)+"\","+ + "SERVICE_NAME=\""+RDEscapeString(RD_SERVICE_NAME)+"\""; + if(!RunQuery(sql)) { + return false; + } // // Create Default Groups // - struct Group { const char *group; @@ -8511,6 +8528,32 @@ int UpdateDb(int ver) delete q; } + if(ver<272) { + sql=QString("create table if not exists USER_SERVICE_PERMS (")+ + "ID int auto_increment not null primary key,"+ + "USER_NAME char(255) not null,"+ + "SERVICE_NAME char(10) not null,"+ + "index USER_NAME_IDX(USER_NAME))"; + q=new QSqlQuery(sql); + delete q; + + sql=QString("select LOGIN_NAME from USERS"); + q=new QSqlQuery(sql); + while(q->next()) { + sql=QString("select NAME from SERVICES"); + q1=new QSqlQuery(sql); + while(q1->next()) { + sql=QString("insert into USER_SERVICE_PERMS set ")+ + "USER_NAME=\""+RDEscapeString(q->value(0).toString())+"\","+ + "SERVICE_NAME=\""+RDEscapeString(q1->value(0).toString())+"\""; + q2=new QSqlQuery(sql); + delete q2; + } + delete q1; + } + delete q; + } + // // Maintainer's Note: diff --git a/rdadmin/edit_rdairplay.cpp b/rdadmin/edit_rdairplay.cpp index b75147e1..fd15f288 100644 --- a/rdadmin/edit_rdairplay.cpp +++ b/rdadmin/edit_rdairplay.cpp @@ -1000,7 +1000,8 @@ void EditRDAirPlay::selectData() { QString logname=air_startlog_edit->text(); - RDListLogs *ll=new RDListLogs(&logname,air_conf->station(),this); + RDListLogs *ll=new RDListLogs(&logname,RDLogFilter::NoFilter,admin_user, + admin_config,this); if(ll->exec()==0) { air_startlog_edit->setText(logname); } diff --git a/rdadmin/edit_svc_perms.cpp b/rdadmin/edit_svc_perms.cpp index 93192c55..d9f66ee7 100644 --- a/rdadmin/edit_svc_perms.cpp +++ b/rdadmin/edit_svc_perms.cpp @@ -2,7 +2,7 @@ // // Edit Rivendell Service Permissions // -// (C) Copyright 2002-2004,2016 Fred Gleason +// (C) Copyright 2002-2004,2016-2017 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -18,22 +18,10 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include -#include -#include -#include +#include + +#include "edit_svc_perms.h" EditSvcPerms::EditSvcPerms(RDSvc *svc,QWidget *parent) : QDialog(parent,"",true) @@ -89,16 +77,15 @@ EditSvcPerms::EditSvcPerms(RDSvc *svc,QWidget *parent) // // Populate Fields - sql=QString().sprintf("select STATION_NAME from SERVICE_PERMS \ - where SERVICE_NAME=\"%s\"", - (const char *)svc_svc->name()); + sql=QString("select STATION_NAME from SERVICE_PERMS where ")+ + "SERVICE_NAME=\""+RDEscapeString(svc_svc->name())+"\""; q=new RDSqlQuery(sql); while(q->next()) { svc_host_sel->destInsertItem(q->value(0).toString()); } delete q; - sql=QString().sprintf("select NAME from STATIONS"); + sql=QString("select NAME from STATIONS"); q=new RDSqlQuery(sql); while(q->next()) { if(svc_host_sel->destFindItem(q->value(0).toString())==0) { @@ -135,18 +122,15 @@ void EditSvcPerms::okData() // Add New Hosts // for(unsigned i=0;idestCount();i++) { - sql=QString().sprintf("select STATION_NAME from SERVICE_PERMS \ - where SERVICE_NAME=\"%s\" && STATION_NAME=\"%s\"", - (const char *)svc_svc->name(), - (const char *)svc_host_sel->destText(i)); + sql=QString("select STATION_NAME from SERVICE_PERMS where ")+ + "SERVICE_NAME=\""+RDEscapeString(svc_svc->name())+"\" && "+ + "STATION_NAME=\""+RDEscapeString(svc_host_sel->destText(i))+"\""; q=new RDSqlQuery(sql); if(q->size()==0) { delete q; - sql=QString(). - sprintf("insert into SERVICE_PERMS (SERVICE_NAME,STATION_NAME) \ - values (\"%s\",\"%s\")", - (const char *)svc_svc->name(), - (const char *)svc_host_sel->destText(i)); + sql=QString("insert into SERVICE_PERMS (SERVICE_NAME,STATION_NAME) ")+ + "values (\""+RDEscapeString(svc_svc->name())+"\","+ + "\""+RDEscapeString(svc_host_sel->destText(i))+"\")"; q=new RDSqlQuery(sql); } delete q; @@ -155,11 +139,11 @@ void EditSvcPerms::okData() // // Delete Old Hosts // - sql=QString().sprintf("delete from SERVICE_PERMS where SERVICE_NAME=\"%s\"", - (const char *)svc_svc->name()); + sql=QString("delete from SERVICE_PERMS where ")+ + "SERVICE_NAME=\""+RDEscapeString(svc_svc->name())+"\""; for(unsigned i=0;idestCount();i++) { - sql+=QString().sprintf(" && STATION_NAME<>\"%s\"", - (const char *)svc_host_sel->destText(i)); + sql+=QString(" && STATION_NAME<>\"")+ + RDEscapeString(svc_host_sel->destText(i))+"\""; } q=new RDSqlQuery(sql); delete q; diff --git a/rdadmin/edit_svc_perms.h b/rdadmin/edit_svc_perms.h index d6d96164..ac458515 100644 --- a/rdadmin/edit_svc_perms.h +++ b/rdadmin/edit_svc_perms.h @@ -2,7 +2,7 @@ // // Edit Rivendell Service Permissions // -// (C) Copyright 2002-2004,2016 Fred Gleason +// (C) Copyright 2002-2004,2016-2017 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -22,10 +22,10 @@ #define EDIT_SVC_PERMS_H #include -#include #include +#include #include class EditSvcPerms : public QDialog @@ -47,5 +47,5 @@ class EditSvcPerms : public QDialog }; -#endif +#endif // EDIT_SVC_PERMS_H diff --git a/rdadmin/edit_user.cpp b/rdadmin/edit_user.cpp index cccf723d..d5ff63a8 100644 --- a/rdadmin/edit_user.cpp +++ b/rdadmin/edit_user.cpp @@ -37,6 +37,7 @@ #include #include +#include #include #include @@ -378,19 +379,28 @@ EditUser::EditUser(const QString &user,QWidget *parent) // Group Permissions Button // user_assign_perms_button=new QPushButton(this); - user_assign_perms_button->setGeometry(10,582,sizeHint().width()/2-20,50); + user_assign_perms_button->setGeometry(10,582,sizeHint().width()/3-20,50); user_assign_perms_button->setFont(font); - user_assign_perms_button->setText(tr("Assign Group\nPermissions")); + user_assign_perms_button->setText(tr("Group\nPermissions")); connect(user_assign_perms_button,SIGNAL(clicked()),this,SLOT(groupsData())); + // + // Services Permissions Button + // + user_assign_svcs_button=new QPushButton(this); + user_assign_svcs_button->setGeometry(sizeHint().width()/3+10,582,sizeHint().width()/3-20,50); + user_assign_svcs_button->setFont(font); + user_assign_svcs_button->setText(tr("Service\nPermissions")); + connect(user_assign_svcs_button,SIGNAL(clicked()),this,SLOT(servicesData())); + // // Feeds Permissions Button // user_assign_feeds_button=new QPushButton(this); user_assign_feeds_button-> - setGeometry(sizeHint().width()/2+10,582,sizeHint().width()/2-20,50); + setGeometry(2*sizeHint().width()/3+10,582,sizeHint().width()/3-20,50); user_assign_feeds_button->setFont(font); - user_assign_feeds_button->setText(tr("Assign Podcast Feed\nPermissions")); + user_assign_feeds_button->setText(tr("Podcast Feed\nPermissions")); connect(user_assign_feeds_button,SIGNAL(clicked()),this,SLOT(feedsData())); // @@ -517,6 +527,14 @@ void EditUser::groupsData() } +void EditUser::servicesData() +{ + EditUserServicePerms *dialog=new EditUserServicePerms(user_user,this); + dialog->exec(); + delete dialog; +} + + void EditUser::feedsData() { EditFeedPerms *dialog=new EditFeedPerms(user_user,this); diff --git a/rdadmin/edit_user.h b/rdadmin/edit_user.h index 56e580a4..e370ab19 100644 --- a/rdadmin/edit_user.h +++ b/rdadmin/edit_user.h @@ -47,6 +47,7 @@ class EditUser : public QDialog void localAuthToggledData(bool state); void passwordData(); void groupsData(); + void servicesData(); void feedsData(); void adminToggledData(bool state); void okData(); @@ -90,6 +91,7 @@ class EditUser : public QDialog QCheckBox *user_edit_podcast_button; QCheckBox *user_delete_podcast_button; QPushButton *user_assign_perms_button; + QPushButton *user_assign_svcs_button; QPushButton *user_assign_feeds_button; QLabel *user_create_carts_label; QLabel *user_delete_carts_label; diff --git a/rdadmin/edit_user_perms.cpp b/rdadmin/edit_user_perms.cpp index c96feda6..927967d2 100644 --- a/rdadmin/edit_user_perms.cpp +++ b/rdadmin/edit_user_perms.cpp @@ -2,7 +2,7 @@ // // Edit Rivendell User/Group Permissions // -// (C) Copyright 2002-2005,2016 Fred Gleason +// (C) Copyright 2002-2005,2016-2017 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -18,22 +18,12 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include +#include + +#include "edit_user_perms.h" EditUserPerms::EditUserPerms(RDUser *user,QWidget *parent) : QDialog(parent,"",true) @@ -90,16 +80,15 @@ EditUserPerms::EditUserPerms(RDUser *user,QWidget *parent) // // Populate Fields // - sql=QString().sprintf("select GROUP_NAME from USER_PERMS \ - where USER_NAME=\"%s\"", - (const char *)user_user->name()); + sql=QString("select GROUP_NAME from USER_PERMS where ")+ + "USER_NAME=\""+RDEscapeString(user_user->name())+"\""; q=new RDSqlQuery(sql); while(q->next()) { user_host_sel->destInsertItem(q->value(0).toString()); } delete q; - sql=QString().sprintf("select NAME from GROUPS"); + sql=QString("select NAME from GROUPS"); q=new RDSqlQuery(sql); while(q->next()) { if(user_host_sel->destFindItem(q->value(0).toString())==0) { @@ -136,18 +125,15 @@ void EditUserPerms::okData() // Add New Groups // for(unsigned i=0;idestCount();i++) { - sql=QString().sprintf("select GROUP_NAME from USER_PERMS \ - where USER_NAME=\"%s\" && GROUP_NAME=\"%s\"", - (const char *)user_user->name(), - (const char *)user_host_sel->destText(i)); + sql=QString("select GROUP_NAME from USER_PERMS where ")+ + "USER_NAME=\""+RDEscapeString(user_user->name())+"\" && " + "GROUP_NAME=\""+RDEscapeString(user_host_sel->destText(i))+"\""; q=new RDSqlQuery(sql); if(q->size()==0) { delete q; - sql=QString(). - sprintf("insert into USER_PERMS (USER_NAME,GROUP_NAME) \ - values (\"%s\",\"%s\")", - (const char *)user_user->name(), - (const char *)user_host_sel->destText(i)); + sql=QString("insert into USER_PERMS (USER_NAME,GROUP_NAME) ")+ + "values (\""+RDEscapeString(user_user->name())+ + "\",\""+RDEscapeString(user_host_sel->destText(i))+"\")"; q=new RDSqlQuery(sql); } delete q; @@ -156,11 +142,11 @@ void EditUserPerms::okData() // // Delete Old Groups // - sql=QString().sprintf("delete from USER_PERMS where USER_NAME=\"%s\"", - (const char *)user_user->name()); + sql=QString("delete from USER_PERMS where ")+ + "USER_NAME=\""+RDEscapeString(user_user->name())+"\""; for(unsigned i=0;idestCount();i++) { - sql+=QString().sprintf(" && GROUP_NAME<>\"%s\"", - (const char *)user_host_sel->destText(i)); + sql+=QString(" && GROUP_NAME<>\"")+ + RDEscapeString(user_host_sel->destText(i))+"\""; } q=new RDSqlQuery(sql); delete q; diff --git a/rdadmin/edit_user_perms.h b/rdadmin/edit_user_perms.h index 2d898b66..d5a2480a 100644 --- a/rdadmin/edit_user_perms.h +++ b/rdadmin/edit_user_perms.h @@ -1,6 +1,6 @@ // edit_user_perms.h // -// Edit Rivendell Service Permissions +// Edit Rivendell User/Group Permissions // // (C) Copyright 2002-2004,2016 Fred Gleason // @@ -22,7 +22,6 @@ #define EDIT_USER_PERMS_H #include -#include #include #include diff --git a/rdadmin/edit_user_service_perms.cpp b/rdadmin/edit_user_service_perms.cpp new file mode 100644 index 00000000..3c4d0538 --- /dev/null +++ b/rdadmin/edit_user_service_perms.cpp @@ -0,0 +1,161 @@ +// edit_user_service_perms.cpp +// +// Edit Rivendell User/Group Permissions +// +// (C) Copyright 2002-2005,2016-2017 Fred Gleason +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// 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, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#include + +#include +#include + +#include "edit_user_service_perms.h" + +EditUserServicePerms::EditUserServicePerms(RDUser *user,QWidget *parent) + : QDialog(parent,"",true) +{ + QString sql; + RDSqlQuery *q; + + user_user=user; + + // + // Fix the Window Size + // + setMinimumWidth(sizeHint().width()); + setMaximumWidth(sizeHint().width()); + setMinimumHeight(sizeHint().height()); + setMaximumHeight(sizeHint().height()); + + setCaption(tr("User: ")+user_user->name()); + + // + // Create Fonts + // + QFont font=QFont("Helvetica",12,QFont::Bold); + font.setPixelSize(12); + + // + // Groups Selector + // + user_host_sel=new RDListSelector(this); + user_host_sel->sourceSetLabel(tr("Available Services")); + user_host_sel->destSetLabel(tr("Enabled Services")); + user_host_sel->setGeometry(10,10,380,130); + + // + // Ok Button + // + QPushButton *ok_button=new QPushButton(this); + ok_button->setGeometry(sizeHint().width()-180,sizeHint().height()-60,80,50); + ok_button->setDefault(true); + ok_button->setFont(font); + ok_button->setText(tr("&OK")); + connect(ok_button,SIGNAL(clicked()),this,SLOT(okData())); + + // + // Cancel Button + // + QPushButton *cancel_button=new QPushButton(this); + cancel_button->setGeometry(sizeHint().width()-90,sizeHint().height()-60, + 80,50); + cancel_button->setFont(font); + cancel_button->setText(tr("&Cancel")); + connect(cancel_button,SIGNAL(clicked()),this,SLOT(cancelData())); + + // + // Populate Fields + // + sql=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+ + "USER_NAME=\""+RDEscapeString(user_user->name())+"\""; + q=new RDSqlQuery(sql); + while(q->next()) { + user_host_sel->destInsertItem(q->value(0).toString()); + } + delete q; + + sql=QString().sprintf("select NAME from SERVICES"); + q=new RDSqlQuery(sql); + while(q->next()) { + if(user_host_sel->destFindItem(q->value(0).toString())==0) { + user_host_sel->sourceInsertItem(q->value(0).toString()); + } + } + delete q; +} + + +EditUserServicePerms::~EditUserServicePerms() +{ +} + + +QSize EditUserServicePerms::sizeHint() const +{ + return QSize(400,212); +} + + +QSizePolicy EditUserServicePerms::sizePolicy() const +{ + return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); +} + + +void EditUserServicePerms::okData() +{ + RDSqlQuery *q; + QString sql; + + // + // Add New Groups + // + for(unsigned i=0;idestCount();i++) { + sql=QString().sprintf("select SERVICE_NAME from USER_SERVICE_PERMS \ + where USER_NAME=\"%s\" && SERVICE_NAME=\"%s\"", + (const char *)user_user->name(), + (const char *)user_host_sel->destText(i)); + q=new RDSqlQuery(sql); + if(q->size()==0) { + delete q; + sql=QString("insert into USER_SERVICE_PERMS (USER_NAME,SERVICE_NAME) ")+ + "values (\""+RDEscapeString(user_user->name())+"\","+ + "\""+RDEscapeString(user_host_sel->destText(i))+"\")"; + q=new RDSqlQuery(sql); + } + delete q; + } + + // + // Delete Old Groups + // + sql=QString("delete from USER_SERVICE_PERMS where ")+ + "USER_NAME=\""+RDEscapeString(user_user->name())+"\""; + for(unsigned i=0;idestCount();i++) { + sql+=QString(" && SERVICE_NAME<>\"")+ + RDEscapeString(user_host_sel->destText(i))+"\""; + } + q=new RDSqlQuery(sql); + delete q; + done(0); +} + + +void EditUserServicePerms::cancelData() +{ + done(1); +} diff --git a/rdadmin/edit_user_service_perms.h b/rdadmin/edit_user_service_perms.h new file mode 100644 index 00000000..9458f959 --- /dev/null +++ b/rdadmin/edit_user_service_perms.h @@ -0,0 +1,49 @@ +// edit_user_service_perms.h +// +// Edit Rivendell User/Group Permissions +// +// (C) Copyright 2002-2004,2016 Fred Gleason +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// 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, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#ifndef EDIT_USER_SERVICE_PERMS_H +#define EDIT_USER_SERVICE_PERMS_H + +#include +#include + +#include + +class EditUserServicePerms : public QDialog +{ + Q_OBJECT + public: + EditUserServicePerms(RDUser *user,QWidget *parent=0); + ~EditUserServicePerms(); + QSize sizeHint() const; + QSizePolicy sizePolicy() const; + + private slots: + void okData(); + void cancelData(); + + private: + RDListSelector *user_host_sel; + RDUser *user_user; +}; + + +#endif // EDIT_USER_SERVICE_PERMS_H + diff --git a/rdadmin/rdadmin_cs.ts b/rdadmin/rdadmin_cs.ts index 3033c2e9..e695dca9 100644 --- a/rdadmin/rdadmin_cs.ts +++ b/rdadmin/rdadmin_cs.ts @@ -4179,13 +4179,13 @@ uloženo. Uložit nyní? Assign Group Permissions - Přiřadit povolení + Přiřadit povolení pro skupinu Assign Podcast Feed Permissions - Přiřadit povolení + Přiřadit povolení pro přívod pro podcast @@ -4212,6 +4212,21 @@ pro přívod pro podcast PAM Service + + Group +Permissions + + + + Service +Permissions + + + + Podcast Feed +Permissions + + EditUserPerms diff --git a/rdadmin/rdadmin_de.ts b/rdadmin/rdadmin_de.ts index c53a31a5..14d175f9 100644 --- a/rdadmin/rdadmin_de.ts +++ b/rdadmin/rdadmin_de.ts @@ -4136,13 +4136,13 @@ gespeichert werden. Jetzt speichern? Assign Group Permissions - Gruppenerlaubnisse + Gruppenerlaubnisse zuweisen Assign Podcast Feed Permissions - Podcastfeed-Erlaubnisse + Podcastfeed-Erlaubnisse zuweisen @@ -4169,6 +4169,21 @@ zuweisen PAM Service + + Group +Permissions + + + + Service +Permissions + + + + Podcast Feed +Permissions + + EditUserPerms diff --git a/rdadmin/rdadmin_es.ts b/rdadmin/rdadmin_es.ts index 80451c95..b1b0fddd 100644 --- a/rdadmin/rdadmin_es.ts +++ b/rdadmin/rdadmin_es.ts @@ -4128,13 +4128,13 @@ debe guardarse. ¿Hacerlo ahora? Assign Group Permissions - Asignar Permisos + Asignar Permisos de Grupo Assign Podcast Feed Permissions - Asignar permisos de + Asignar permisos de Feeds para Podcasts @@ -4157,6 +4157,21 @@ Feeds para Podcasts PAM Service + + Group +Permissions + + + + Service +Permissions + + + + Podcast Feed +Permissions + + EditUserPerms diff --git a/rdadmin/rdadmin_fr.ts b/rdadmin/rdadmin_fr.ts index a7e1bee3..8cf8effe 100644 --- a/rdadmin/rdadmin_fr.ts +++ b/rdadmin/rdadmin_fr.ts @@ -3733,16 +3733,6 @@ must be saved. Save now? Dele&te Podcast - - Assign Group -Permissions - - - - Assign Podcast Feed -Permissions - - &OK @@ -3767,6 +3757,21 @@ Permissions PAM Service + + Group +Permissions + + + + Service +Permissions + + + + Podcast Feed +Permissions + + EditUserPerms diff --git a/rdadmin/rdadmin_nb.ts b/rdadmin/rdadmin_nb.ts index e994ce25..8cb888f5 100644 --- a/rdadmin/rdadmin_nb.ts +++ b/rdadmin/rdadmin_nb.ts @@ -4114,13 +4114,13 @@ Lagre no? Assign Group Permissions - Styr gruppe- + Styr gruppe- tilgang Assign Podcast Feed Permissions - Styr podkastsraum- + Styr podkastsraum- tilgangsrettar @@ -4147,6 +4147,21 @@ tilgangsrettar PAM Service + + Group +Permissions + + + + Service +Permissions + + + + Podcast Feed +Permissions + + EditUserPerms diff --git a/rdadmin/rdadmin_nn.ts b/rdadmin/rdadmin_nn.ts index e994ce25..8cb888f5 100644 --- a/rdadmin/rdadmin_nn.ts +++ b/rdadmin/rdadmin_nn.ts @@ -4114,13 +4114,13 @@ Lagre no? Assign Group Permissions - Styr gruppe- + Styr gruppe- tilgang Assign Podcast Feed Permissions - Styr podkastsraum- + Styr podkastsraum- tilgangsrettar @@ -4147,6 +4147,21 @@ tilgangsrettar PAM Service + + Group +Permissions + + + + Service +Permissions + + + + Podcast Feed +Permissions + + EditUserPerms diff --git a/rdadmin/rdadmin_pt_BR.ts b/rdadmin/rdadmin_pt_BR.ts index 1a4740c3..a4c169d8 100644 --- a/rdadmin/rdadmin_pt_BR.ts +++ b/rdadmin/rdadmin_pt_BR.ts @@ -4129,13 +4129,13 @@ deve ser salva. Salvar Agora? Assign Group Permissions - Determinar Permissões + Determinar Permissões de Grupo Assign Podcast Feed Permissions - Determinar Permissões de + Determinar Permissões de Feeds de Podcasts @@ -4162,6 +4162,21 @@ Feeds de Podcasts PAM Service + + Group +Permissions + + + + Service +Permissions + + + + Podcast Feed +Permissions + + EditUserPerms diff --git a/rdairplay/list_logs.cpp b/rdairplay/list_logs.cpp index be773d70..fe95b4cc 100644 --- a/rdairplay/list_logs.cpp +++ b/rdairplay/list_logs.cpp @@ -47,7 +47,8 @@ ListLogs::ListLogs(LogPlay *log,QWidget *parent) // // Filter Widget // - list_filter_widget=new RDLogFilter(this); + list_filter_widget= + new RDLogFilter(RDLogFilter::StationFilter,rduser,air_config,this); connect(list_filter_widget,SIGNAL(filterChanged(const QString &)), this,SLOT(filterChangedData(const QString &))); @@ -133,7 +134,6 @@ int ListLogs::exec(QString *logname,QString *svcname) while(q->next()) { services_list.push_back(q->value(0).toString()); } - list_filter_widget->setServices(services_list); delete q; RefreshList(); @@ -186,7 +186,8 @@ void ListLogs::saveAsButtonData() QString logname; QString svcname=*list_svcname; RDAddLog *log; - log=new RDAddLog(&logname,&svcname,rdstation_conf,tr("Rename Log"),this); + log=new RDAddLog(&logname,&svcname,RDLogFilter::StationFilter,rduser, + rdstation_conf,tr("Rename Log"),this); if(log->exec()<0) { delete log; diff --git a/rdlogedit/edit_chain.cpp b/rdlogedit/edit_chain.cpp index f8c44db3..94610e7b 100644 --- a/rdlogedit/edit_chain.cpp +++ b/rdlogedit/edit_chain.cpp @@ -289,7 +289,8 @@ void EditChain::selectLogData() { QString logname; - RDListLogs *d=new RDListLogs(&logname,log_config->stationName(),this); + RDListLogs *d= + new RDListLogs(&logname,RDLogFilter::UserFilter,rduser,log_config,this); if(d->exec()!=0) { delete d; return; diff --git a/rdlogedit/edit_log.cpp b/rdlogedit/edit_log.cpp index 8b0131ba..42af53ef 100644 --- a/rdlogedit/edit_log.cpp +++ b/rdlogedit/edit_log.cpp @@ -1094,7 +1094,8 @@ void EditLog::saveasData() RDAddLog *log=NULL; if(rduser->createLog()) { - log=new RDAddLog(&logname,&svcname,NULL,tr("Add Log"),this); + log=new RDAddLog(&logname,&svcname,RDLogFilter::UserFilter,rduser, + rdstation_conf,tr("Add Log"),this); if(log->exec()<0) { return; } diff --git a/rdlogedit/rdlogedit.cpp b/rdlogedit/rdlogedit.cpp index 82d7638e..f22ea137 100644 --- a/rdlogedit/rdlogedit.cpp +++ b/rdlogedit/rdlogedit.cpp @@ -247,7 +247,8 @@ MainWidget::MainWidget(QWidget *parent) // // Log Filter // - log_filter_widget=new RDLogFilter(this); + log_filter_widget= + new RDLogFilter(RDLogFilter::UserFilter,rduser,log_config,this); connect(log_filter_widget,SIGNAL(filterChanged(const QString &)), this,SLOT(filterChangedData(const QString &))); @@ -343,7 +344,7 @@ MainWidget::MainWidget(QWidget *parent) log_close_button->setText(tr("&Close")); connect(log_close_button,SIGNAL(clicked()),this,SLOT(quitMainWidget())); - RefreshList(); + // RefreshList(); #ifndef WIN32 // @@ -384,6 +385,8 @@ void MainWidget::userData() delete rduser; } rduser=new RDUser(rdripc->user()); + log_filter_widget->setUser(rduser); + RefreshList(); // // Set Control Perms @@ -410,7 +413,8 @@ void MainWidget::addData() RDAddLog *log; if(rduser->createLog()) { - log=new RDAddLog(&logname,&svcname,NULL,tr("Add Log"),this); + log=new RDAddLog(&logname,&svcname,RDLogFilter::UserFilter,rduser, + rdstation_conf,tr("Add Log"),this); if(log->exec()!=0) { delete log; return; diff --git a/utils/rdrevert/rdrevert.cpp b/utils/rdrevert/rdrevert.cpp index e615bcb5..04425c55 100644 --- a/utils/rdrevert/rdrevert.cpp +++ b/utils/rdrevert/rdrevert.cpp @@ -243,6 +243,10 @@ void MainObject::Revert(int schema) const case 271: Revert271(); break; + + case 272: + Revert272(); + break; } } @@ -739,6 +743,18 @@ void MainObject::Revert271() const } +void MainObject::Revert272() const +{ + QString sql; + QSqlQuery *q; + sql=QString("drop table USER_SERVICE_PERMS"); + q=new QSqlQuery(sql); + delete q; + + SetVersion(271); +} + + int MainObject::GetVersion() const { QString sql; @@ -783,7 +799,7 @@ int MainObject::MapSchema(const QString &ver) version_map["2.15"]=259; version_map["2.16"]=263; version_map["2.17"]=268; - version_map["2.18"]=271; + version_map["2.18"]=272; // // Normalize String diff --git a/utils/rdrevert/rdrevert.h b/utils/rdrevert/rdrevert.h index 3a95d17d..0bd18362 100644 --- a/utils/rdrevert/rdrevert.h +++ b/utils/rdrevert/rdrevert.h @@ -67,6 +67,7 @@ class MainObject : public QObject void Revert269() const; void Revert270() const; void Revert271() const; + void Revert272() const; int GetVersion() const; void SetVersion(int schema) const; int MapSchema(const QString &ver); diff --git a/web/rdxport/logs.cpp b/web/rdxport/logs.cpp index 7ab558a7..b6e23ac8 100644 --- a/web/rdxport/logs.cpp +++ b/web/rdxport/logs.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -52,10 +51,7 @@ void Xport::AddLog() if(!xport_post->getValue("SERVICE_NAME",&service_name)) { XmlExit("Missing SERVICE_NAME",400,"logs.cpp",LINE_NUMBER); } - RDSvc *svc=new RDSvc(service_name,xport_station,xport_config); - if(!svc->exists()) { - XmlExit("No such service",404,"logs.cpp",LINE_NUMBER); - } + GetLogService(service_name); // // Verify User Perms @@ -129,6 +125,9 @@ void Xport::ListLogs() // Get Options // xport_post->getValue("SERVICE_NAME",&service_name); + if(!service_name.isEmpty()) { + GetLogService(service_name); + } xport_post->getValue("LOG_NAME",&log_name); xport_post->getValue("TRACKABLE",&trackable); xport_post->getValue("FILTER",&filter); @@ -142,7 +141,19 @@ void Xport::ListLogs() if(!log_name.isEmpty()) { sql+=" (NAME=\""+RDEscapeString(log_name)+"\")&&"; } - if(!service_name.isEmpty()) { + if(service_name.isEmpty()) { + QString sql2=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+ + "USER_NAME=\""+RDEscapeString(xport_user->name())+"\""; + q=new RDSqlQuery(sql2); + sql+="("; + while(q->next()) { + sql+="(SERVICE=\""+RDEscapeString(q->value(0).toString())+"\")||"; + } + sql=sql.left(sql.length()-2); + sql+=")&&"; + delete q; + } + else { sql+=" (SERVICE=\""+RDEscapeString(service_name)+"\")&&"; } if(trackable=="1") { @@ -209,7 +220,7 @@ void Xport::ListLog() // Verify that log exists // log=new RDLog(name); - if(!log->exists()) { + if((!ServiceUserValid(log->service()))||(!log->exists())) { delete log; XmlExit("No such log",404,"logs.cpp",LINE_NUMBER); } @@ -259,6 +270,7 @@ void Xport::SaveLog() if(!xport_post->getValue("SERVICE_NAME",&service_name)) { XmlExit("Missing SERVICE_NAME",400,"logs.cpp",LINE_NUMBER); } + GetLogService(service_name); if(!xport_post->getValue("DESCRIPTION",&description)) { XmlExit("Missing DESCRIPTION",400,"logs.cpp",LINE_NUMBER); } @@ -504,3 +516,37 @@ void Xport::SaveLog() XmlExit(QString().sprintf("OK Saved %d events",logevt->size()), 200,"logs.cpp",LINE_NUMBER); } + + +RDSvc *Xport::GetLogService(const QString &svc_name) +{ + QString sql=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+ + "(USER_NAME=\""+RDEscapeString(xport_user->name())+"\")&&"+ + "(SERVICE_NAME=\""+RDEscapeString(svc_name)+"\")"; + RDSqlQuery *q=new RDSqlQuery(sql); + if(!q->first()) { + XmlExit("No such service",404,"logs.cpp",LINE_NUMBER); + } + delete q; + RDSvc *svc=new RDSvc(svc_name,xport_station,xport_config); + if(!svc->exists()) { + XmlExit("No such service",404,"logs.cpp",LINE_NUMBER); + } + + return svc; +} + + +bool Xport::ServiceUserValid(const QString &svc_name) +{ + bool ret=false; + + QString sql=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+ + "(SERVICE_NAME=\""+RDEscapeString(svc_name)+"\")&&"+ + "(USER_NAME=\""+RDEscapeString(xport_user->name())+"\")"; + RDSqlQuery *q=new RDSqlQuery(sql); + ret=q->first(); + delete q; + + return ret; +} diff --git a/web/rdxport/rdxport.h b/web/rdxport/rdxport.h index 9a6104e6..92675981 100644 --- a/web/rdxport/rdxport.h +++ b/web/rdxport/rdxport.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -69,6 +70,8 @@ class Xport : public QObject void DeleteLog(); void ListLogs(); void ListLog(); + RDSvc *GetLogService(const QString &svc_name); + bool ServiceUserValid(const QString &svc_name); void Rehash(); void SaveLog(); void ListSchedCodes(); diff --git a/web/rdxport/services.cpp b/web/rdxport/services.cpp index f4489f1e..b323d400 100644 --- a/web/rdxport/services.cpp +++ b/web/rdxport/services.cpp @@ -37,6 +37,7 @@ void Xport::ListServices() { QString sql; + QString sql2; RDSqlQuery *q; RDSvc *svc; QString trackable; @@ -49,9 +50,20 @@ void Xport::ListServices() // // Generate Service List // - sql="select NAME from SERVICES"; + sql=QString("select NAME from SERVICES where "); + sql2=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+ + "USER_NAME=\""+RDEscapeString(xport_user->name())+"\""; + q=new RDSqlQuery(sql2); + sql+="("; + while(q->next()) { + sql+="(NAME=\""+RDEscapeString(q->value(0).toString())+"\")||"; + } + sql=sql.left(sql.length()-2); + sql+=")"; + delete q; + if(trackable=="1") { - sql+=" where (TRACK_GROUP!=\"\")&&(TRACK_GROUP is not null)"; + sql+="&&(TRACK_GROUP!=\"\")&&(TRACK_GROUP is not null)"; } sql+=" order by NAME"; q=new RDSqlQuery(sql);