From 82c0bf02476d0fedcb25f3f36f1f5be4a797552e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Agneray?= <francois.agneray@lam.fr>
Date: Wed, 9 Mar 2022 15:20:17 +0100
Subject: [PATCH] Download by actions + dataset protected

---
 .../result/datatable-actions.component.html   |  16 +--
 .../result/datatable-actions.component.ts     | 113 ++----------------
 .../result/datatable-tab.component.html       |   5 +-
 .../result/datatable-tab.component.ts         |   4 +-
 .../result/datatable.component.html           |   2 +-
 .../components/result/datatable.component.ts  |   2 +-
 .../components/result/download.component.html |   2 +-
 .../components/result/download.component.ts   |   8 +-
 .../renderer/download-renderer.component.ts   |   4 +-
 .../search/containers/result.component.html   |   6 +-
 .../search/containers/result.component.ts     |   6 +-
 .../store/actions/download-file.actions.ts    |   2 +-
 .../store/effects/download-file.effects.ts    |  12 +-
 docker-compose.yml                            |   2 +-
 server/src/Action/AbstractAction.php          |   2 +-
 .../Action/DatasetListByInstanceAction.php    |   3 +-
 .../Action/StartTaskCreateArchiveAction.php   |   5 +-
 .../Action/StartTaskCreateResultAction.php    |   6 +-
 tasks/src/anis_tasks/archive.py               |   2 +-
 tasks/src/anis_tasks/result.py                |   3 +-
 tasks/src/anis_tasks/utils.py                 |   9 +-
 21 files changed, 74 insertions(+), 140 deletions(-)

diff --git a/client/src/app/instance/search/components/result/datatable-actions.component.html b/client/src/app/instance/search/components/result/datatable-actions.component.html
index f0f88863..38e119df 100644
--- a/client/src/app/instance/search/components/result/datatable-actions.component.html
+++ b/client/src/app/instance/search/components/result/datatable-actions.component.html
@@ -4,35 +4,29 @@
     </button>
     <ul id="dropdown-basic" *dropdownMenu class="dropdown-menu" role="menu" aria-labelledby="button-basic">
         <li *ngIf="getConfigDownloadResultFormat('download_csv')" role="menuitem">
-            <a class="dropdown-item" [href]="getUrl('csv')" (click)="click($event, getUrl('csv'), 'csv')">
+            <a class="dropdown-item" (click)="downloadResult('csv')">
                 <span class="fas fa-file-csv"></span> Download CSV
             </a>
         </li>
         <li *ngIf="getConfigDownloadResultFormat('download_ascii')" role="menuitem">
-            <a class="dropdown-item" [href]="getUrl('ascii')" (click)="click($event, getUrl('ascii'), 'txt')">
+            <a class="dropdown-item" (click)="downloadResult('ascii')">
                 <span class="fas fa-file"></span> Download ASCII
             </a>
         </li>
         <li *ngIf="getConfigDownloadResultFormat('download_vo')" role="menuitem">
-            <a class="dropdown-item" [href]="getUrl('votable')" (click)="click($event, getUrl('votable'), 'xml')">
+            <a class="dropdown-item" (click)="downloadResult('votable')">
                 <span class="fas fa-file"></span> VOtable
             </a>
         </li>
         <li *ngIf="getConfigDownloadResultFormat('download_vo')" role="menuitem" [class.disabled]="!sampRegistered">
-            <a class="dropdown-item" [class.disabled]="!sampRegistered" (click)="broadcastVotable()">
+            <a class="dropdown-item" [class.disabled]="!sampRegistered" (click)="broadcast.emit()">
                 <span class="fas fa-broadcast-tower"></span> Broadcast VOtable
             </a>
         </li>
         <li *ngIf="getConfigDownloadResultFormat('download_archive')" role="menuitem">
-            <a class="dropdown-item" [href]="createFilesArchiveUrl()" (click)="createFilesArchive($event, createFilesArchiveUrl())">
+            <a class="dropdown-item" (click)="downloadArchive()">
                 <span class="fas fa-archive"></span> Download files archive
             </a>
         </li>
     </ul>
-</div>
-
-<div *ngIf="archiveInProgress">
-    <span class="fas fa-circle-notch fa-spin fa-3x"></span>
-    <span class="sr-only">Loading...</span>
-    Please wait archive is under construction...
 </div>
