Fix queries with start/end shortestpath

master
Rohan Vazarkar 2017-09-28 12:40:26 -04:00
parent 3690a5ad86
commit c29d3c168a
4 changed files with 1283 additions and 1231 deletions

View File

@ -84,11 +84,11 @@ export default class ComputerNodeData extends Component {
s4.run("MATCH p=(n:Computer {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(c2:Computer) RETURN count(c2)", {name:payload}) s4.run("MATCH p=(n:Computer {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(c2:Computer) RETURN count(c2)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'groupDelegatedLocalAdmin':result.records[0]._fields[0].low}) this.setState({'groupDelegatedLocalAdmin':result.records[0]._fields[0].low});
s4.close() s4.close();
}.bind(this)) }.bind(this))
s5.run("MATCH (n:Computer {name:{name}}), (m:Computer), p=shortestPath((n)-[r:AdminTo|MemberOf*1..]->(m)) RETURN count(distinct(m))", {name:payload}) s5.run("MATCH (n:Computer {name:{name}}), (m:Computer) WHERE NOT m.name={name} MATCH p=shortestPath((n)-[r:AdminTo|MemberOf*1..]->(m)) RETURN count(distinct(m))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'derivativeLocalAdmin':result.records[0]._fields[0].low}) this.setState({'derivativeLocalAdmin':result.records[0]._fields[0].low})
s5.close() s5.close()
@ -112,7 +112,7 @@ export default class ComputerNodeData extends Component {
s8.close() s8.close()
}.bind(this)) }.bind(this))
s9.run("MATCH p = shortestPath((n)-[r:AdminTo|MemberOf|HasSession*1..]->(m:Computer {name:{name}})) RETURN COUNT(DISTINCT(n))", {name:payload}) s9.run("MATCH (n) WHERE NOT n.name={name} WITH n MATCH p = shortestPath((n)-[r:AdminTo|MemberOf|HasSession*1..]->(m:Computer {name:{name}})) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'derivativeLocalAdmins':result.records[0]._fields[0].low}) this.setState({'derivativeLocalAdmins':result.records[0]._fields[0].low})
s9.close() s9.close()
@ -136,7 +136,7 @@ export default class ComputerNodeData extends Component {
s12.close() s12.close()
}.bind(this)) }.bind(this))
s13.run("MATCH p = shortestPath((c:Computer {name:{name}})-[r:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN COUNT(DISTINCT(n))", {name:payload}) s13.run("MATCH (n) WHERE NOT n.name={name} WITH n MATCH p = shortestPath((c:Computer {name:{name}})-[r:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'transitiveControl':result.records[0]._fields[0].low}) this.setState({'transitiveControl':result.records[0]._fields[0].low})
s13.close() s13.close()
@ -178,7 +178,8 @@ export default class ComputerNodeData extends Component {
click={function(){ click={function(){
emitter.emit('query', emitter.emit('query',
"MATCH (m:Computer {name:{name}})-[r:HasSession]->(n:User) WITH n,r,m WHERE NOT n.name ENDS WITH '$' RETURN n,r,m", {name: this.state.label}) "MATCH (m:Computer {name:{name}})-[r:HasSession]->(n:User) WITH n,r,m WHERE NOT n.name ENDS WITH '$' RETURN n,r,m", {name: this.state.label})
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4>Local Admins</h4> <h4>Local Admins</h4>
@ -192,7 +193,8 @@ export default class ComputerNodeData extends Component {
click={function(){ click={function(){
emitter.emit('query', emitter.emit('query',
"MATCH (n)-[r:AdminTo]->(m:Computer {name:{name}}) RETURN n,r,m",{name: this.state.label}) "MATCH (n)-[r:AdminTo]->(m:Computer {name:{name}}) RETURN n,r,m",{name: this.state.label})
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Unrolled Admins Unrolled Admins
@ -206,7 +208,8 @@ export default class ComputerNodeData extends Component {
"MATCH p = (n:User)-[r:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(c:Computer {name:{name}}) RETURN p", "MATCH p = (n:User)-[r:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(c:Computer {name:{name}}) RETURN p",
{name: this.state.label}, {name: this.state.label},
this.state.label) this.state.label)
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Derivative Local Admins Derivative Local Admins
@ -217,8 +220,9 @@ export default class ComputerNodeData extends Component {
value={this.state.derivativeLocalAdmins} value={this.state.derivativeLocalAdmins}
click={function(){ click={function(){
emitter.emit('query', emitter.emit('query',
"MATCH p = shortestPath((n)-[r:AdminTo|MemberOf|HasSession*1..]->(m:Computer {name:{name}})) RETURN p",{name: this.state.label}, this.state.label) "MATCH (n) WHERE NOT n.name={name} WITH n MATCH p = shortestPath((n)-[r:AdminTo|MemberOf|HasSession*1..]->(m:Computer {name:{name}})) RETURN p",{name: this.state.label}, this.state.label)
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4>Group Memberships</h4> <h4>Group Memberships</h4>
@ -232,7 +236,8 @@ export default class ComputerNodeData extends Component {
click={function(){ click={function(){
emitter.emit('query', emitter.emit('query',
"MATCH (n:Computer {name:{name}}),(m:Group), (n)-[r:MemberOf]->(m) RETURN n,r,m",{name: this.state.label}, this.state.label) "MATCH (n:Computer {name:{name}}),(m:Group), (n)-[r:MemberOf]->(m) RETURN n,r,m",{name: this.state.label}, this.state.label)
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Unrolled Group Membership Unrolled Group Membership
@ -244,7 +249,8 @@ export default class ComputerNodeData extends Component {
click={function(){ click={function(){
emitter.emit('query', emitter.emit('query',
"MATCH p = (n:Computer {name:{name}})-[r:MemberOf*1..]->(m:Group) RETURN p",{name: this.state.label}, this.state.label) "MATCH p = (n:Computer {name:{name}})-[r:MemberOf*1..]->(m:Group) RETURN p",{name: this.state.label}, this.state.label)
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Foreign Group Membership Foreign Group Membership
@ -256,7 +262,8 @@ export default class ComputerNodeData extends Component {
click={function(){ click={function(){
emitter.emit('query', emitter.emit('query',
"MATCH p = (c:Computer {name:{name}})-[r:MemberOf*1..]->(g:Group) WHERE NOT g.domain = c.domain RETURN p",{name: this.state.label}, this.state.label) "MATCH p = (c:Computer {name:{name}})-[r:MemberOf*1..]->(g:Group) WHERE NOT g.domain = c.domain RETURN p",{name: this.state.label}, this.state.label)
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4>Local Admin Rights</h4> <h4>Local Admin Rights</h4>
@ -270,7 +277,8 @@ export default class ComputerNodeData extends Component {
click={function(){ click={function(){
emitter.emit('query', emitter.emit('query',
"MATCH (n:Computer {name:{name}}), (m:Computer), p=(n)-[r:AdminTo]->(m) RETURN p",{name: this.state.label}, this.state.label) "MATCH (n:Computer {name:{name}}), (m:Computer), p=(n)-[r:AdminTo]->(m) RETURN p",{name: this.state.label}, this.state.label)
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Group Delegated Local Admin Group Delegated Local Admin
@ -282,7 +290,8 @@ export default class ComputerNodeData extends Component {
click={function(){ click={function(){
emitter.emit('query', emitter.emit('query',
"MATCH p=(n:Computer {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(m:Computer) RETURN p",{name: this.state.label}, this.state.label) "MATCH p=(n:Computer {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(m:Computer) RETURN p",{name: this.state.label}, this.state.label)
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Derivative Local Admin Derivative Local Admin
@ -293,8 +302,9 @@ export default class ComputerNodeData extends Component {
value={this.state.derivativeLocalAdmin} value={this.state.derivativeLocalAdmin}
click={function(){ click={function(){
emitter.emit('query', emitter.emit('query',
"MATCH p = shortestPath((c1:Computer {name:{name}})-[r:AdminTo|MemberOf|HasSession*1..]->(c:Computer)) RETURN p",{name: this.state.label}, this.state.label) "MATCH (c:Computer) WHERE NOT c.name={name} WITH c MATCH p = shortestPath((c1:Computer {name:{name}})-[r:AdminTo|MemberOf|HasSession*1..]->(c)) RETURN p",{name: this.state.label}, this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4>Outbound Object Control</h4> <h4>Outbound Object Control</h4>
@ -307,7 +317,8 @@ export default class ComputerNodeData extends Component {
value={this.state.firstdegreeControl} value={this.state.firstdegreeControl}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (c:Computer {name:{name}})-[r1:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label}) emitter.emit('query', "MATCH p = (c:Computer {name:{name}})-[r1:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label})
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Group Delegated Object Control Group Delegated Object Control
@ -319,7 +330,8 @@ export default class ComputerNodeData extends Component {
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (c:Computer {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH p = (c:Computer {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label)
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Transitive Object Control Transitive Object Control
@ -329,9 +341,10 @@ export default class ComputerNodeData extends Component {
ready={this.state.transitiveControl !== -1} ready={this.state.transitiveControl !== -1}
value={this.state.transitiveControl} value={this.state.transitiveControl}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = shortestPath((c:Computer {name:{name}})-[r1:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH (n) WHERE NOT n.name={name} WITH n MATCH p = shortestPath((c:Computer {name:{name}})-[r1:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label)
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
</dl> </dl>
</div> </div>

View File

@ -1,7 +1,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import NodeALink from './NodeALink.jsx' import NodeALink from './NodeALink.jsx';
import LoadLabel from './LoadLabel.jsx' import LoadLabel from './LoadLabel.jsx';
import PropTypes from 'prop-types' import PropTypes from 'prop-types';
export default class DomainNodeData extends Component { export default class DomainNodeData extends Component {
constructor(){ constructor(){
@ -19,7 +19,7 @@ export default class DomainNodeData extends Component {
firstDegreeInboundTrusts: -1, firstDegreeInboundTrusts: -1,
effectiveInboundTrusts: -1, effectiveInboundTrusts: -1,
driversessions: [] driversessions: []
} };
emitter.on('domainNodeClicked', this.getNodeData.bind(this)); emitter.on('domainNodeClicked', this.getNodeData.bind(this));
} }
@ -27,7 +27,7 @@ export default class DomainNodeData extends Component {
getNodeData(payload){ getNodeData(payload){
$.each(this.state.driversessions, function(index, record){ $.each(this.state.driversessions, function(index, record){
record.close(); record.close();
}) });
this.setState({ this.setState({
label: payload, label: payload,
users: -1, users: -1,
@ -39,73 +39,73 @@ export default class DomainNodeData extends Component {
effectiveOutboundTrusts: -1, effectiveOutboundTrusts: -1,
firstDegreeInboundTrusts: -1, firstDegreeInboundTrusts: -1,
effectiveInboundTrusts: -1 effectiveInboundTrusts: -1
}) });
var s1 = driver.session() var s1 = driver.session();
var s2 = driver.session() var s2 = driver.session();
var s3 = driver.session() var s3 = driver.session();
var s4 = driver.session() var s4 = driver.session();
var s5 = driver.session() var s5 = driver.session();
var s6 = driver.session() var s6 = driver.session();
var s7 = driver.session() var s7 = driver.session();
var s8 = driver.session() var s8 = driver.session();
var s9 = driver.session() var s9 = driver.session();
s1.run("MATCH (a:User) WHERE a.name ENDS WITH ('@' + {name}) RETURN COUNT(a)", {name:payload}) s1.run("MATCH (a:User) WHERE a.name ENDS WITH ('@' + {name}) RETURN COUNT(a)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'users':result.records[0]._fields[0].low}) this.setState({'users':result.records[0]._fields[0].low});
s1.close() s1.close();
}.bind(this)) }.bind(this));
s2.run("MATCH (a:Group) WHERE a.name ENDS WITH ('@' + {name}) RETURN COUNT(a)", {name:payload}) s2.run("MATCH (a:Group) WHERE a.name ENDS WITH ('@' + {name}) RETURN COUNT(a)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'groups':result.records[0]._fields[0].low}) this.setState({'groups':result.records[0]._fields[0].low});
s2.close() s2.close();
}.bind(this)) }.bind(this));
s3.run("MATCH (n:Computer) WHERE n.name ENDS WITH {name} WITH n WHERE size(split(n.name,'.')) - size(split({name},'.')) = 1 RETURN count(n)", {name:payload}) s3.run("MATCH (n:Computer) WHERE n.name ENDS WITH {name} WITH n WHERE size(split(n.name,'.')) - size(split({name},'.')) = 1 RETURN count(n)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'computers':result.records[0]._fields[0].low}) this.setState({'computers':result.records[0]._fields[0].low});
s3.close() s3.close();
}.bind(this)) }.bind(this));
s4.run("MATCH (a:Group) WHERE NOT a.name ENDS WITH ('@' + {name}) WITH a MATCH (b:Group) WHERE b.name ENDS WITH ('@' + {name}) WITH a,b MATCH (a)-[r:MemberOf]->(b) RETURN count(a)", {name:payload}) s4.run("MATCH (a:Group) WHERE NOT a.name ENDS WITH ('@' + {name}) WITH a MATCH (b:Group) WHERE b.name ENDS WITH ('@' + {name}) WITH a,b MATCH (a)-[r:MemberOf]->(b) RETURN count(a)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'foreignGroups':result.records[0]._fields[0].low}) this.setState({'foreignGroups':result.records[0]._fields[0].low});
s4.close() s4.close();
}.bind(this)) }.bind(this));
s5.run("MATCH (a:User) WHERE NOT a.name ENDS WITH ('@' + {name}) WITH a MATCH (b:Group) WHERE b.name ENDS WITH ('@' + {name}) WITH a,b MATCH (a)-[r:MemberOf]->(b) RETURN count(a)", {name:payload}) s5.run("MATCH (a:User) WHERE NOT a.name ENDS WITH ('@' + {name}) WITH a MATCH (b:Group) WHERE b.name ENDS WITH ('@' + {name}) WITH a,b MATCH (a)-[r:MemberOf]->(b) RETURN count(a)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'foreignUsers':result.records[0]._fields[0].low}) this.setState({'foreignUsers':result.records[0]._fields[0].low});
s5.close() s5.close();
}.bind(this)) }.bind(this));
s6.run("MATCH (a:Domain {name:{name}})<-[r:TrustedBy]-(b:Domain) RETURN count(b)", {name:payload}) s6.run("MATCH (a:Domain {name:{name}})<-[r:TrustedBy]-(b:Domain) RETURN count(b)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'firstDegreeInboundTrusts':result.records[0]._fields[0].low}) this.setState({'firstDegreeInboundTrusts':result.records[0]._fields[0].low});
s6.close() s6.close();
}.bind(this)) }.bind(this));
s7.run("MATCH (a:Domain {name:{name}})-[r:TrustedBy]->(b:Domain) RETURN count(b)", {name:payload}) s7.run("MATCH (a:Domain {name:{name}})-[r:TrustedBy]->(b:Domain) RETURN count(b)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'firstDegreeOutboundTrusts':result.records[0]._fields[0].low}) this.setState({'firstDegreeOutboundTrusts':result.records[0]._fields[0].low});
s7.close() s7.close();
}.bind(this)) }.bind(this));
s8.run("MATCH p=shortestPath((a:Domain {name:{name}})<-[r:TrustedBy*1..]-(b:Domain)) RETURN count(b)", {name:payload}) s8.run("MATCH (b:Domain) WHERE NOT b.name={name} WITH b MATCH p=shortestPath((a:Domain {name:{name}})<-[r:TrustedBy*1..]-(b)) RETURN count(b)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'effectiveInboundTrusts':result.records[0]._fields[0].low}) this.setState({'effectiveInboundTrusts':result.records[0]._fields[0].low});
s8.close() s8.close();
}.bind(this)) }.bind(this));
s9.run("MATCH p=shortestPath((a:Domain {name:{name}})-[r:TrustedBy*1..]->(b:Domain)) RETURN count(b)", {name:payload}) s9.run("MATCH (b:Domain) WHERE NOT b.name={name} MATCH p=shortestPath((a:Domain {name:{name}})-[r:TrustedBy*1..]->(b)) RETURN count(b)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'effectiveOutboundTrusts':result.records[0]._fields[0].low}) this.setState({'effectiveOutboundTrusts':result.records[0]._fields[0].low});
s9.close() s9.close();
}.bind(this)) }.bind(this));
this.setState({'driversessions': [s1,s2,s3,s4,s5,s6,s7,s8,s9]}) this.setState({'driversessions': [s1,s2,s3,s4,s5,s6,s7,s8,s9]});
} }
render() { render() {
@ -125,7 +125,8 @@ export default class DomainNodeData extends Component {
<dd> <dd>
<LoadLabel <LoadLabel
ready={this.state.users !== -1} ready={this.state.users !== -1}
value={this.state.users} /> value={this.state.users}
/>
</dd> </dd>
<dt> <dt>
Groups Groups
@ -133,7 +134,8 @@ export default class DomainNodeData extends Component {
<dd> <dd>
<LoadLabel <LoadLabel
ready={this.state.groups !== -1} ready={this.state.groups !== -1}
value={this.state.groups} /> value={this.state.groups}
/>
</dd> </dd>
<dt> <dt>
Computers Computers
@ -141,7 +143,8 @@ export default class DomainNodeData extends Component {
<dd> <dd>
<LoadLabel <LoadLabel
ready={this.state.computers !== -1} ready={this.state.computers !== -1}
value={this.state.computers} /> value={this.state.computers}
/>
</dd> </dd>
<br /> <br />
<dt> <dt>
@ -152,8 +155,9 @@ export default class DomainNodeData extends Component {
ready={this.state.foreignUsers !== -1} ready={this.state.foreignUsers !== -1}
value={this.state.foreignUsers} value={this.state.foreignUsers}
click={function(){ click={function(){
emitter.emit('query', "MATCH (a:User) WHERE NOT a.name ENDS WITH ('@' + {domain}) WITH a MATCH (b:Group) WHERE b.name ENDS WITH ('@' + {domain}) WITH a,b MATCH (a)-[r:MemberOf]-(b) RETURN a,r,b", {domain: this.state.label}) emitter.emit('query', "MATCH (a:User) WHERE NOT a.name ENDS WITH ('@' + {domain}) WITH a MATCH (b:Group) WHERE b.name ENDS WITH ('@' + {domain}) WITH a,b MATCH (a)-[r:MemberOf]-(b) RETURN a,r,b", {domain: this.state.label});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Foreign Groups Foreign Groups
@ -163,8 +167,9 @@ export default class DomainNodeData extends Component {
ready={this.state.foreignGroups !== -1} ready={this.state.foreignGroups !== -1}
value={this.state.foreignGroups} value={this.state.foreignGroups}
click={function(){ click={function(){
emitter.emit('query', "MATCH (a:Group) WHERE NOT a.name ENDS WITH ('@' + {domain}) WITH a MATCH (b:Group) WHERE b.name ENDS WITH ('@' + {domain}) WITH a,b MATCH (a)-[r:MemberOf]-(b) RETURN a,r,b", {domain: this.state.label}) emitter.emit('query', "MATCH (a:Group) WHERE NOT a.name ENDS WITH ('@' + {domain}) WITH a MATCH (b:Group) WHERE b.name ENDS WITH ('@' + {domain}) WITH a,b MATCH (a)-[r:MemberOf]-(b) RETURN a,r,b", {domain: this.state.label});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Foreign Admins Foreign Admins
@ -174,8 +179,9 @@ export default class DomainNodeData extends Component {
ready={this.state.foreignAdmins !== -1} ready={this.state.foreignAdmins !== -1}
value={this.state.foreignAdmins} value={this.state.foreignAdmins}
click={function(){ click={function(){
emitter.emit('query', "MATCH (a:Group) WHERE NOT a.name ENDS WITH ('@' + {domain}) WITH a MATCH (b:Group) WHERE b.name ENDS WITH ('@' + {domain}) WITH a,b MATCH (a)-[r:MemberOf]-(b) RETURN a,r,b", {domain: this.state.label}) emitter.emit('query', "MATCH (a:Group) WHERE NOT a.name ENDS WITH ('@' + {domain}) WITH a MATCH (b:Group) WHERE b.name ENDS WITH ('@' + {domain}) WITH a,b MATCH (a)-[r:MemberOf]-(b) RETURN a,r,b", {domain: this.state.label});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<dt> <dt>
@ -186,8 +192,9 @@ export default class DomainNodeData extends Component {
ready={this.state.firstDegreeInboundTrusts !== -1} ready={this.state.firstDegreeInboundTrusts !== -1}
value={this.state.firstDegreeInboundTrusts} value={this.state.firstDegreeInboundTrusts}
click={function(){ click={function(){
emitter.emit('query', "MATCH (a:Domain {name:{domain}})<-[r:TrustedBy]-(b:Domain) RETURN a,r,b", {domain: this.state.label}) emitter.emit('query', "MATCH (a:Domain {name:{domain}})<-[r:TrustedBy]-(b:Domain) RETURN a,r,b", {domain: this.state.label});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Effective Inbound Trusts Effective Inbound Trusts
@ -197,8 +204,9 @@ export default class DomainNodeData extends Component {
ready={this.state.effectiveInboundTrusts !== -1} ready={this.state.effectiveInboundTrusts !== -1}
value={this.state.effectiveInboundTrusts} value={this.state.effectiveInboundTrusts}
click={function(){ click={function(){
emitter.emit('query', "MATCH p=shortestPath((a:Domain {name:{domain}})<-[r:TrustedBy*1..]-(b:Domain)) RETURN p", {domain: this.state.label}) emitter.emit('query', "MATCH (b:Domain) WHERE NOT b.name={domain} WITH b MATCH p=shortestPath((a:Domain {name:{domain}})<-[r:TrustedBy*1..]-(b)) RETURN p", {domain: this.state.label});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Outbound Trusts Outbound Trusts
@ -208,8 +216,9 @@ export default class DomainNodeData extends Component {
ready={this.state.firstDegreeOutboundTrusts !== -1} ready={this.state.firstDegreeOutboundTrusts !== -1}
value={this.state.firstDegreeOutboundTrusts} value={this.state.firstDegreeOutboundTrusts}
click={function(){ click={function(){
emitter.emit('query', "MATCH (a:Domain {name:{domain}})-[r:TrustedBy]->(b:Domain) RETURN a,r,b", {domain: this.state.label}) emitter.emit('query', "MATCH (a:Domain {name:{domain}})-[r:TrustedBy]->(b:Domain) RETURN a,r,b", {domain: this.state.label});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Effective Outbound Trusts Effective Outbound Trusts
@ -219,8 +228,9 @@ export default class DomainNodeData extends Component {
ready={this.state.effectiveOutboundTrusts !== -1} ready={this.state.effectiveOutboundTrusts !== -1}
value={this.state.effectiveOutboundTrusts} value={this.state.effectiveOutboundTrusts}
click={function(){ click={function(){
emitter.emit('query', "MATCH p=shortestPath((a:Domain {name:{domain}})-[r:TrustedBy*1..]->(b:Domain)) RETURN p", {domain: this.state.label}) emitter.emit('query', "MATCH (b:Domain) WHERE NOT b.name={domain} WITH b MATCH p=shortestPath((a:Domain {name:{domain}})-[r:TrustedBy*1..]->(b:Domain)) RETURN p", {domain: this.state.label});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
</dl> </dl>
</div> </div>
@ -230,4 +240,4 @@ export default class DomainNodeData extends Component {
DomainNodeData.propTypes = { DomainNodeData.propTypes = {
visible : React.PropTypes.bool.isRequired visible : React.PropTypes.bool.isRequired
} };

View File

@ -1,6 +1,6 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import NodeALink from './NodeALink' import NodeALink from './NodeALink';
import PropTypes from 'prop-types' import PropTypes from 'prop-types';
export default class GroupNodeData extends Component { export default class GroupNodeData extends Component {
constructor(){ constructor(){
@ -25,7 +25,7 @@ export default class GroupNodeData extends Component {
unrolledControllers: -1, unrolledControllers: -1,
transitiveControllers: -1, transitiveControllers: -1,
driversessions: [] driversessions: []
} };
emitter.on('groupNodeClicked', this.getNodeData.bind(this)); emitter.on('groupNodeClicked', this.getNodeData.bind(this));
} }
@ -33,7 +33,7 @@ export default class GroupNodeData extends Component {
getNodeData(payload){ getNodeData(payload){
$.each(this.state.driversessions, function(index, record){ $.each(this.state.driversessions, function(index, record){
record.close(); record.close();
}) });
this.setState({ this.setState({
label: payload, label: payload,
@ -53,127 +53,127 @@ export default class GroupNodeData extends Component {
firstDegreeControllers: -1, firstDegreeControllers: -1,
unrolledControllers: -1, unrolledControllers: -1,
transitiveControllers: -1 transitiveControllers: -1
}) });
var domain = '@' + payload.split('@').last() var domain = '@' + payload.split('@').last();
var s1 = driver.session() var s1 = driver.session();
var s2 = driver.session() var s2 = driver.session();
var s3 = driver.session() var s3 = driver.session();
var s4 = driver.session() var s4 = driver.session();
var s5 = driver.session() var s5 = driver.session();
var s6 = driver.session() var s6 = driver.session();
var s7 = driver.session() var s7 = driver.session();
var s8 = driver.session() var s8 = driver.session();
var s9 = driver.session() var s9 = driver.session();
var s10 = driver.session() var s10 = driver.session();
var s11 = driver.session() var s11 = driver.session();
var s12 = driver.session() var s12 = driver.session();
var s13 = driver.session() var s13 = driver.session();
var s14 = driver.session() var s14 = driver.session();
var s15 = driver.session() var s15 = driver.session();
var s16 = driver.session() var s16 = driver.session();
s1.run("MATCH (a)-[b:MemberOf]->(c:Group {name:{name}}) RETURN count(a)", {name:payload}) s1.run("MATCH (a)-[b:MemberOf]->(c:Group {name:{name}}) RETURN count(a)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'directMembers':result.records[0]._fields[0].low}) this.setState({'directMembers':result.records[0]._fields[0].low});
s1.close() s1.close();
}.bind(this)) }.bind(this));
s2.run("MATCH p = (n)-[r:MemberOf*1..]->(g:Group {name:{name}}) RETURN COUNT(n)", {name:payload}) s2.run("MATCH p = (n)-[r:MemberOf*1..]->(g:Group {name:{name}}) RETURN COUNT(n)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'unrolledMembers':result.records[0]._fields[0].low}) this.setState({'unrolledMembers':result.records[0]._fields[0].low});
s2.close() s2.close();
}.bind(this)) }.bind(this));
s3.run("MATCH (n:Group {name:{name}})-[r:AdminTo]->(m:Computer) RETURN count(distinct(m))", {name:payload}) s3.run("MATCH (n:Group {name:{name}})-[r:AdminTo]->(m:Computer) RETURN count(distinct(m))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'directAdminTo':result.records[0]._fields[0].low}) this.setState({'directAdminTo':result.records[0]._fields[0].low});
s3.close() s3.close();
}.bind(this)) }.bind(this));
s4.run("MATCH p = shortestPath((g:Group {name:{name}})-[r:MemberOf|AdminTo|HasSession*1..]->(c:Computer)) RETURN COUNT(DISTINCT(c))", {name:payload}) s4.run("MATCH (c:Computer) WHERE NOT c.name={name} WITH c MATCH p = shortestPath((g:Group {name:{name}})-[r:MemberOf|AdminTo|HasSession*1..]->(c)) RETURN COUNT(DISTINCT(c))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'derivativeAdminTo':result.records[0]._fields[0].low}) this.setState({'derivativeAdminTo':result.records[0]._fields[0].low});
s4.close() s4.close();
}.bind(this)) }.bind(this));
s5.run("MATCH p = (g1:Group {name:{name}})-[r:MemberOf*1..]->(g2:Group) RETURN COUNT(DISTINCT(g2))", {name:payload}) s5.run("MATCH p = (g1:Group {name:{name}})-[r:MemberOf*1..]->(g2:Group) RETURN COUNT(DISTINCT(g2))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'unrolledMemberOf':result.records[0]._fields[0].low}) this.setState({'unrolledMemberOf':result.records[0]._fields[0].low});
s5.close() s5.close();
}.bind(this)) }.bind(this));
s6.run("MATCH p = (c:Computer)-[r1:HasSession]->(u:User)-[r2:MemberOf*1..]->(g:Group {name: {name}}) RETURN COUNT(r1)", {name:payload}) s6.run("MATCH p = (c:Computer)-[r1:HasSession]->(u:User)-[r2:MemberOf*1..]->(g:Group {name: {name}}) RETURN COUNT(r1)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'sessions':result.records[0]._fields[0].low}) this.setState({'sessions':result.records[0]._fields[0].low});
s6.close() s6.close();
}.bind(this)) }.bind(this));
s7.run("MATCH (n:Group) WHERE NOT n.name ENDS WITH {domain} WITH n MATCH (m:Group {name:{name}}) MATCH (m)-[r:MemberOf]->(n) RETURN count(n)", {name:payload, domain:domain}) s7.run("MATCH (n:Group) WHERE NOT n.name ENDS WITH {domain} WITH n MATCH (m:Group {name:{name}}) MATCH (m)-[r:MemberOf]->(n) RETURN count(n)", {name:payload, domain:domain})
.then(function(result){ .then(function(result){
this.setState({'foreignGroupMembership':result.records[0]._fields[0].low}) this.setState({'foreignGroupMembership':result.records[0]._fields[0].low});
s7.close() s7.close();
}.bind(this)) }.bind(this));
s8.run("MATCH p = (n)-[r:MemberOf*1..]->(g:Group {name:{name}}) WHERE NOT g.domain = n.domain RETURN COUNT(DISTINCT(n))", {name:payload}) s8.run("MATCH p = (n)-[r:MemberOf*1..]->(g:Group {name:{name}}) WHERE NOT g.domain = n.domain RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'foreignGroupMembers':result.records[0]._fields[0].low}) this.setState({'foreignGroupMembers':result.records[0]._fields[0].low});
s8.close() s8.close();
}.bind(this)) }.bind(this));
s9.run("MATCH p = (g1:Group {name:{name}})-[r:MemberOf]->(g2:Group) RETURN COUNT(DISTINCT(g2))", {name:payload}) s9.run("MATCH p = (g1:Group {name:{name}})-[r:MemberOf]->(g2:Group) RETURN COUNT(DISTINCT(g2))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'firstDegreeGroupMembership':result.records[0]._fields[0].low}) this.setState({'firstDegreeGroupMembership':result.records[0]._fields[0].low});
s9.close() s9.close();
}.bind(this)) }.bind(this));
s10.run("MATCH p = (g1:Group {name:{name}})-[r1:MemberOf*1..]->(g2:Group)-[r2:AdminTo]->(c:Computer) RETURN COUNT(DISTINCT(c))", {name:payload}) s10.run("MATCH p = (g1:Group {name:{name}})-[r1:MemberOf*1..]->(g2:Group)-[r2:AdminTo]->(c:Computer) RETURN COUNT(DISTINCT(c))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'groupDelegatedAdmin':result.records[0]._fields[0].low}) this.setState({'groupDelegatedAdmin':result.records[0]._fields[0].low});
s10.close() s10.close();
}.bind(this)) }.bind(this));
s11.run("MATCH p = (g:Group {name:{name}})-[r:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN COUNT(DISTINCT(n))", {name:payload}) s11.run("MATCH p = (g:Group {name:{name}})-[r:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'firstdegreeControl':result.records[0]._fields[0].low}) this.setState({'firstdegreeControl':result.records[0]._fields[0].low});
s11.close() s11.close();
}.bind(this)) }.bind(this));
s12.run("MATCH p = (g1:Group {name:{name}})-[r1:MemberOf*1..]->(g2:Group)-[r2:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN COUNT(DISTINCT(n))", {name:payload}) s12.run("MATCH p = (g1:Group {name:{name}})-[r1:MemberOf*1..]->(g2:Group)-[r2:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'groupDelegatedControl':result.records[0]._fields[0].low}) this.setState({'groupDelegatedControl':result.records[0]._fields[0].low});
s12.close() s12.close();
}.bind(this)) }.bind(this));
s13.run("MATCH p = shortestPath((g:Group {name:{name}})-[r:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN COUNT(DISTINCT(n))", {name:payload}) s13.run("MATCH (n) WHERE NOT n.name={name} WITH n MATCH p = shortestPath((g:Group {name:{name}})-[r:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'transitiveControl':result.records[0]._fields[0].low}) this.setState({'transitiveControl':result.records[0]._fields[0].low});
s13.close() s13.close();
}.bind(this)) }.bind(this));
s14.run("MATCH p = (n)-[r:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(g:Group {name:{name}}) RETURN COUNT(DISTINCT(n))", {name:payload}) s14.run("MATCH p = (n)-[r:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(g:Group {name:{name}}) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'firstDegreeControllers':result.records[0]._fields[0].low}) this.setState({'firstDegreeControllers':result.records[0]._fields[0].low});
s14.close() s14.close();
}.bind(this)) }.bind(this));
s15.run("MATCH p = (n1)-[r:MemberOf*1..]->(g1:Group)-[r1:AddMembers|AllExtendedRights|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(g2:Group {name: {name}}) WITH LENGTH(p) as pathLength, p, n1 WHERE NONE (x in NODES(p)[1..(pathLength-1)] WHERE x.name = g2.name) AND NOT n1.name = g2.name RETURN COUNT(DISTINCT(n1))", {name:payload}) s15.run("MATCH p = (n1)-[r:MemberOf*1..]->(g1:Group)-[r1:AddMembers|AllExtendedRights|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(g2:Group {name: {name}}) WITH LENGTH(p) as pathLength, p, n1 WHERE NONE (x in NODES(p)[1..(pathLength-1)] WHERE x.name = g2.name) AND NOT n1.name = g2.name RETURN COUNT(DISTINCT(n1))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'unrolledControllers':result.records[0]._fields[0].low}) this.setState({'unrolledControllers':result.records[0]._fields[0].low});
s15.close() s15.close();
}.bind(this)) }.bind(this));
s16.run("MATCH p = shortestPath((n)-[r:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(g:Group {name:{name}})) RETURN COUNT(DISTINCT(n))", {name:payload}) s16.run("MATCH (n) WHERE NOT n.name={name} WITH n MATCH p = shortestPath((n)-[r:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(g:Group {name:{name}})) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'transitiveControllers':result.records[0]._fields[0].low}) this.setState({'transitiveControllers':result.records[0]._fields[0].low});
s16.close() s16.close();
}.bind(this)) }.bind(this));
this.setState({'driversessions': [s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16]}) this.setState({'driversessions': [s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16]});
} }
render() { render() {
var domain = '@' + this.state.label.split('@') var domain = '@' + this.state.label.split('@');
return ( return (
<div className={this.props.visible ? "" : "displaynone"}> <div className={this.props.visible ? "" : "displaynone"}>
<dl className='dl-horizontal'> <dl className='dl-horizontal'>
@ -193,8 +193,9 @@ export default class GroupNodeData extends Component {
value={this.state.sessions} value={this.state.sessions}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (c:Computer)-[r1:HasSession]->(u:User)-[r2:MemberOf*1..]->(g:Group {name: {name}}) RETURN p", {name: this.state.label}, emitter.emit('query', "MATCH p = (c:Computer)-[r1:HasSession]->(u:User)-[r2:MemberOf*1..]->(g:Group {name: {name}}) RETURN p", {name: this.state.label},
"",this.state.label) "",this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4>Group Members</h4> <h4>Group Members</h4>
@ -206,8 +207,9 @@ export default class GroupNodeData extends Component {
ready={this.state.directMembers !== -1} ready={this.state.directMembers !== -1}
value={this.state.directMembers} value={this.state.directMembers}
click={function(){ click={function(){
emitter.emit('query', "MATCH (n)-[r:MemberOf]->(m:Group {name:{name}}) RETURN n,r,m", {name: this.state.label}) emitter.emit('query', "MATCH (n)-[r:MemberOf]->(m:Group {name:{name}}) RETURN n,r,m", {name: this.state.label});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Unrolled Members Unrolled Members
@ -218,8 +220,9 @@ export default class GroupNodeData extends Component {
value={this.state.unrolledMembers} value={this.state.unrolledMembers}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (n)-[r:MemberOf*1..]->(g:Group {name:{name}}) RETURN p", {name: this.state.label}, emitter.emit('query', "MATCH p = (n)-[r:MemberOf*1..]->(g:Group {name:{name}}) RETURN p", {name: this.state.label},
this.state.label) this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Foreign Members Foreign Members
@ -230,8 +233,9 @@ export default class GroupNodeData extends Component {
value={this.state.foreignGroupMembers} value={this.state.foreignGroupMembers}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (n)-[r:MemberOf*1..]->(g:Group {name:{name}}) WHERE NOT g.domain = n.domain RETURN p", {name: this.state.label}, emitter.emit('query', "MATCH p = (n)-[r:MemberOf*1..]->(g:Group {name:{name}}) WHERE NOT g.domain = n.domain RETURN p", {name: this.state.label},
this.state.label) this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4>Group Membership</h4> <h4>Group Membership</h4>
@ -244,8 +248,9 @@ export default class GroupNodeData extends Component {
value={this.state.firstDegreeGroupMembership} value={this.state.firstDegreeGroupMembership}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (g1:Group {name:{name}})-[r:MemberOf]->(g2:Group) RETURN p", {name: this.state.label}, emitter.emit('query', "MATCH p = (g1:Group {name:{name}})-[r:MemberOf]->(g2:Group) RETURN p", {name: this.state.label},
this.state.label) this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Unrolled Member Of Unrolled Member Of
@ -256,8 +261,9 @@ export default class GroupNodeData extends Component {
value={this.state.unrolledMemberOf} value={this.state.unrolledMemberOf}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (g1:Group {name:{name}})-[r:MemberOf*1..]->(g2:Group) RETURN p", {name: this.state.label}, emitter.emit('query', "MATCH p = (g1:Group {name:{name}})-[r:MemberOf*1..]->(g2:Group) RETURN p", {name: this.state.label},
this.state.label) this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Foreign Group Membership Foreign Group Membership
@ -267,8 +273,9 @@ export default class GroupNodeData extends Component {
ready={this.state.foreignGroupMembership !== -1} ready={this.state.foreignGroupMembership !== -1}
value={this.state.foreignGroupMembership} value={this.state.foreignGroupMembership}
click={function(){ click={function(){
emitter.emit('query', "MATCH (n:Group) WHERE NOT n.name ENDS WITH {domain} WITH n MATCH (m:Group {name:{name}}) MATCH (m)-[r:MemberOf]->(n) RETURN m,r,n", {name: this.state.label, domain: domain}) emitter.emit('query', "MATCH (n:Group) WHERE NOT n.name ENDS WITH {domain} WITH n MATCH (m:Group {name:{name}}) MATCH (m)-[r:MemberOf]->(n) RETURN m,r,n", {name: this.state.label, domain: domain});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4>Local Admin Rights</h4> <h4>Local Admin Rights</h4>
@ -281,8 +288,9 @@ export default class GroupNodeData extends Component {
value={this.state.directAdminTo} value={this.state.directAdminTo}
click={function(){ click={function(){
emitter.emit('query', "MATCH p=(g:Group {name:{name}})-[r:AdminTo]->(c:Computer) RETURN p", {name: this.state.label}, emitter.emit('query', "MATCH p=(g:Group {name:{name}})-[r:AdminTo]->(c:Computer) RETURN p", {name: this.state.label},
this.state.label) this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Group Delegated Local Admin Rights Group Delegated Local Admin Rights
@ -293,8 +301,9 @@ export default class GroupNodeData extends Component {
value={this.state.groupDelegatedAdmin} value={this.state.groupDelegatedAdmin}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (g1:Group {name:{name}})-[r1:MemberOf*1..]->(g2:Group)-[r2:AdminTo]->(c:Computer) RETURN p", {name: this.state.label}, emitter.emit('query', "MATCH p = (g1:Group {name:{name}})-[r1:MemberOf*1..]->(g2:Group)-[r2:AdminTo]->(c:Computer) RETURN p", {name: this.state.label},
this.state.label) this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Derivative Local Admin Rights Derivative Local Admin Rights
@ -304,9 +313,10 @@ export default class GroupNodeData extends Component {
ready={this.state.derivativeAdminTo !== -1} ready={this.state.derivativeAdminTo !== -1}
value={this.state.derivativeAdminTo} value={this.state.derivativeAdminTo}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = shortestPath((g:Group {name:{name}})-[r:MemberOf|AdminTo|HasSession*1..]->(c:Computer)) RETURN p", {name: this.state.label}, emitter.emit('query', "MATCH (c:Computer) WHERE NOT c.name={name} WITH c MATCH p = shortestPath((g:Group {name:{name}})-[r:MemberOf|AdminTo|HasSession*1..]->(c)) RETURN p", {name: this.state.label},
this.state.label) this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4>Outbound Object Control</h4> <h4>Outbound Object Control</h4>
@ -318,8 +328,9 @@ export default class GroupNodeData extends Component {
ready={this.state.firstdegreeControl !== -1} ready={this.state.firstdegreeControl !== -1}
value={this.state.firstdegreeControl} value={this.state.firstdegreeControl}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (g:Group {name:{name}})-[r1:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label}) emitter.emit('query', "MATCH p = (g:Group {name:{name}})-[r1:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Group Delegated Object Control Group Delegated Object Control
@ -330,8 +341,9 @@ export default class GroupNodeData extends Component {
value={this.state.groupDelegatedControl} value={this.state.groupDelegatedControl}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (g1:Group {name:{name}})-[r1:MemberOf*1..]->(g2:Group)-[r2:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH p = (g1:Group {name:{name}})-[r1:MemberOf*1..]->(g2:Group)-[r2:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Transitive Object Control Transitive Object Control
@ -341,9 +353,10 @@ export default class GroupNodeData extends Component {
ready={this.state.transitiveControl !== -1} ready={this.state.transitiveControl !== -1}
value={this.state.transitiveControl} value={this.state.transitiveControl}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = shortestPath((g:Group {name:{name}})-[r1:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH (n) WHERE NOT n.name={name} WITH n MATCH p = shortestPath((g:Group {name:{name}})-[r1:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4>Inbound Object Control</h4> <h4>Inbound Object Control</h4>
@ -356,8 +369,9 @@ export default class GroupNodeData extends Component {
value={this.state.firstDegreeControllers} value={this.state.firstDegreeControllers}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (n)-[r:AddMembers|AllExtendedRights|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(g:Group {name: {name}}) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH p = (n)-[r:AddMembers|AllExtendedRights|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(g:Group {name: {name}}) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Unrolled Object Controllers Unrolled Object Controllers
@ -368,8 +382,9 @@ export default class GroupNodeData extends Component {
value={this.state.unrolledControllers} value={this.state.unrolledControllers}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (n1)-[r:MemberOf*1..]->(g1:Group)-[r1:AddMembers|AllExtendedRights|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(g2:Group {name: {name}}) WITH LENGTH(p) as pathLength, p, n1 WHERE NONE (x in NODES(p)[1..(pathLength-1)] WHERE x.name = g2.name) AND NOT n1.name = g2.name RETURN p", {name:this.state.label} emitter.emit('query', "MATCH p = (n1)-[r:MemberOf*1..]->(g1:Group)-[r1:AddMembers|AllExtendedRights|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(g2:Group {name: {name}}) WITH LENGTH(p) as pathLength, p, n1 WHERE NONE (x in NODES(p)[1..(pathLength-1)] WHERE x.name = g2.name) AND NOT n1.name = g2.name RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Transitive Object Controllers Transitive Object Controllers
@ -379,9 +394,10 @@ export default class GroupNodeData extends Component {
ready={this.state.transitiveControllers !== -1} ready={this.state.transitiveControllers !== -1}
value={this.state.transitiveControllers} value={this.state.transitiveControllers}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = shortestPath((n)-[r:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(g:Group {name: {name}})) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH (n) WHERE NOT n.name={name} WITH n MATCH p = shortestPath((n)-[r:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(g:Group {name: {name}})) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
</dl> </dl>
</div> </div>
@ -391,4 +407,4 @@ export default class GroupNodeData extends Component {
GroupNodeData.propTypes = { GroupNodeData.propTypes = {
visible : React.PropTypes.bool.isRequired visible : React.PropTypes.bool.isRequired
} };

View File

@ -1,6 +1,6 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import NodeALink from './NodeALink' import NodeALink from './NodeALink';
import PropTypes from 'prop-types' import PropTypes from 'prop-types';
export default class UserNodeData extends Component { export default class UserNodeData extends Component {
constructor(){ constructor(){
@ -25,7 +25,7 @@ export default class UserNodeData extends Component {
unrolledControl: -1, unrolledControl: -1,
transitiveControl: -1, transitiveControl: -1,
driversessions : [] driversessions : []
} };
emitter.on('userNodeClicked', this.getNodeData.bind(this)); emitter.on('userNodeClicked', this.getNodeData.bind(this));
} }
@ -33,7 +33,7 @@ export default class UserNodeData extends Component {
getNodeData(payload){ getNodeData(payload){
$.each(this.state.driversessions,function(index, record){ $.each(this.state.driversessions,function(index, record){
record.close(); record.close();
}) });
this.setState({ this.setState({
label: payload, label: payload,
@ -53,107 +53,107 @@ export default class UserNodeData extends Component {
firstdegreeControl: -1, firstdegreeControl: -1,
unrolledControl: -1, unrolledControl: -1,
transitiveControl: -1 transitiveControl: -1
}) });
var domain = '@' + payload.split('@').last() var domain = '@' + payload.split('@').last();
var s1 = driver.session() var s1 = driver.session();
var s2 = driver.session() var s2 = driver.session();
var s3 = driver.session() var s3 = driver.session();
var s4 = driver.session() var s4 = driver.session();
var s5 = driver.session() var s5 = driver.session();
var s6 = driver.session() var s6 = driver.session();
var s7 = driver.session() var s7 = driver.session();
var s8 = driver.session() var s8 = driver.session();
var s9 = driver.session() var s9 = driver.session();
var s10 = driver.session() var s10 = driver.session();
var s11 = driver.session() var s11 = driver.session();
var s12 = driver.session() var s12 = driver.session();
var s13 = driver.session() var s13 = driver.session();
s1.run("MATCH (n:Group) WHERE NOT n.name ENDS WITH {domain} WITH n MATCH (m:User {name:{name}}) MATCH (m)-[r:MemberOf*1..]->(n) RETURN count(n)", {name:payload, domain: domain}) s1.run("MATCH (n:Group) WHERE NOT n.name ENDS WITH {domain} WITH n MATCH (m:User {name:{name}}) MATCH (m)-[r:MemberOf*1..]->(n) RETURN count(n)", {name:payload, domain: domain})
.then(function(result){ .then(function(result){
this.setState({'foreignGroupMembership':result.records[0]._fields[0].low}) this.setState({'foreignGroupMembership':result.records[0]._fields[0].low});
s1.close() s1.close();
}.bind(this)) }.bind(this));
s2.run("MATCH (n:User {name:{name}}), (m:Group), p=(n)-[:MemberOf]->(m) RETURN count(m)", {name:payload}) s2.run("MATCH (n:User {name:{name}}), (m:Group), p=(n)-[:MemberOf]->(m) RETURN count(m)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'firstDegreeGroupMembership':result.records[0]._fields[0].low}) this.setState({'firstDegreeGroupMembership':result.records[0]._fields[0].low});
s2.close() s2.close();
}.bind(this)) }.bind(this));
s3.run("MATCH p = (n:User {name:{name}})-[r:MemberOf*1..]->(g:Group) RETURN COUNT(DISTINCT(g))", {name:payload}) s3.run("MATCH p = (n:User {name:{name}})-[r:MemberOf*1..]->(g:Group) RETURN COUNT(DISTINCT(g))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'unrolledGroupMembership':result.records[0]._fields[0].low}) this.setState({'unrolledGroupMembership':result.records[0]._fields[0].low});
s3.close() s3.close();
}.bind(this)) }.bind(this));
s4.run("MATCH p = (n:User {name:{name}})-[r:AdminTo]->(c:Computer) RETURN COUNT(DISTINCT(c))", {name:payload}) s4.run("MATCH p = (n:User {name:{name}})-[r:AdminTo]->(c:Computer) RETURN COUNT(DISTINCT(c))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'firstDegreeLocalAdmin':result.records[0]._fields[0].low}) this.setState({'firstDegreeLocalAdmin':result.records[0]._fields[0].low});
s4.close() s4.close();
}.bind(this)) }.bind(this));
s5.run("MATCH p=(n:User {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(c:Computer) RETURN count(distinct(c))", {name:payload}) s5.run("MATCH p=(n:User {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(c:Computer) RETURN count(distinct(c))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'groupDelegatedLocalAdmin':result.records[0]._fields[0].low}) this.setState({'groupDelegatedLocalAdmin':result.records[0]._fields[0].low});
s5.close() s5.close();
}.bind(this)) }.bind(this));
s6.run("MATCH p = shortestPath((n:User {name:{name}})-[r:HasSession|AdminTo|MemberOf*1..]->(c:Computer)) RETURN COUNT(c)", {name:payload}) s6.run("MATCH (c:Computer) WHERE NOT c.name={name} WITH c MATCH p = shortestPath((n:User {name:{name}})-[r:HasSession|AdminTo|MemberOf*1..]->(c)) RETURN COUNT(c)", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'derivativeLocalAdmin':result.records[0]._fields[0].low}) this.setState({'derivativeLocalAdmin':result.records[0]._fields[0].low});
s6.close() s6.close();
}.bind(this)) }.bind(this));
s7.run("MATCH p = (n:Computer)-[r:HasSession]->(m:User {name:{name}}) RETURN COUNT(DISTINCT(n))", {name:payload}) s7.run("MATCH p = (n:Computer)-[r:HasSession]->(m:User {name:{name}}) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'sessions':result.records[0]._fields[0].low}) this.setState({'sessions':result.records[0]._fields[0].low});
s7.close() s7.close();
}.bind(this)) }.bind(this));
s8.run("MATCH p = (n)-[r:AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(u1:User {name: {name}}) RETURN COUNT(DISTINCT(n))", {name:payload}) s8.run("MATCH p = (n)-[r:AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(u1:User {name: {name}}) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'firstdegreeControllers':result.records[0]._fields[0].low}) this.setState({'firstdegreeControllers':result.records[0]._fields[0].low});
s8.close() s8.close();
}.bind(this)) }.bind(this));
s9.run("MATCH p = (n1)-[r:MemberOf*1..]->(g:Group)-[r1:AddMembers|AllExtendedRights|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(u:User {name: {name}}) WITH LENGTH(p) as pathLength, p, n1 WHERE NONE (x in NODES(p)[1..(pathLength-1)] WHERE x.name = u.name) AND NOT n1.name = u.name RETURN COUNT(DISTINCT(n1))", {name:payload}) s9.run("MATCH p = (n1)-[r:MemberOf*1..]->(g:Group)-[r1:AddMembers|AllExtendedRights|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(u:User {name: {name}}) WITH LENGTH(p) as pathLength, p, n1 WHERE NONE (x in NODES(p)[1..(pathLength-1)] WHERE x.name = u.name) AND NOT n1.name = u.name RETURN COUNT(DISTINCT(n1))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'unrolledControllers':result.records[0]._fields[0].low}) this.setState({'unrolledControllers':result.records[0]._fields[0].low});
s9.close() s9.close();
}.bind(this)) }.bind(this));
s10.run("MATCH p = shortestPath((n1)-[r1:MemberOf|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(u1:User {name: {name}})) RETURN COUNT(DISTINCT(n1))", {name:payload}) s10.run("MATCH (n1) WHERE NOT n1.name={name} WITH n1 MATCH p = shortestPath((n1)-[r1:MemberOf|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(u1:User {name: {name}})) RETURN COUNT(DISTINCT(n1))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'transitiveControllers':result.records[0]._fields[0].low}) this.setState({'transitiveControllers':result.records[0]._fields[0].low});
s10.close() s10.close();
}.bind(this)) }.bind(this));
s11.run("MATCH p = (u:User {name:{name}})-[r1:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN COUNT(DISTINCT(n))", {name:payload}) s11.run("MATCH p = (u:User {name:{name}})-[r1:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'firstdegreeControl':result.records[0]._fields[0].low}) this.setState({'firstdegreeControl':result.records[0]._fields[0].low});
s11.close() s11.close();
}.bind(this)) }.bind(this));
s12.run("MATCH p = (u:User {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN COUNT(DISTINCT(n))", {name:payload}) s12.run("MATCH p = (u:User {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'unrolledControl':result.records[0]._fields[0].low}) this.setState({'unrolledControl':result.records[0]._fields[0].low});
s12.close() s12.close();
}.bind(this)) }.bind(this));
s13.run("MATCH p = shortestPath((u:User {name:{name}})-[r1:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN COUNT(DISTINCT(n))", {name:payload}) s13.run("MATCH (n) WHERE NOT n.name={name} WITH n MATCH p = shortestPath((u:User {name:{name}})-[r1:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN COUNT(DISTINCT(n))", {name:payload})
.then(function(result){ .then(function(result){
this.setState({'transitiveControl':result.records[0]._fields[0].low}) this.setState({'transitiveControl':result.records[0]._fields[0].low});
s13.close() s13.close();
}.bind(this)) }.bind(this));
this.setState({'driversessions': [s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13]}) this.setState({'driversessions': [s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13]});
} }
render() { render() {
var domain = '@' + this.state.label.split('@').last() var domain = '@' + this.state.label.split('@').last();
return ( return (
<div className={this.props.visible ? "" : "displaynone"}> <div className={this.props.visible ? "" : "displaynone"}>
<dl className='dl-horizontal'> <dl className='dl-horizontal'>
@ -193,8 +193,9 @@ export default class UserNodeData extends Component {
value={this.state.sessions} value={this.state.sessions}
click={function(){ click={function(){
emitter.emit('query', "MATCH (n:Computer)-[r:HasSession]->(m:User {name:{name}}) RETURN n,r,m", {name:this.state.label} emitter.emit('query', "MATCH (n:Computer)-[r:HasSession]->(m:User {name:{name}}) RETURN n,r,m", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4>Group Membership</h4> <h4>Group Membership</h4>
@ -209,8 +210,9 @@ export default class UserNodeData extends Component {
emitter.emit( emitter.emit(
'query', 'query',
"MATCH p = (n:User {name:{name}})-[r:MemberOf]->(g:Group) RETURN p", {name:this.state.label} "MATCH p = (n:User {name:{name}})-[r:MemberOf]->(g:Group) RETURN p", {name:this.state.label}
) );
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Unrolled Group Memberships Unrolled Group Memberships
@ -221,8 +223,9 @@ export default class UserNodeData extends Component {
value={this.state.unrolledGroupMembership} value={this.state.unrolledGroupMembership}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (n:User {name:{name}})-[r:MemberOf*1..]->(g:Group) RETURN p", {name:this.state.label}, emitter.emit('query', "MATCH p = (n:User {name:{name}})-[r:MemberOf*1..]->(g:Group) RETURN p", {name:this.state.label},
this.state.label) this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Foreign Group Membership Foreign Group Membership
@ -233,8 +236,9 @@ export default class UserNodeData extends Component {
value={this.state.foreignGroupMembership} value={this.state.foreignGroupMembership}
click={function(){ click={function(){
emitter.emit('query', emitter.emit('query',
"MATCH (n:Group) WHERE NOT n.name ENDS WITH {domain} WITH n MATCH (m:User {name:{name}}) WITH n,m MATCH p = (m)-[r:MemberOf*1..]->(n) RETURN p", {name: this.state.label, domain: domain}) "MATCH (n:Group) WHERE NOT n.name ENDS WITH {domain} WITH n MATCH (m:User {name:{name}}) WITH n,m MATCH p = (m)-[r:MemberOf*1..]->(n) RETURN p", {name: this.state.label, domain: domain});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4> <h4>
@ -248,8 +252,9 @@ export default class UserNodeData extends Component {
ready={this.state.firstDegreeLocalAdmin !== -1} ready={this.state.firstDegreeLocalAdmin !== -1}
value={this.state.firstDegreeLocalAdmin} value={this.state.firstDegreeLocalAdmin}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (n:User {name:{name}})-[r:AdminTo]->(c:Computer) RETURN p", {name:this.state.label}) emitter.emit('query', "MATCH p = (n:User {name:{name}})-[r:AdminTo]->(c:Computer) RETURN p", {name:this.state.label});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Group Delegated Local Admin Rights Group Delegated Local Admin Rights
@ -260,8 +265,9 @@ export default class UserNodeData extends Component {
value={this.state.groupDelegatedLocalAdmin} value={this.state.groupDelegatedLocalAdmin}
click={function(){ click={function(){
emitter.emit('query', "MATCH p=(n:User {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(c:Computer) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH p=(n:User {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(c:Computer) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Derivative Local Admin Rights Derivative Local Admin Rights
@ -271,9 +277,10 @@ export default class UserNodeData extends Component {
ready={this.state.derivativeLocalAdmin !== -1} ready={this.state.derivativeLocalAdmin !== -1}
value={this.state.derivativeLocalAdmin} value={this.state.derivativeLocalAdmin}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = shortestPath((n:User {name:{name}})-[r:HasSession|AdminTo|MemberOf*1..]->(c:Computer)) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH (c:Computer) WHERE NOT c.name={name} WITH c MATCH p = shortestPath((n:User {name:{name}})-[r:HasSession|AdminTo|MemberOf*1..]->(c)) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4> <h4>
@ -287,8 +294,9 @@ export default class UserNodeData extends Component {
ready={this.state.firstdegreeControl !== -1} ready={this.state.firstdegreeControl !== -1}
value={this.state.firstdegreeControl} value={this.state.firstdegreeControl}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (u:User {name:{name}})-[r1:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label}) emitter.emit('query', "MATCH p = (u:User {name:{name}})-[r1:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label});
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Group Delegated Object Control Group Delegated Object Control
@ -299,8 +307,9 @@ export default class UserNodeData extends Component {
value={this.state.unrolledControl} value={this.state.unrolledControl}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (u:User {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH p = (u:User {name:{name}})-[r1:MemberOf*1..]->(g:Group)-[r2:AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(n) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Transitive Object Control Transitive Object Control
@ -310,9 +319,10 @@ export default class UserNodeData extends Component {
ready={this.state.transitiveControl !== -1} ready={this.state.transitiveControl !== -1}
value={this.state.transitiveControl} value={this.state.transitiveControl}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = shortestPath((u:User {name:{name}})-[r1:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH (n) WHERE NOT n.name={name} WITH n MATCH p = shortestPath((u:User {name:{name}})-[r1:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(n)) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<br /> <br />
<h4>Inbound Object Control</h4> <h4>Inbound Object Control</h4>
@ -325,8 +335,9 @@ export default class UserNodeData extends Component {
value={this.state.firstdegreeControllers} value={this.state.firstdegreeControllers}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (n)-[r:AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(u1:User {name: {name}}) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH p = (n)-[r:AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(u1:User {name: {name}}) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Unrolled Object Controllers Unrolled Object Controllers
@ -337,8 +348,9 @@ export default class UserNodeData extends Component {
value={this.state.unrolledControllers} value={this.state.unrolledControllers}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = (n1)-[r:MemberOf*1..]->(g:Group)-[r1:AddMembers|AllExtendedRights|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(u:User {name: {name}}) WITH LENGTH(p) as pathLength, p, n1 WHERE NONE (x in NODES(p)[1..(pathLength-1)] WHERE x.name = u.name) AND NOT n1.name = u.name RETURN p", {name:this.state.label} emitter.emit('query', "MATCH p = (n1)-[r:MemberOf*1..]->(g:Group)-[r1:AddMembers|AllExtendedRights|GenericAll|GenericWrite|WriteDacl|WriteOwner]->(u:User {name: {name}}) WITH LENGTH(p) as pathLength, p, n1 WHERE NONE (x in NODES(p)[1..(pathLength-1)] WHERE x.name = u.name) AND NOT n1.name = u.name RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
<dt> <dt>
Transitive Object Controllers Transitive Object Controllers
@ -348,9 +360,10 @@ export default class UserNodeData extends Component {
ready={this.state.transitiveControllers !== -1} ready={this.state.transitiveControllers !== -1}
value={this.state.transitiveControllers} value={this.state.transitiveControllers}
click={function(){ click={function(){
emitter.emit('query', "MATCH p = shortestPath((n1)-[r1:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(u1:User {name: {name}})) RETURN p", {name:this.state.label} emitter.emit('query', "MATCH (n1) WHERE NOT n1.name={name} WITH n1 MATCH p = shortestPath((n1)-[r1:MemberOf|AddMembers|AllExtendedRights|ForceChangePassword|GenericAll|GenericWrite|WriteDacl|WriteOwner*1..]->(u1:User {name: {name}})) RETURN p", {name:this.state.label}
,this.state.label) ,this.state.label);
}.bind(this)} /> }.bind(this)}
/>
</dd> </dd>
</dl> </dl>
</div> </div>
@ -360,4 +373,4 @@ export default class UserNodeData extends Component {
UserNodeData.propTypes = { UserNodeData.propTypes = {
visible : React.PropTypes.bool.isRequired visible : React.PropTypes.bool.isRequired
} };