mirror of
https://github.com/google/nomulus.git
synced 2025-05-10 00:38:23 +02:00
Store only interesting failures, not login failures (#188)
Login failures will happen any time that we aren't coming from a whitelisted IP for that particular TLD. Since whitelists are out of date (and we don't whitelist IPs for every TLD anyway) those failures aren't interesting. Store and fully-log the interesting failures if one happened.
This commit is contained in:
parent
e3ce5ec0cf
commit
652c4f6b36
2 changed files with 71 additions and 26 deletions
|
@ -92,27 +92,23 @@ public final class UpdateRegistrarRdapBaseUrlsAction implements Runnable {
|
||||||
@Inject
|
@Inject
|
||||||
UpdateRegistrarRdapBaseUrlsAction() {}
|
UpdateRegistrarRdapBaseUrlsAction() {}
|
||||||
|
|
||||||
private String loginAndGetId(HttpRequestFactory requestFactory, String tld) {
|
private String loginAndGetId(HttpRequestFactory requestFactory, String tld) throws IOException {
|
||||||
try {
|
logger.atInfo().log("Logging in to MoSAPI");
|
||||||
logger.atInfo().log("Logging in to MoSAPI");
|
HttpRequest request =
|
||||||
HttpRequest request =
|
requestFactory.buildGetRequest(new GenericUrl(String.format(LOGIN_URL, tld)));
|
||||||
requestFactory.buildGetRequest(new GenericUrl(String.format(LOGIN_URL, tld)));
|
request.getHeaders().setBasicAuthentication(String.format("%s_ry", tld), password);
|
||||||
request.getHeaders().setBasicAuthentication(String.format("%s_ry", tld), password);
|
HttpResponse response = request.execute();
|
||||||
HttpResponse response = request.execute();
|
|
||||||
|
|
||||||
Optional<HttpCookie> idCookie =
|
Optional<HttpCookie> idCookie =
|
||||||
HttpCookie.parse(response.getHeaders().getFirstHeaderStringValue("Set-Cookie")).stream()
|
HttpCookie.parse(response.getHeaders().getFirstHeaderStringValue("Set-Cookie")).stream()
|
||||||
.filter(cookie -> cookie.getName().equals(COOKIE_ID))
|
.filter(cookie -> cookie.getName().equals(COOKIE_ID))
|
||||||
.findAny();
|
.findAny();
|
||||||
checkState(
|
checkState(
|
||||||
idCookie.isPresent(),
|
idCookie.isPresent(),
|
||||||
"Didn't get the ID cookie from the login response. Code: %s, headers: %s",
|
"Didn't get the ID cookie from the login response. Code: %s, headers: %s",
|
||||||
response.getStatusCode(),
|
response.getStatusCode(),
|
||||||
response.getHeaders());
|
response.getHeaders());
|
||||||
return idCookie.get().getValue();
|
return idCookie.get().getValue();
|
||||||
} catch (IOException e) {
|
|
||||||
throw new UncheckedIOException("Error logging in to MoSAPI server: " + e.getMessage(), e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void logout(HttpRequestFactory requestFactory, String id, String tld) {
|
private void logout(HttpRequestFactory requestFactory, String id, String tld) {
|
||||||
|
@ -128,9 +124,8 @@ public final class UpdateRegistrarRdapBaseUrlsAction implements Runnable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ImmutableSetMultimap<String, String> getRdapBaseUrlsPerIanaIdWithTld(String tld) {
|
private ImmutableSetMultimap<String, String> getRdapBaseUrlsPerIanaIdWithTld(
|
||||||
HttpRequestFactory requestFactory = httpTransport.createRequestFactory();
|
String tld, String id, HttpRequestFactory requestFactory) {
|
||||||
String id = loginAndGetId(requestFactory, tld);
|
|
||||||
String content;
|
String content;
|
||||||
try {
|
try {
|
||||||
HttpRequest request =
|
HttpRequest request =
|
||||||
|
@ -173,11 +168,22 @@ public final class UpdateRegistrarRdapBaseUrlsAction implements Runnable {
|
||||||
checkArgument(!tlds.isEmpty(), "There must exist at least one REAL TLD.");
|
checkArgument(!tlds.isEmpty(), "There must exist at least one REAL TLD.");
|
||||||
Throwable finalThrowable = null;
|
Throwable finalThrowable = null;
|
||||||
for (String tld : tlds) {
|
for (String tld : tlds) {
|
||||||
|
HttpRequestFactory requestFactory = httpTransport.createRequestFactory();
|
||||||
|
String id;
|
||||||
try {
|
try {
|
||||||
return getRdapBaseUrlsPerIanaIdWithTld(tld);
|
id = loginAndGetId(requestFactory, tld);
|
||||||
|
} catch (Throwable e) {
|
||||||
|
// Login failures are bad but not unexpected for certain TLDs. We shouldn't store those
|
||||||
|
// but rather should only store useful Throwables.
|
||||||
|
logger.atWarning().log("Error logging in to MoSAPI server: " + e.getMessage(), e);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return getRdapBaseUrlsPerIanaIdWithTld(tld, id, requestFactory);
|
||||||
} catch (Throwable throwable) {
|
} catch (Throwable throwable) {
|
||||||
logger.atWarning().log(String
|
logger.atWarning().log(
|
||||||
.format("Error retrieving RDAP urls with TLD %s: %s", tld, throwable.getMessage()));
|
String.format(
|
||||||
|
"Error retrieving RDAP urls with TLD %s: %s", tld, throwable.getMessage()));
|
||||||
finalThrowable = throwable;
|
finalThrowable = throwable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import com.google.api.client.testing.http.MockLowLevelHttpRequest;
|
||||||
import com.google.api.client.testing.http.MockLowLevelHttpResponse;
|
import com.google.api.client.testing.http.MockLowLevelHttpResponse;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
import google.registry.model.registrar.Registrar;
|
import google.registry.model.registrar.Registrar;
|
||||||
import google.registry.model.registrar.RegistrarAddress;
|
import google.registry.model.registrar.RegistrarAddress;
|
||||||
import google.registry.model.registry.Registry;
|
import google.registry.model.registry.Registry;
|
||||||
|
@ -276,6 +277,44 @@ public final class UpdateRegistrarRdapBaseUrlsActionTest extends ShardableTestCa
|
||||||
.isEqualTo("Error contacting MosAPI server. Tried TLDs [secondtld, tld]");
|
.isEqualTo("Error contacting MosAPI server. Tried TLDs [secondtld, tld]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFailureCause_ignoresLoginFailure() {
|
||||||
|
// Login failures aren't particularly interesting so we should log them, but the final
|
||||||
|
// throwable should be some other failure if one existed
|
||||||
|
createTld("secondtld");
|
||||||
|
httpTransport = new TestHttpTransport();
|
||||||
|
action.httpTransport = httpTransport;
|
||||||
|
|
||||||
|
MockLowLevelHttpResponse loginResponse = new MockLowLevelHttpResponse();
|
||||||
|
loginResponse.addHeader(
|
||||||
|
"Set-Cookie",
|
||||||
|
"id=myAuthenticationId; "
|
||||||
|
+ "Expires=Tue, 11-Jun-2019 16:34:21 GMT; Path=/mosapi/v1/app; Secure; HttpOnly");
|
||||||
|
|
||||||
|
MockLowLevelHttpResponse badListResponse = new MockLowLevelHttpResponse();
|
||||||
|
String badListReply = JSON_LIST_REPLY.substring(50);
|
||||||
|
badListResponse.setContent(badListReply);
|
||||||
|
|
||||||
|
MockLowLevelHttpResponse logoutResponse = new MockLowLevelHttpResponse();
|
||||||
|
logoutResponse.addHeader(
|
||||||
|
"Set-Cookie",
|
||||||
|
"id=id; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/mosapi/v1/app; Secure; HttpOnly");
|
||||||
|
|
||||||
|
MockLowLevelHttpResponse badLoginResponse = new MockLowLevelHttpResponse();
|
||||||
|
badLoginResponse.addHeader(
|
||||||
|
"Set-Cookie",
|
||||||
|
"Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/mosapi/v1/app; Secure; HttpOnly");
|
||||||
|
|
||||||
|
httpTransport.addNextResponse(loginResponse);
|
||||||
|
httpTransport.addNextResponse(badListResponse);
|
||||||
|
httpTransport.addNextResponse(logoutResponse);
|
||||||
|
httpTransport.addNextResponse(badLoginResponse);
|
||||||
|
|
||||||
|
assertThat(assertThrows(RuntimeException.class, action::run))
|
||||||
|
.hasCauseThat()
|
||||||
|
.isInstanceOf(JsonSyntaxException.class);
|
||||||
|
}
|
||||||
|
|
||||||
private static void addValidResponses(TestHttpTransport httpTransport) {
|
private static void addValidResponses(TestHttpTransport httpTransport) {
|
||||||
MockLowLevelHttpResponse loginResponse = new MockLowLevelHttpResponse();
|
MockLowLevelHttpResponse loginResponse = new MockLowLevelHttpResponse();
|
||||||
loginResponse.addHeader(
|
loginResponse.addHeader(
|
||||||
|
|
Loading…
Add table
Reference in a new issue