Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,27 +1,36 @@
<ng-container *ngIf="tableColumn.routerLink">
<span *ngFor="let link of tableColumn.routerLink(element) | async">
<ng-container *ngIf="link.tooltip; else linkTmpl">
<a [routerLink]="link.routerLink" title="{{ link.tooltip }}">
<ng-container *ngIf="link.label">
{{ link.label }}
</ng-container>
<ng-container *ngIf="!link.label">
{{ element[tableColumn.dataKey] }}
</ng-container>
</a>
<ng-container *ngFor="let link of tableColumn.routerLink(element) | async">
<ng-container *ngIf="link.label || link.routerLink">

<!-- If routerLink is set, render as link <a> -->
<ng-container *ngIf="link.routerLink; else plainText">
<a [routerLink]="link.routerLink" [title]="link.tooltip ?? ''" class="link">
<ng-container *ngIf="link.label; else fallbackLabel">
{{ link.label }}
</ng-container>
<ng-template #fallbackLabel>
{{ element[tableColumn.dataKey] }}
</ng-template>
<ng-container *ngIf="link.icon?.faIcon">
<fa-icon [icon]="link.icon.faIcon" [title]="link.icon.tooltip ?? ''"></fa-icon>
</ng-container>
</a>
</ng-container>

<!-- If no routerLink, render as plain text <span> -->
<ng-template #plainText>
<span>
<ng-container *ngIf="link.label; else fallbackPlain">
{{ link.label }}
</ng-container>
<ng-template #fallbackPlain>
{{ element[tableColumn.dataKey] }}
</ng-template>
<ng-container *ngIf="link.icon?.faIcon">
<fa-icon [icon]="link.icon.faIcon" [title]="link.icon.tooltip ?? ''"></fa-icon>
</ng-container>
</span>
</ng-template>
</ng-container>
<ng-template #linkTmpl>
<a [routerLink]="link.routerLink">
<ng-container *ngIf="link.label">
{{ link.label }}
</ng-container>
<ng-container *ngIf="!link.label">
{{ element[tableColumn.dataKey] }}
</ng-container>
<ng-container *ngIf="link.icon && link.icon.faIcon">
<fa-icon [icon]="link.icon.faIcon" title="{{ link.icon.tooltip }}"></fa-icon>
</ng-container>
</a>
</ng-template>
</span>
</ng-container>
</ng-container>
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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';

Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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' : '<b>SuperTask</b>'),
export: async (wrapper: JTaskWrapper) => (wrapper.taskType === 0 ? 'Task' : 'Supertask' + '')
render: (wrapper: JTaskWrapper) => (wrapper.taskType === TaskType.TASK ? 'Task' : '<b>SuperTask</b>'),
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
},
Expand Down Expand Up @@ -265,26 +266,26 @@ 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,
dataKey: 'isSmall',
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,
dataKey: 'isCpuTask',
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') : ''
}
];
}
Expand Down Expand Up @@ -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
};
}

Expand All @@ -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 {
Expand Down Expand Up @@ -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))}%`;
Expand Down Expand Up @@ -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 {
Expand All @@ -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)}`;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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<HTTableRouterLink[]> {
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]);
}

/**
Expand All @@ -761,18 +762,27 @@ export class TasksTableComponent extends BaseTableComponent implements OnInit, O
* @private
*/
private renderTaskWrapperLink(wrapper: JTaskWrapper): Observable<HTTableRouterLink[]> {
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);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/app/core/_datasources/hashes.datasource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<JHash> {
private _id = 0;
Expand Down
3 changes: 1 addition & 2 deletions src/app/core/_datasources/tasks-supertasks.datasource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
3 changes: 1 addition & 2 deletions src/app/core/_datasources/tasks.datasource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
28 changes: 0 additions & 28 deletions src/app/core/_models/task-wrapper.model.ts

This file was deleted.

32 changes: 32 additions & 0 deletions src/app/core/_models/task.model.ts
Original file line number Diff line number Diff line change
@@ -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
*/
Expand Down Expand Up @@ -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;
}
Loading