mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-04-02 13:45:10 -05:00
Restrict status messages by owner if set
This commit is contained in:
parent
b961df90a7
commit
022bb272e6
@ -6,4 +6,5 @@ export interface WebsocketConsumerStatusMessage {
|
|||||||
status?: string
|
status?: string
|
||||||
message?: string
|
message?: string
|
||||||
document_id: number
|
document_id: number
|
||||||
|
owner_id?: number
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import { environment } from 'src/environments/environment'
|
|||||||
import { DocumentService } from './rest/document.service'
|
import { DocumentService } from './rest/document.service'
|
||||||
import { HttpEventType, HttpResponse } from '@angular/common/http'
|
import { HttpEventType, HttpResponse } from '@angular/common/http'
|
||||||
import WS from 'jest-websocket-mock'
|
import WS from 'jest-websocket-mock'
|
||||||
|
import { SettingsService } from './settings.service'
|
||||||
|
|
||||||
describe('ConsumerStatusService', () => {
|
describe('ConsumerStatusService', () => {
|
||||||
let httpTestingController: HttpTestingController
|
let httpTestingController: HttpTestingController
|
||||||
@ -24,7 +25,21 @@ describe('ConsumerStatusService', () => {
|
|||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
providers: [ConsumerStatusService, DocumentService],
|
providers: [
|
||||||
|
ConsumerStatusService,
|
||||||
|
DocumentService,
|
||||||
|
SettingsService,
|
||||||
|
{
|
||||||
|
provide: SettingsService,
|
||||||
|
useValue: {
|
||||||
|
currentUser: {
|
||||||
|
id: 1,
|
||||||
|
username: 'testuser',
|
||||||
|
is_superuser: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
imports: [HttpClientTestingModule],
|
imports: [HttpClientTestingModule],
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -275,4 +290,32 @@ describe('ConsumerStatusService', () => {
|
|||||||
1
|
1
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should not notify current user if document has different expected owner', () => {
|
||||||
|
consumerStatusService.connect()
|
||||||
|
server.send({
|
||||||
|
task_id: '1234',
|
||||||
|
filename: 'file1.pdf',
|
||||||
|
current_progress: 50,
|
||||||
|
max_progress: 100,
|
||||||
|
docuement_id: 12,
|
||||||
|
owner_id: 1,
|
||||||
|
status: 'WORKING',
|
||||||
|
})
|
||||||
|
|
||||||
|
server.send({
|
||||||
|
task_id: '5678',
|
||||||
|
filename: 'file2.pdf',
|
||||||
|
current_progress: 50,
|
||||||
|
max_progress: 100,
|
||||||
|
docuement_id: 13,
|
||||||
|
owner_id: 2,
|
||||||
|
status: 'WORKING',
|
||||||
|
})
|
||||||
|
|
||||||
|
consumerStatusService.disconnect()
|
||||||
|
expect(consumerStatusService.getConsumerStatusNotCompleted()).toHaveLength(
|
||||||
|
1
|
||||||
|
)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'
|
|||||||
import { Subject } from 'rxjs'
|
import { Subject } from 'rxjs'
|
||||||
import { environment } from 'src/environments/environment'
|
import { environment } from 'src/environments/environment'
|
||||||
import { WebsocketConsumerStatusMessage } from '../data/websocket-consumer-status-message'
|
import { WebsocketConsumerStatusMessage } from '../data/websocket-consumer-status-message'
|
||||||
|
import { SettingsService } from './settings.service'
|
||||||
|
|
||||||
// see ConsumerFilePhase in src/documents/consumer.py
|
// see ConsumerFilePhase in src/documents/consumer.py
|
||||||
export enum FileStatusPhase {
|
export enum FileStatusPhase {
|
||||||
@ -44,6 +45,8 @@ export class FileStatus {
|
|||||||
|
|
||||||
documentId: number
|
documentId: number
|
||||||
|
|
||||||
|
ownerId: number
|
||||||
|
|
||||||
getProgress(): number {
|
getProgress(): number {
|
||||||
switch (this.phase) {
|
switch (this.phase) {
|
||||||
case FileStatusPhase.STARTED:
|
case FileStatusPhase.STARTED:
|
||||||
@ -81,7 +84,7 @@ export class FileStatus {
|
|||||||
providedIn: 'root',
|
providedIn: 'root',
|
||||||
})
|
})
|
||||||
export class ConsumerStatusService {
|
export class ConsumerStatusService {
|
||||||
constructor() {}
|
constructor(private settingsService: SettingsService) {}
|
||||||
|
|
||||||
private statusWebSocket: WebSocket
|
private statusWebSocket: WebSocket
|
||||||
|
|
||||||
@ -143,6 +146,15 @@ export class ConsumerStatusService {
|
|||||||
this.statusWebSocket.onmessage = (ev) => {
|
this.statusWebSocket.onmessage = (ev) => {
|
||||||
let statusMessage: WebsocketConsumerStatusMessage = JSON.parse(ev['data'])
|
let statusMessage: WebsocketConsumerStatusMessage = JSON.parse(ev['data'])
|
||||||
|
|
||||||
|
// tasks are async so we rely on checking user id
|
||||||
|
if (
|
||||||
|
statusMessage.owner_id &&
|
||||||
|
statusMessage.owner_id !== this.settingsService.currentUser?.id &&
|
||||||
|
!this.settingsService.currentUser?.is_superuser
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
let statusMessageGet = this.get(
|
let statusMessageGet = this.get(
|
||||||
statusMessage.task_id,
|
statusMessage.task_id,
|
||||||
statusMessage.filename
|
statusMessage.filename
|
||||||
|
@ -90,6 +90,7 @@ class Consumer(LoggingMixin):
|
|||||||
"status": status,
|
"status": status,
|
||||||
"message": message,
|
"message": message,
|
||||||
"document_id": document_id,
|
"document_id": document_id,
|
||||||
|
"owner_id": self.override_owner_id if self.override_owner_id else None,
|
||||||
}
|
}
|
||||||
async_to_sync(self.channel_layer.group_send)(
|
async_to_sync(self.channel_layer.group_send)(
|
||||||
"status_updates",
|
"status_updates",
|
||||||
@ -118,7 +119,7 @@ class Consumer(LoggingMixin):
|
|||||||
self.override_document_type_id = None
|
self.override_document_type_id = None
|
||||||
self.override_asn = None
|
self.override_asn = None
|
||||||
self.task_id = None
|
self.task_id = None
|
||||||
self.owner_id = None
|
self.override_owner_id = None
|
||||||
|
|
||||||
self.channel_layer = get_channel_layer()
|
self.channel_layer = get_channel_layer()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user