package io.vertx.ext.web.handler.impl;
import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.auth.impl.AuthProviderInternal;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.auth.AuthProvider;
import java.util.Base64;
public class BasicAuthHandlerImpl extends AuthorizationAuthHandler {
private static AuthProvider verifyProvider(AuthProvider provider) {
if (provider instanceof AuthProviderInternal) {
((AuthProviderInternal)provider).verifyIsUsingPassword();
}
return provider;
}
public BasicAuthHandlerImpl(AuthProvider authProvider, String realm) {
super(verifyProvider(authProvider), realm, Type.BASIC);
}
@Override
public void parseCredentials(RoutingContext context, Handler<AsyncResult<JsonObject>> handler) {
parseAuthorization(context, false, parseAuthorization -> {
if (parseAuthorization.failed()) {
handler.handle(Future.failedFuture(parseAuthorization.cause()));
return;
}
final String suser;
final String spass;
try {
String decoded = new String(Base64.getDecoder().decode(parseAuthorization.result()));
int colonIdx = decoded.indexOf(":");
if (colonIdx != -1) {
suser = decoded.substring(0, colonIdx);
spass = decoded.substring(colonIdx + 1);
} else {
suser = decoded;
spass = null;
}
} catch (RuntimeException e) {
context.fail(e);
return;
}
handler.handle(Future.succeededFuture(new JsonObject().put("username", suser).put("password", spass)));
});
}
@Override
protected String authenticateHeader(RoutingContext context) {
return "Basic realm=\"" + realm + "\"";
}
}