3434import io .jans .as .server .model .token .JwtSigner ;
3535import io .jans .as .server .service .ClientService ;
3636import io .jans .as .server .service .ServerCryptoProvider ;
37+ import io .jans .as .server .service .external .ExternalTxTokenService ;
38+ import io .jans .as .server .service .external .context .ExternalScriptContext ;
3739import io .jans .as .server .util .ServerUtil ;
3840import io .jans .model .token .TokenEntity ;
3941import io .jans .util .security .StringEncrypter ;
4042import jakarta .ejb .Stateless ;
4143import jakarta .inject .Inject ;
4244import jakarta .inject .Named ;
4345import jakarta .servlet .http .HttpServletRequest ;
46+ import jakarta .ws .rs .WebApplicationException ;
4447import jakarta .ws .rs .core .MediaType ;
4548import jakarta .ws .rs .core .Response ;
4649import org .apache .commons .lang3 .StringUtils ;
@@ -88,6 +91,9 @@ public class TxTokenService {
8891 @ Inject
8992 private AuthorizationGrantList authorizationGrantList ;
9093
94+ @ Inject
95+ private ExternalTxTokenService externalTxTokenService ;
96+
9197 public Response processTxToken (ExecutionContext executionContext ) throws Exception {
9298 final JSONObject responseJson = process (executionContext );
9399 final String entity = responseJson .toString ();
@@ -106,7 +112,14 @@ private JSONObject process(ExecutionContext executionContext) throws Exception {
106112
107113 TxToken txToken = createTxToken (executionContext , subjectGrant );
108114
109- return createResponse (txToken .getCode ());
115+ JSONObject response = createResponse (txToken .getCode ());
116+ JSONObject responseForScript = new JSONObject (response .toString ());
117+
118+ if (externalTxTokenService .modifyResponse (responseForScript , ExternalScriptContext .of (executionContext ))) {
119+ // change response only if external script returned `true`
120+ response = responseForScript ;
121+ }
122+ return response ;
110123 }
111124
112125 public static JSONObject createResponse (String txToken ) {
@@ -133,7 +146,7 @@ private TxToken createTxToken(ExecutionContext executionContext, AuthorizationGr
133146 final JsonWebResponse jwr = createTxTokenJwr (audience , requestContext , requestDetails , executionContext , subjectGrant );
134147 final String jwrString = jwr .toString ();
135148
136- final int txTokenLifetime = getTxTokenLifetime (client );
149+ final int txTokenLifetime = getTxTokenLifetime (executionContext );
137150 TxToken txToken = new TxToken (txTokenLifetime );
138151 txToken .setCode (jwrString );
139152
@@ -147,10 +160,9 @@ private void fillPayload(JsonWebResponse jwr, String audience, String requestCon
147160
148161 Calendar calendar = Calendar .getInstance ();
149162 Date issuedAt = calendar .getTime ();
150- calendar .add (Calendar .SECOND , getTxTokenLifetime (client ));
163+ calendar .add (Calendar .SECOND , getTxTokenLifetime (executionContext ));
151164 Date expiration = calendar .getTime ();
152165
153-
154166 jwr .getClaims ().setIssuer (appConfiguration .getIssuer ());
155167 jwr .getClaims ().setExpirationTime (expiration );
156168 jwr .getClaims ().setIat (issuedAt );
@@ -180,6 +192,20 @@ private void fillPayload(JsonWebResponse jwr, String audience, String requestCon
180192 azd .put ("client_id" , client .getClientId ());
181193
182194 jwr .getClaims ().setClaim ("azd" , azd );
195+
196+ boolean externalOk = externalTxTokenService .modifyTokenPayload (jwr , ExternalScriptContext .of (executionContext ));
197+ if (!externalOk ) {
198+ final String reason = "External TxToken script forbids tx_token creation." ;
199+ log .trace (reason );
200+
201+ throw new WebApplicationException (Response
202+ .status (Response .Status .FORBIDDEN )
203+ .type (MediaType .APPLICATION_JSON_TYPE )
204+ .cacheControl (ServerUtil .cacheControl (true , false ))
205+ .header ("Pragma" , "no-cache" )
206+ .entity (errorResponseFactory .errorAsJson (TokenErrorResponseType .ACCESS_DENIED , reason ))
207+ .build ());
208+ }
183209 }
184210
185211 private static JSONObject decodeJson (String jsonString ) {
@@ -194,11 +220,18 @@ private static JSONObject decodeJson(String jsonString) {
194220 }
195221 }
196222
197- private int getTxTokenLifetime (Client client ) {
223+ private int getTxTokenLifetime (ExecutionContext executionContext ) {
224+ Client client = executionContext .getClient ();
198225 if (client .getAttributes ().getTxTokenLifetime () != null && client .getAttributes ().getTxTokenLifetime () > 0 ) {
199226 log .trace ("Override TxToken lifetime with value {} from client: {}" , client .getAttributes ().getTxTokenLifetime (), client .getClientId ());
200227 return client .getAttributes ().getTxTokenLifetime ();
201228 }
229+
230+ int lifetimeFromScript = externalTxTokenService .getTxTokenLifetimeInSeconds (ExternalScriptContext .of (executionContext ));
231+ if (lifetimeFromScript > 0 ) {
232+ log .trace ("Override TxToken lifetime with value {} from script." , lifetimeFromScript );
233+ return lifetimeFromScript ;
234+ }
202235 return appConfiguration .getTxTokenLifetime ();
203236 }
204237
0 commit comments