juice-shop
109 строк · 3.7 Кб
1/*
2* Copyright (c) 2014-2024 Bjoern Kimminich & the OWASP Juice Shop contributors.
3* SPDX-License-Identifier: MIT
4*/
5
6import { UserDetailsComponent } from '../user-details/user-details.component'
7import { FeedbackDetailsComponent } from '../feedback-details/feedback-details.component'
8import { MatDialog } from '@angular/material/dialog'
9import { FeedbackService } from '../Services/feedback.service'
10import { MatTableDataSource } from '@angular/material/table'
11import { UserService } from '../Services/user.service'
12import { Component, type OnInit, ViewChild } from '@angular/core'
13import { DomSanitizer } from '@angular/platform-browser'
14import { library } from '@fortawesome/fontawesome-svg-core'
15import { faArchive, faEye, faHome, faTrashAlt, faUser } from '@fortawesome/free-solid-svg-icons'
16import { MatPaginator } from '@angular/material/paginator'
17
18library.add(faUser, faEye, faHome, faArchive, faTrashAlt)
19
20@Component({
21selector: 'app-administration',
22templateUrl: './administration.component.html',
23styleUrls: ['./administration.component.scss']
24})
25export class AdministrationComponent implements OnInit {
26public userDataSource: any
27public userDataSourceHidden: any
28public userColumns = ['user', 'email', 'user_detail']
29public feedbackDataSource: any
30public feedbackColumns = ['user', 'comment', 'rating', 'remove']
31public error: any
32public resultsLengthUser = 0
33public resultsLengthFeedback = 0
34@ViewChild('paginatorUsers') paginatorUsers: MatPaginator
35@ViewChild('paginatorFeedb') paginatorFeedb: MatPaginator
36constructor (private readonly dialog: MatDialog, private readonly userService: UserService, private readonly feedbackService: FeedbackService,
37private readonly sanitizer: DomSanitizer) {}
38
39ngOnInit () {
40this.findAllUsers()
41this.findAllFeedbacks()
42}
43
44findAllUsers () {
45this.userService.find().subscribe((users) => {
46this.userDataSource = users
47this.userDataSourceHidden = users
48for (const user of this.userDataSource) {
49user.email = this.sanitizer.bypassSecurityTrustHtml(`<span class="${this.doesUserHaveAnActiveSession(user) ? 'confirmation' : 'error'}">${user.email}</span>`)
50}
51this.userDataSource = new MatTableDataSource(this.userDataSource)
52this.userDataSource.paginator = this.paginatorUsers
53this.resultsLengthUser = users.length
54}, (err) => {
55this.error = err
56console.log(this.error)
57})
58}
59
60findAllFeedbacks () {
61this.feedbackService.find().subscribe((feedbacks) => {
62this.feedbackDataSource = feedbacks
63for (const feedback of this.feedbackDataSource) {
64feedback.comment = this.sanitizer.bypassSecurityTrustHtml(feedback.comment)
65}
66this.feedbackDataSource = new MatTableDataSource(this.feedbackDataSource)
67this.feedbackDataSource.paginator = this.paginatorFeedb
68this.resultsLengthFeedback = feedbacks.length
69}, (err) => {
70this.error = err
71console.log(this.error)
72})
73}
74
75deleteFeedback (id: number) {
76this.feedbackService.del(id).subscribe(() => {
77this.findAllFeedbacks()
78}, (err) => {
79this.error = err
80console.log(this.error)
81})
82}
83
84showUserDetail (id: number) {
85this.dialog.open(UserDetailsComponent, {
86data: {
87id
88}
89})
90}
91
92showFeedbackDetails (feedback: any, id: number) {
93this.dialog.open(FeedbackDetailsComponent, {
94data: {
95feedback,
96id
97}
98})
99}
100
101times (numberOfTimes: number) {
102return Array(numberOfTimes).fill('★')
103}
104
105doesUserHaveAnActiveSession (user: { email: string, lastLoginTime: number }) {
106const SIX_HOURS_IN_SECONDS = 60 * 60 * 6
107return user.lastLoginTime && user.lastLoginTime > ((Date.now() / 1000) - SIX_HOURS_IN_SECONDS)
108}
109}
110