blob: 89067699a220cd928f3345875a77511024bc342b [file] [log] [blame]
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +05301/*
2// Copyright (c) 2018 Intel Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16
Patrick Williams9638afb2021-02-22 17:16:24 -060017#include "config.h"
18
19#include "users.hpp"
20
21#include "user_mgr.hpp"
22
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053023#include <sys/types.h>
24#include <sys/wait.h>
Patrick Williams9638afb2021-02-22 17:16:24 -060025#include <unistd.h>
26
27#include <phosphor-logging/elog-errors.hpp>
28#include <phosphor-logging/elog.hpp>
29#include <phosphor-logging/log.hpp>
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053030#include <xyz/openbmc_project/Common/error.hpp>
31#include <xyz/openbmc_project/User/Common/error.hpp>
Patrick Williams9638afb2021-02-22 17:16:24 -060032
33#include <filesystem>
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053034
35namespace phosphor
36{
37namespace user
38{
39
40using namespace phosphor::logging;
41using InsufficientPermission =
42 sdbusplus::xyz::openbmc_project::Common::Error::InsufficientPermission;
43using InternalFailure =
44 sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
45using InvalidArgument =
46 sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument;
47using NoResource =
48 sdbusplus::xyz::openbmc_project::User::Common::Error::NoResource;
49
50using Argument = xyz::openbmc_project::Common::InvalidArgument;
51
52/** @brief Constructs UserMgr object.
53 *
54 * @param[in] bus - sdbusplus handler
55 * @param[in] path - D-Bus path
56 * @param[in] groups - users group list
57 * @param[in] priv - user privilege
58 * @param[in] enabled - user enabled state
59 * @param[in] parent - user manager - parent object
60 */
Patrick Williamsb3ef4e12022-07-22 19:26:55 -050061Users::Users(sdbusplus::bus_t& bus, const char* path,
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053062 std::vector<std::string> groups, std::string priv, bool enabled,
Patrick Williams9638afb2021-02-22 17:16:24 -060063 UserMgr& parent) :
Patrick Williams224559b2022-04-05 16:10:39 -050064 Interfaces(bus, path, Interfaces::action::defer_emit),
P Dheeraj Srujan Kumarb01e2fe2021-12-13 09:43:28 +053065 userName(sdbusplus::message::object_path(path).filename()), manager(parent)
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053066{
67 UsersIface::userPrivilege(priv, true);
68 UsersIface::userGroups(groups, true);
69 UsersIface::userEnabled(enabled, true);
Ratan Gupta1af12232018-11-03 00:35:38 +053070
71 this->emit_object_added();
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053072}
73
74/** @brief delete user method.
75 * This method deletes the user as requested
76 *
77 */
78void Users::delete_(void)
79{
80 manager.deleteUser(userName);
81}
82
83/** @brief update user privilege
84 *
85 * @param[in] value - User privilege
86 */
87std::string Users::userPrivilege(std::string value)
88{
89 if (value == UsersIface::userPrivilege())
90 {
91 return value;
92 }
93 manager.updateGroupsAndPriv(userName, UsersIface::userGroups(), value);
94 return UsersIface::userPrivilege(value);
95}
96
97/** @brief list user privilege
98 *
99 */
100std::string Users::userPrivilege(void) const
101{
102 return UsersIface::userPrivilege();
103}
104
105/** @brief update user groups
106 *
107 * @param[in] value - User groups
108 */
109std::vector<std::string> Users::userGroups(std::vector<std::string> value)
110{
111 if (value == UsersIface::userGroups())
112 {
113 return value;
114 }
115 std::sort(value.begin(), value.end());
116 manager.updateGroupsAndPriv(userName, value, UsersIface::userPrivilege());
117 return UsersIface::userGroups(value);
118}
119
120/** @brief list user groups
121 *
122 */
123std::vector<std::string> Users::userGroups(void) const
124{
125 return UsersIface::userGroups();
126}
127
128/** @brief lists user enabled state
129 *
130 */
131bool Users::userEnabled(void) const
132{
133 return UsersIface::userEnabled();
134}
135
136/** @brief update user enabled state
137 *
138 * @param[in] value - bool value
139 */
140bool Users::userEnabled(bool value)
141{
142 if (value == UsersIface::userEnabled())
143 {
144 return value;
145 }
146 manager.userEnable(userName, value);
147 return UsersIface::userEnabled(value);
148}
149
Richard Marian Thomaiyarc7045192018-06-13 16:51:00 +0530150/** @brief lists user locked state for failed attempt
151 *
152 **/
153bool Users::userLockedForFailedAttempt(void) const
154{
155 return manager.userLockedForFailedAttempt(userName);
156}
157
158/** @brief unlock user locked state for failed attempt
159 *
160 * @param[in]: value - false - unlock user account, true - no action taken
161 **/
162bool Users::userLockedForFailedAttempt(bool value)
163{
164 if (value != false)
165 {
166 return userLockedForFailedAttempt();
167 }
168 else
169 {
170 return manager.userLockedForFailedAttempt(userName, value);
171 }
172}
173
Joseph Reynolds3ab6cc22020-03-03 14:09:03 -0600174/** @brief indicates if the user's password is expired
175 *
176 **/
177bool Users::userPasswordExpired(void) const
178{
179 return manager.userPasswordExpired(userName);
180}
181
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +0530182} // namespace user
183} // namespace phosphor