diff options
author | Pradeep Krishnamurthy <pradeep.krishnamurthy@calxeda.com> | 2013-08-29 14:53:30 -0500 |
---|---|---|
committer | Pradeep Krishnamurthy <pradeep.krishnamurthy@calxeda.com> | 2013-08-29 14:53:30 -0500 |
commit | f6529952242f903add49dd653cad06d0eec04624 (patch) | |
tree | b8d1fd859116ce19c2b620df11cddbe3b80ff858 | |
parent | 039d808ec00b425ea4d2ed1baaea272e92800af0 (diff) | |
parent | e47f3da89b5c282748866f99d9d6f4649fe4b55e (diff) | |
download | ipmitool-f6529952242f903add49dd653cad06d0eec04624.tar.gz |
Merge branch 'master' of ssh://git/var/git/ipmitool
-rw-r--r-- | include/ipmitool/ipmi_user.h | 6 | ||||
-rw-r--r-- | lib/ipmi_user.c | 38 | ||||
-rw-r--r-- | src/plugins/lanplus/lanplus.c | 14 |
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; |