if ( request.getKdcReqBody().getKdcOptions().get( KdcOptions.FORWARDABLE ) )
{
if ( !config.isForwardableAllowed() )
{
throw new KerberosException( ErrorType.KDC_ERR_POLICY );
}
if ( !tgt.getEncTicketPart().getFlags().isForwardable() )
{
throw new KerberosException( ErrorType.KDC_ERR_BADOPTION );
}
newTicketPart.setFlag( TicketFlag.FORWARDABLE );
}
if ( request.getKdcReqBody().getKdcOptions().get( KdcOptions.FORWARDED ) )
{
if ( !config.isForwardableAllowed() )
{
throw new KerberosException( ErrorType.KDC_ERR_POLICY );
}
if ( !tgt.getEncTicketPart().getFlags().isForwardable() )
{
throw new KerberosException( ErrorType.KDC_ERR_BADOPTION );
}
if ( request.getKdcReqBody().getAddresses() != null
&& request.getKdcReqBody().getAddresses().getAddresses() != null
&& request.getKdcReqBody().getAddresses().getAddresses().length > 0 )
{
newTicketPart.setClientAddresses( request.getKdcReqBody().getAddresses() );
}
else
{
if ( !config.isEmptyAddressesAllowed() )
{
throw new KerberosException( ErrorType.KDC_ERR_POLICY );
}
}
newTicketPart.setFlag( TicketFlag.FORWARDED );
}
if ( tgt.getEncTicketPart().getFlags().isForwarded() )
{
newTicketPart.setFlag( TicketFlag.FORWARDED );
}
if ( request.getKdcReqBody().getKdcOptions().get( KdcOptions.PROXIABLE ) )
{
if ( !config.isProxiableAllowed() )
{
throw new KerberosException( ErrorType.KDC_ERR_POLICY );
}
if ( !tgt.getEncTicketPart().getFlags().isProxiable() )
{
throw new KerberosException( ErrorType.KDC_ERR_BADOPTION );
}
newTicketPart.setFlag( TicketFlag.PROXIABLE );
}
if ( request.getKdcReqBody().getKdcOptions().get( KdcOptions.PROXY ) )
{
if ( !config.isProxiableAllowed() )
{
throw new KerberosException( ErrorType.KDC_ERR_POLICY );
}
if ( !tgt.getEncTicketPart().getFlags().isProxiable() )
{
throw new KerberosException( ErrorType.KDC_ERR_BADOPTION );
}
if ( request.getKdcReqBody().getAddresses() != null
&& request.getKdcReqBody().getAddresses().getAddresses() != null
&& request.getKdcReqBody().getAddresses().getAddresses().length > 0 )
{
newTicketPart.setClientAddresses( request.getKdcReqBody().getAddresses() );
}
else
{
if ( !config.isEmptyAddressesAllowed() )
{
throw new KerberosException( ErrorType.KDC_ERR_POLICY );
}
}
newTicketPart.setFlag( TicketFlag.PROXY );
}
if ( request.getKdcReqBody().getKdcOptions().get( KdcOptions.ALLOW_POSTDATE ) )
{
if ( !config.isPostdatedAllowed() )
{
throw new KerberosException( ErrorType.KDC_ERR_POLICY );
}
if ( !tgt.getEncTicketPart().getFlags().isMayPosdate() )
{
throw new KerberosException( ErrorType.KDC_ERR_BADOPTION );
}
newTicketPart.setFlag( TicketFlag.MAY_POSTDATE );
}
/*
* "Otherwise, if the TGT has the MAY-POSTDATE flag set, then the resulting
* ticket will be postdated, and the requested starttime is checked against
* the policy of the local realm. If acceptable, the ticket's starttime is
* set as requested, and the INVALID flag is set. The postdated ticket MUST
* be validated before use by presenting it to the KDC after the starttime
* has been reached. However, in no case may the starttime, endtime, or
* renew-till time of a newly-issued postdated ticket extend beyond the
* renew-till time of the TGT."
*/
if ( request.getKdcReqBody().getKdcOptions().get( KdcOptions.POSTDATED ) )
{
if ( !config.isPostdatedAllowed() )
{
throw new KerberosException( ErrorType.KDC_ERR_POLICY );
}
if ( !tgt.getEncTicketPart().getFlags().isMayPosdate() )
{
throw new KerberosException( ErrorType.KDC_ERR_BADOPTION );
}
newTicketPart.setFlag( TicketFlag.POSTDATED );
newTicketPart.setFlag( TicketFlag.INVALID );
newTicketPart.setStartTime( request.getKdcReqBody().getFrom() );
}
if ( request.getKdcReqBody().getKdcOptions().get( KdcOptions.VALIDATE ) )
{
if ( !config.isPostdatedAllowed() )
{
throw new KerberosException( ErrorType.KDC_ERR_POLICY );
}
if ( !tgt.getEncTicketPart().getFlags().isInvalid() )
{
throw new KerberosException( ErrorType.KDC_ERR_POLICY );
}
KerberosTime startTime = ( tgt.getEncTicketPart().getStartTime() != null ) ?
tgt.getEncTicketPart().getStartTime() :
tgt.getEncTicketPart().getAuthTime();
if ( startTime.greaterThan( new KerberosTime() ) )
{
throw new KerberosException( ErrorType.KRB_AP_ERR_TKT_NYV );
}
echoTicket( newTicketPart, tgt );
newTicketPart.getFlags().clearFlag( TicketFlag.INVALID );
}
if ( request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_0 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_7 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_9 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_10 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_11 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_12 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_13 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_14 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_15 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_16 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_17 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_18 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_19 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_20 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_21 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_22 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_23 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_24 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_25 ) ||
request.getKdcReqBody().getKdcOptions().get( KdcOptions.RESERVED_29 ) )
{
throw new KerberosException( ErrorType.KDC_ERR_BADOPTION );
}
}