PageRenderTime 51ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/GeneralPDP/TranslationToDkal/XacmlPolicyTranslator.fs

#
F# | 84 lines | 64 code | 19 blank | 1 comment | 2 complexity | 5b069d4707c4a2da71845cfdd00c044f MD5 | raw file
Possible License(s): Apache-2.0, GPL-3.0, LGPL-3.0, BSD-3-Clause
  1. namespace Microsoft.Research.GeneralPDP.Translations.ToDKAL
  2. open Microsoft.Research.GeneralPDP.DKAL.Engine.ParsingCtxFactory
  3. open Microsoft.Research.GeneralPDP.DKAL.Engine.Basics
  4. open Microsoft.Research.GeneralPDP.XACML.Ast
  5. open Microsoft.Research.GeneralPDP.XACML.Simplifier
  6. open Microsoft.Research.DkalEngine
  7. open Microsoft.Research.DkalEngine.Ast
  8. open Microsoft.Research.DkalEngine.Util
  9. open XacmlToExps
  10. open XacmlToDisjointExps
  11. open ExpressionTranslator
  12. open Option
  13. open System.Collections.Generic
  14. module XacmlPolicyTranslator =
  15. type XacmlPolicyTranslator (sender: string, receiver: string, pctx: ParsingCtx) =
  16. let translator = ExpressionTranslator(pctx)
  17. let unfold = List.reduceBack (fun t1 t2 -> App(pctx.LookupFunction("and"), [t1; t2]))
  18. let simplifyConditions cdps =
  19. let simplifiedConditionPairs = List.map (fun (c,d) -> (simplifyExp c, d)) cdps
  20. let filteredConditions = List.filter (fun (c,_) -> c <> (ValueExp(BoolAtomValue false))) simplifiedConditionPairs
  21. filteredConditions
  22. member private this.BuildPolicyCommRule (condition: Expression, decision: Decision) =
  23. let translator = ExpressionTranslator(pctx)
  24. let reqId = Var(pctx.MakeVar "REQ" Type.Int)
  25. let pep = Var(pctx.MakeVar "PEP" Type.Principal)
  26. let conditions = match condition with
  27. | ApplyExp("and", es) -> es
  28. | c -> [c]
  29. let conditions' = List.map translator.TranslateExpression conditions
  30. let asInfons = List.map translator.AsInfon conditions'
  31. let attributes = translator.AttributeInfons reqId pep condition
  32. let reqPresent = translator.RequestArrivedInfon reqId pep
  33. let trigger = [reqPresent] @ attributes @ asInfons
  34. let decisionInfon = translator.DecisionInfon reqId pep decision
  35. SendTo {ai = {origin = fakePos; principal = {internal_id= 0; name= sender; typ= Type.Principal}};
  36. target = Const(Principal({internal_id= 0; name= receiver; typ= Type.Principal}));
  37. message = decisionInfon;
  38. proviso = Term.Empty;
  39. trigger = trigger |> unfold;
  40. certified = CertifiedSay}
  41. member private this.TranslateCondition (condition: Expression, decision: Decision) =
  42. let reqId = Var(pctx.MakeVar "REQ" Type.Int)
  43. let pep = Var(pctx.MakeVar "PEP" Type.Principal)
  44. let pap = Const(Principal(pctx.LookupOrAddPrincipal(receiver)))
  45. let conditions = match condition with
  46. | ApplyExp("and", es) -> es
  47. | c -> [c]
  48. let conditions' = List.map translator.TranslateExpression conditions
  49. let asInfons = List.map translator.AsInfon conditions'
  50. let attributes = translator.AttributeInfons reqId pep condition
  51. let reqPresent = translator.RequestArrivedInfon reqId pep
  52. let guard = unfold ([reqPresent] @ attributes @ asInfons)
  53. let decisionInfon = translator.DecisionInfon reqId pep decision
  54. let impliedDecision = App(pctx.LookupFunction("said"), [pap; decisionInfon])
  55. App(pctx.LookupFunction("follows"), [guard; impliedDecision])
  56. member this.TranslatePolicyToInfons (policy: Policy) =
  57. let cdPairs = policyToDisjointCondDecisionPairs policy |> simplifyConditions
  58. List.map this.TranslateCondition cdPairs
  59. member this.TranslatePolicyToCommRules (policy: Policy) =
  60. let cdPairs = policyToCondDecisionPairs policy |> simplifyConditions
  61. let _, trustAssertions = xacmlBasicTrustingCtx sender receiver
  62. let commRules = List.map this.BuildPolicyCommRule cdPairs
  63. // Add default last NotApplicable comm rule
  64. let naCommRule = this.BuildPolicyCommRule (ValueExp(BoolAtomValue true), NotApplicable)
  65. DkalPolicy(policy.PolicyId, trustAssertions @ commRules @ [naCommRule])