summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPradeep Krishnamurthy <pradeep.krishnamurthy@calxeda.com>2013-08-29 14:53:30 -0500
committerPradeep Krishnamurthy <pradeep.krishnamurthy@calxeda.com>2013-08-29 14:53:30 -0500
commitf6529952242f903add49dd653cad06d0eec04624 (patch)
treeb8d1fd859116ce19c2b620df11cddbe3b80ff858
parent039d808ec00b425ea4d2ed1baaea272e92800af0 (diff)
parente47f3da89b5c282748866f99d9d6f4649fe4b55e (diff)
downloadipmitool-f6529952242f903add49dd653cad06d0eec04624.tar.gz
Merge branch 'master' of ssh://git/var/git/ipmitool
-rw-r--r--include/ipmitool/ipmi_user.h6
-rw-r--r--lib/ipmi_user.c38
-rw-r--r--src/plugins/lanplus/lanplus.c14
3 files changed, 57 insertions, 1 deletions
diff --git a/include/ipmitool/ipmi_user.h b/include/ipmitool/ipmi_user.h
index 8c1d8c7..ac74372 100644
--- a/include/ipmitool/ipmi_user.h
+++ b/include/ipmitool/ipmi_user.h
@@ -82,7 +82,11 @@ struct user_access_rsp {
#endif
} __attribute__ ((packed));
-
+int ipmi_get_user_access_by_name(
+ struct ipmi_intf *intf,
+ uint8_t channel_number,
+ uint8_t user_name[17],
+ struct user_access_rsp *user_access);
int ipmi_user_main(struct ipmi_intf *, int, char **);
diff --git a/lib/ipmi_user.c b/lib/ipmi_user.c
index 93a63bf..735b5c8 100644
--- a/lib/ipmi_user.c
+++ b/lib/ipmi_user.c
@@ -167,6 +167,44 @@ ipmi_get_user_name(
}
+int ipmi_get_user_access_by_name(
+ struct ipmi_intf *intf,
+ uint8_t channel_number,
+ uint8_t user_name[17],
+ struct user_access_rsp *user_access)
+{
+ uint8_t current_user_id = 0;
+ uint8_t current_user_name[17];
+ int found = 0;
+
+ do
+ {
+ if (ipmi_get_user_access(intf,
+ channel_number,
+ current_user_id,
+ user_access))
+ return -1;
+
+ if (ipmi_get_user_name(intf,
+ current_user_id,
+ current_user_name))
+ return -1;
+
+ if(strcmp(user_name, current_user_name) == 0) {
+ found = 1;
+ break;
+ }
+
+ ++current_user_id;
+ } while((current_user_id <= user_access->maximum_ids) &&
+ (current_user_id <= 63)); /* Absolute maximum allowed by spec */
+
+ if(!found) {
+ return -1;
+ }
+
+ return 0;
+}
static void
diff --git a/src/plugins/lanplus/lanplus.c b/src/plugins/lanplus/lanplus.c
index 3b1470e..3fd4a3e 100644
--- a/src/plugins/lanplus/lanplus.c
+++ b/src/plugins/lanplus/lanplus.c
@@ -55,6 +55,7 @@
#include <ipmitool/ipmi_channel.h>
#include <ipmitool/ipmi_intf.h>
#include <ipmitool/ipmi_strings.h>
+#include <ipmitool/ipmi_user.h>
#include <ipmitool/bswap.h>
#include <openssl/rand.h>
@@ -3287,6 +3288,7 @@ ipmi_lanplus_open(struct ipmi_intf * intf)
struct get_channel_auth_cap_rsp auth_cap;
struct sockaddr_in addr;
struct ipmi_session *session;
+ struct user_access_rsp user_access;
if (!intf || !intf->session)
return -1;
@@ -3417,6 +3419,18 @@ ipmi_lanplus_open(struct ipmi_intf * intf)
bridgePossible = 1;
+ if (ipmi_get_user_access_by_name(
+ intf,
+ 0x0E,
+ intf->session->username,
+ &user_access)) {
+ lprintf(LOG_ERR, "Error: Unable to get user privileges for %s\n",
+ intf->session->username);
+ }
+
+ intf->session->privlvl = intf->session->privlvl <= user_access.channel_privilege_limit
+ ? intf->session->privlvl
+ : user_access.channel_privilege_limit;
rc = ipmi_set_session_privlvl_cmd(intf);
if (rc < 0)
goto fail;