Hi,
i am on the train and had nothing to do, so here it is:
rip out the resmgr/group/etc access control.
This may help getting this going, i'll probably not commit it since it
is incomplete (e.g. checkPermissions() probably should go away completely).
But a little bit of the long boring stuff is done ;-)
Thomas, i hope this helps getting rid of the socket stuff.
If you want me to commit it (hey, it compiles and i can run it! ;-) drop
me a note and i'll do it.
--
Stefan Seyfried \ "I didn't want to write for pay. I
QA / R&D Team Mobile Devices \ wanted to be paid for what I write."
SUSE LINUX Products GmbH, Nürnberg \ -- Leonard Cohen
diff -rup /tmp/powersave/powersave-0.10.6/config_files/common
./config_files/common
--- /tmp/powersave/powersave-0.10.6/config_files/common 2005-07-22
11:46:07.000000000 +0200
+++ ./config_files/common 2005-08-05 20:33:30.000000000 +0200
@@ -71,10 +71,12 @@ NOTIFY_METHOD=""
## Default: "ac battery button fan processor thermal"
## ServiceRestart: powersaved
#
-# The powersaved startscript will load all necessary modules for acpi. If some
of
+# The acpid startscript will load all necessary modules for acpi. If some of
# these modules cause trouble, you may remove it from this variable. You may
# add the modules asus_acpi or toshiba_acpi if your computer is an Asus or a
# Toshiba. Seperate several modules by space.
+# If this variable is empty, the default is used. If you want to disable
+# module loading, enter "NONE".
#
ACPI_MODULES=""
@@ -159,16 +161,6 @@ START_ACPID=""
SECURITY=""
## Path: System/Powermanagement/Powersave/General
-## Type: string
-## Default "powersave"
-#
-# If the daemon is started with group security policy (powersave -a param)
-# you can specify the system group that is allowed to connect to the daemon
-# by default the resource mangager (resmgr) policy is used and this
-# variable is ignored
-PM_GROUP=""
-
-## Path: System/Powermanagement/Powersave/General
## Type: integer(1:100)
## Default "0"
#
diff -rup /tmp/powersave/powersave-0.10.6/daemon/clientConnection.cpp
./daemon/clientConnection.cpp
--- /tmp/powersave/powersave-0.10.6/daemon/clientConnection.cpp 2005-08-02
18:52:10.000000000 +0200
+++ ./daemon/clientConnection.cpp 2005-08-05 20:23:26.000000000 +0200
@@ -24,9 +24,6 @@ clientConnection::clientConnection(PM_ST
// allocate memory for the socketoperations
sockOp = new (socketOpts);
-
- // set the user management in reference to the configuration
- sockOp->setUserManagement(config->user_management,
config->current_scheme->PM_GROUP);
}
diff -rup /tmp/powersave/powersave-0.10.6/daemon/config_pm.cpp
./daemon/config_pm.cpp
--- /tmp/powersave/powersave-0.10.6/daemon/config_pm.cpp 2005-08-05
10:28:26.000000000 +0200
+++ ./daemon/config_pm.cpp 2005-08-05 20:34:05.000000000 +0200
@@ -32,7 +32,6 @@ PS_Config::PS_Config(){
ENABLE_THERMAL_MANAGEMENT = OFF;
- PM_GROUP = "powersave";
USER_STANDBY_DISABLED = 1;
USER_SUSPEND2DISK_DISABLED = 0;
USER_SUSPEND2RAM_DISABLED = 1;
@@ -180,10 +179,6 @@ void PS_Config::assignConfigEntries(){
CPU_IDLE_LIMIT = checkValue(CPU_IDLE_LIMIT, "CPU_IDLE_LIMIT", 0, 100);
POWER_BUTTON_DELAY = checkValue(POWER_BUTTON_DELAY, "POWERBTN_DELAY",
0);
- s = data["PM_GROUP"];
- if (s != "")
- PM_GROUP = s.c_str();
-
FORCE_BATTERY_POLLING = checkYes(FORCE_BATTERY_POLLING,
"FORCE_BATTERY_POLLING");
USER_SUSPEND2DISK_DISABLED = checkYes(USER_SUSPEND2DISK_DISABLED,
"DISABLE_USER_SUSPEND2DISK");
USER_SUSPEND2RAM_DISABLED = checkYes(USER_SUSPEND2RAM_DISABLED,
"DISABLE_USER_SUSPEND2RAM");
diff -rup /tmp/powersave/powersave-0.10.6/daemon/config_pm.h
./daemon/config_pm.h
--- /tmp/powersave/powersave-0.10.6/daemon/config_pm.h 2005-07-08
22:11:19.000000000 +0200
+++ ./daemon/config_pm.h 2005-08-05 20:34:23.000000000 +0200
@@ -29,8 +29,6 @@ enum CPUFREQ_CONTROL_MODE{CPUFREQ_USERSP
enum THERMAL_MANAGEMENT_DELIGATION { OFF, KERNEL };
-enum ACCESS_MODE { ACCESS_ALL=1, ACCESS_RESMGR, ACCESS_GROUP, ACCESS_ROOT };
-
class Event;
class GeneralConfig;
@@ -78,8 +76,6 @@ class PS_Config{
* the idle event is thrown */
int CPU_IDLE_LIMIT;
- string PM_GROUP;
-
/** @brief should niced processes count for cpufreq calculatiob, too? */
int CONSIDER_NICE;
@@ -199,9 +195,6 @@ class GeneralConfig: public PS_Config {
string config_dir;
int disable_CPU_freq;
int no_of_schemes;
- /** @brief this is given by parameter */
- static ACCESS_MODE user_management;
-
GeneralConfig();
virtual ~GeneralConfig();
diff -rup /tmp/powersave/powersave-0.10.6/daemon/general_config.cpp
./daemon/general_config.cpp
--- /tmp/powersave/powersave-0.10.6/daemon/general_config.cpp 2005-07-05
15:57:23.000000000 +0200
+++ ./daemon/general_config.cpp 2005-08-05 20:32:28.000000000 +0200
@@ -4,8 +4,6 @@
#include <dirent.h>
-ACCESS_MODE GeneralConfig::user_management = ACCESS_ROOT;
-
void PS_Config::strtointErr(char *str, int line, const char *file){
pDebug(DBG_ERR, "Could not convert string to int; given string: '%s' in"
" line %d; config file: %s\n", str, line, file);
@@ -302,24 +300,10 @@ int GeneralConfig::setActiveSchemeByPowe
ostream& operator<<(ostream& os, const GeneralConfig &gc){
string ret;
- string access_m = "";
int x;
- if (gc.user_management == ACCESS_ROOT)
- access_m = "root";
- else if (gc.user_management == ACCESS_GROUP)
- access_m = "group";
- else if (gc.user_management == ACCESS_RESMGR)
- access_m = "managed by resmgr";
- else if (gc.user_management == ACCESS_ALL)
- access_m = "all";
- else
- access_m = "undefined";
-
os << endl << endl
<< "GENERAL CONFIGURATIONS:";
- os << endl << "Users that are allowed to connect through socket:
" << access_m;
- os << (gc.user_management == ACCESS_GROUP ? gc.PM_GROUP : "");
os << endl << "Force CPU frequency scaling to be disabled: " <<
(gc.disable_CPU_freq == 1 ? "yes" : "no");
os << endl << "gc.AC_SCHEME: " << ((gc.AC_scheme == NULL) ? "Not
available" : gc.AC_scheme->SCHEME_NAME);
os << endl << "gc.BATTERY_SCHEME: " << ((gc.Battery_scheme ==
NULL) ? "Not available" : gc.Battery_scheme->SCHEME_NAME);
diff -rup /tmp/powersave/powersave-0.10.6/daemon/powersaved.cpp
./daemon/powersaved.cpp
--- /tmp/powersave/powersave-0.10.6/daemon/powersaved.cpp 2005-08-05
11:50:12.000000000 +0200
+++ ./daemon/powersaved.cpp 2005-08-05 20:22:36.000000000 +0200
@@ -126,9 +126,6 @@ int PM_Interface::rereadConfig(){
config->current_scheme->CONSIDER_NICE);
}
}
- /* maybe group that is allowed to access has changed, set it in socket
class */
- if (config->user_management == ACCESS_GROUP)
- server_socket.setUserManagement(config->user_management,
config->current_scheme->PM_GROUP);
return ret;
}
@@ -241,8 +238,6 @@ PM_Interface::PM_Interface(GeneralConfig
pDebug (DBG_ERR, "Cannot create cpufreq objects");
}
}
-
- server_socket.setUserManagement(config->user_management,
config->current_scheme->PM_GROUP);
// allocate memory for event management object
eM = new EventManagement();
@@ -1101,7 +1096,7 @@ void get_args(int argc, char** argv, Gen
{NULL, 0, 0, 0},
};
while (1){
- int i = getopt_long(argc, argv, "v:c:s:a:x:f:ndh", opts,
&option_index);
+ int i = getopt_long(argc, argv, "v:c:s:x:f:ndh", opts,
&option_index);
if (i == -1){
break;
}
diff -rup /tmp/powersave/powersave-0.10.6/daemon/scheme_config.cpp
./daemon/scheme_config.cpp
--- /tmp/powersave/powersave-0.10.6/daemon/scheme_config.cpp 2005-07-08
22:11:19.000000000 +0200
+++ ./daemon/scheme_config.cpp 2005-08-05 20:35:07.000000000 +0200
@@ -26,7 +26,6 @@ SchemeConfig::SchemeConfig(string file_n
ENABLE_THERMAL_MANAGEMENT = gc.ENABLE_THERMAL_MANAGEMENT;
- PM_GROUP = gc.PM_GROUP;
USER_STANDBY_DISABLED = gc.USER_STANDBY_DISABLED;
USER_SUSPEND2DISK_DISABLED = gc.USER_SUSPEND2DISK_DISABLED;
USER_SUSPEND2RAM_DISABLED = gc.USER_SUSPEND2RAM_DISABLED;
diff -rup /tmp/powersave/powersave-0.10.6/daemon/server_socket.cpp
./daemon/server_socket.cpp
--- /tmp/powersave/powersave-0.10.6/daemon/server_socket.cpp 2005-06-26
12:27:35.000000000 +0200
+++ ./daemon/server_socket.cpp 2005-08-05 20:29:22.000000000 +0200
@@ -19,14 +19,12 @@
ServerSocket::ServerSocket(){
- user_management = ACCESS_ROOT;
accepted_sockfd = -1;
socket_fd = -1;
}
ServerSocket::~ServerSocket(){
- user_management = ACCESS_ROOT;
if (socket_fd != -1)
closeSocket();
}
@@ -88,18 +86,11 @@ int ServerSocket::checkPermission(){
struct sockaddr_un client_address;
socklen_t client_len;
- int result, k;
- group *groupinfo = NULL;
-
+ int result;
struct ucred cred;
struct passwd *pwd = NULL;
socklen_t len = sizeof(cred);
-#ifdef HAVE_LIBRESMGR
- char *p;
- char **sessions = NULL;
- char **sessions_free = NULL;
-#endif
client_len = sizeof(client_address);
// should never hang ...
@@ -108,80 +99,15 @@ int ServerSocket::checkPermission(){
pDebug(DBG_DIAG, "Server threw error after accept: %s\n",
strerror(errno));
return -1;
}
- if ( user_management == ACCESS_ALL ){
+ if ( getsockopt(accepted_sockfd, SOL_SOCKET, SO_PEERCRED, &cred, &len)
< 0 ){
+ pDebug(DBG_DIAG, "getsockopt failed");
+ return -1;
}
- else {
- if ( getsockopt(accepted_sockfd, SOL_SOCKET, SO_PEERCRED,
&cred, &len) < 0 ){
- pDebug(DBG_DIAG, "getsockopt failed");
- return -1;
- }
- if ((pwd = getpwuid(cred.uid)) == NULL || !pwd->pw_name)
- goto no_rights;
+ if ((pwd = getpwuid(cred.uid)) == NULL || !pwd->pw_name)
+ goto no_rights;
- if ( user_management == ACCESS_RESMGR ){
-#ifdef HAVE_LIBRESMGR
- // only need resmgr if no root user tries to connect
- if ( cred.uid ){
- sessions = rsm_list_sessions();
- sessions_free = sessions;
- if ( !sessions || !*sessions )
- goto no_rights;
- int okay = 0;
- pwd = getpwuid(cred.uid);
- for ( ; sessions && *sessions; sessions++ ){
- p = strstr( *sessions, " " );
- if ( p && *(p+1) && !strcmp( p+1,
pwd->pw_name ) ){
- okay = 1;
- break;
- }
- }
- if (sessions_free){
- for (k=0; sessions_free[k]; k++)
- free(sessions_free[k]);
- free(sessions_free);
- }
- if ( !okay ){
- pDebug(DBG_DIAG, "user %s has no resmgr
session"
- " and is not allowed to
connect.",
- pwd->pw_name);
- goto no_rights;
- }
- }
-#else
- pDebug (DBG_ERR, "Binary has no resmgr support compiled
in, fall back"
- "to root user management");
- user_management = ACCESS_ROOT;
-#endif
- }
- /* is a member of the powersave group connecting ?*/
- else if ( user_management == ACCESS_GROUP ) {
- groupinfo = getgrnam(pm_group.c_str());
- if (cred.uid && (groupinfo == NULL || groupinfo->gr_mem
== NULL)){
- pDebug(DBG_DIAG, "Could not find group: %s that
is "
- "allowed to use PM. Only root will be
allowed to connect to daemon."
- , pm_group.c_str());
- goto no_rights;
- }
- if (cred.uid){
- for ( k=0; *(groupinfo->gr_mem+k); k++){
- int m =
min(strlen(*(groupinfo->gr_mem+k)), strlen(pm_group.c_str()));
- if (!strncmp(*(groupinfo->gr_mem+k),
pwd->pw_name, m)){
- pDebug(DBG_DIAG, "%s is a
member of group %s - allowed to connect",
- pwd->pw_name,
pm_group.c_str());
- break;
- }
- else
- continue;
- }
- if (!*(groupinfo->gr_mem+k))
- goto no_rights;
- }
- }
- else if ( user_management == ACCESS_ROOT ){
- if (cred.uid)
- goto no_rights;
- }
- }
+ if (cred.uid)
+ goto no_rights;
return 1;
no_rights:
@@ -364,13 +290,6 @@ void ServerSocket::closeSocket(){
close(socket_fd);
}
-void ServerSocket::setUserManagement(ACCESS_MODE um, string group){
-
- pm_group = group;
- user_management = um;
-
-}
-
// reads one 'line' from a filedescriptor and returns it. The 'line' has to be
// terminated with \0
diff -rup /tmp/powersave/powersave-0.10.6/daemon/server_socket.h
./daemon/server_socket.h
--- /tmp/powersave/powersave-0.10.6/daemon/server_socket.h 2004-11-17
12:44:28.000000000 +0100
+++ ./daemon/server_socket.h 2005-08-05 20:24:35.000000000 +0200
@@ -12,7 +12,6 @@ class ServerSocket {
private:
int socket_fd;
int accepted_sockfd;
- ACCESS_MODE user_management;
string pm_group;
public:
@@ -26,7 +25,6 @@ class ServerSocket {
int sendIntReply(int reply);
int sendLongReply(int64_t reply);
int sendSchemesReply (GeneralConfig *configs);
- void setUserManagement(ACCESS_MODE um, string pm_group);
int getAcceptedSockFD();
//reads one line from a filedescription and returns it. The line has to
be terminated with \n
char *readLine(int fd);
Only in ./docs/autodocs: CVS
Only in ./docs: CVS
diff -rup /tmp/powersave/powersave-0.10.6/docs/README.user_management
./docs/README.user_management
--- /tmp/powersave/powersave-0.10.6/docs/README.user_management 2005-07-04
18:33:57.000000000 +0200
+++ ./docs/README.user_management 2005-08-05 20:36:53.000000000 +0200
@@ -1,35 +1,2 @@
-There are 4 types the daemon might allow user's to
-connect to the daemon (e.g. with powersave/kpowersave):
-
-
-ALL:
-Everybody is allowed to connect to the daemon
-
-RESMGR:
-The daemon asks the resmgr who is allowed to
-obtain PM related info or control.
-
-GROUP:
-You can specify a system group in common config file
-and add users to this group that are allowed to
-communicate with the daemon
-
-ROOT:
-The superuser is always allowed to connect.
-If the -a parameter is missing at all, when invoking
-the powersaved, only root is allowed to connect.
-
-Also see the manpage of powersaved (param: -a).
-You can change the security settings in the
-/etc/sysconfig/powerave/common file by modifing the
-variable:
-SECURITY
-and if you have chosen group you can specify the group
-that is allowed to connect to the daemon through the
-variable:
-PM_GROUP
-This will tell the init script to always use this settings
-at boot time.
-
-Note that for the resmgr setting support has to be compiled
-in and the resource manager package needs to be installed.
+Access control is now handled via DBus, have a look at
+/etc/dbus-1/system.d/powersave.conf._______________________________________________
powersave-devel mailing list
[email protected]
http://forge.novell.com/mailman/listinfo/powersave-devel