2 ** Copyright 2016 Double Precision, Inc. See COPYING for
3 ** distribution information.
7 #include "courier_auth_config.h"
17 #include "authldaprc.h"
18 #include "courierauthdebug.h"
25 #include "authconfigfile.h"
27 courier::auth::config_file::config_file(const char *filenameArg
)
28 : filename(filenameArg
), loaded(false)
32 bool courier::auth::config_file::load(bool reload
)
36 if (stat(filename
, &stat_buf
) < 0)
38 courier_auth_err("stat(%s) failed", filename
);
44 if (stat_buf
.st_mtime
!= config_timestamp
)
49 loaded
=open_and_load_file(reload
);
52 config_timestamp
=stat_buf
.st_mtime
;
56 class courier::auth::config_file::isspace
{
60 bool operator()(char c
)
62 return std::isspace(c
);
66 class courier::auth::config_file::not_isspace
: public isspace
{
70 bool operator()(char c
)
72 return !isspace::operator()(c
);
77 bool courier::auth::config_file::open_and_load_file(bool reload
)
79 std::ifstream
f(filename
);
83 courier_auth_err("Cannot open %s", filename
);
90 bool seen_marker
=false;
92 while (s
.clear(), !std::getline(f
, s
).eof() || !s
.empty())
94 std::string::iterator e
=s
.end();
96 std::string::iterator p
=
97 std::find_if(s
.begin(), e
, not_isspace());
99 if (p
== s
.end() || *p
== '#')
101 static const char marker
[]="##NAME: MARKER:";
103 if (s
.substr(0, sizeof(marker
)-1) == marker
)
108 std::string::iterator q
=std::find_if(p
, e
, isspace());
110 std::string
name(p
, q
);
115 q
=std::find_if(q
, e
, not_isspace());
117 while (q
!= e
&& isspace()(e
[-1]))
123 bool continuing
=false;
131 setting
.insert(setting
.end(), q
, e
);
142 parsed_config
.insert(std::make_pair(name
, setting
));
147 courier_auth_err((reload
148 ? "marker line not found in %s will try again later"
149 : "marker line not found in %s (probably forgot to run sysconftool after an upgrade)"), filename
);
156 bool courier::auth::config_file::getconfig(const char *name
,
159 const char *default_value
) const
161 std::map
<std::string
, std::string
>::const_iterator
162 iter
=parsed_config
.find(name
);
164 if (iter
!= parsed_config
.end())
172 courier_auth_err("%s not found in %s",
184 bool courier::auth::config_file::config(const char *name
,
187 const char *default_value
) const
189 return getconfig(name
, value
, required
, default_value
);
192 std::string
courier::auth::config_file::config(const char *name
) const
194 return config(name
, 0);
197 std::string
courier::auth::config_file::config(const char *name
,
198 const char *default_value
) const
202 config(name
, retval
, false, default_value
);
208 courier::auth::config_file::expand_string(const std::string
&s
,
209 const std::map
<std::string
,
210 std::string
> ¶meters
)
212 std::ostringstream o
;
214 std::string::const_iterator b
=s
.begin(), e
=s
.end(), p
;
215 std::map
<std::string
, std::string
>::const_iterator p_iter
;
219 p
=std::find(b
, e
, '$');
221 o
<< std::string(b
, p
);
234 p
=std::find(++b
, e
, ')');
236 p_iter
=parameters
.find(std::string(b
, p
));
241 if (p_iter
!= parameters
.end())
248 courier::auth::config_file::parse_custom_query(const std::string
&s
,
249 const std::string
&login
,
250 const std::string
&defdomain
,
251 std::map
<std::string
,
252 std::string
> ¶meters
)
255 std::string::const_iterator b
=login
.begin(),
257 p
=std::find(b
, e
, '@');
259 parameters
["local_part"]=std::string(b
, p
);
260 parameters
["domain"]=p
== e
? defdomain
:std::string(p
+1, e
);
262 return expand_string(s
, parameters
);