package Ġcom . eg m . st elli o . entity . authorization Ċ Ċ import Ġcom . eg m . st elli o . entity . model . Relationship Ċ import Ġcom . eg m . st elli o . shared . util . Auth Context Model . AUTH _ PROP _ RO LES Ċ import Ġcom . eg m . st elli o . shared . util . Auth Context Model . AUTH _ PROP _ SAP Ċ import Ġcom . eg m . st elli o . shared . util . Auth Context Model . AUTH _ PROP _ SID Ċ import Ġcom . eg m . st elli o . shared . util . Auth Context Model . AUTH _ REL _ CAN _ ADMIN Ċ import Ġcom . eg m . st elli o . shared . util . Auth Context Model . CLIENT _ TYPE Ċ import Ġcom . eg m . st elli o . shared . util . Auth Context Model . USER _ TYPE Ċ import Ġcom . eg m . st elli o . shared . util . toList Of String Ċ import Ġcom . eg m . st elli o . shared . util . to Uri Ċ import Ġorg . springframework . data . neo 4 j . core . Neo 4 j Client Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . net . URI Ċ Ċ @ Component Ċ class ĠNeo 4 j Authorization Repository ( ĊĠĠĠ Ġprivate Ġval Ġne o 4 j Client : ĠNeo 4 j Client Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġfilter Entities User Has OneOf Given Rights ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠURI , ĊĠĠĠĠĠĠĠ Ġentities Id : ĠList < URI >, ĊĠĠĠĠĠĠĠ Ġrights : ĠSet < String > ĊĠĠĠ Ġ): ĠList < URI > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( user Entity : Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE Ġ( user Entity . id Ġ= Ġ${ '$ '} userId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOR Ġ( user Entity )- [: HAS _ VALUE ]-> (: Property Ġ{ Ġname : Ġ"$ AUTH _ PROP _ SID ", Ġvalue : Ġ${ '$ '} userId Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWITH Ġuser Entity ĠĊĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( entity : Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE Ġentity . id ĠIN Ġ${ '$ '} entities Id ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWITH Ġuser Entity , Ġentity ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( user Entity )- [: HAS _ OBJECT ]-> ( right : Attribute : Relationship )- [] -> ( entity : Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE Ġsize ([ label ĠIN Ġlabels ( right ) ĠWHERE Ġlabel ĠIN Ġ${ '$ '} rights ]) Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentity . id Ġas Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUNION ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( user Entity )- [: HAS _ OBJECT ]-> (: Attribute : Relationship )- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ[: is Member Of ]-> (: Entity )- [: HAS _ OBJECT ] -( grp Right : Attribute : Relationship )- [] -> ( entity : Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE Ġsize ([ label ĠIN Ġlabels ( grp Right ) ĠWHERE Ġlabel ĠIN Ġ${ '$ '} rights ]) Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentity . id Ġas Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" userId " Ġto ĠuserId . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" entities Id " Ġto Ġentities Id . toList Of String (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" rights " Ġto Ġrights ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġne o 4 j Client . query ( query ). bind All ( parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fetch (). all () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( it [" id "] Ġas ĠString ). to Uri () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfilter Entities With Specific Access Policy ( ĊĠĠĠĠĠĠĠ Ġentities Id : ĠList < URI >, ĊĠĠĠĠĠĠĠ Ġspecific Access Policies : ĠList < String > ĊĠĠĠ Ġ): ĠList < URI > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( entity : Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE Ġentity . id ĠIN Ġ${ '$ '} entities Id ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( entity )- [: HAS _ VALUE ]-> ( p : Property Ġ{ Ġname : Ġ"$ AUTH _ PROP _ SAP " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE Ġp . value ĠIN Ġ${ '$ '} specific Access Policies ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN Ġentity . id Ġas Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" entities Id " Ġto Ġentities Id . toList Of String (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" specific Access Policies " Ġto Ġspecific Access Policies ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġne o 4 j Client . query ( query ). bind All ( parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fetch (). all () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( it [" id "] Ġas ĠString ). to Uri () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetUser Roles ( userId : ĠURI ): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( user Entity : Entity Ġ{ Ġid : Ġ${ '$ '} userId Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOPTIONAL ĠMATCH Ġ( user Entity )- [: HAS _ VALUE ]-> ( p : Property Ġ{ Ġname :" $ AUTH _ PROP _ RO LES " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOPTIONAL ĠMATCH Ġ( user Entity )- [: HAS _ OBJECT ] -( r : Attribute : Relationship )- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ[: is Member Of ]-> ( group : Entity )- [: HAS _ VALUE ]-> ( p group : Property Ġ{ Ġname : Ġ"$ AUTH _ PROP _ RO LES " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN Ġap oc . coll . union ( collect ( p . value ), Ġcollect ( p group . value )) Ġas Ġroles ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUNION ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( client : Entity )- [: HAS _ VALUE ]-> ( sid : Property Ġ{ Ġname : Ġ"$ AUTH _ PROP _ SID ", Ġvalue : Ġ${ '$ '} userId Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOPTIONAL ĠMATCH Ġ( client )- [: HAS _ VALUE ]-> ( p : Property Ġ{ Ġname :" $ AUTH _ PROP _ RO LES " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOPTIONAL ĠMATCH Ġ( client )- [: HAS _ OBJECT ] -( r : Attribute : Relationship )- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ[: is Member Of ]-> ( group : Entity )- [: HAS _ VALUE ]-> ( p group : Property Ġ{ Ġname : Ġ"$ AUTH _ PROP _ RO LES " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN Ġap oc . coll . union ( collect ( p . value ), Ġcollect ( p group . value )) Ġas Ġroles ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" userId " Ġto ĠuserId . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġne o 4 j Client . query ( query ). bind All ( parameters ). fetch (). all () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroles Ġ= Ġit [" roles "] Ġas ĠList < *> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroles . flatMap Ġ{ Ġroles Entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( roles Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> ĠlistOf ( roles Entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList < *> Ġ-> Ġroles Entry Ġas ĠList < String > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Admin Links ( userId : ĠURI , Ġrelationships : ĠList < Relationship >, Ġentities Id : ĠList < URI >): ĠList < URI > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCALL Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( user : Entity :` $ USER _ TYPE `) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE Ġuser . id Ġ= Ġ${ '$ '} userId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUNION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( user : Entity :` $ CLIENT _ TYPE `) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE Ġ( user )- [: HAS _ VALUE ]-> (: Property Ġ{ Ġname : Ġ"$ AUTH _ PROP _ SID ", Ġvalue : Ġ${ '$ '} userId Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWITH Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUN W IND Ġ${ '$ '} rel Props And Targets ĠAS Ġrel Prop And Target ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( target : Entity Ġ{ Ġid : Ġrel Prop And Target . target EntityId Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCREATE Ġ( user )- [: HAS _ OBJECT ]-> ( r : Attribute : Relationship :` $ AUTH _ REL _ CAN _ ADMIN `) - [: r Can Admin ]-> ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSET Ġr Ġ= Ġrel Prop And Target . props ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN Ġr . id Ġas Ġid ĊĠĠĠĠĠĠĠ Ġ""" ĊĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" rel Props And Targets " Ġto Ġrelationships ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . node Properties () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. zip ( entities Id . toList Of String ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" props " Ġto Ġit . first , Ġ" target EntityId " Ġto Ġit . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" userId " Ġto ĠuserId . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġne o 4 j Client . query ( query ). bind All ( parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fetch (). all () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( it [" id "] Ġas ĠString ). to Uri () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove User Rights On Entity ( ĊĠĠĠĠĠĠĠ Ġsubject Id : ĠURI , ĊĠĠĠĠĠĠĠ Ġtarget Id : ĠURI ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatch Query Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMATCH Ġ( subject : Entity Ġ{ Ġid : Ġ${ '$ '} subject Id Ġ}) - [: HAS _ OBJECT ] -( rel Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- [] -> ( target : Entity Ġ{ Ġid : Ġ${ '$ '} target Id Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDET ACH ĠDELETE Ġrel Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" subject Id " Ġto Ġsubject Id . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" target Id " Ġto Ġtarget Id . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġne o 4 j Client . query ( match Query ). bind All ( parameters ). run (). counters (). nodes Deleted () ĊĠĠĠ Ġ} Ċ } Ċ