in lib/auth/AuthOauth2.cc [115:164]
KeyFile KeyFile::fromParamMap(ParamMap& params) {
const auto it = params.find("private_key");
if (it == params.cend()) {
return {params["client_id"], params["client_secret"]};
}
const std::string& url = it->second;
size_t startPos = 0;
auto getPrefix = [&url, &startPos](char separator) -> std::string {
const size_t endPos = url.find(separator, startPos);
if (endPos == std::string::npos) {
return "";
}
const auto prefix = url.substr(startPos, endPos - startPos);
startPos = endPos + 1;
return prefix;
};
const auto protocol = getPrefix(':');
// If the private key is not a URL, treat it as the file path
if (protocol.empty()) {
return fromFile(it->second);
}
if (protocol == "file") {
// URL is "file://..." or "file:..."
if (url.size() > startPos + 2 && url[startPos + 1] == '/' && url[startPos + 2] == '/') {
return fromFile(url.substr(startPos + 2));
} else {
return fromFile(url.substr(startPos));
}
} else if (protocol == "data") {
// Only support base64 encoded data from a JSON string. The URL should be:
// "data:application/json;base64,..."
const auto contentType = getPrefix(';');
if (contentType != "application/json") {
LOG_ERROR("Unsupported content type: " << contentType);
return {};
}
const auto encodingType = getPrefix(',');
if (encodingType != "base64") {
LOG_ERROR("Unsupported encoding type: " << encodingType);
return {};
}
return fromBase64(url.substr(startPos));
} else {
LOG_ERROR("Unsupported protocol: " << protocol);
return {};
}
}