From 3d02d42505922d34e3634a21297cbf2ad4e33596 Mon Sep 17 00:00:00 2001 From: John Kastner Date: Mon, 27 Nov 2023 17:18:55 -0500 Subject: [PATCH 1/6] Add documentation for new `is` operator --- docs/collections/_policies/json-format.md | 158 ++++++++++++++++++ docs/collections/_policies/syntax-grammar.md | 2 +- .../collections/_policies/syntax-operators.md | 28 ++++ docs/collections/_policies/syntax-policy.md | 12 ++ docs/collections/_policies/templates.md | 1 + docs/collections/_policies/validation.md | 2 +- 6 files changed, 201 insertions(+), 2 deletions(-) diff --git a/docs/collections/_policies/json-format.md b/docs/collections/_policies/json-format.md index 5d518cd..ce7f16c 100644 --- a/docs/collections/_policies/json-format.md +++ b/docs/collections/_policies/json-format.md @@ -208,6 +208,73 @@ The `op` key is required. The `op` object must have one of the following string }, ``` +* `is` + + If present, then the `principal` object must also have a an `entity_type` key. + + **Example** + + Cedar policy line: + + ```cedar + principal is User + ``` + + JSON representation: + + ```json + "principal": { + "op": "is", + "entity_type": "User" + } + ``` + + The `principal` object may also optionally have an `in` key. The value of this key is an object with one of the following: + + * [`entity`](#entity) + + **Example** + + Cedar policy line: + + ```cedar + principal is User in Group::"Admins" + ``` + + JSON representation: + + ```json + "principal": { + "op": "is", + "entity_type": "User", + "in": { + "entity": { "type": "Group", "id": "Admins" } + } + } + ``` + + * [`slot`](#slot) + + **Example** + + Cedar policy line: + + ```cedar + principal is User in ?principal + ``` + + JSON representation + + ```json + "principal": { + "op": "is", + "entity_type": "User", + "in": { + "slot": { "?principal" } + } + }, + ``` + ## `action` The `action` object is required. @@ -425,6 +492,73 @@ The `op` object must have one of the following string values: } ``` +* `is` + + If present, then the `resource` object must also have a an `entity_type` key. + + **Example** + + Cedar policy line: + + ```cedar + resource is file + ``` + + JSON representation: + + ```json + "resource": { + "op": "is", + "entity_type": "file" + } + ``` + + The `resource` object may also optionally have an `in` key. The value of this key is an object with one of the following: + + * [`entity`](#entity) + + **Example** + + Cedar policy line: + + ```cedar + resource is file in folder::"Public" + ``` + + JSON representation: + + ```json + "resource": { + "op": "is", + "entity_type": "file", + "in": { + "entity": { "type": "Folder", "id": "Public" } + } + } + ``` + + * [`slot`](#slot) + + **Example** + + Cedar policy line: + + ```cedar + resource is file in ?resource + ``` + + JSON representation + + ```json + "resource": { + "op": "is", + "entity_type": "file", + "in": { + "slot": { "?resource" } + } + }, + ``` + ## conditions The `conditions` object is required. @@ -789,6 +923,30 @@ JSON representation } ``` +### `is` {#JsonExpr-is} + +The value of this key is an object with the keys `left` and `entity_type`. +The `left` key is itself an [JsonExpr object](#JsonExpr-objects), while the `entity_type` key is a string. +The value may optionally have an `in` key which is also a JsonExpr object. + +**Example for `is`** + +Cedar policy line + +```cedar +principal is User in Group::"friends" +``` + +JSON representation + +```json +"is": { + "left": { "Var": "principal" }, + "entity_type": "User", + "in": {"entity": { "type": "Folder", "id": "Public" }} +} +``` + ### `like` {#JsonExpr-like} The value of this key is an object with keys `left` and `pattern`. The left key is itself an [JsonExpr object](#JsonExpr-objects), while the `pattern` key is any string. diff --git a/docs/collections/_policies/syntax-grammar.md b/docs/collections/_policies/syntax-grammar.md index 06f10d7..9fe4dfa 100644 --- a/docs/collections/_policies/syntax-grammar.md +++ b/docs/collections/_policies/syntax-grammar.md @@ -117,7 +117,7 @@ For more details, see [`&&` \(AND\)](../policies/syntax-operators.html#operator- ## `Relation` {#grammar-relation} ``` -Relation ::= Add [RELOP Add] | Add 'has' (IDENT | STR) | Add 'like' PAT +Relation ::= Add [RELOP Add] | Add 'has' (IDENT | STR) | Add 'like' PAT | Add 'is' Path ('in' Add)? ``` ## `Add` {#grammar-add} diff --git a/docs/collections/_policies/syntax-operators.md b/docs/collections/_policies/syntax-operators.md index 2295112..2e3e4c5 100644 --- a/docs/collections/_policies/syntax-operators.md +++ b/docs/collections/_policies/syntax-operators.md @@ -808,6 +808,34 @@ In that case, then the previous expression that checks for `context.addr has cou context has addr && context.addr has country && context.addr.country == "US" // false, with no error ``` +### `is` \(entity type test\) {#operator-is} + +**Usage:** ` is ` + +Boolean operator that evaluates to `true` if the left operand is an entity and has the specified entity type and evaluates to `false` if it is an entity that does not have the specified entity type. +If you attempt to test the type of an expression that is not an entity, then Cedar generates an error. + +**Usage:** ` is in ` + +The `is` operator may optionally be combined with an `in` operation, in which case the expression is equivalent to ` is && in `. + +**Usage:** ` is in set(, , ...)` + +As when `in` appears on it's own, an `is` with an `in` may check membership in a set of entities. It still may only check for one entity type. + +#### Examples: +{: .no_toc } + +```cedar +User::"alice" is User // true +principal is User // true if `principal` has the `User` entity type +principal is User in Group::"friends" // true if `principal` has the `User` entity type and is in `Group::"friends` +ExampleCo::User::"alice" is ExampleCo::User // true +Group::"friends" is User // false +ExampleCo::User::"alice" is User // false - `ExampleCo::User` and `User` are different entity types +"alice" is String // type error - `is` only applies to entities +``` + ### `.contains()` \(single element set membership test\) {#function-contains} **Usage:** `.contains()` diff --git a/docs/collections/_policies/syntax-policy.md b/docs/collections/_policies/syntax-policy.md index 5fe9d0b..10ce4f5 100644 --- a/docs/collections/_policies/syntax-policy.md +++ b/docs/collections/_policies/syntax-policy.md @@ -114,6 +114,12 @@ principal == User::"alice" //matches any principal in the hierarchy of the specified Group principal in Group::"alice_friends" + +//matches any principal of type User +principal is User + +//matches any principal of type User in the hierarchy of the specified Group +principal is User in Group::"alice_friends" ``` ### `action` {#term-parc-action} @@ -157,6 +163,12 @@ resource == Photo::"VacationPhoto94.jpg" //matches any resource that is in the hierarchy of the specified entity of type Album resource in Album::"alice_vacation" + +//matches any resource of type Photo +resource is Photo + +//matches any resource of type Photo in the hierarchy of the specified entity Album +resource is Photo in Album::"alice_vacation" ``` ## Conditions {#term-parc-context} diff --git a/docs/collections/_policies/templates.md b/docs/collections/_policies/templates.md index 415692f..e75d094 100644 --- a/docs/collections/_policies/templates.md +++ b/docs/collections/_policies/templates.md @@ -17,6 +17,7 @@ You can use placeholders in a Cedar policy template for only the following two e You can use either one or both in a policy template. Placeholders can appear in ***only*** the policy head on the right-hand side of the `==` or `in` operators. +This includes `in` operators when appearing together with an `is` operator, but excludes solitary `is` operators. Then, when you create a policy based on the policy template, you must specify values for each of the placeholders. Those values are combined with the rest of the policy template to form a complete and usable template-linked policy. diff --git a/docs/collections/_policies/validation.md b/docs/collections/_policies/validation.md index 53dd3d5..6a314da 100644 --- a/docs/collections/_policies/validation.md +++ b/docs/collections/_policies/validation.md @@ -116,7 +116,7 @@ The validator compares a policy with a schema to look for inconsistencies. From + **Unrecognized attributes** – For example, `principal.jobbLevel` has a typo and should be `jobLevel`. + **Unsafe access to optional attributes** – For example, `principal.numberOfLaptops` where `numberOfLaptops` is an optional attribute declared with `"required": false`. Such tests should be guarded by including a [`has`](../policies/syntax-operators.html#operator-has) check as the left side of the shortcut [&&](../policies/syntax-operators.html#operator-and) expression. For example, as in `principal has numberOfLaptops && principal.numberOfLaptops > 1`. + **Type mismatch in operators** – For example, `principal.jobLevel > "14"` is an illegal comparison with a `String`. -+ **Cases that always evaluate to false, and thus never apply** – For example, `when { principal has manager && principal.manager == User::"Ethel" }` always evaluates to `false` when the type of `principal` will never have the `manager` attribute, as made clear in the schema, so the policy can never apply. ++ **Cases that always evaluate to false, and thus never apply** – For example, `when { principal has manager && principal.manager == User::"Ethel" }` always evaluates to `false` when the type of `principal` will never have the `manager` attribute, as made clear in the schema, so the policy can never apply. Similarly, `principal is ExampleCo::Personnel::Admin` always evaluates to `false` when the `principal` is always a `User`, and not an `Admin`. The schema can also specify the expected format of the context record for each `Action`. Making this specification lets Cedar also flag errors on references to context. From e14cfe340b6c84a2ae30ec78cd9556433b78a922 Mon Sep 17 00:00:00 2001 From: John Kastner Date: Tue, 28 Nov 2023 09:10:25 -0500 Subject: [PATCH 2/6] fixes --- docs/collections/_policies/json-format.md | 4 ++-- docs/collections/_policies/syntax-operators.md | 4 ++-- docs/collections/_policies/validation.md | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/collections/_policies/json-format.md b/docs/collections/_policies/json-format.md index ce7f16c..e50b8c2 100644 --- a/docs/collections/_policies/json-format.md +++ b/docs/collections/_policies/json-format.md @@ -210,7 +210,7 @@ The `op` key is required. The `op` object must have one of the following string * `is` - If present, then the `principal` object must also have a an `entity_type` key. + If present, then the `principal` object must also have an `entity_type` key. **Example** @@ -494,7 +494,7 @@ The `op` object must have one of the following string values: * `is` - If present, then the `resource` object must also have a an `entity_type` key. + If present, then the `resource` object must also have an `entity_type` key. **Example** diff --git a/docs/collections/_policies/syntax-operators.md b/docs/collections/_policies/syntax-operators.md index 2e3e4c5..84e0825 100644 --- a/docs/collections/_policies/syntax-operators.md +++ b/docs/collections/_policies/syntax-operators.md @@ -812,7 +812,7 @@ context has addr && context.addr has country && context.addr.country == "US" // **Usage:** ` is ` -Boolean operator that evaluates to `true` if the left operand is an entity and has the specified entity type and evaluates to `false` if it is an entity that does not have the specified entity type. +Boolean operator that evaluates to `true` if the left operand is an entity that has the specified entity type and evaluates to `false` if the left operand is an entity that does not have the specified entity type. If you attempt to test the type of an expression that is not an entity, then Cedar generates an error. **Usage:** ` is in ` @@ -829,7 +829,7 @@ As when `in` appears on it's own, an `is` with an `in` may check membership in a ```cedar User::"alice" is User // true principal is User // true if `principal` has the `User` entity type -principal is User in Group::"friends" // true if `principal` has the `User` entity type and is in `Group::"friends` +principal is User in Group::"friends" // true if `principal` has the `User` entity type and is in `Group::"friends"` ExampleCo::User::"alice" is ExampleCo::User // true Group::"friends" is User // false ExampleCo::User::"alice" is User // false - `ExampleCo::User` and `User` are different entity types diff --git a/docs/collections/_policies/validation.md b/docs/collections/_policies/validation.md index 6a314da..ee6e870 100644 --- a/docs/collections/_policies/validation.md +++ b/docs/collections/_policies/validation.md @@ -116,7 +116,8 @@ The validator compares a policy with a schema to look for inconsistencies. From + **Unrecognized attributes** – For example, `principal.jobbLevel` has a typo and should be `jobLevel`. + **Unsafe access to optional attributes** – For example, `principal.numberOfLaptops` where `numberOfLaptops` is an optional attribute declared with `"required": false`. Such tests should be guarded by including a [`has`](../policies/syntax-operators.html#operator-has) check as the left side of the shortcut [&&](../policies/syntax-operators.html#operator-and) expression. For example, as in `principal has numberOfLaptops && principal.numberOfLaptops > 1`. + **Type mismatch in operators** – For example, `principal.jobLevel > "14"` is an illegal comparison with a `String`. -+ **Cases that always evaluate to false, and thus never apply** – For example, `when { principal has manager && principal.manager == User::"Ethel" }` always evaluates to `false` when the type of `principal` will never have the `manager` attribute, as made clear in the schema, so the policy can never apply. Similarly, `principal is ExampleCo::Personnel::Admin` always evaluates to `false` when the `principal` is always a `User`, and not an `Admin`. ++ **Cases that always evaluate to false, and thus never apply** – For example, `when { principal has manager && principal.manager == User::"Ethel" }` always evaluates to `false` when the type of `principal` will never have the `manager` attribute, as made clear in the schema, so the policy can never apply. + Similarly, `principal is ExampleCo::Personnel::Admin` always evaluates to `false` when the `principal` is always a `User`, and not an `Admin`. The schema can also specify the expected format of the context record for each `Action`. Making this specification lets Cedar also flag errors on references to context. From 475cb28891490f67247111662d7e5159e9c1bd3a Mon Sep 17 00:00:00 2001 From: John Kastner Date: Wed, 29 Nov 2023 10:37:58 -0500 Subject: [PATCH 3/6] Update scope grammar for `is` --- docs/collections/_policies/syntax-grammar.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/collections/_policies/syntax-grammar.md b/docs/collections/_policies/syntax-grammar.md index 9fe4dfa..403ee24 100644 --- a/docs/collections/_policies/syntax-grammar.md +++ b/docs/collections/_policies/syntax-grammar.md @@ -60,10 +60,12 @@ Scope ::= Principal ',' Action ',' Resource The `Principal` element consists of the `principal` keyword. If specified by itself, the policy statement matches *any* principal. -Optionally, the keyword can be followed by either the [`in`](../policies/syntax-operators.html#operator-in) or [`==`](../policies/syntax-operators.html#operator-equality) operator, followed by either an `Entity`, or the `?principal` placeholder when used in a policy template. +Optionally, the keyword can be followed by either the [`in`](../policies/syntax-operators.html#operator-in), [`==`](../policies/syntax-operators.html#operator-equality), or [`is`](../_policies/syntax-operators.html#operator-is) operator. +An `is` operator may appear together with an `in` operators, but not an `==` operator. +The `in` and `==` operators are followed by either an `Entity`, or the `?principal` placeholder when used in a policy template. ``` -Principal ::= 'principal' [('in' | '==') (Entity | '?principal')] +Principal ::= 'principal' [(['is' PATH] ['in' (Entity | '?principal')]) | ('==' (Entity | '?principal'))] ``` ## `Action` {#grammar-action} @@ -76,10 +78,12 @@ Action ::= 'action' [( '==' Entity | 'in' ('[' EntList ']' | Entity) )] ## `Resource` {#grammar-resource} -The `Resource` consists of the `resource` keyword. If specified by itself, it matches any resource. Optionally, it can be followed by either the [`in`](../policies/syntax-operators.html#operator-in) or [`==`](../policies/syntax-operators.html#operator-equality) operator, followed by an entity, or the `?resource` placeholder when used in a policy template. +The `Resource` consists of the `resource` keyword. If specified by itself, it matches any resource. Optionally, it can be followed by either the [`in`](../policies/syntax-operators.html#operator-in), [`==`](../policies/syntax-operators.html#operator-equality), or [`is`](../_policies/syntax-operators.html#operator-is) operator. +An `is` operator may appear together with an `in` operators, but not an `==` operator. +The `in` and `==` operators are followed by either an `Entity`, or the `?resource` placeholder when used in a policy template. ``` -Resource ::= 'resource' [('in' | '==') (Entity | '?resource')] +Resource ::= 'resource' [(['is' PATH] ['in' (Entity | '?resource')]) | ('==' (Entity | '?resource'))] ``` ## `Condition` {#grammar-condition} From 8d9a01d8a82183087fb52efd7cad61907d801504 Mon Sep 17 00:00:00 2001 From: Brandon Cotter Date: Fri, 1 Dec 2023 11:23:44 -0800 Subject: [PATCH 4/6] fixed a typo, updated doc history, updated syntax highlighting --- docs/collections/_other/doc-history.md | 2 ++ docs/collections/_policies/syntax-operators.md | 2 +- docs/js/hljs-cedar.min.js | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/collections/_other/doc-history.md b/docs/collections/_other/doc-history.md index 3ad5bc9..143b38f 100644 --- a/docs/collections/_other/doc-history.md +++ b/docs/collections/_other/doc-history.md @@ -12,6 +12,7 @@ The following table describes major documentation updates for Cedar. | Description | Date | | --- | --- | +| Added [`is` operator](../auth/syntax-operators.html) | July 27, 2023 | | Added [Entities & context syntax](../auth/entities-syntax.html) topic | July 27, 2023 | | Added [Schema grammar](../schema/schema-grammar.html) topic | July 17, 2023 | | Added [JSON policy format](../policies/json-format.html) reference page | July 14, 2023 | @@ -23,6 +24,7 @@ The following table describes major documentation updates for Cedar. | Cedar
Version | Description | Cedar SDK
Versions | Date | | --- |--- |--- | --- | +| 3.0 | New `is` operator [PR](https://github.com/cedar-policy/cedar/pull/396) | 2.4.2 | December 1, 2023 | | 2.1.2 | Change to how validation treats template-linked policies [PR](https://github.com/cedar-policy/cedar/pull/371) | 2.4.2 | October 23, 2023 | | 2.1.1 | Increased validation precision [PR](https://github.com/cedar-policy/cedar/pull/117) | 2.4.0 - 2.4.1 | September 29, 2023 | | 2.1.0 | [RFC #9](https://github.com/cedar-policy/rfcs/blob/main/text/0009-disallow-whitespace-in-entityuid.md): Disallows whitespace in namespaces | 2.3.0 - 2.3.3 | June 29, 2023 | diff --git a/docs/collections/_policies/syntax-operators.md b/docs/collections/_policies/syntax-operators.md index 84e0825..ac64029 100644 --- a/docs/collections/_policies/syntax-operators.md +++ b/docs/collections/_policies/syntax-operators.md @@ -821,7 +821,7 @@ The `is` operator may optionally be combined with an `in` operation, in which ca **Usage:** ` is in set(, , ...)` -As when `in` appears on it's own, an `is` with an `in` may check membership in a set of entities. It still may only check for one entity type. +As when `in` appears on its own, an `is` with an `in` may check membership in a set of entities. It still may only check for one entity type. #### Examples: {: .no_toc } diff --git a/docs/js/hljs-cedar.min.js b/docs/js/hljs-cedar.min.js index 41c5656..aa3a4d4 100644 --- a/docs/js/hljs-cedar.min.js +++ b/docs/js/hljs-cedar.min.js @@ -1,3 +1,3 @@ -(()=>{function n(e){let i=["decimal","ip"],s=["principal","action","resource","context"],t={match:/(?:\?resource|\?principal)\b/,scope:"template-variable"},o={keyword:["permit","forbid","when","unless","if","then","else"],literal:["true","false"],built_in:i,variable:s},a={match:/(?:,|;|\.|\[|\]|\(|\)|{|})/,scope:"punctuation"},c={begin:/(?=","<=",">","<","\\+","-","\\*","in","like","has"].join("|")+")"+/(?!\w)/.source,scope:"operator",relevance:0},r={scope:"number",begin:"0|-?[1-9](_?[0-9])*",relevance:0},l={scope:"title.function.invoke",begin:"(?=.)(contains|containsAll|containsAny)(?=\\()",relevance:0},p={scope:"title.function.invoke",begin:"(?=.)(lessThan|lessThanOrEqual|greaterThan|greaterThanOrEqual)(?=\\()",relevance:0},u={scope:"title.function.invoke",begin:"(?=.)(isIpv4|isIpv6|isLoopback|isMulticast|isInRange)(?=\\()",relevance:0};return{name:"Cedar",aliases:["cedar"],case_insensitive:!1,keywords:o,contains:[e.QUOTE_STRING_MODE,e.C_LINE_COMMENT_MODE,r,a,c,l,p,u,t]}}window.hljsCedar=n;})(); +(()=>{function n(e){let i=["decimal","ip"],s=["principal","action","resource","context"],t={match:/(?:\?resource|\?principal)\b/,scope:"template-variable"},o={keyword:["permit","forbid","when","unless","if","then","else"],literal:["true","false"],built_in:i,variable:s},a={match:/(?:,|;|\.|\[|\]|\(|\)|{|})/,scope:"punctuation"},c={begin:/(?=","<=",">","<","\\+","-","\\*","in","like","has","is"].join("|")+")"+/(?!\w)/.source,scope:"operator",relevance:0},r={scope:"number",begin:"0|-?[1-9](_?[0-9])*",relevance:0},l={scope:"title.function.invoke",begin:"(?=.)(contains|containsAll|containsAny)(?=\\()",relevance:0},p={scope:"title.function.invoke",begin:"(?=.)(lessThan|lessThanOrEqual|greaterThan|greaterThanOrEqual)(?=\\()",relevance:0},u={scope:"title.function.invoke",begin:"(?=.)(isIpv4|isIpv6|isLoopback|isMulticast|isInRange)(?=\\()",relevance:0};return{name:"Cedar",aliases:["cedar"],case_insensitive:!1,keywords:o,contains:[e.QUOTE_STRING_MODE,e.C_LINE_COMMENT_MODE,r,a,c,l,p,u,t]}}window.hljsCedar=n;})(); //! Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. //! SPDX-License-Identifier: Apache-2.0 From e5500639320d19cb79230a51232f7e69a1a60b52 Mon Sep 17 00:00:00 2001 From: John Kastner Date: Fri, 1 Dec 2023 14:55:07 -0500 Subject: [PATCH 5/6] Update sdk version number and dates --- docs/collections/_other/doc-history.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/collections/_other/doc-history.md b/docs/collections/_other/doc-history.md index 143b38f..1259bee 100644 --- a/docs/collections/_other/doc-history.md +++ b/docs/collections/_other/doc-history.md @@ -12,7 +12,7 @@ The following table describes major documentation updates for Cedar. | Description | Date | | --- | --- | -| Added [`is` operator](../auth/syntax-operators.html) | July 27, 2023 | +| Added [`is` operator](../auth/syntax-operators.html) | December ??, 2023 | | Added [Entities & context syntax](../auth/entities-syntax.html) topic | July 27, 2023 | | Added [Schema grammar](../schema/schema-grammar.html) topic | July 17, 2023 | | Added [JSON policy format](../policies/json-format.html) reference page | July 14, 2023 | @@ -24,7 +24,7 @@ The following table describes major documentation updates for Cedar. | Cedar
Version | Description | Cedar SDK
Versions | Date | | --- |--- |--- | --- | -| 3.0 | New `is` operator [PR](https://github.com/cedar-policy/cedar/pull/396) | 2.4.2 | December 1, 2023 | +| 3.0.0 | New `is` operator [PR](https://github.com/cedar-policy/cedar/pull/396) | 3.0.0 | December ??, 2023 | | 2.1.2 | Change to how validation treats template-linked policies [PR](https://github.com/cedar-policy/cedar/pull/371) | 2.4.2 | October 23, 2023 | | 2.1.1 | Increased validation precision [PR](https://github.com/cedar-policy/cedar/pull/117) | 2.4.0 - 2.4.1 | September 29, 2023 | | 2.1.0 | [RFC #9](https://github.com/cedar-policy/rfcs/blob/main/text/0009-disallow-whitespace-in-entityuid.md): Disallows whitespace in namespaces | 2.3.0 - 2.3.3 | June 29, 2023 | From 4044f3ab3aa23fd954267e5270b591d3a1ee8438 Mon Sep 17 00:00:00 2001 From: John Kastner <130772734+john-h-kastner-aws@users.noreply.github.com> Date: Fri, 15 Dec 2023 16:05:00 -0500 Subject: [PATCH 6/6] Update release dates --- docs/collections/_other/doc-history.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/collections/_other/doc-history.md b/docs/collections/_other/doc-history.md index 1259bee..07ace82 100644 --- a/docs/collections/_other/doc-history.md +++ b/docs/collections/_other/doc-history.md @@ -12,7 +12,7 @@ The following table describes major documentation updates for Cedar. | Description | Date | | --- | --- | -| Added [`is` operator](../auth/syntax-operators.html) | December ??, 2023 | +| Added [`is` operator](../auth/syntax-operators.html) | December 15, 2023 | | Added [Entities & context syntax](../auth/entities-syntax.html) topic | July 27, 2023 | | Added [Schema grammar](../schema/schema-grammar.html) topic | July 17, 2023 | | Added [JSON policy format](../policies/json-format.html) reference page | July 14, 2023 | @@ -24,7 +24,7 @@ The following table describes major documentation updates for Cedar. | Cedar
Version | Description | Cedar SDK
Versions | Date | | --- |--- |--- | --- | -| 3.0.0 | New `is` operator [PR](https://github.com/cedar-policy/cedar/pull/396) | 3.0.0 | December ??, 2023 | +| 3.0.0 | New `is` operator [PR](https://github.com/cedar-policy/cedar/pull/396) | 3.0.0 | December 15, 2023 | | 2.1.2 | Change to how validation treats template-linked policies [PR](https://github.com/cedar-policy/cedar/pull/371) | 2.4.2 | October 23, 2023 | | 2.1.1 | Increased validation precision [PR](https://github.com/cedar-policy/cedar/pull/117) | 2.4.0 - 2.4.1 | September 29, 2023 | | 2.1.0 | [RFC #9](https://github.com/cedar-policy/rfcs/blob/main/text/0009-disallow-whitespace-in-entityuid.md): Disallows whitespace in namespaces | 2.3.0 - 2.3.3 | June 29, 2023 |