blob: 7957482b949a7d324c4d7a74edf01f267df7636d [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
Nan Zhoufef63032022-10-25 00:07:12 +000097void Users::setUserPrivilege(const std::string& value)
98{
99 UsersIface::userPrivilege(value);
100}
101
102void Users::setUserGroups(const std::vector<std::string>& groups)
103{
104 UsersIface::userGroups(groups);
105}
106
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +0530107/** @brief list user privilege
108 *
109 */
110std::string Users::userPrivilege(void) const
111{
112 return UsersIface::userPrivilege();
113}
114
115/** @brief update user groups
116 *
117 * @param[in] value - User groups
118 */
119std::vector<std::string> Users::userGroups(std::vector<std::string> value)
120{
121 if (value == UsersIface::userGroups())
122 {
123 return value;
124 }
125 std::sort(value.begin(), value.end());
126 manager.updateGroupsAndPriv(userName, value, UsersIface::userPrivilege());
127 return UsersIface::userGroups(value);
128}
129
130/** @brief list user groups
131 *
132 */
133std::vector<std::string> Users::userGroups(void) const
134{
135 return UsersIface::userGroups();
136}
137
138/** @brief lists user enabled state
139 *
140 */
141bool Users::userEnabled(void) const
142{
143 return UsersIface::userEnabled();
144}
145
146/** @brief update user enabled state
147 *
148 * @param[in] value - bool value
149 */
150bool Users::userEnabled(bool value)
151{
152 if (value == UsersIface::userEnabled())
153 {
154 return value;
155 }
156 manager.userEnable(userName, value);
157 return UsersIface::userEnabled(value);
158}
159
Richard Marian Thomaiyarc7045192018-06-13 16:51:00 +0530160/** @brief lists user locked state for failed attempt
161 *
162 **/
163bool Users::userLockedForFailedAttempt(void) const
164{
165 return manager.userLockedForFailedAttempt(userName);
166}
167
168/** @brief unlock user locked state for failed attempt
169 *
170 * @param[in]: value - false - unlock user account, true - no action taken
171 **/
172bool Users::userLockedForFailedAttempt(bool value)
173{
174 if (value != false)
175 {
176 return userLockedForFailedAttempt();
177 }
178 else
179 {
180 return manager.userLockedForFailedAttempt(userName, value);
181 }
182}
183
Joseph Reynolds3ab6cc22020-03-03 14:09:03 -0600184/** @brief indicates if the user's password is expired
185 *
186 **/
187bool Users::userPasswordExpired(void) const
188{
189 return manager.userPasswordExpired(userName);
190}
191
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +0530192} // namespace user
193} // namespace phosphor