Files
pip/libs/http_server/pihttpserverbasicauth.cpp
T

43 lines
1.4 KiB
C++

#include "pihttpserverbasicauth.h"
#include "piliterals_string.h"
namespace {
bool parseBasic(const PIString & auth_header, PIString & user, PIString & pass) {
if (!auth_header.startsWith("Basic "_a)) return false;
PIString rest = auth_header.mid(6).trimmed();
if (rest.isEmpty()) return false;
if (rest.size() % 4 != 0) return false;
PIByteArray decoded = PIByteArray::fromBase64(rest);
if (decoded.isEmpty()) return false;
PIString creds = PIString::fromUTF8(decoded);
int ind = creds.find(':');
if (ind < 0) return false;
user = creds.takeLeft(ind);
creds.pop_front();
pass = creds;
return true;
}
} // namespace
PIHTTPServerBasicAuth::PIHTTPServerBasicAuth() {
auth_realm = "Restricted"_a;
}
PIHTTP::MessageMutable PIHTTPServerBasicAuth::accessDeniedReply(const PIHTTP::MessageConst &) {
return PIHTTP::MessageMutable::fromCode(PIHTTP::Code::Unauthorized)
.addHeader(PIHTTP::Header::WWWAuthenticate, "Basic realm=\"%1\", charset=\"UTF-8\""_a.arg(auth_realm))
.setBody(PIByteArray::fromAscii("Authorization required"));
}
PIHTTP::AuthInfo PIHTTPServerBasicAuth::authenticate(const PIHTTP::MessageConst & request) {
if (!callback_auth) return PIHTTP::AuthInfo();
PIString header = request.headers().value(PIHTTP::Header::Authorization, "");
PIString user, pass;
if (!parseBasic(header, user, pass)) return PIHTTP::AuthInfo();
return callback_auth(user, pass);
}