Skip to content

Commit

Permalink
[frontend] Graph is now working (#34)
Browse files Browse the repository at this point in the history
  • Loading branch information
Samuel Hassine committed Oct 21, 2019
1 parent 62c0786 commit a2eb2b4
Show file tree
Hide file tree
Showing 18 changed files with 479 additions and 89 deletions.
20 changes: 17 additions & 3 deletions opencti-platform/opencti-front/src/components/ItemIcon.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ import {
CityVariant,
Tag,
ProgressWrench,
HexagonOutline
HexagonOutline,
VectorRadius,
} from 'mdi-material-ui';

const iconSelector = (type, variant, fontSize, color) => {
Expand Down Expand Up @@ -75,6 +76,8 @@ const iconSelector = (type, variant, fontSize, color) => {
return <BugReport style={style} fontSize={fontSize} />;
case 'report':
return <Description style={style} fontSize={fontSize} />;
case 'tag':
return <Tag style={style} fontSize={fontSize} />;
case 'domain':
case 'ipv4-addr':
case 'ipv6-addr':
Expand All @@ -86,8 +89,19 @@ const iconSelector = (type, variant, fontSize, color) => {
case 'file-sha1':
case 'file-sha256':
return <HexagonOutline style={style} fontSize={fontSize} />;
case 'stix_relation':
return <Tag style={style} fontSize={fontSize} />;
case 'targets':
case 'uses':
case 'related-to':
case 'mitigates':
case 'impersonates':
case 'indicates':
case 'comes-after':
case 'attributed-to':
case 'variant-of':
case 'localization':
case 'gathering':
case 'drops':
return <VectorRadius style={style} fontSize={fontSize} />;
default:
return <Help style={style} fontSize={fontSize} />;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,15 @@ class EntityNodeWidget extends Component {
aria-label="edit"
size="small"
onClick={this.handleEdit.bind(this, node)}
disabled={extras.disabled === true}
>
<Edit fontSize="small" />
</IconButton>
<IconButton
aria-label="delete"
size="small"
onClick={this.handleRemove.bind(this, node)}
disabled={extras.disabled === true}
>
<Delete fontSize="small" />
</IconButton>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@ const styles = () => ({
position: 'relative',
textAlign: 'center',
width: 70,
height: 30,
lineHeight: '30px',
height: 25,
lineHeight: '25px',
zIndex: 20,
borderRadius: 10,
fontSize: 11,
backgroundColor: '#303030',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
},
port: {
position: 'absolute',
Expand Down Expand Up @@ -80,10 +83,10 @@ class RelationNodeWidget extends Component {
<div
className={classes.node}
style={{
border: node.selected ? '2px solid #00c0ff' : '2px solid #ff3d00',
border: node.selected ? '2px solid #00c0ff' : '2px solid #9e9e9e',
}}
>
<strong>{t(`relation_${extras.relationship_type}`)}</strong>
<strong>{t(`relation_${extras.type}`)}</strong>
<div
className={classes.port}
style={{ display: node.selected ? 'none' : 'block' }}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import React from 'react';
import * as SRD from 'storm-react-diagrams';
import SimpleLabelWidget from './SimpleLabelWidget';
import SimpleLabelModel from './SimpleLabelModel';

export default class SimpleLabelFactory extends SRD.AbstractLabelFactory {
constructor() {
super('simple');
}

// eslint-disable-next-line class-methods-use-this
generateReactWidget(diagramEngine, label) {
return <SimpleLabelWidget model={label} />;
}

// eslint-disable-next-line class-methods-use-this
getNewInstance() {
return new SimpleLabelModel();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { LabelModel } from 'storm-react-diagrams';
import { mergeRight } from 'ramda';

export default class SimpleLabelModel extends LabelModel {
constructor() {
super('simple');
this.offsetY = -23;
this.selected = false;
this.extras = null;
}

setLabel(label) {
this.label = label;
}

setExtras(extras) {
this.extras = extras;
}

deSerialize(ob, engine) {
super.deSerialize(ob, engine);
this.extras = ob.extras;
}

serialize() {
return mergeRight(super.serialize(), {
label: this.label,
extras: this.extras,
});
}

isSelected() {
return this.selected;
}

setSelected(selected) {
this.selected = selected;
this.props.model.parent.iterateListeners((listener, event) => {
if (listener.selectionChanged) {
listener.selectionChanged({
...event,
openEdit: true,
inferred: this.props.model.parent.inferred,
isSelected: selected,
});
}
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import React, { Component } from 'react';
import * as PropTypes from 'prop-types';
import { compose, head } from 'ramda';
import { withStyles } from '@material-ui/core/styles';
import inject18n from '../i18n';

const styles = () => ({
item: {
textAlign: 'center',
padding: '5px 8px 5px 8px',
backgroundColor: '#14262c',
color: '#ffffff',
pointerEvents: 'auto',
cursor: 'pointer',
fontSize: 12,
'&:hover': {
background: '#1e3f49',
},
position: 'relative',
zIndex: 1500,
},
});

class SimpleLabelWidget extends Component {
render() {
const {
t,
nsd,
classes,
model,
model: { extras },
} = this.props;
const label = head(extras);
if (extras.length === 1) {
return (
<div
className={classes.item}
onClick={model.setSelected.bind(this, true)}
>
<strong>{t(`relation_${label.relationship_type}`)}</strong>
{label.inferred === true ? (
<span>
<br />
<em>{t('Inferred')}</em>
</span>
) : (
''
)}
{label.first_seen ? (
<span>
<br />
{nsd(label.first_seen)}
<br />
{nsd(label.last_seen)}
</span>
) : (
''
)}
</div>
);
}
return (
<div className={classes.item}>
<strong>{t(`relation_${label.relationship_type}`)}</strong>
<span>
<br />
<em>
{extras.length} {t('relations')}
</em>
</span>
</div>
);
}
}

SimpleLabelWidget.propTypes = {
model: PropTypes.object,
classes: PropTypes.object,
t: PropTypes.func,
nsd: PropTypes.func,
};

export default compose(
inject18n,
withStyles(styles),
)(SimpleLabelWidget);
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import React from 'react';
import * as SRD from 'storm-react-diagrams';
import SimpleLinkModel from './SimpleLinkModel';

export default class SimpleLinkFactory extends SRD.AbstractLinkFactory {
constructor() {
super('simple');
}

// eslint-disable-next-line class-methods-use-this
generateReactWidget(diagramEngine, link) {
return React.createElement(SRD.DefaultLinkWidget, {
link,
diagramEngine,
});
}

// eslint-disable-next-line class-methods-use-this
getNewInstance() {
return new SimpleLinkModel();
}

// eslint-disable-next-line class-methods-use-this
generateLinkSegment(model, widget, selected, path) {
const classNameNotInferred = selected ? widget.bem('--path-selected') : '';
return (
<path
className={
model.inferred ? widget.bem('--path-inferred') : classNameNotInferred
}
strokeWidth={model.width}
stroke={model.color}
d={path}
/>
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { LinkModel } from 'storm-react-diagrams';
import { mergeRight } from 'ramda';
import SimpleLabelModel from './SimpleLabelModel';

export default class SimpleLinkModel extends LinkModel {
constructor(type = 'simple') {
super(type);
this.color = '#00bcd4';
this.width = 3;
this.curvyness = 50;
this.inferred = false;
}

serialize() {
return mergeRight(super.serialize(), {
width: this.width,
color: this.color,
curvyness: this.curvyness,
inferred: this.inferred,
});
}

deSerialize(ob, engine) {
super.deSerialize(ob, engine);
this.color = ob.color;
this.width = ob.width;
this.curvyness = ob.curvyness;
this.inferred = ob.inferred;
}

addLabel(label) {
if (label instanceof SimpleLabelModel) {
return super.addLabel(label);
}
const labelOb = new SimpleLabelModel();
labelOb.setLabel(label);
return super.addLabel(labelOb);
}

setWidth(width) {
this.width = width;
this.iterateListeners((listener, event) => {
if (listener.widthChanged) {
listener.widthChanged({ ...event, width });
}
});
}

setColor(color) {
this.color = color;
this.iterateListeners((listener, event) => {
if (listener.colorChanged) {
listener.colorChanged({ ...event, color });
}
});
}

setExtras(extras) {
this.extras = extras;
}

setLabel(label) {
this.labels = [];
if (label instanceof SimpleLabelModel) {
return super.addLabel(label);
}
const labelOb = new SimpleLabelModel();
labelOb.setLabel(label);
return super.addLabel(labelOb);
}

setInferred(inferred) {
this.inferred = inferred;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import React, { Component } from 'react';
import * as PropTypes from 'prop-types';
import windowDimensions from 'react-window-dimensions';
import { compose } from 'ramda';
import { compose, differenceWith } from 'ramda';
import { withStyles } from '@material-ui/core/styles';
import {
AutoSizer,
Expand Down Expand Up @@ -44,7 +44,12 @@ class ListCardsContent extends Component {
}

componentDidUpdate(prevProps) {
if (this.props.dataList.length !== prevProps.dataList.length) {
const diff = differenceWith(
(x, y) => x.node.id === y.node.id,
this.props.dataList,
prevProps.dataList,
);
if (diff.length > 0) {
this.gridRef.forceUpdate();
}
}
Expand Down
Loading

0 comments on commit a2eb2b4

Please sign in to comment.