Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RFC 53 implementation #1377

Open
wants to merge 37 commits into
base: main
Choose a base branch
from
Open

RFC 53 implementation #1377

wants to merge 37 commits into from

Conversation

shaobo-he-aws
Copy link
Contributor

@shaobo-he-aws shaobo-he-aws commented Dec 16, 2024

Description of changes

Issue #, if available

Checklist for requesting a review

The change in this PR is (choose one, and delete the other options):

  • A backwards-compatible change requiring a minor version bump to cedar-policy (e.g., addition of a new API).

I confirm that this PR (choose one, and delete the other options):

  • Updates the "Unreleased" section of the CHANGELOG with a description of my change (required for major/minor version bumps).

I confirm that cedar-spec (choose one, and delete the other options):

  • Requires updates, and I have made / will make these updates myself. (Please include in your description a timeline or link to the relevant PR in cedar-spec, and how you have tested that your updates are correct.)

I confirm that docs.cedarpolicy.com (choose one, and delete the other options):

  • Requires updates, and I have made / will make these updates myself. (Please include in your description a timeline or link to the relevant PR in cedar-docs. PRs should be targeted at a staging-X.Y branch, not main.)

Signed-off-by: Shaobo He <[email protected]>
@shaobo-he-aws shaobo-he-aws marked this pull request as draft December 16, 2024 21:39
Copy link
Contributor

@cdisselkoen cdisselkoen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Scanned through this, looks like a reasonable high-level approach to me

cedar-policy-validator/src/json_schema.rs Outdated Show resolved Hide resolved
Comment on lines 37 to 62
pub struct ValidatorEntityType {
/// The name of the entity type.
pub(crate) name: EntityType,

/// The set of entity types that can be members of this entity type. When
/// this structure is initially constructed, the field will contain direct
/// children, but it will be updated to contain the closure of all
/// descendants before it is used in any validation.
pub descendants: HashSet<EntityType>,

/// The attributes associated with this entity.
pub(crate) attributes: Attributes,

/// Indicates that this entity type may have additional attributes
/// other than the declared attributes that may be accessed under partial
/// schema validation. We do not know if they are present, and do not know
/// their type when they are present. Attempting to access an undeclared
/// attribute under standard validation is an error regardless of this flag.
pub(crate) open_attributes: OpenTag,

/// Tag type for this entity type. `None` indicates that entities of this
/// type are not allowed to have tags.
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) tags: Option<Type>,
pub enum ValidatorEntityType {
Common {
/// The name of the entity type.
name: EntityType,

/// The set of entity types that can be members of this entity type. When
/// this structure is initially constructed, the field will contain direct
/// children, but it will be updated to contain the closure of all
/// descendants before it is used in any validation.
descendants: HashSet<EntityType>,

/// The attributes associated with this entity.
attributes: Attributes,

/// Indicates that this entity type may have additional attributes
/// other than the declared attributes that may be accessed under partial
/// schema validation. We do not know if they are present, and do not know
/// their type when they are present. Attempting to access an undeclared
/// attribute under standard validation is an error regardless of this flag.
open_attributes: OpenTag,

/// Tag type for this entity type. `None` indicates that entities of this
/// type are not allowed to have tags.
#[serde(skip_serializing_if = "Option::is_none")]
tags: Option<Type>,
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change makes the fields pub instead of pub(crate), this is probably fine, just drawing attention to this in case someone thinks they shouldn't be pub

Copy link
Contributor

@john-h-kastner-aws john-h-kastner-aws left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks pretty good


/// Return valid EID choices if the entity type is enumerated otherwise
/// return `None`
fn choices(&self) -> Option<Vec<SmolStr>>;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be better off returning slice or an iterator?

cedar-policy-validator/src/cedar_schema/ast.rs Outdated Show resolved Hide resolved
cedar-policy-validator/src/coreschema.rs Outdated Show resolved Hide resolved
cedar-policy-validator/src/coreschema.rs Outdated Show resolved Hide resolved
cedar-policy-validator/src/json_schema.rs Outdated Show resolved Hide resolved
@@ -202,6 +202,7 @@ impl Validator {
} else {
Some(
self.validate_entity_types(p)
.chain(self.validate_enum_entity(p))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noting that this will mean enum entity validation doesn't short-circuit, matching the current behavior for validating entity types and actions. This is a good design decision IMO, but might mean we run into some differences between the Rust and Lean impls in DRT, so I'll just leave a comment here so we don't forget that it's expected

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was thinking if we should implement enum entity validity checking in the type checker. What's your thought on this?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't do that in this PR. Could consider moving it along with the entity-type check later

cedar-policy-validator/src/rbac.rs Outdated Show resolved Hide resolved
@shaobo-he-aws shaobo-he-aws marked this pull request as ready for review January 13, 2025 22:41
Signed-off-by: Shaobo He <[email protected]>
cedar-policy-validator/src/typecheck/test/policy.rs Outdated Show resolved Hide resolved
cedar-policy-validator/src/coreschema.rs Show resolved Hide resolved
@@ -202,6 +202,7 @@ impl Validator {
} else {
Some(
self.validate_entity_types(p)
.chain(self.validate_enum_entity(p))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't do that in this PR. Could consider moving it along with the entity-type check later

Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Signed-off-by: Shaobo He <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants