52Auth::Basic::Config::active()
const
58Auth::Basic::Config::configured()
const
60 return (SchemeConfig::configured() && !realm.isEmpty());
64Auth::Basic::Config::type()
const
66 return Auth::Basic::Scheme::GetInstance()->type();
72 if (authenticateProgram) {
74 debugs(29, 9,
"Sending type:" << hdrType <<
" header: 'Basic realm=\"" << realm <<
"\", charset=\"UTF-8\"'");
77 debugs(29, 9,
"Sending type:" << hdrType <<
" header: 'Basic realm=\"" << realm <<
"\"'");
84Auth::Basic::Config::rotateHelpers()
96Auth::Basic::Config::done()
108 if (authenticateProgram)
118 storeAppendPrintf(entry,
"%s basic credentialsttl %d seconds\n", name, (
int) credentialsTTL);
119 storeAppendPrintf(entry,
"%s basic casesensitive %s\n", name, casesensitive ?
"on" :
"off");
123Auth::Basic::Config::Config() :
124 credentialsTTL( 2*60*60 ),
127 static const SBuf defaultRealm(
"Squid proxy-caching web server");
128 realm = defaultRealm;
132Auth::Basic::Config::parse(
Auth::SchemeConfig * scheme,
size_t n_configured,
char *param_str)
134 if (strcmp(param_str,
"credentialsttl") == 0) {
136 }
else if (strcmp(param_str,
"casesensitive") == 0) {
150Auth::Basic::Config::decodeCleartext(
const char *httpAuthHeader,
const HttpRequest *request)
152 const char *proxy_auth = httpAuthHeader;
164 char *eek =
xstrdup(proxy_auth);
167 const size_t srcLen = strlen(eek);
175 cleartext[dstLen] =
'\0';
178 auto str = isCP1251EncodingAllowed(request) ?
181 cleartext =
xstrdup(str.c_str());
188 debugs(29, 9,
"'" << cleartext <<
"'");
190 if (strcspn(cleartext,
"\r\n") != strlen(cleartext)) {
191 debugs(29,
DBG_IMPORTANT,
"WARNING: Bad characters in authorization header '" << httpAuthHeader <<
"'");
195 debugs(29, 2,
"WARNING: Invalid Base64 character in authorization header '" << httpAuthHeader <<
"'");
211Auth::Basic::Config::decode(
char const *proxy_auth,
const HttpRequest *request,
const char *aRequestRealm)
217 const auto cleartext = decodeCleartext(proxy_auth, request);
221 return auth_user_request;
225 Auth::Basic::User *local_basic =
nullptr;
227 char *separator = strchr(cleartext,
':');
229 lb = local_basic =
new Auth::Basic::User(
this, aRequestRealm);
234 local_basic->passwd =
xstrdup(separator+1);
239 local_basic->username(cleartext);
241 if (local_basic->passwd ==
nullptr) {
242 debugs(29, 4,
"no password in proxy authorization header '" << proxy_auth <<
"'");
243 auth_user_request->
setDenyMessage(
"no password was present in the HTTP [proxy-]authorization header. This is most likely a browser bug");
245 if (local_basic->passwd[0] ==
'\0') {
246 debugs(29, 4,
"Disallowing empty password. User is '" << local_basic->username() <<
"'");
248 auth_user_request->
setDenyMessage(
"Request denied because you provided an empty password. Users MUST have a password.");
254 if (!local_basic->valid()) {
256 auth_user_request->
user(lb);
257 return auth_user_request;
263 if (!(auth_user = Auth::Basic::User::Cache()->lookup(lb->userKey()))) {
266 debugs(29, 9,
"Creating new user '" << lb->username() <<
"'");
275 lb->addToNameCache();
278 assert(auth_user !=
nullptr);
281 Auth::Basic::User *basic_auth =
dynamic_cast<Auth::Basic::User *
>(auth_user.
getRaw());
283 basic_auth->updateCached(local_basic);
284 auth_user = basic_auth;
288 auth_user_request->
user(auth_user);
289 return auth_user_request;
297 if (authenticateProgram) {
314Auth::Basic::Config::registerWithCacheManager(
void)
317 "Basic User Authenticator Stats",
#define SQUIDSBUFPRINT(s)
void AUTHSSTATS(StoreEntry *)
Helper::ClientPointer basicauthenticators
static int authbasic_initialised
static AUTHSSTATS authenticateBasicStats
void base64_decode_init(struct base64_decode_ctx *ctx)
int base64_decode_update(struct base64_decode_ctx *ctx, size_t *dst_length, uint8_t *dst, size_t src_length, const char *src)
int base64_decode_final(struct base64_decode_ctx *ctx)
#define BASE64_DECODE_LENGTH(length)
void parse_time_t(time_t *var)
void parse_onoff(int *var)
virtual void parse(SchemeConfig *, size_t, char *)
virtual bool dump(StoreEntry *, const char *, SchemeConfig *) const
void setDenyMessage(char const *)
virtual User::Pointer user()
static Pointer Make(const char *name)
#define debugs(SECTION, LEVEL, CONTENT)
void helperShutdown(const Helper::Client::Pointer &hlp)
void RegisterAction(char const *action, char const *desc, OBJH *handler, Protected, Atomic, Format)
void storeAppendPrintf(StoreEntry *e, const char *fmt,...)
struct timeval current_time
the current UNIX time in timeval {seconds, microseconds} format
SBuf Cp1251ToUtf8(const char *in)
converts CP1251 to UTF-8
SBuf Latin1ToUtf8(const char *in)
converts ISO-LATIN-1 to UTF-8
bool isValidUtf8String(const char *source, const char *sourceEnd)
returns whether the given input is a valid (or empty) sequence of UTF-8 code points
void wordlistDestroy(wordlist **list)
destroy a wordlist