Skip to content

Commit 5eba703

Browse files
Log the outcome of a VOMS proxy request (#921)
1 parent d7ef2b5 commit 5eba703

File tree

2 files changed

+89
-8
lines changed

2 files changed

+89
-8
lines changed

iam-voms-aa/src/main/java/it/infn/mw/voms/api/VOMSController.java

Lines changed: 71 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,13 @@
1515
*/
1616
package it.infn.mw.voms.api;
1717

18+
import static java.lang.String.format;
19+
1820
import java.io.IOException;
21+
import java.text.SimpleDateFormat;
1922

20-
import org.springframework.beans.factory.annotation.Autowired;
23+
import org.slf4j.Logger;
24+
import org.slf4j.LoggerFactory;
2125
import org.springframework.security.access.prepost.PreAuthorize;
2226
import org.springframework.security.core.Authentication;
2327
import org.springframework.transaction.annotation.Transactional;
@@ -29,12 +33,14 @@
2933

3034
import it.infn.mw.iam.authn.x509.IamX509AuthenticationCredential;
3135
import it.infn.mw.iam.persistence.model.IamAccount;
32-
import it.infn.mw.iam.persistence.repository.IamAccountRepository;
3336
import it.infn.mw.iam.service.aup.AUPSignatureCheckService;
3437
import it.infn.mw.voms.aa.AttributeAuthority;
3538
import it.infn.mw.voms.aa.RequestContextFactory;
3639
import it.infn.mw.voms.aa.VOMSErrorMessage;
40+
import it.infn.mw.voms.aa.VOMSRequest;
3741
import it.infn.mw.voms.aa.VOMSRequestContext;
42+
import it.infn.mw.voms.aa.VOMSResponse;
43+
import it.infn.mw.voms.aa.VOMSResponse.Outcome;
3844
import it.infn.mw.voms.aa.ac.ACGenerator;
3945
import it.infn.mw.voms.aa.ac.VOMSResponseBuilder;
4046
import it.infn.mw.voms.properties.VomsProperties;
@@ -44,18 +50,20 @@
4450
@Transactional
4551
public class VOMSController extends VOMSControllerSupport {
4652

53+
private final Logger log = LoggerFactory.getLogger(VOMSController.class);
54+
4755
public static final String LEGACY_VOMS_APIS_UA = "voms APIs 2.0";
4856

57+
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
58+
4959
private final VomsProperties vomsProperties;
5060
private final AttributeAuthority aa;
5161
private final ACGenerator acGenerator;
5262
private final VOMSResponseBuilder responseBuilder;
5363
private final AUPSignatureCheckService signatureCheckService;
5464

55-
@Autowired
5665
public VOMSController(AttributeAuthority aa, VomsProperties props, ACGenerator acGenerator,
57-
VOMSResponseBuilder responseBuilder, IamAccountRepository accountRepo,
58-
AUPSignatureCheckService signatureCheckService) {
66+
VOMSResponseBuilder responseBuilder, AUPSignatureCheckService signatureCheckService) {
5967
this.aa = aa;
6068
this.vomsProperties = props;
6169
this.acGenerator = acGenerator;
@@ -102,24 +110,79 @@ public String generateAC(@RequestHeader(name = "User-Agent", required = false) S
102110
(IamX509AuthenticationCredential) authentication.getCredentials();
103111

104112
VOMSRequestContext context = initVomsRequestContext(cred, request, userAgent);
113+
logRequest(context);
105114

106115
if (!aa.getAttributes(context)) {
107116

108117
VOMSErrorMessage em = context.getResponse().getErrorMessages().get(0);
109118

119+
String responseString;
110120
if (LEGACY_VOMS_APIS_UA.equals(userAgent)) {
111-
return responseBuilder.createLegacyErrorResponse(em);
121+
responseString = responseBuilder.createLegacyErrorResponse(em);
112122
} else {
113-
return responseBuilder.createErrorResponse(em);
123+
responseString = responseBuilder.createErrorResponse(em);
114124
}
125+
logOutcome(context);
126+
return responseString;
115127
} else {
116128
IamAccount user = context.getIamAccount();
117129
if (signatureCheckService.needsAupSignature(user)) {
118130
VOMSErrorMessage em = VOMSErrorMessage.faildToSignAup(user.getUsername());
119131
return responseBuilder.createErrorResponse(em);
120132
}
121133
byte[] acBytes = acGenerator.generateVOMSAC(context);
122-
return responseBuilder.createResponse(acBytes, context.getResponse().getWarnings());
134+
String responseString =
135+
responseBuilder.createResponse(acBytes, context.getResponse().getWarnings());
136+
logOutcome(context);
137+
return responseString;
138+
}
139+
}
140+
141+
private void logRequest(VOMSRequestContext c) {
142+
if (log.isDebugEnabled()) {
143+
VOMSRequest r = c.getRequest();
144+
log.debug(
145+
"VOMSRequest: [holderIssuer: {}, holderSubject: {}, requesterIssuer: {}, requesterSubject: {}, attributes: {}, FQANs: {}, validity: {}, targets: {}]",
146+
sanitize(r.getHolderIssuer()), sanitize(r.getHolderSubject()),
147+
sanitize(r.getRequesterIssuer()), sanitize(r.getRequesterSubject()),
148+
r.getRequestAttributes(), r.getRequestedFQANs(), r.getRequestedValidity(), r.getTargets());
149+
}
150+
}
151+
152+
private String sanitize(String str) {
153+
return str.replaceAll("[\n\r]", "_");
154+
}
155+
156+
private String userStr(VOMSRequestContext c) {
157+
String username = c.getIamAccount().getUsername();
158+
String uuid = c.getIamAccount().getUuid();
159+
String reqSubject = c.getRequest().getRequesterSubject();
160+
String reqIssuer = c.getRequest().getRequesterIssuer();
161+
return sanitize(format("[username: %s, uuid: %s, subjectDN: %s, issuerDN: %s]", username, uuid,
162+
reqSubject, reqIssuer));
163+
}
164+
165+
private String errorResponse(VOMSRequestContext c) {
166+
return sanitize(format("[outcome: %s, errorMessages: %s]", c.getResponse().getOutcome().name(),
167+
c.getResponse().getErrorMessages()));
168+
}
169+
170+
private String successResponse(VOMSRequestContext c) {
171+
VOMSResponse r = c.getResponse();
172+
return sanitize(format(
173+
"[outcome: %s, VO: %s, uri: %s, targets: %s, issuedFQANs: %s, notAfter: %s, notBefore: %s]",
174+
r.getOutcome().name(), c.getVOName(), c.getHost() + ":" + c.getPort(),
175+
r.getTargets().toString(), r.getIssuedFQANs().toString(),
176+
dateFormat.format(r.getNotAfter()), dateFormat.format(r.getNotBefore())));
177+
}
178+
179+
private void logOutcome(VOMSRequestContext c) {
180+
if (log.isInfoEnabled()) {
181+
if (Outcome.SUCCESS.equals(c.getResponse().getOutcome())) {
182+
log.info("User {} got successful VOMS response {} ", userStr(c), successResponse(c));
183+
} else {
184+
log.info("User {} got failure VOMS response {}", userStr(c), errorResponse(c));
185+
}
123186
}
124187
}
125188
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#
2+
# Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2016-2021
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
#
16+
17+
logging.level.root=WARN
18+
logging.level.it.infn.mw=DEBUG

0 commit comments

Comments
 (0)