diff --git a/src/app/core/_components/tables/ht-table/type/link/ht-table-type-link.component.html b/src/app/core/_components/tables/ht-table/type/link/ht-table-type-link.component.html
index bd2565703..5865efae4 100644
--- a/src/app/core/_components/tables/ht-table/type/link/ht-table-type-link.component.html
+++ b/src/app/core/_components/tables/ht-table/type/link/ht-table-type-link.component.html
@@ -1,27 +1,36 @@
-
-
-
-
- {{ link.label }}
-
-
- {{ element[tableColumn.dataKey] }}
-
-
+
+
+
+
+
+
+
+ {{ link.label }}
+
+
+ {{ element[tableColumn.dataKey] }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ link.label }}
+
+
+ {{ element[tableColumn.dataKey] }}
+
+
+
+
+
+
-
-
-
- {{ link.label }}
-
-
- {{ element[tableColumn.dataKey] }}
-
-
-
-
-
-
-
+
diff --git a/src/app/core/_components/tables/tasks-table/tasks-table.component.ts b/src/app/core/_components/tables/tasks-table/tasks-table.component.ts
index 41fce4927..d103356a0 100644
--- a/src/app/core/_components/tables/tasks-table/tasks-table.component.ts
+++ b/src/app/core/_components/tables/tasks-table/tasks-table.component.ts
@@ -5,8 +5,7 @@ import { SafeHtml } from '@angular/platform-browser';
import { ChunkData } from '@models/chunk.model';
import { JHashlist } from '@models/hashlist.model';
-import { JTaskWrapper } from '@models/task-wrapper.model';
-import { JTask } from '@models/task.model';
+import { JTask, JTaskWrapper, TaskType } from '@models/task.model';
import { TaskContextMenuService } from '@services/context-menu/tasks/task-menu.service';
import { SERV } from '@services/main.config';
@@ -32,7 +31,6 @@ import {
import { TasksDataSource } from '@datasources/tasks.datasource';
-import { TaskWrapper } from '@src/app/core/_constants/userpermissions.config';
import { convertCrackingSpeed, convertToLocale } from '@src/app/shared/utils/util';
import { ModalSubtasksComponent } from '@src/app/tasks/show-tasks/modal-subtasks/modal-subtasks.component';
@@ -102,13 +100,12 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
);
case 'id':
- return item.id?.toString().toLowerCase().includes(filterValue);
-
+ return item.tasks?.some((task: JTask) => task.id?.toString().toLowerCase().includes(filterValue));
case 'taskName':
return item.tasks?.some((task: JTask) => task.taskName?.toLowerCase().includes(filterValue));
case 'taskType': {
- const typeText = item.taskType === 0 ? 'task' : 'supertask';
+ const typeText = item.taskType === TaskType.TASK ? 'task' : 'supertask';
return typeText.includes(filterValue);
}
@@ -145,20 +142,24 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
dataKey: 'id',
isSortable: true,
isSearchable: true,
- export: async (wrapper: JTaskWrapper) => wrapper.id + ''
+ export: async (wrapper: JTaskWrapper) => {
+ return wrapper.taskType === TaskType.TASK ? wrapper.tasks[0]?.id + '' : '';
+ },
+ render: (wrapper: JTaskWrapper) => {
+ return wrapper.taskType === TaskType.TASK ? wrapper.tasks[0]?.id + '' : '';
+ }
},
{
id: TaskTableCol.TASK_TYPE,
dataKey: 'taskType',
- render: (wrapper: JTaskWrapper) => (wrapper.taskType === 0 ? 'Task' : 'SuperTask'),
- export: async (wrapper: JTaskWrapper) => (wrapper.taskType === 0 ? 'Task' : 'Supertask' + '')
+ render: (wrapper: JTaskWrapper) => (wrapper.taskType === TaskType.TASK ? 'Task' : 'SuperTask'),
+ export: async (wrapper: JTaskWrapper) => (wrapper.taskType === TaskType.TASK ? 'Task' : 'Supertask' + '')
},
{
id: TaskTableCol.NAME,
dataKey: 'taskName',
routerLink: (wrapper: JTaskWrapper) => this.renderTaskWrapperLink(wrapper),
isSearchable: true,
-
isSortable: false,
export: async (wrapper: JTaskWrapper) => wrapper.tasks[0]?.taskName
},
@@ -265,10 +266,10 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
id: TaskTableCol.PREPROCESSOR,
dataKey: 'preprocessorId',
render: (wrapper: JTaskWrapper) =>
- wrapper.taskType === 0 && wrapper.tasks[0].preprocessorId === 1 ? 'Prince' : '',
+ wrapper.taskType === TaskType.TASK && wrapper.tasks[0].preprocessorId === 1 ? 'Prince' : '',
isSortable: false,
export: async (wrapper: JTaskWrapper) =>
- wrapper.taskType === 0 && wrapper.tasks[0].preprocessorId === 1 ? 'Prince' : ''
+ wrapper.taskType === TaskType.TASK && wrapper.tasks[0].preprocessorId === 1 ? 'Prince' : ''
},
{
id: TaskTableCol.IS_SMALL,
@@ -276,7 +277,7 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
icon: (wrapper: JTaskWrapper) => this.renderIsSmallIcon(wrapper),
isSortable: false,
export: async (wrapper: JTaskWrapper) =>
- wrapper.taskType === 0 ? (wrapper.tasks[0].isSmall ? 'Yes' : 'No') : ''
+ wrapper.taskType === TaskType.TASK ? (wrapper.tasks[0].isSmall ? 'Yes' : 'No') : ''
},
{
id: TaskTableCol.IS_CPU_TASK,
@@ -284,7 +285,7 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
icon: (wrapper: JTaskWrapper) => this.renderIsCpuTaskIcon(wrapper),
isSortable: false,
export: async (wrapper: JTaskWrapper) =>
- wrapper.taskType === 0 ? (wrapper.tasks[0].isCpuTask ? 'Yes' : 'No') : ''
+ wrapper.taskType === TaskType.TASK ? (wrapper.tasks[0].isCpuTask ? 'Yes' : 'No') : ''
}
];
}
@@ -328,7 +329,7 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
getRowDeleteLabel(data: JTaskWrapper): JTaskWrapper {
return {
...data,
- taskName: data.taskType === 1 ? data.taskWrapperName : data.tasks[0].taskName
+ taskName: data.taskType === TaskType.SUPERTASK ? data.taskWrapperName : data.tasks[0].taskName
};
}
@@ -338,7 +339,7 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
// Preprocess the data and count the occurrences of each type
const updatedData: JTaskWrapper[] = event.data.map((taskWrapper: JTaskWrapper) => {
- if (taskWrapper.taskType === 1) {
+ if (taskWrapper.taskType === TaskType.SUPERTASK) {
superTasksCount++;
return { ...taskWrapper, taskName: taskWrapper.taskWrapperName };
} else {
@@ -426,7 +427,7 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
}
getDispatchedSearchedString(wrapper: JTaskWrapper): string {
- if (wrapper.taskType === 0) {
+ if (wrapper.taskType === TaskType.TASK) {
const task: JTask = wrapper.tasks[0];
if (task.keyspace > 0) {
return `${convertToLocale(Number(task.dispatched))}% / ${convertToLocale(Number(task.searched))}%`;
@@ -480,7 +481,7 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
}
getNumAgents(wrapper: JTaskWrapper): number {
- return wrapper.taskType === 0 && wrapper.chunkData ? wrapper.chunkData.agents.length : 0;
+ return wrapper.taskType === TaskType.TASK && wrapper.chunkData ? wrapper.chunkData.agents.length : 0;
}
renderAgents(wrapper: JTaskWrapper): SafeHtml {
@@ -490,7 +491,7 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
renderSpeed(wrapper: JTaskWrapper): SafeHtml {
let html = '';
- if (wrapper.taskType === 0) {
+ if (wrapper.taskType === TaskType.TASK) {
const chunkData: ChunkData = wrapper.chunkData;
if (chunkData && 'speed' in chunkData && chunkData.speed > 0) {
html = `${convertCrackingSpeed(chunkData.speed)}`;
@@ -522,7 +523,7 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
}
private getTaskStatus(wrapper: JTaskWrapper): TaskStatus {
- if (wrapper.taskType === 0 && wrapper.tasks.length > 0) {
+ if (wrapper.taskType === TaskType.TASK && wrapper.tasks.length > 0) {
const chunkData: ChunkData = wrapper.chunkData;
if (chunkData) {
const speed = chunkData.speed;
@@ -560,7 +561,7 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
private renderBoolIcon(wrapper: JTaskWrapper, key: string, equals: string = ''): HTTableIcon {
let icon: HTTableIcon = { name: '' };
- if (wrapper.taskType === 0) {
+ if (wrapper.taskType === TaskType.TASK) {
const task: JTask = wrapper.tasks[0];
if (equals === '') {
if (task[key] === true) {
@@ -737,21 +738,21 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
}
/**
- * Render router link to show cracked hashes for a task
+ * Render router link to show cracked hashes for a task if any.
+ * For supertasks only the cracked number as text is shown
* @param wrapper - the task wrapper object to render the link for
* @return observable containing an array of router links to be rendered in HTML
* @private
*/
private renderCrackedLinkFromWrapper(wrapper: JTaskWrapper): Observable {
- const links: HTTableRouterLink[] = [];
- if (wrapper.taskType === 0) {
- links.push({
- label: wrapper.cracked.toLocaleString(),
- routerLink: ['/hashlists', 'hashes', 'tasks', wrapper.id]
- });
+ if (wrapper.cracked === 0) {
+ return of([{ label: null, routerLink: null }]);
}
-
- return of(links);
+ const link: HTTableRouterLink = {
+ label: wrapper.cracked.toLocaleString(),
+ routerLink: wrapper.taskType === TaskType.TASK ? ['/hashlists', 'hashes', 'tasks', wrapper.tasks[0].id] : null
+ };
+ return of([link]);
}
/**
@@ -761,18 +762,27 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
* @private
*/
private renderTaskWrapperLink(wrapper: JTaskWrapper): Observable {
- const links: HTTableRouterLink[] = [];
- for (const task of wrapper.tasks) {
- const taskName = task.taskName?.length > 40 ? `${task.taskName.substring(40)}...` : task.taskName;
-
- links.push({
- label: taskName,
- routerLink: ['/tasks', 'show-tasks', task.id, 'edit'],
- tooltip: task.attackCmd
- });
+ if (wrapper.taskType === TaskType.TASK) {
+ const task = wrapper.tasks?.[0];
+ const taskName = task?.taskName?.length > 40 ? `${task.taskName.substring(0, 40)}...` : task?.taskName;
+
+ return of([
+ {
+ label: taskName,
+ routerLink: ['/tasks', 'show-tasks', task?.id, 'edit'],
+ tooltip: task?.attackCmd ?? ''
+ }
+ ]);
+ } else {
+ // Supertask: No link
+ return of([
+ {
+ label: wrapper.taskWrapperName,
+ routerLink: null,
+ tooltip: ''
+ }
+ ]);
}
-
- return of(links);
}
/**
diff --git a/src/app/core/_datasources/hashes.datasource.ts b/src/app/core/_datasources/hashes.datasource.ts
index ecda25d76..4ea13b28f 100644
--- a/src/app/core/_datasources/hashes.datasource.ts
+++ b/src/app/core/_datasources/hashes.datasource.ts
@@ -3,11 +3,11 @@ import { catchError, finalize, of } from 'rxjs';
import { BaseDataSource } from '@datasources/base.datasource';
import { FilterType } from '@models/request-params.model';
import { JHash } from '@models/hash.model';
-import { JTaskWrapper } from '@models/task-wrapper.model';
import { JsonAPISerializer } from '@services/api/serializer-service';
import { RequestParamBuilder } from '@services/params/builder-implementation.service';
import { ResponseWrapper } from '@models/response.model';
import { SERV } from '@services/main.config';
+import { JTaskWrapper } from '@models/task.model';
export class HashesDataSource extends BaseDataSource {
private _id = 0;
diff --git a/src/app/core/_datasources/tasks-supertasks.datasource.ts b/src/app/core/_datasources/tasks-supertasks.datasource.ts
index 14d301f15..2d3639b00 100644
--- a/src/app/core/_datasources/tasks-supertasks.datasource.ts
+++ b/src/app/core/_datasources/tasks-supertasks.datasource.ts
@@ -3,8 +3,7 @@ import { catchError, finalize, of } from 'rxjs';
import { JChunk } from '@models/chunk.model';
import { FilterType } from '@models/request-params.model';
import { ResponseWrapper } from '@models/response.model';
-import { JTaskWrapper } from '@models/task-wrapper.model';
-import { JTask } from '@models/task.model';
+import { JTask, JTaskWrapper } from '@models/task.model';
import { JsonAPISerializer } from '@services/api/serializer-service';
import { SERV } from '@services/main.config';
diff --git a/src/app/core/_datasources/tasks.datasource.ts b/src/app/core/_datasources/tasks.datasource.ts
index 730f685d8..ac37a651e 100644
--- a/src/app/core/_datasources/tasks.datasource.ts
+++ b/src/app/core/_datasources/tasks.datasource.ts
@@ -4,8 +4,7 @@ import { finalize } from 'rxjs/operators';
import { JChunk } from '@models/chunk.model';
import { FilterType } from '@models/request-params.model';
import { ResponseWrapper } from '@models/response.model';
-import { JTaskWrapper } from '@models/task-wrapper.model';
-import { JTask } from '@models/task.model';
+import { JTask, JTaskWrapper } from '@models/task.model';
import { SERV } from '@services/main.config';
import { RequestParamBuilder } from '@services/params/builder-implementation.service';
diff --git a/src/app/core/_models/task-wrapper.model.ts b/src/app/core/_models/task-wrapper.model.ts
deleted file mode 100644
index dc7daed9d..000000000
--- a/src/app/core/_models/task-wrapper.model.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { JAccessGroup } from '@models/access-group.model';
-import { BaseModel } from '@models/base.model';
-import { ChunkData } from '@models/chunk.model';
-import { JHashlist } from '@models/hashlist.model';
-import { JHashtype } from '@models/hashtype.model';
-import { JTask } from '@models/task.model';
-
-/**
- * Interface definition for a task wrapper (wrapper object for tasks and supertasks)
- */
-export interface JTaskWrapper extends BaseModel {
- accessGroupId: number;
- accessGroup?: JAccessGroup;
- accessGroupName?: string;
- cracked: number;
- hashlistId: number;
- hashlist?: JHashlist;
- hashType?: JHashtype;
- isArchived: boolean;
- maxAgents: number;
- priority: number;
- taskType: number;
- taskWrapperId: number;
- taskWrapperName: string;
- tasks?: JTask[];
- taskName?: string;
- chunkData?: ChunkData;
-}
diff --git a/src/app/core/_models/task.model.ts b/src/app/core/_models/task.model.ts
index 13957e5e6..072f93cfd 100644
--- a/src/app/core/_models/task.model.ts
+++ b/src/app/core/_models/task.model.ts
@@ -1,11 +1,21 @@
+import { JAccessGroup } from '@models/access-group.model';
import { JAgent } from '@models/agent.model';
import { BaseModel } from '@models/base.model';
import { ChunkData } from '@models/chunk.model';
import { JCrackerBinary, JCrackerBinaryType } from '@models/cracker-binary.model';
import { JFile } from '@models/file.model';
import { JHashlist } from '@models/hashlist.model';
+import { JHashtype } from '@models/hashtype.model';
import { SpeedStat } from '@models/speed-stat.model';
+/**
+ * Enum definition for taskType (task or supertask)
+ */
+export enum TaskType {
+ TASK = 0,
+ SUPERTASK = 1
+}
+
/**
* Interface definition for a cracking task
*/
@@ -43,3 +53,25 @@ export interface JTask extends BaseModel {
speeds: SpeedStat[];
chunkData?: ChunkData;
}
+
+/**
+ * Interface definition for a task wrapper (wrapper object for cracking tasks and supertasks)
+ */
+export interface JTaskWrapper extends BaseModel {
+ accessGroupId: number;
+ accessGroup?: JAccessGroup;
+ accessGroupName?: string;
+ cracked: number;
+ hashlistId: number;
+ hashlist?: JHashlist;
+ hashType?: JHashtype;
+ isArchived: boolean;
+ maxAgents: number;
+ priority: number;
+ taskType: TaskType;
+ taskWrapperId: number;
+ taskWrapperName: string;
+ tasks?: JTask[];
+ taskName?: string;
+ chunkData?: ChunkData;
+}
diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts
index fa6b1ce3c..b5b17b167 100644
--- a/src/app/home/home.component.ts
+++ b/src/app/home/home.component.ts
@@ -5,7 +5,9 @@ import { CanvasRenderer } from 'echarts/renderers';
import { Subscription } from 'rxjs';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
-import { Component, OnDestroy, OnInit, AfterViewInit } from '@angular/core';
+import { AfterViewInit, Component, OnDestroy, OnInit } from '@angular/core';
+
+import { TaskType } from '@models/task.model';
import { PermissionService } from '@services/permission/permission.service';
import { AlertService } from '@services/shared/alert.service';
@@ -363,7 +365,7 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
*/
private getSuperTasks(): void {
const paramsTotalTasks = new RequestParamBuilder()
- .addFilter({ field: 'taskType', operator: FilterType.EQUAL, value: 1 })
+ .addFilter({ field: 'taskType', operator: FilterType.EQUAL, value: TaskType.SUPERTASK })
.create();
this.subscriptions.push(
@@ -375,7 +377,7 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
const paramsCompletedTasks = new RequestParamBuilder()
.addFilter({ field: 'keyspace', operator: FilterType.EQUAL, value: 'keyspaceProgress' })
.addFilter({ field: 'keyspace', operator: FilterType.GREATER, value: 0 })
- .addFilter({ field: 'taskType', operator: FilterType.EQUAL, value: 1 })
+ .addFilter({ field: 'taskType', operator: FilterType.EQUAL, value: TaskType.SUPERTASK })
.addInclude('tasks')
.create();
diff --git a/src/app/shared/graphs/graphs.module.ts b/src/app/shared/graphs/graphs.module.ts
index 7904f7fcb..c8f299451 100644
--- a/src/app/shared/graphs/graphs.module.ts
+++ b/src/app/shared/graphs/graphs.module.ts
@@ -1,16 +1,16 @@
-import { TaskVisualomponent } from "./task-visual/task-visual.component";
+import { TaskVisualComponent } from "./task-visual/task-visual.component";
import { CommonModule } from "@angular/common";
import { NgModule } from "@angular/core";
@NgModule({
declarations:[
- TaskVisualomponent,
+ TaskVisualComponent,
],
imports:[
CommonModule
],
exports:[
- TaskVisualomponent
+ TaskVisualComponent
]
})
export class GraphsModule {}
diff --git a/src/app/shared/graphs/task-visual/task-visual.component.ts b/src/app/shared/graphs/task-visual/task-visual.component.ts
index 8f748c7d0..418aad4c6 100644
--- a/src/app/shared/graphs/task-visual/task-visual.component.ts
+++ b/src/app/shared/graphs/task-visual/task-visual.component.ts
@@ -1,33 +1,29 @@
-import { Component, ElementRef, Input, ViewChild } from '@angular/core';
-import { GlobalService } from '../../../core/_services/main.service';
-import { SERV } from '../../../core/_services/main.config';
import { FilterType } from 'src/app/core/_models/request-params.model';
-import { RequestParamBuilder } from '@services/params/builder-implementation.service';
-import { JTask } from '@models/task.model';
+
+import { AfterViewInit, Component, ElementRef, Input, ViewChild } from '@angular/core';
+
+import { JChunk } from '@models/chunk.model';
import { ResponseWrapper } from '@models/response.model';
+import { JTask, JTaskWrapper, TaskType } from '@models/task.model';
+
import { JsonAPISerializer } from '@services/api/serializer-service';
-import { JTaskWrapper } from '@models/task-wrapper.model';
-import { JChunk } from '@models/chunk.model';
+import { SERV } from '@services/main.config';
+import { GlobalService } from '@services/main.service';
+import { RequestParamBuilder } from '@services/params/builder-implementation.service';
@Component({
- selector: 'task-visual',
- template: `
-