Идём по киберследу: Анализ защищенности Active Directory c помощью утилиты BloodHound — страница 40 из 46

localuserVisible: false,

shareVisible: false
,

templateVisible: false,

Дальше нужно добавить обработку при нажатии на узел. Для этого находим строку

nodeClickHandler(type)
и добавляем код:

nodeClickHandler(type) {

} else if (type === 'Share') {

this._shareNodeClicked();

} else if (type === 'Template') {

this._templateNodeClicked();

Ниже находим изменение состояния видимости вкладки для каждой метки. Код начинается с

_labelNodeClicked.
Для локального пользователя код будет выглядеть следующим образом:

_shareNodeClicked() {

this.clearVisible()

this.setState({

shareVisible: true,

selected:2

});

}

_templateNodeClicked() {

this.clearVisible()

this.setState({

templateVisible: true,

selected:2

});

}

Ниже в функции отображения

render()
находим строку
NoNodeData
и добавляем следующий код:

render() {

visible={

!this.state.localuserVisible &&

!this.state.shareVisible &&

!this.state.templateVisible &&

И еще ниже добавим отображение вкладки со свойствами для

TemplateNodeData:

Сохраняем измененный файл.

Переходим в директорию

src\components\Spotlight
и открываем на редактирование файл
SpotlightRow.jsx.
В функции
render
находим строку
switch (this.props.nodeType)
и добавляем код:

render() {

let nodeIcon;

let parentIcon = '';

switch (this.props.nodeType) {

case 'Share':

nodeIcon = 'fa fa-folder';

break;

case 'Template':

nodeIcon = 'fa fa-id-card';

break;

default:

nodeIcon = '';

break;

}

Ниже находим строку

switch (this.props.parentNodeType)
и добавляем отображение родительской иконки:

switch (this.props.parentNodeType) {

case 'Share':

parentIcon = 'fa fa-folder';

break;

case 'Template':

parentIcon = 'fa fa-id-card';

break;

default:

parentIcon = '';

break;

}

Сохраняем измененный файл.

B завершение создадим вкладку с отображением свойств шаблона сертификата. Переходим в директорию

src\components\SearchContainer\Tabs.
Скопируем файл
UserNodeData.jsx
и назовем его
TemplateNodeData.jsx.
Шаги по изменению кода будут описаны в нем самом:

import React, {useEffect, useState} from 'react';

import clsx from 'clsx';

import CollapsibleSection from './Components/CollapsibleSection';

import NodeCypherLinkComplex from './Components/NodeCypherLinkComplex';

import NodeCypherLink from './Components/NodeCypherLink';

import NodeCypherNoNumberLink from './Components/NodeCypherNoNumberLink';

import MappedNodeProps from './Components/MappedNodeProps';

import ExtraNodeProps from './Components/ExtraNodeProps';

import NodePlayCypherLink from './Components/NodePlayCypherLink';

import {withAlert} from 'react-alert';

import {Table} from 'react-bootstrap';

import styles from './NodeData.module.css';

import {useContext} from 'react';

import {AppContext} from '../../../AppContext';

// Меняем название метки на TemplateNodeData

const 
TemplateNodeData
 = () => {

const [visible, setVisible] = useState(false);

const [objectId, setObjectId] = useState(null);

const [label, setLabel] = useState(null);

const [domain, setDomain] = useState(null);

const [nodeProps, setNodeProps] = useState({});

const context = useContext(AppContext);

useEffect(() => {

emitter.on('nodeClicked', nodeClickEvent);

return () => {

emitter.removeListener('nodeClicked', nodeClickEvent);

};

}, []);

const nodeClickEvent = (type, id, blocksinheritance, domain) => {

// Меняем название метки Template

if (type === '
Template
') {

setVisible(true);

setObjectId(id);

setDomain(domain);

let session = driver.session();

session

// Меняем метку на Template

.run('MATCH (n:
Template
 {objectid:$objectid}) RETURN n AS node', {

objectid: id,

})

.then((r) => {

let props = r.records[0].get('node'). properties;

setNodeProps(props);

setLabel(props.name || props.azname || objectid);

session.close();

});

} else {

setObjectId(null);

setVisible(false);

}

};

//Здесь определяется, какие свойства узла попадут

//в раздел NODE PROPERTIES, остальные будут

//отображаться в EXTRA PROPERTIES

const displayMap = {

displayname:'Display Name',

objectid: