blob: 06a4d5dc7729c62b6fac64600423ff6cf4a07982 [file] [log] [blame]
Nagaraju Goruganti997f5e02018-08-30 03:05:11 -05001#include <phosphor-logging/elog.hpp>
2#include <phosphor-logging/elog-errors.hpp>
3#include "ldap_configuration.hpp"
4#include "config.h"
5#include <fstream>
6#include <sstream>
7
8namespace phosphor
9{
10namespace ldap
11{
12constexpr auto nslcdService = "nslcd.service";
13
14Config::Config(sdbusplus::bus::bus& bus, const char* path, const char* filePath,
15 bool secureLDAP, std::string lDAPServerURI,
16 std::string lDAPBindDN, std::string lDAPBaseDN,
17 std::string lDAPBindDNpassword,
18 ldap_base::Config::SearchScope lDAPSearchScope,
19 ldap_base::Config::Type lDAPType, ConfigMgr& parent) :
20 ConfigIface(bus, path, true),
21 configFilePath(filePath), bus(bus), parent(parent)
22{
23 ConfigIface::secureLDAP(secureLDAP);
24 ConfigIface::lDAPServerURI(lDAPServerURI);
25 ConfigIface::lDAPBindDN(lDAPBindDN);
26 ConfigIface::lDAPBaseDN(lDAPBaseDN);
27 ConfigIface::lDAPBINDDNpassword(lDAPBindDNpassword);
28 ConfigIface::lDAPSearchScope(lDAPSearchScope);
29 ConfigIface::lDAPType(lDAPType);
30 writeConfig();
31 parent.restartService(nslcdService);
32 // Emit deferred signal.
33 this->emit_object_added();
34}
35
36void Config::writeConfig()
37{
38 std::fstream stream(configFilePath.c_str(), std::fstream::out);
39 std::stringstream confData;
40 confData << "uid root\n";
41 confData << "gid root\n\n";
42 confData << "ldap_version 3\n\n";
43 confData << "timelimit 30\n";
44 confData << "bind_timelimit 30\n";
45 confData << "pagesize 1000\n";
46 confData << "referrals off\n\n";
47 confData << "uri " << lDAPServerURI() << "\n\n";
48 confData << "base " << lDAPBaseDN() << "\n\n";
49 confData << "binddn " << lDAPBindDN() << "\n";
50 confData << "bindpw " << lDAPBINDDNpassword() << "\n\n";
51 switch (lDAPSearchScope())
52 {
53 case ldap_base::Config::SearchScope::sub:
54 confData << "scope sub\n\n";
55 break;
56 case ldap_base::Config::SearchScope::one:
57 confData << "scope one\n\n";
58 break;
59 case ldap_base::Config::SearchScope::base:
60 confData << "scope base\n\n";
61 break;
62 }
63 confData << "base passwd " << lDAPBaseDN() << "\n";
64 confData << "base shadow " << lDAPBaseDN() << "\n\n";
65 if (secureLDAP() == true)
66 {
67 confData << "ssl on\n";
68 confData << "tls_reqcert allow\n";
69 confData << "tls_cert /etc/nslcd/certs/cert.pem\n";
70 }
71 else
72 {
73 confData << "ssl off\n\n";
74 }
75 if (lDAPType() == ldap_base::Config::Type::ActiveDirectory)
76 {
77 confData << "filter passwd (&(objectClass=user)(objectClass=person)"
78 "(!(objectClass=computer)))\n";
79 confData
80 << "filter group (|(objectclass=group)(objectclass=groupofnames) "
81 "(objectclass=groupofuniquenames))\n";
82 confData << "map passwd uid sAMAccountName\n";
83 confData << "map passwd uidNumber "
84 "objectSid:S-1-5-21-3623811015-3361044348-30300820\n";
85 confData << "map passwd gidNumber primaryGroupID\n";
86 confData << "map passwd homeDirectory \"/home/$sAMAccountName\"\n";
87 confData << "map passwd gecos displayName\n";
88 confData << "map passwd loginShell \"/bin/bash\"\n";
89 confData << "map group gidNumber primaryGroupID\n";
90 confData << "map group gidNumber "
91 "objectSid:S-1-5-21-3623811015-3361044348-30300820\n";
92 confData << "map group cn sAMAccountName\n";
93 }
94 else if (lDAPType() == ldap_base::Config::Type::OpenLdap)
95 {
96 confData << "filter passwd (objectclass=*)\n";
97 confData << "map passwd uid cn\n";
98 confData << "map passwd gecos displayName\n";
99 }
100 stream << confData.str();
101 stream.flush();
102 stream.close();
103 return;
104}
105
106bool Config::secureLDAP(bool value)
107{
108 if (value == secureLDAP())
109 {
110 return value;
111 }
112
113 auto val = ConfigIface::secureLDAP(value);
114 writeConfig();
115 parent.restartService(nslcdService);
116
117 return val;
118}
119
120std::string Config::lDAPServerURI(std::string value)
121{
122 if (value == lDAPServerURI())
123 {
124 return value;
125 }
126
127 auto val = ConfigIface::lDAPServerURI(value);
128 writeConfig();
129 parent.restartService(nslcdService);
130
131 return val;
132}
133
134std::string Config::lDAPBindDN(std::string value)
135{
136 if (value == lDAPBindDN())
137 {
138 return value;
139 }
140
141 auto val = ConfigIface::lDAPBindDN(value);
142 writeConfig();
143 parent.restartService(nslcdService);
144
145 return val;
146}
147
148std::string Config::lDAPBaseDN(std::string value)
149{
150 if (value == lDAPBaseDN())
151 {
152 return value;
153 }
154
155 auto val = ConfigIface::lDAPBaseDN(value);
156 writeConfig();
157 parent.restartService(nslcdService);
158
159 return val;
160}
161
162std::string Config::lDAPBINDDNpassword(std::string value)
163{
164 if (value == lDAPBINDDNpassword())
165 {
166 return value;
167 }
168
169 auto val = ConfigIface::lDAPBINDDNpassword(value);
170 writeConfig();
171 parent.restartService(nslcdService);
172
173 return val;
174}
175
176ldap_base::Config::SearchScope
177 Config::lDAPSearchScope(ldap_base::Config::SearchScope value)
178{
179 if (value == lDAPSearchScope())
180 {
181 return value;
182 }
183
184 auto val = ConfigIface::lDAPSearchScope(value);
185 writeConfig();
186 parent.restartService(nslcdService);
187
188 return val;
189}
190
191ldap_base::Config::Type Config::lDAPType(ldap_base::Config::Type value)
192{
193 if (value == lDAPType())
194 {
195 return value;
196 }
197
198 auto val = ConfigIface::lDAPType(value);
199 writeConfig();
200 parent.restartService(nslcdService);
201
202 return val;
203}
204
205void ConfigMgr::restartService(const std::string& service)
206{
207 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
208 SYSTEMD_INTERFACE, "RestartUnit");
209 method.append(service.c_str(), "replace");
210 bus.call_noreply(method);
211}
212
213std::string
214 ConfigMgr::createConfig(bool secureLDAP, std::string lDAPServerURI,
215 std::string lDAPBindDN, std::string lDAPBaseDN,
216 std::string lDAPBINDDNpassword,
217 ldap_base::Create::SearchScope lDAPSearchScope,
218 ldap_base::Create::Type lDAPType)
219{
220 // With current implementation we support only one LDAP server.
221 configPtr.reset(nullptr);
222
223 auto objPath = std::string(LDAP_CONFIG_DBUS_OBJ_PATH);
224 configPtr = std::make_unique<Config>(
225 bus, objPath.c_str(), LDAP_CONFIG_FILE, secureLDAP, lDAPServerURI,
226 lDAPBindDN, lDAPBaseDN, lDAPBINDDNpassword,
227 static_cast<ldap_base::Config::SearchScope>(lDAPSearchScope),
228 static_cast<ldap_base::Config::Type>(lDAPType), *this);
229
230 return objPath;
231}
232
233} // namespace ldap
234} // namespace phosphor