Skip to content

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 <shaobohe@amazon.com>
@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

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

Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
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

@@ -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

Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
@shaobo-he-aws shaobo-he-aws marked this pull request as ready for review January 13, 2025 22:41
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
This reverts commit 77ec089.
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Shaobo He <shaobohe@amazon.com>
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 great

D: serde::Deserializer<'de>,
{
// A "real" option that does not accept `null` during deserialization
// TODO: we should be able to use `serde_as` or `serde_with` instead
Copy link
Contributor

Choose a reason for hiding this comment

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

We should open an issue to keep track of the work for this improvement, and paste it here.

Comment on lines +518 to +519
// I tried to apply the same idea to `EntityTypeKind` but serde allows
// unknown fields
Copy link
Contributor

Choose a reason for hiding this comment

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

And you can't use deny_unknown_fields there? Or what's the issue?

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 can't recall what the issue is. It seems deny_unknown_fields didn't work.

Copy link
Contributor

Choose a reason for hiding this comment

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

deny_unknown_fields is generally problematic

assert_matches!(&**element, Type::Type { ty: TypeVariant::String, loc: None }); // TODO: why is this `TypeVariant::String` in this case but `EntityOrCommon { "String" }` in all the other cases in this test? Do we accept common types as the element type for sets?
assert_matches!(frag.0.get(&None).unwrap().entity_types.get(&"User".parse().unwrap()).unwrap(), EntityType { kind: EntityTypeKind::Standard(user), ..} => {
assert_matches!(&user.tags, Some(Type::Type { ty: TypeVariant::Set { element }, ..}) => {
assert_matches!(&**element, Type::Type{ ty: TypeVariant::String, ..}); // TODO: why is this `TypeVariant::String` in this case but `EntityOrCommon { "String" }` in all the other cases in this test? Do we accept common types as the element type for sets?
Copy link
Contributor

Choose a reason for hiding this comment

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

Shouldn't we figure this out or at least have an issue for it?

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 think it's beyond the scope of this PR. We can create an issue for it.

@adpaco-aws
Copy link
Contributor

Forgot to say that I'm also a little concerned about the amount of cloned() in this code. It'd be great to avoid them wherever possible, but I acknowledge this is the first version so maybe we want to leave that for stabilization.

Signed-off-by: Shaobo He <shaobohe@amazon.com>
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.

Should these changes be hidden behind an experimental flag?

Signed-off-by: Shaobo He <shaobohe@amazon.com>
@shaobo-he-aws
Copy link
Contributor Author

shaobo-he-aws commented Feb 5, 2025

Should these changes be hidden behind an experimental flag?

I don't think so. A Lean model is under development and we will use it for DRT.

Signed-off-by: Shaobo He <shaobohe@amazon.com>
Copy link
Contributor

@adpaco-aws adpaco-aws left a comment

Choose a reason for hiding this comment

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

Thanks! Please don't forget to open/reference issues for pending work in parts of this PR.

@shaobo-he-aws shaobo-he-aws merged commit 33bd811 into main Feb 5, 2025
17 of 19 checks passed
@shaobo-he-aws shaobo-he-aws deleted the feature/shaobo/rfc53 branch February 5, 2025 21:03
chaluli pushed a commit to chaluli/cedar that referenced this pull request Feb 7, 2025
Signed-off-by: Shaobo He <shaobohe@amazon.com>
Signed-off-by: Charlie Murphy <mutmoth@amazon.com>
@a0js a0js mentioned this pull request Feb 18, 2025
4 tasks
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.

4 participants