]> git.proxmox.com Git - ceph.git/blame - ceph/src/rgw/rgw_ldap.h
update sources to v12.2.1
[ceph.git] / ceph / src / rgw / rgw_ldap.h
CommitLineData
7c673cae
FG
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3
4#ifndef RGW_LDAP_H
5#define RGW_LDAP_H
6
7#include "acconfig.h"
8
9#if defined(HAVE_OPENLDAP)
10#define LDAP_DEPRECATED 1
11#include "ldap.h"
12#endif
13
14#include <stdint.h>
15#include <tuple>
16#include <vector>
17#include <string>
18#include <iostream>
19#include <mutex>
20
21namespace rgw {
22
23#if defined(HAVE_OPENLDAP)
24
25 class LDAPHelper
26 {
27 std::string uri;
28 std::string binddn;
29 std::string bindpw;
30 std::string searchdn;
31 std::string searchfilter;
32 std::string dnattr;
33 LDAP *ldap;
34 bool msad = false; /* TODO: possible future specialization */
35 std::mutex mtx;
36
37 public:
38 using lock_guard = std::lock_guard<std::mutex>;
39
40 LDAPHelper(std::string _uri, std::string _binddn, std::string _bindpw,
41 std::string _searchdn, std::string _searchfilter, std::string _dnattr)
42 : uri(std::move(_uri)), binddn(std::move(_binddn)),
43 bindpw(std::move(_bindpw)), searchdn(_searchdn), searchfilter(_searchfilter), dnattr(_dnattr),
44 ldap(nullptr) {
45 // nothing
46 }
47
48 int init() {
49 int ret;
50 ret = ldap_initialize(&ldap, uri.c_str());
51 if (ret == LDAP_SUCCESS) {
52 unsigned long ldap_ver = LDAP_VERSION3;
53 ret = ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION,
54 (void*) &ldap_ver);
55 }
56 if (ret == LDAP_SUCCESS) {
57 ret = ldap_set_option(ldap, LDAP_OPT_REFERRALS, LDAP_OPT_OFF);
58 }
59 return (ret == LDAP_SUCCESS) ? ret : -EINVAL;
60 }
61
62 int bind() {
63 int ret;
64 ret = ldap_simple_bind_s(ldap, binddn.c_str(), bindpw.c_str());
65 return (ret == LDAP_SUCCESS) ? ret : -EINVAL;
66 }
67
68 int rebind() {
69 if (ldap) {
70 (void) ldap_unbind(ldap);
71 (void) init();
72 return bind();
73 }
74 return -EINVAL;
75 }
76
77 int simple_bind(const char *dn, const std::string& pwd) {
78 LDAP* tldap;
79 int ret = ldap_initialize(&tldap, uri.c_str());
80 if (ret == LDAP_SUCCESS) {
81 unsigned long ldap_ver = LDAP_VERSION3;
82 ret = ldap_set_option(tldap, LDAP_OPT_PROTOCOL_VERSION,
83 (void*) &ldap_ver);
84 if (ret == LDAP_SUCCESS) {
85 ret = ldap_simple_bind_s(tldap, dn, pwd.c_str());
86 if (ret == LDAP_SUCCESS) {
87 (void) ldap_unbind(tldap);
88 }
89 }
90 }
91 return ret; // OpenLDAP client error space
92 }
93
94 int auth(const std::string uid, const std::string pwd);
95
96 ~LDAPHelper() {
97 if (ldap)
98 (void) ldap_unbind(ldap);
99 }
100
101 }; /* LDAPHelper */
102
103#else
104
105 class LDAPHelper
106 {
107 public:
108 LDAPHelper(std::string _uri, std::string _binddn, std::string _bindpw,
109 std::string _searchdn, std::string _searchfilter, std::string _dnattr)
110 {}
111
112 int init() {
113 return -ENOTSUP;
114 }
115
116 int bind() {
117 return -ENOTSUP;
118 }
119
120 int auth(const std::string uid, const std::string pwd) {
121 return -EACCES;
122 }
123
124 ~LDAPHelper() {}
125
126 }; /* LDAPHelper */
127
128
129#endif /* HAVE_OPENLDAP */
130
131} /* namespace rgw */
132
133#include "common/ceph_context.h"
134#include "common/common_init.h"
135#include "common/dout.h"
136#include "common/safe_io.h"
137#include <boost/algorithm/string.hpp>
138
139#include "include/assert.h"
140
141std::string parse_rgw_ldap_bindpw(CephContext* ctx);
142
143#endif /* RGW_LDAP_H */