2121import com .iexec .commons .poco .task .TaskDescription ;
2222import com .iexec .commons .poco .tee .TeeEnclaveConfiguration ;
2323import com .iexec .sms .api .config .TeeServicesProperties ;
24- import com .iexec .sms .secret .compute .OnChainObjectType ;
25- import com .iexec .sms .secret .compute .SecretOwnerRole ;
26- import com .iexec .sms .secret .compute .TeeTaskComputeSecret ;
27- import com .iexec .sms .secret .compute .TeeTaskComputeSecretService ;
24+ import com .iexec .sms .secret .compute .*;
25+ import com .iexec .sms .secret .web2 .Web2Secret ;
26+ import com .iexec .sms .secret .web2 .Web2SecretHeader ;
2827import com .iexec .sms .secret .web2 .Web2SecretService ;
2928import com .iexec .sms .secret .web3 .Web3SecretService ;
3029import com .iexec .sms .tee .challenge .EthereumCredentials ;
@@ -220,54 +219,64 @@ public SecretEnclaveBase getAppTokens(TeeSessionRequest request)
220219
221220 private Map <String , Object > getApplicationComputeSecrets (TaskDescription taskDescription ) {
222221 final Map <String , Object > tokens = new HashMap <>();
223- final String applicationAddress = taskDescription .getAppAddress ();
224-
225- if (applicationAddress != null ) {
226- final String secretIndex = "1" ;
227- String appDeveloperSecret = teeTaskComputeSecretService .getSecret (
228- OnChainObjectType .APPLICATION ,
229- applicationAddress .toLowerCase (),
230- SecretOwnerRole .APPLICATION_DEVELOPER ,
231- "" ,
232- secretIndex )
233- .map (TeeTaskComputeSecret ::getValue )
234- .orElse (EMPTY_YML_VALUE );
235- if (!StringUtils .isEmpty (appDeveloperSecret )) {
236- tokens .put ("IEXEC_APP_DEVELOPER_SECRET" , appDeveloperSecret );
237- tokens .put (IexecEnvUtils .IEXEC_APP_DEVELOPER_SECRET_PREFIX + secretIndex , appDeveloperSecret );
222+ final List <TeeTaskComputeSecretHeader > ids = getAppComputeSecretsHeaders (taskDescription );
223+ log .debug ("TeeTaskComputeSecret looking for secrets [chainTaskId:{}, count:{}]" ,
224+ taskDescription .getChainTaskId (), ids .size ());
225+ final List <TeeTaskComputeSecret > secrets = teeTaskComputeSecretService .getSecretsForTeeSession (ids );
226+ log .debug ("TeeTaskComputeSecret objects fetched from database [chainTaskId:{}, count:{}]" ,
227+ taskDescription .getChainTaskId (), secrets .size ());
228+ for (TeeTaskComputeSecret secret : secrets ) {
229+ if (!StringUtils .isEmpty (secret .getHeader ().getOnChainObjectAddress ())) {
230+ tokens .put ("IEXEC_APP_DEVELOPER_SECRET" , secret .getValue ());
231+ tokens .put (IexecEnvUtils .IEXEC_APP_DEVELOPER_SECRET_PREFIX + "1" , secret .getValue ());
232+ } else {
233+ final String secretKey = secret .getHeader ().getKey ();
234+ taskDescription .getSecrets ().forEach ((key , value ) -> {
235+ if (value .equals (secretKey )) {
236+ tokens .put (IexecEnvUtils .IEXEC_REQUESTER_SECRET_PREFIX + key , secret .getValue ());
237+ }
238+ });
238239 }
239240 }
241+ return tokens ;
242+ }
240243
241- if (taskDescription .getSecrets () == null || taskDescription .getRequester () == null ) {
242- return tokens ;
244+ private List <TeeTaskComputeSecretHeader > getAppComputeSecretsHeaders (TaskDescription taskDescription ) {
245+ final List <TeeTaskComputeSecretHeader > ids = new ArrayList <>();
246+ final String applicationAddress = taskDescription .getAppAddress ();
247+ if (applicationAddress != null ) {
248+ final String secretIndex = "1" ;
249+ ids .add (new TeeTaskComputeSecretHeader (
250+ OnChainObjectType .APPLICATION ,
251+ applicationAddress .toLowerCase (),
252+ SecretOwnerRole .APPLICATION_DEVELOPER ,
253+ "" ,
254+ secretIndex ));
243255 }
244256
245- final HashMap <String , String > requesterSecrets = new HashMap <>();
246- for (Map .Entry <String , String > secretEntry : taskDescription .getSecrets ().entrySet ()) {
247- try {
248- int requesterSecretIndex = Integer .parseInt (secretEntry .getKey ());
249- if (requesterSecretIndex <= 0 ) {
250- String message = "Application secret indices provided in the deal parameters must be positive numbers"
251- + " [providedApplicationSecretIndex:" + requesterSecretIndex + "]" ;
252- log .warn (message );
253- throw new NumberFormatException (message );
257+ if (taskDescription .getSecrets () != null && taskDescription .getRequester () != null ) {
258+ for (Map .Entry <String , String > secretEntry : taskDescription .getSecrets ().entrySet ()) {
259+ try {
260+ int requesterSecretIndex = Integer .parseInt (secretEntry .getKey ());
261+ if (requesterSecretIndex <= 0 ) {
262+ String message = "Application secret indices provided in the deal parameters must be positive numbers"
263+ + " [providedApplicationSecretIndex:" + requesterSecretIndex + "]" ;
264+ log .warn (message );
265+ throw new NumberFormatException (message );
266+ }
267+ } catch (NumberFormatException e ) {
268+ log .warn ("Invalid entry found in deal parameters secrets map" , e );
269+ continue ;
254270 }
255- } catch (NumberFormatException e ) {
256- log .warn ("Invalid entry found in deal parameters secrets map" , e );
257- continue ;
271+ ids .add (new TeeTaskComputeSecretHeader (
272+ OnChainObjectType .APPLICATION ,
273+ "" ,
274+ SecretOwnerRole .REQUESTER ,
275+ taskDescription .getRequester ().toLowerCase (),
276+ secretEntry .getValue ()));
258277 }
259- String requesterSecret = teeTaskComputeSecretService .getSecret (
260- OnChainObjectType .APPLICATION ,
261- "" ,
262- SecretOwnerRole .REQUESTER ,
263- taskDescription .getRequester ().toLowerCase (),
264- secretEntry .getValue ())
265- .map (TeeTaskComputeSecret ::getValue )
266- .orElse (EMPTY_YML_VALUE );
267- requesterSecrets .put (IexecEnvUtils .IEXEC_REQUESTER_SECRET_PREFIX + secretEntry .getKey (), requesterSecret );
268278 }
269- tokens .putAll (requesterSecrets );
270- return tokens ;
279+ return ids ;
271280 }
272281
273282 /**
@@ -287,12 +296,46 @@ public SecretEnclaveBase getPostComputeTokens(TeeSessionRequest request)
287296 if (taskDescription == null ) {
288297 throw new TeeSessionGenerationException (NO_TASK_DESCRIPTION , "Task description must not be null" );
289298 }
299+
300+ final List <Web2SecretHeader > ids = getPostComputeSecretHeaders (taskDescription , request .getWorkerAddress ());
301+ log .debug ("Web2Secret looking for secrets [chainTaskId:{}, count:{}]" ,
302+ taskDescription .getChainTaskId (), ids .size ());
303+ final List <Web2Secret > secrets = web2SecretService .getSecretsForTeeSession (ids );
304+ log .debug ("Web2Secret objects fetched from database [chainTaskId:{}, count:{}]" ,
305+ taskDescription .getChainTaskId (), secrets .size ());
290306 // encryption
291- Map <String , String > encryptionTokens = getPostComputeEncryptionTokens (request );
292- tokens .putAll (encryptionTokens );
307+ final String resultEncryptionSecret = secrets .stream ()
308+ .filter (secret -> IEXEC_RESULT_ENCRYPTION_PUBLIC_KEY .equals (secret .getHeader ().getAddress ()))
309+ .findFirst ()
310+ .map (Web2Secret ::getValue )
311+ .orElse ("" );
312+ tokens .putAll (getPostComputeEncryptionTokens (request , resultEncryptionSecret ));
293313 // storage
294- Map <String , String > storageTokens = getPostComputeStorageTokens (request );
295- tokens .putAll (storageTokens );
314+ if (taskDescription .containsCallback ()) {
315+ tokens .putAll (getPostComputeStorageTokens (request , "" ));
316+ } else if (DROPBOX_RESULT_STORAGE_PROVIDER .equals (taskDescription .getResultStorageProvider ())) {
317+ final String storageToken = secrets .stream ()
318+ .filter (secret -> IEXEC_RESULT_DROPBOX_TOKEN .equals (secret .getHeader ().getAddress ()))
319+ .findFirst ()
320+ .map (Web2Secret ::getValue )
321+ .orElse ("" );
322+ tokens .putAll (getPostComputeStorageTokens (request , storageToken ));
323+ } else {
324+ // TODO remove fallback on requester token when legacy Result Proxy endpoints have been removed
325+ final boolean isWorkerTokenPresent = secrets .stream ()
326+ .anyMatch (secret -> IEXEC_RESULT_IEXEC_IPFS_TOKEN .equals (secret .getHeader ().getAddress ())
327+ && request .getWorkerAddress ().equalsIgnoreCase (secret .getHeader ().getOwnerAddress ()));
328+ final String tokenOwner = isWorkerTokenPresent ? request .getWorkerAddress () : taskDescription .getRequester ();
329+ final String storageToken = secrets .stream ()
330+ .filter (secret -> IEXEC_RESULT_IEXEC_IPFS_TOKEN .equals (secret .getHeader ().getAddress ()) &&
331+ tokenOwner .equalsIgnoreCase (secret .getHeader ().getOwnerAddress ()))
332+ .findFirst ()
333+ .map (Web2Secret ::getValue )
334+ .orElse ("" );
335+ log .debug ("storage token [isWorkerTokenPresent:{}, tokenOwner:{}]" ,
336+ isWorkerTokenPresent , tokenOwner );
337+ tokens .putAll (getPostComputeStorageTokens (request , storageToken ));
338+ }
296339 // enclave signature
297340 Map <String , String > signTokens = getPostComputeSignTokens (request );
298341 tokens .putAll (signTokens );
@@ -301,7 +344,21 @@ public SecretEnclaveBase getPostComputeTokens(TeeSessionRequest request)
301344 .build ();
302345 }
303346
304- public Map <String , String > getPostComputeEncryptionTokens (TeeSessionRequest request )
347+ List <Web2SecretHeader > getPostComputeSecretHeaders (TaskDescription taskDescription , String workerAddress ) {
348+ final List <Web2SecretHeader > ids = new ArrayList <>();
349+ if (taskDescription .isResultEncryption ()) {
350+ ids .add (new Web2SecretHeader (taskDescription .getBeneficiary (), IEXEC_RESULT_ENCRYPTION_PUBLIC_KEY ));
351+ }
352+ if (DROPBOX_RESULT_STORAGE_PROVIDER .equals (taskDescription .getResultStorageProvider ())) {
353+ ids .add (new Web2SecretHeader (taskDescription .getRequester (), IEXEC_RESULT_DROPBOX_TOKEN ));
354+ } else {
355+ ids .add (new Web2SecretHeader (taskDescription .getRequester (), IEXEC_RESULT_IEXEC_IPFS_TOKEN ));
356+ ids .add (new Web2SecretHeader (workerAddress , IEXEC_RESULT_IEXEC_IPFS_TOKEN ));
357+ }
358+ return ids ;
359+ }
360+
361+ public Map <String , String > getPostComputeEncryptionTokens (TeeSessionRequest request , String resultEncryptionKey )
305362 throws TeeSessionGenerationException {
306363 TaskDescription taskDescription = request .getTaskDescription ();
307364 String taskId = taskDescription .getChainTaskId ();
@@ -313,24 +370,20 @@ public Map<String, String> getPostComputeEncryptionTokens(TeeSessionRequest requ
313370 if (!shouldEncrypt ) {
314371 return tokens ;
315372 }
316- Optional <String > beneficiaryResultEncryptionKeySecret = web2SecretService .getDecryptedValue (
317- taskDescription .getBeneficiary (),
318- IEXEC_RESULT_ENCRYPTION_PUBLIC_KEY );
319- if (beneficiaryResultEncryptionKeySecret .isEmpty ()) {
373+ if (StringUtils .isEmpty (resultEncryptionKey )) {
320374 throw new TeeSessionGenerationException (
321375 POST_COMPUTE_GET_ENCRYPTION_TOKENS_FAILED_EMPTY_BENEFICIARY_KEY ,
322376 "Empty beneficiary encryption key - taskId: " + taskId );
323377 }
324- String publicKeyValue = beneficiaryResultEncryptionKeySecret .get ();
325- tokens .put (RESULT_ENCRYPTION_PUBLIC_KEY , publicKeyValue ); // base64 encoded by client
378+ tokens .put (RESULT_ENCRYPTION_PUBLIC_KEY , resultEncryptionKey ); // base64 encoded by client
326379 return tokens ;
327380 }
328381
329382 // TODO: We need a signature of the beneficiary to push
330383 // to the beneficiary private storage space waiting for
331384 // that feature we only allow to push to the requester
332385 // private storage space
333- public Map <String , String > getPostComputeStorageTokens (TeeSessionRequest request )
386+ public Map <String , String > getPostComputeStorageTokens (TeeSessionRequest request , String storageToken )
334387 throws TeeSessionGenerationException {
335388 TaskDescription taskDescription = request .getTaskDescription ();
336389 String taskId = taskDescription .getChainTaskId ();
@@ -345,23 +398,13 @@ public Map<String, String> getPostComputeStorageTokens(TeeSessionRequest request
345398 }
346399 String storageProvider = taskDescription .getResultStorageProvider ();
347400 String storageProxy = taskDescription .getResultStorageProxy ();
348- final Optional <String > storageTokenSecret ;
349- if (DROPBOX_RESULT_STORAGE_PROVIDER .equals (storageProvider )) {
350- storageTokenSecret = web2SecretService .getDecryptedValue (taskDescription .getRequester (), IEXEC_RESULT_DROPBOX_TOKEN );
351- } else {
352- // TODO remove fallback on requester token when legacy Result Proxy endpoints have been removed
353- final boolean isWorkerTokenPresent = web2SecretService .isSecretPresent (request .getWorkerAddress (), IEXEC_RESULT_IEXEC_IPFS_TOKEN );
354- final String tokenOwner = isWorkerTokenPresent ? request .getWorkerAddress () : taskDescription .getRequester ();
355- storageTokenSecret = web2SecretService .getDecryptedValue (tokenOwner , IEXEC_RESULT_IEXEC_IPFS_TOKEN );
356- }
357- if (storageTokenSecret .isEmpty ()) {
401+ if (StringUtils .isEmpty (storageToken )) {
358402 log .error ("Failed to get storage token [taskId:{}, storageProvider:{}, requester:{}]" ,
359403 taskId , storageProvider , taskDescription .getRequester ());
360404 throw new TeeSessionGenerationException (
361405 POST_COMPUTE_GET_STORAGE_TOKENS_FAILED ,
362406 "Empty requester storage token - taskId: " + taskId );
363407 }
364- final String storageToken = storageTokenSecret .get ();
365408 tokens .put (RESULT_STORAGE_PROVIDER , storageProvider );
366409 tokens .put (RESULT_STORAGE_PROXY , storageProxy );
367410 tokens .put (RESULT_STORAGE_TOKEN , storageToken );
0 commit comments