in kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/request/TicketIssuer.java [89:224]
public EncTicketPart makeEncTicketPart() throws KrbException {
KdcReq request = kdcRequest.getKdcReq();
EncTicketPart encTicketPart = new EncTicketPart();
KdcConfig config = kdcRequest.getKdcContext().getConfig();
TicketFlags ticketFlags = new TicketFlags();
encTicketPart.setFlags(ticketFlags);
ticketFlags.setFlag(TicketFlag.INITIAL);
if (kdcRequest.isPreAuthenticated()) {
ticketFlags.setFlag(TicketFlag.PRE_AUTH);
}
if (request.getReqBody().getKdcOptions().isFlagSet(KdcOption.FORWARDABLE)) {
if (!config.isForwardableAllowed()) {
LOG.warn("Forward is not allowed.");
throw new KrbException(KrbErrorCode.KDC_ERR_POLICY);
}
ticketFlags.setFlag(TicketFlag.FORWARDABLE);
}
if (request.getReqBody().getKdcOptions().isFlagSet(KdcOption.PROXIABLE)) {
if (!config.isProxiableAllowed()) {
LOG.warn("Proxy is not allowed.");
throw new KrbException(KrbErrorCode.KDC_ERR_POLICY);
}
ticketFlags.setFlag(TicketFlag.PROXIABLE);
}
if (request.getReqBody().getKdcOptions().isFlagSet(KdcOption.ALLOW_POSTDATE)) {
if (!config.isPostdatedAllowed()) {
LOG.warn("Post date is not allowed.");
throw new KrbException(KrbErrorCode.KDC_ERR_POLICY);
}
ticketFlags.setFlag(TicketFlag.MAY_POSTDATE);
}
EncryptionKey sessionKey = EncryptionHandler.random2Key(
kdcRequest.getEncryptionType());
encTicketPart.setKey(sessionKey);
PrincipalName clientPrincipal = getclientPrincipal();
encTicketPart.setCname(getclientPrincipal());
if (clientPrincipal.getRealm() != null) {
encTicketPart.setCrealm(clientPrincipal.getRealm());
} else {
encTicketPart.setCrealm(request.getReqBody().getRealm());
}
TransitedEncoding transEnc = getTransitedEncoding();
encTicketPart.setTransited(transEnc);
KdcOptions kdcOptions = request.getReqBody().getKdcOptions();
KerberosTime now = KerberosTime.now();
encTicketPart.setAuthTime(now);
KerberosTime krbStartTime = request.getReqBody().getFrom();
if (krbStartTime == null || krbStartTime.lessThan(now)
|| krbStartTime.isInClockSkew(config.getAllowableClockSkew())) {
krbStartTime = now;
}
if (krbStartTime.greaterThan(now)
&& !krbStartTime.isInClockSkew(config.getAllowableClockSkew())
&& !kdcOptions.isFlagSet(KdcOption.POSTDATED)) {
throw new KrbException(KrbErrorCode.KDC_ERR_CANNOT_POSTDATE);
}
if (kdcOptions.isFlagSet(KdcOption.POSTDATED)) {
if (!config.isPostdatedAllowed()) {
throw new KrbException(KrbErrorCode.KDC_ERR_POLICY);
}
ticketFlags.setFlag(TicketFlag.POSTDATED);
encTicketPart.setStartTime(krbStartTime);
}
KerberosTime krbEndTime = request.getReqBody().getTill();
KerberosTime maxEndTime = krbStartTime.extend(config.getMaximumTicketLifetime() * 1000);
if (krbEndTime == null || krbEndTime.getTime() == 0 || krbEndTime.greaterThan(maxEndTime)) {
krbEndTime = maxEndTime;
} else if (krbStartTime.greaterThan(krbEndTime)) {
throw new KrbException(KrbErrorCode.KDC_ERR_NEVER_VALID);
}
encTicketPart.setEndTime(krbEndTime);
long ticketLifeTime = Math.abs(krbEndTime.diff(krbStartTime));
if (ticketLifeTime < config.getMinimumTicketLifetime()) {
throw new KrbException(KrbErrorCode.KDC_ERR_NEVER_VALID);
}
KerberosTime krbRtime = request.getReqBody().getRtime();
if (kdcOptions.isFlagSet(KdcOption.RENEWABLE_OK)) {
kdcOptions.setFlag(KdcOption.RENEWABLE);
}
if (kdcOptions.isFlagSet(KdcOption.RENEWABLE)) {
if (!config.isRenewableAllowed()) {
throw new KrbException(KrbErrorCode.KDC_ERR_POLICY);
}
ticketFlags.setFlag(TicketFlag.RENEWABLE);
if (krbRtime == null || krbRtime.getTime() == 0) {
krbRtime = krbEndTime;
}
KerberosTime allowedMaximumRenewableTime = krbStartTime;
allowedMaximumRenewableTime = allowedMaximumRenewableTime
.extend(config.getMaximumRenewableLifetime() * 1000);
if (krbRtime.greaterThan(allowedMaximumRenewableTime)) {
krbRtime = allowedMaximumRenewableTime;
}
encTicketPart.setRenewtill(krbRtime);
}
HostAddresses hostAddresses = request.getReqBody().getAddresses();
if (hostAddresses == null || hostAddresses.isEmpty()) {
if (!config.isEmptyAddressesAllowed()) {
throw new KrbException(KrbErrorCode.KDC_ERR_POLICY);
}
} else {
encTicketPart.setClientAddresses(hostAddresses);
}
AuthorizationData authData = makeAuthorizationData(kdcRequest,
encTicketPart);
if (authData != null) {
encTicketPart.setAuthorizationData(authData);
}
return encTicketPart;
}