xref: /netbsd-src/external/bsd/openldap/dist/contrib/ldapc++/src/LDAPUrl.h (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1 /*	$NetBSD: LDAPUrl.h,v 1.3 2021/08/14 16:14:49 christos Exp $	*/
2 
3 // $OpenLDAP$
4 /*
5  * Copyright 2000-2021 The OpenLDAP Foundation, All Rights Reserved.
6  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
7  */
8 
9 
10 #ifndef LDAP_URL_H
11 #define LDAP_URL_H
12 
13 #include <StringList.h>
14 
15 class LDAPUrlException;
16 /**
17  * This class is used to analyze and store LDAP-Urls as returned by a
18  * LDAP-Server as Referrals and Search References. LDAP-URLs are defined
19  * in RFC1959 and have the following format: <BR>
20  * <code>
21  * ldap://host:port/baseDN[?attr[?scope[?filter]]] <BR>
22  * </code>
23  */
24 class LDAPUrl{
25 
26     public :
27         /**
28          * Create a new object from a string that contains a LDAP-Url
29          * @param url The URL String
30          */
31         LDAPUrl(const std::string &url="");
32 
33         /**
34          * Destructor
35          */
36         ~LDAPUrl();
37 
38         /**
39          * @return The part of the URL that is representing the network
40          * port
41          */
42         int getPort() const;
43 
44         /**
45          * Set the port value of the URL
46          * @param dn The port value
47          */
48         void setPort(int port);
49 
50         /**
51          * @return The scope part of the URL is returned.
52          */
53         int getScope() const;
54 
55         /**
56          * Set the Scope part of the URL
57          * @param scope The new scope
58          */
59         void setScope(const std::string& scope);
60 
61         /**
62          * @return The complete URL as a string
63          */
64         const std::string& getURLString() const;
65 
66         /**
67          * Set the URL member attribute
68          * @param url The URL String
69          */
70         void setURLString(const std::string &url);
71 
72         /**
73          * @return The hostname or IP-Address of the destination host.
74          */
75         const std::string& getHost() const;
76 
77         /**
78          * Set the Host part of the URL
79          * @param host The new host part
80          */
81         void setHost( const std::string &host);
82 
83         /**
84          * @return The Protocol Scheme of the URL.
85          */
86         const std::string& getScheme() const;
87 
88         /**
89          * Set the Protocol Scheme of the URL
90          * @param host The Protocol scheme. Allowed values are
91          *       ldap,ldapi,ldaps and cldap
92          */
93         void setScheme( const std::string &scheme );
94 
95         /**
96          * @return The Base-DN part of the URL
97          */
98         const std::string& getDN() const;
99 
100         /**
101          * Set the DN part of the URL
102          * @param dn The new DN part
103          */
104         void setDN( const std::string &dn);
105 
106 
107         /**
108          * @return The Filter part of the URL
109          */
110         const std::string& getFilter() const;
111 
112         /**
113          * Set the Filter part of the URL
114          * @param filter The new Filter
115          */
116         void setFilter( const std::string &filter);
117 
118         /**
119          * @return The List of attributes  that was in the URL
120          */
121         const StringList& getAttrs() const;
122 
123         /**
124          * Set the Attributes part of the URL
125          * @param attrs StringList containing the List of Attributes
126          */
127         void setAttrs( const StringList &attrs);
128         void setExtensions( const StringList &ext);
129         const StringList& getExtensions() const;
130 
131         /**
132          * Percent-decode a string
133          * @param src The string that is to be decoded
134          * @param dest The decoded result string
135          */
136         void percentDecode( const std::string& src, std::string& dest );
137 
138         /**
139          * Percent-encoded a string
140          * @param src The string that is to be encoded
141          * @param dest The encoded result string
142          * @param flags
143          */
144         std::string& percentEncode( const std::string& src,
145                     std::string& dest,
146                     int flags=0 ) const;
147 
148     protected :
149         /**
150          * Split the url string that is associated with this Object into
151          * it components. The components of the URL can be access via the
152          * get...() methods.
153          * (this function is mostly for internal use and gets called
154          * automatically whenever necessary)
155          */
156         void parseUrl();
157 
158         /**
159          * Generate an URL string from the components that were set with
160          * the various set...() methods
161          * (this function is mostly for internal use and gets called
162          * automatically whenever necessary)
163          */
164         void components2Url() const;
165 
166         void string2list(const std::string &src, StringList& sl,
167                 bool percentDecode=false);
168 
169     protected :
170         mutable bool regenerate;
171         int m_Port;
172         int m_Scope;
173         std::string m_Host;
174         std::string m_DN;
175         std::string m_Filter;
176         StringList m_Attrs;
177         StringList m_Extensions;
178         mutable std::string m_urlString;
179         std::string m_Scheme;
180         enum mode { base, attrs, scope, filter, extensions };
181 };
182 
183 /// @cond
184 struct code2string_s {
185     int code;
186     const char* string;
187 };
188 /// @endcond
189 
190 class LDAPUrlException {
191     public :
192         LDAPUrlException(int code, const std::string &msg="" );
193 
194         int getCode() const;
195         const std::string getErrorMessage() const;
196         const std::string getAdditionalInfo() const;
197 
198         static const int INVALID_SCHEME      = 1;
199         static const int INVALID_PORT        = 2;
200         static const int INVALID_SCOPE       = 3;
201         static const int INVALID_URL         = 4;
202         static const int URL_DECODING_ERROR  = 5;
203         static const code2string_s code2string[];
204 
205     private:
206         int m_code;
207         std::string m_addMsg;
208 };
209 #endif //LDAP_URL_H
210