\ No newline at end of file
diff --git a/client/src/app/instance/search/components/result/datatable-actions.component.ts b/client/src/app/instance/search/components/result/datatable-actions.component.ts
index cdb42876..73f55fd8 100644
--- a/client/src/app/instance/search/components/result/datatable-actions.component.ts
+++ b/client/src/app/instance/search/components/result/datatable-actions.component.ts
@@ -1,13 +1,7 @@
 import { Component, Input, Output, EventEmitter } from '@angular/core';
-import { HttpClient } from '@angular/common/http';
-import { interval, Subscription} from 'rxjs';
-
-import { ToastrService } from 'ngx-toastr';
 
 import { Dataset, Attribute } from 'src/app/metamodel/models';
-import { Criterion, ConeSearch, criterionToString } from 'src/app/instance/store/models';
-import { getHost } from 'src/app/shared/utils';
-import { AppConfigService } from 'src/app/app-config.service';
+import { Criterion, ConeSearch } from 'src/app/instance/store/models';
 
 @Component({
     selector: 'app-datatable-actions',
@@ -24,14 +18,8 @@ export class DatatableActionsComponent {
     @Input() dataLength: number;
     @Input() sampRegistered: boolean;
     @Output() broadcast: EventEmitter<string> = new EventEmitter();
-    @Output() startsDownloadingFile: EventEmitter<{url: string, filename: string}> = new EventEmitter();
-
-    archiveName = '';
-    archiveId ='';
-    archiveInProgress = false;
-    archiveIsAvailableSubscription: Subscription
-
-    constructor(private appConfig: AppConfigService, private http: HttpClient, private toastr: ToastrService) { }
+    @Output() startTaskCreateResult: EventEmitter<{ format: string, selectedData: boolean }> = new EventEmitter();
+    @Output() startTaskCreateArchive: EventEmitter<{ selectedData: boolean }> = new EventEmitter();
 
     /**
      * Checks if the download format is allowed by Anis Admin configuration.
@@ -49,102 +37,21 @@ export class DatatableActionsComponent {
         return this.datasetList.find(d => d.name === this.datasetSelected);
     }
 
-    /**
-     * Returns URL to download file for the given format.
-     *
-     * @param  {string} format - The file format to download.
-     *
-     * @return string
-     */
-    getUrl(format: string): string {
-        let query: string = `${getHost(this.appConfig.apiUrl)}/search/${this.datasetSelected}?a=${this.outputList.join(';')}`;
-        if (this.criteriaList.length > 0) {
-            query += `&c=${this.criteriaList.map(criterion => criterionToString(criterion)).join(';')};${this.getCriterionSelectedData()}`;
-        } else {
-            query += `&c=${this.getCriterionSelectedData()}`;
-        }
-        if (this.coneSearch) {
-            query += `&cs=${this.coneSearch.ra}:${this.coneSearch.dec}:${this.coneSearch.radius}`;
-        }
-        query += `&f=${format}`;
-        return query;
-    }
-
     getCriterionSelectedData() {
         const attributeId = this.attributeList.find(a => a.search_flag === 'ID');
         return `${attributeId.id}::in::${this.selectedData.join('|')}`;
     }
 
-    /**
-     * Allows to download file.
-     */
-    click(event, href, extension): void {
-        event.preventDefault();
-
-        const url = href;
-        const filename = `${this.datasetSelected}.${extension}`;
-
-        this.startsDownloadingFile.emit({ url, filename });
-    }
-
-    /**
-     * Returns URL to download archive.
-     *
-     * @return boolean
-     */
-    createFilesArchiveUrl(): string {
-        let query: string = `${getHost(this.appConfig.apiUrl)}/start-task-create-archive/${this.datasetSelected}?a=${this.outputList.join(';')}`;
-        if (this.criteriaList.length > 0) {
-            query += `&c=${this.criteriaList.map(criterion => criterionToString(criterion)).join(';')}`;
-        } else {
-            query += `&c=${this.getCriterionSelectedData()}`;
-        }
-        if (this.coneSearch) {
-            query += `&cs=${this.coneSearch.ra}:${this.coneSearch.dec}:${this.coneSearch.radius}`;
-        }
-        return query;
-    }
-
-    getArchiveUrl() {
-        return `${getHost(this.appConfig.apiUrl)}/download-archive/${this.datasetSelected}/${this.archiveId}`;
-    }
-
-    testArchiveIsAvailable() {
-        const url = `${getHost(this.appConfig.apiUrl)}/is-archive-available/${this.archiveId}`;
-        this.http.get<{"archive_is_available": boolean}>(url).subscribe(data => {
-            console.log(data);
-            if (data.archive_is_available) {
-                this.archiveInProgress = false;
-                this.archiveIsAvailableSubscription.unsubscribe();
-                this.startsDownloadingFile.emit({ url: this.getArchiveUrl(), filename: this.archiveName })
-            }
+    downloadResult(format: string) {
+        this.startTaskCreateResult.emit({
+            format,
+            selectedData: true
         });
     }
 
-    /**
-     * Starts the creation of the files archive
-     */
-    createFilesArchive(event, href): void {
-        event.preventDefault();
-
-        this.http.get<{"archive_name": string, "archive_id": string}>(href).subscribe(data => {
-            this.archiveInProgress = true;
-            this.archiveName = data.archive_name;
-            this.archiveId = data.archive_id;
-            this.archiveIsAvailableSubscription = interval(1000).subscribe(() => this.testArchiveIsAvailable());
+    downloadArchive() {
+        this.startTaskCreateArchive.emit({
+            selectedData: true
         });
     }
-
-    /**
-     * Emits event to  action to broadcast data.
-     *
-     * @fires EventEmitter<string>
-     */
-    broadcastVotable(): void {
-        this.broadcast.emit(this.getUrl('votable'));
-    }
-
-    ngOnDestroy() {
-        this.archiveIsAvailableSubscription.unsubscribe();
-    }
 }
diff --git a/client/src/app/instance/search/components/result/datatable-tab.component.html b/client/src/app/instance/search/components/result/datatable-tab.component.html
index 0feb3064..3a9773c0 100644
--- a/client/src/app/instance/search/components/result/datatable-tab.component.html
+++ b/client/src/app/instance/search/components/result/datatable-tab.component.html
@@ -19,7 +19,8 @@
             [dataLength]="dataLength"
             [sampRegistered]="sampRegistered"
             (broadcast)="broadcast.emit($event)"
-            (downloadingFile)="downloadingFile.emit($event)">
+            (startTaskCreateResult)="startTaskCreateResult.emit($event)"
+            (startTaskCreateArchive)="startTaskCreateArchive.emit($event)">
         </app-datatable-actions>
         <app-datatable
             [dataset]="datasetList | datasetByName:datasetSelected"
@@ -35,7 +36,7 @@
             (retrieveData)="retrieveData.emit($event)"
             (addSelectedData)="addSelectedData.emit($event)"
             (deleteSelectedData)="deleteSelectedData.emit($event)"
-            (downloadingFile)="downloadingFile.emit($event)">
+            (downloadFile)="downloadFile.emit($event)">
         </app-datatable>
     </accordion-group>
 </accordion>
diff --git a/client/src/app/instance/search/components/result/datatable-tab.component.ts b/client/src/app/instance/search/components/result/datatable-tab.component.ts
index af78907c..2f4e3475 100644
--- a/client/src/app/instance/search/components/result/datatable-tab.component.ts
+++ b/client/src/app/instance/search/components/result/datatable-tab.component.ts
@@ -40,5 +40,7 @@ export class DatatableTabComponent {
     @Output() addSelectedData: EventEmitter<number | string> = new EventEmitter();
     @Output() deleteSelectedData: EventEmitter<number | string> = new EventEmitter();
     @Output() broadcast: EventEmitter<string> = new EventEmitter();
-    @Output() downloadingFile: EventEmitter<{url: string, fileId: string, datasetName: string, filename: string}> = new EventEmitter();
+    @Output() startTaskCreateResult: EventEmitter<{ format: string, selectedData: boolean }> = new EventEmitter();
+    @Output() startTaskCreateArchive: EventEmitter<{ selectedData: boolean }> = new EventEmitter();
+    @Output() downloadFile: EventEmitter<{url: string, fileId: string, datasetName: string, filename: string}> = new EventEmitter();
 }
diff --git a/client/src/app/instance/search/components/result/datatable.component.html b/client/src/app/instance/search/components/result/datatable.component.html
index c1df3527..0647cae6 100644
--- a/client/src/app/instance/search/components/result/datatable.component.html
+++ b/client/src/app/instance/search/components/result/datatable.component.html
@@ -63,7 +63,7 @@
                                 [datasetName]="dataset.name"
                                 [datasetPublic]="dataset.public"
                                 [config]="getRendererConfig(attribute)"
-                                (downloadingFile)="downloadingFile.emit($event)">
+                                (downloadFile)="downloadFile.emit($event)">
                             </app-download-renderer>
                         </div>
                         <div *ngSwitchCase="'image'">
diff --git a/client/src/app/instance/search/components/result/datatable.component.ts b/client/src/app/instance/search/components/result/datatable.component.ts
index 35be1904..0718b70e 100644
--- a/client/src/app/instance/search/components/result/datatable.component.ts
+++ b/client/src/app/instance/search/components/result/datatable.component.ts
@@ -44,7 +44,7 @@ export class DatatableComponent implements OnInit {
     @Output() retrieveData: EventEmitter<Pagination> = new EventEmitter();
     @Output() addSelectedData: EventEmitter<number | string> = new EventEmitter();
     @Output() deleteSelectedData: EventEmitter<number | string> = new EventEmitter();
-    @Output() downloadingFile: EventEmitter<{url: string, fileId: string, datasetName: string, filename: string}> = new EventEmitter();
+    @Output() downloadFile: EventEmitter<{url: string, fileId: string, datasetName: string, filename: string}> = new EventEmitter();
 
     public page = 1;
     public nbItems = 10;
diff --git a/client/src/app/instance/search/components/result/download.component.html b/client/src/app/instance/search/components/result/download.component.html
index 408855a5..f1318353 100644
--- a/client/src/app/instance/search/components/result/download.component.html
+++ b/client/src/app/instance/search/components/result/download.component.html
@@ -41,7 +41,7 @@
                     <p>Download archive files just here:</p>
                 </div>
                 <div class="col">
-                    <a (click)="startTaskCreateArchive.emit()" class="btn btn-outline-primary" title="Download an archive with all files">
+                    <a (click)="downloadArchive()" class="btn btn-outline-primary" title="Download an archive with all files">
                         <span class="fas fa-archive"></span> Files archive
                     </a>
                 </div>
diff --git a/client/src/app/instance/search/components/result/download.component.ts b/client/src/app/instance/search/components/result/download.component.ts
index d6c2323b..e9e03f92 100644
--- a/client/src/app/instance/search/components/result/download.component.ts
+++ b/client/src/app/instance/search/components/result/download.component.ts
@@ -30,7 +30,7 @@ export class DownloadComponent {
     @Input() sampRegistered: boolean;
     @Output() broadcast: EventEmitter<string> = new EventEmitter();
     @Output() startTaskCreateResult: EventEmitter<{ format: string, selectedData: boolean }> = new EventEmitter();
-    @Output() startTaskCreateArchive: EventEmitter<{}> = new EventEmitter();
+    @Output() startTaskCreateArchive: EventEmitter<{ selectedData: boolean }> = new EventEmitter();
 
     /**
      * Checks if download tab has to be display.
@@ -70,4 +70,10 @@ export class DownloadComponent {
             selectedData: false
         });
     }
+
+    downloadArchive() {
+        this.startTaskCreateArchive.emit({
+            selectedData: false
+        });
+    }
 }
diff --git a/client/src/app/instance/search/components/result/renderer/download-renderer.component.ts b/client/src/app/instance/search/components/result/renderer/download-renderer.component.ts
index b7eb941f..9cdb554f 100644
--- a/client/src/app/instance/search/components/result/renderer/download-renderer.component.ts
+++ b/client/src/app/instance/search/components/result/renderer/download-renderer.component.ts
@@ -27,7 +27,7 @@ export class DownloadRendererComponent {
     @Input() datasetName: string;
     @Input() datasetPublic: boolean;
     @Input() config: DownloadRendererConfig;
-    @Output() downloadingFile: EventEmitter<{url: string, fileId: string, datasetName: string, filename: string}> = new EventEmitter();
+    @Output() downloadFile: EventEmitter<{url: string, fileId: string, datasetName: string, filename: string}> = new EventEmitter();
 
     constructor(private appConfig: AppConfigService) { }
 
@@ -62,7 +62,7 @@ export class DownloadRendererComponent {
         const k = Math.floor(Math.random() * 1000000);
         const m = String.fromCharCode(n) + k;
 
-        this.downloadingFile.emit({
+        this.downloadFile.emit({
             url,
             fileId: m,
             datasetName: this.datasetName,
diff --git a/client/src/app/instance/search/containers/result.component.html b/client/src/app/instance/search/containers/result.component.html
index f0f8c4f9..d06e9f7f 100644
--- a/client/src/app/instance/search/containers/result.component.html
+++ b/client/src/app/instance/search/containers/result.component.html
@@ -39,7 +39,7 @@
                 [sampRegistered]="sampRegistered | async"
                 (broadcast)="broadcastVotable($event)"
                 (startTaskCreateResult)="startTaskCreateResult($event)"
-                (startTaskCreateArchive)="startTaskCreateArchive()">
+                (startTaskCreateArchive)="startTaskCreateArchive($event)">
             </app-download>
             <app-reminder
                 [datasetSelected]="datasetSelected | async"
@@ -84,7 +84,9 @@
                 (addSelectedData)="addSearchData($event)"
                 (deleteSelectedData)="deleteSearchData($event)"
                 (broadcast)="broadcastVotable($event)"
-                (downloadingFile)="downloadingFile($event)">
+                (startTaskCreateResult)="startTaskCreateResult($event)"
+                (startTaskCreateArchive)="startTaskCreateArchive($event)"
+                (downloadFile)="downloadFile($event)">
             </app-datatable-tab>
         </ng-container>
     </div>
diff --git a/client/src/app/instance/search/containers/result.component.ts b/client/src/app/instance/search/containers/result.component.ts
index dcc9146c..cc058ea4 100644
--- a/client/src/app/instance/search/containers/result.component.ts
+++ b/client/src/app/instance/search/containers/result.component.ts
@@ -129,7 +129,7 @@ export class ResultComponent extends AbstractSearchComponent {
      *
      * @param  {url: string, fileId: string, datasetName: string, filename: string} download - Info about file to download
      */
-    downloadingFile(download: {url: string, fileId: string, datasetName: string, filename: string}): void {
+    downloadFile(download: {url: string, fileId: string, datasetName: string, filename: string}): void {
         this.store.dispatch(downloadFileActions.downloadFile(download));
     }
 
@@ -146,8 +146,8 @@ export class ResultComponent extends AbstractSearchComponent {
      * Dispatches action to starts task create archive and download
      *
      */
-    startTaskCreateArchive() {
-        this.store.dispatch(downloadFileActions.startTaskCreateArchive());
+    startTaskCreateArchive(event: { selectedData: boolean }) {
+        this.store.dispatch(downloadFileActions.startTaskCreateArchive(event));
     }
 
     /**
diff --git a/client/src/app/instance/store/actions/download-file.actions.ts b/client/src/app/instance/store/actions/download-file.actions.ts
index e1c428e5..8368ed92 100644
--- a/client/src/app/instance/store/actions/download-file.actions.ts
+++ b/client/src/app/instance/store/actions/download-file.actions.ts
@@ -15,7 +15,7 @@ export const startTaskCreateResultFail = createAction('[File] Start Task Create
 export const isResultAvailable = createAction('[File] Is Result Available', props<{ fileId: string, datasetName: string, filename: string }>());
 export const isResultAvailableFail = createAction('[File] Is Result Available Fail');
 
-export const startTaskCreateArchive = createAction('[File] Start Task Create Archive');
+export const startTaskCreateArchive = createAction('[File] Start Task Create Archive', props<{ selectedData: boolean }>());
 export const startTaskCreateArchiveSuccess = createAction('[File] Start Task Create Archive Success', props<{ fileId: string, datasetName: string, filename: string }>());
 export const startTaskCreateArchiveFail = createAction('[File] Start Task Create Archive Fail');
 export const isArchiveAvailable = createAction('[File] Is Archive Available', props<{ fileId: string, datasetName: string, filename: string }>());
diff --git a/client/src/app/instance/store/effects/download-file.effects.ts b/client/src/app/instance/store/effects/download-file.effects.ts
index 6a375221..90a6a107 100644
--- a/client/src/app/instance/store/effects/download-file.effects.ts
+++ b/client/src/app/instance/store/effects/download-file.effects.ts
@@ -127,14 +127,22 @@ export class DownloadFileEffects {
             ofType(downloadFileActions.startTaskCreateArchive),
             concatLatestFrom(() => [
                 this.store.select(searchSelector.selectCurrentDataset),
+                this.store.select(attributeSelector.selectAllAttributes),
                 this.store.select(searchSelector.selectCriteriaListByRoute),
                 this.store.select(coneSearchSelector.selectConeSearchByRoute),
-                this.store.select(searchSelector.selectOutputListByRoute)
+                this.store.select(searchSelector.selectOutputListByRoute),
+                this.store.select(searchSelector.selectSelectedData)
             ]),
-            mergeMap(([action, currentDataset, criteriaList, coneSearch, outputList]) => {
+            mergeMap(([action, currentDataset, attributeList, criteriaList, coneSearch, outputList, selectedData]) => {
+                const attributeId = attributeList.find(a => a.search_flag === 'ID');
                 let query: string = `${currentDataset}?a=${outputList}`;
                 if (criteriaList) {
                     query += `&c=${criteriaList}`;
+                    if (selectedData && action.selectedData) {
+                        query += `;${attributeId.id}::in::${selectedData.join('|')}`;
+                    }
+                } else if (selectedData && action.selectedData) {
+                    query += `&c=${attributeId.id}::in::${selectedData.join('|')}`;
                 }
                 if (coneSearch) {
                     query += `&cs=${coneSearch}`;
diff --git a/docker-compose.yml b/docker-compose.yml
index 463a5f3c..85f5477c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -34,7 +34,7 @@ services:
             SSO_AUTH_URL: "http://localhost:8180/auth"
             SSO_REALM: "anis"
             SSO_CLIENT_ID: "anis-client"
-            TOKEN_ENABLED: 0
+            TOKEN_ENABLED: 1
             TOKEN_JWKS_URL: "http://keycloak:8180/auth/realms/anis/protocol/openid-connect/certs"
             TOKEN_ADMIN_ROLES: anis_admin,superuser
             RMQ_HOST: rmq
diff --git a/server/src/Action/AbstractAction.php b/server/src/Action/AbstractAction.php
index 894633a7..97d75965 100644
--- a/server/src/Action/AbstractAction.php
+++ b/server/src/Action/AbstractAction.php
@@ -82,7 +82,7 @@ abstract class AbstractAction
         }
     }
 
-    private function isAdmin(array $adminRoles, $roles)
+    protected function isAdmin(array $adminRoles, $roles)
     {
         $admin = false;
         for ($i = 0; $i < count($adminRoles); $i++) {
diff --git a/server/src/Action/DatasetListByInstanceAction.php b/server/src/Action/DatasetListByInstanceAction.php
index 12747790..efa9f06a 100644
--- a/server/src/Action/DatasetListByInstanceAction.php
+++ b/server/src/Action/DatasetListByInstanceAction.php
@@ -81,8 +81,9 @@ final class DatasetListByInstanceAction extends AbstractAction
                     // If user is not connected return public datasets
                     $qb->andWhere($qb->expr()->eq('d.public', 'true'));
                 } else {
+                    $adminRoles = explode(',', $this->settings['admin_roles']);
                     $roles = $token->realm_access->roles;
-                    if (!in_array($this->settings['admin_roles'], $roles)) {
+                    if (!$this->isAdmin($adminRoles, $roles)) {
                         // If user is not an admin return public datasets
                         // And returns datasets from user's groups
                         $qb->andWhere($qb->expr()->eq('d.public', 'true'));
diff --git a/server/src/Action/StartTaskCreateArchiveAction.php b/server/src/Action/StartTaskCreateArchiveAction.php
index 898183d4..5be35c2a 100644
--- a/server/src/Action/StartTaskCreateArchiveAction.php
+++ b/server/src/Action/StartTaskCreateArchiveAction.php
@@ -92,12 +92,14 @@ final class StartTaskCreateArchiveAction extends AbstractAction
         }
 
         // If dataset is private and authorization enabled
+        $token = '';
         if (!$dataset->getPublic() && boolval($this->settings['enabled'])) {
             $this->verifyDatasetAuthorization(
                 $request,
                 $dataset->getName(),
                 explode(',', $this->settings['admin_roles'])
             );
+            $token = $request->getHeader('Authorization')[0];
         }
 
         $queryParams = $request->getQueryParams();
@@ -121,7 +123,8 @@ final class StartTaskCreateArchiveAction extends AbstractAction
             'archive_id' => $archiveId,
             'dataset_name' => $datasetName,
             'query' => $request->getUri()->getQuery(),
-            'param_a' => $queryParams['a']
+            'param_a' => $queryParams['a'],
+            'token' => $token
         )));
         $channel->basic_publish($msg, '', 'archive');
 
diff --git a/server/src/Action/StartTaskCreateResultAction.php b/server/src/Action/StartTaskCreateResultAction.php
index bc9426ea..0067b577 100644
--- a/server/src/Action/StartTaskCreateResultAction.php
+++ b/server/src/Action/StartTaskCreateResultAction.php
@@ -92,12 +92,14 @@ final class StartTaskCreateResultAction extends AbstractAction
         }
 
         // If dataset is private and authorization enabled
+        $token = '';
         if (!$dataset->getPublic() && boolval($this->settings['enabled'])) {
             $this->verifyDatasetAuthorization(
                 $request,
                 $dataset->getName(),
                 explode(',', $this->settings['admin_roles'])
             );
+            $token = $request->getHeader('Authorization')[0];
         }
 
         $queryParams = $request->getQueryParams();
@@ -128,10 +130,12 @@ final class StartTaskCreateResultAction extends AbstractAction
         // Publish message in the archive queue
         $channel = $this->rmq->channel();
         $channel->queue_declare('archive', false, false, false, false);
+
         $msg = new AMQPMessage(json_encode(array(
             'file_id' => $fileId,
             'dataset_name' => $datasetName,
-            'query' => $request->getUri()->getQuery()
+            'query' => $request->getUri()->getQuery(),
+            'token' => $token
         )));
         $channel->basic_publish($msg, '', 'result');
 
diff --git a/tasks/src/anis_tasks/archive.py b/tasks/src/anis_tasks/archive.py
index d439f79e..2e93e389 100644
--- a/tasks/src/anis_tasks/archive.py
+++ b/tasks/src/anis_tasks/archive.py
@@ -17,7 +17,7 @@ def archive_handler(ch, method, properties, body):
     attributes_selected = get_attributes_selected(attributes, message["param_a"])
 
     # Retrieve data
-    data = utils.search_data(message["dataset_name"], message["query"])
+    data = utils.search_data(message["dataset_name"], message["query"], message["token"])
 
     # create a ZipFile object
     data_path = utils.get_data_path()
diff --git a/tasks/src/anis_tasks/result.py b/tasks/src/anis_tasks/result.py
index 965b4339..27ac73df 100644
--- a/tasks/src/anis_tasks/result.py
+++ b/tasks/src/anis_tasks/result.py
@@ -11,7 +11,8 @@ def result_handler(ch, method, properties, body):
     message = json.loads(body)
 
     # Retrieve data
-    data = utils.search_data(message["dataset_name"], message["query"])
+    logging.info(message["token"])
+    data = utils.search_data(message["dataset_name"], message["query"], message["token"])
 
     # create a File object
     data_path = utils.get_data_path()
diff --git a/tasks/src/anis_tasks/utils.py b/tasks/src/anis_tasks/utils.py
index 689f4517..ae43a76b 100644
--- a/tasks/src/anis_tasks/utils.py
+++ b/tasks/src/anis_tasks/utils.py
@@ -80,10 +80,15 @@ def get_attributes(dname):
 
     return r.json()
 
-def search_data(dname, query):
+def search_data(dname, query, token):
     server_url = os.environ["SERVER_URL"]
 
-    r = requests.get(server_url + "/search/" + dname + "?" + query)
+    headers = {}
+
+    if (token):
+        headers = { "Authorization": token }
+
+    r = requests.get(server_url + "/search/" + dname + "?" + query, headers=headers)
 
     if (r.status_code == 404):
         raise DatasetNotFound(dname)
-- 
GitLab