Skip to content

Commit

Permalink
Merge pull request #18 from Nexthash/feature/added-caveat-handling
Browse files Browse the repository at this point in the history
Added caveat handling during relationship creation
  • Loading branch information
tanczosm authored Apr 23, 2024
2 parents 430db9a + 190abc1 commit d42c688
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 8 deletions.
25 changes: 20 additions & 5 deletions SpiceDb/Api/SpiceDbPermissions.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Authzed.Api.V1;
using Google.Protobuf;
using Google.Protobuf.Collections;
using Google.Protobuf.WellKnownTypes;
using Grpc.Core;
using SpiceDb.Enum;
using SpiceDb.Models;
Expand Down Expand Up @@ -396,7 +397,7 @@ public bool UpdateRelationships(ref RepeatedField<RelationshipUpdate> updateColl

public RelationshipUpdate GetRelationshipUpdate(string resourceType, string resourceId,
string relation, string subjectType, string subjectId, string optionalSubjectRelation = "",
RelationshipUpdate.Types.Operation operation = RelationshipUpdate.Types.Operation.Touch)
RelationshipUpdate.Types.Operation operation = RelationshipUpdate.Types.Operation.Touch, Caveat? caveat = null)
{
return new RelationshipUpdate
{
Expand All @@ -406,6 +407,7 @@ public RelationshipUpdate GetRelationshipUpdate(string resourceType, string reso
Resource = new ObjectReference { ObjectType = resourceType, ObjectId = resourceId },
Relation = relation,
Subject = new SubjectReference { Object = new ObjectReference { ObjectType = subjectType, ObjectId = subjectId }, OptionalRelation = optionalSubjectRelation },
OptionalCaveat = GetCaveat(caveat)
}
};
}
Expand All @@ -426,26 +428,39 @@ public async Task<WriteRelationshipsResponse> WriteRelationshipsAsync(RepeatedFi

public async Task<ZedToken> UpdateRelationshipAsync(string resourceType, string resourceId, string relation,
string subjectType, string subjectId, string optionalSubjectRelation = "",
RelationshipUpdate.Types.Operation operation = RelationshipUpdate.Types.Operation.Touch)
RelationshipUpdate.Types.Operation operation = RelationshipUpdate.Types.Operation.Touch, Caveat? caveat = null)
{

return await UpdateRelationshipsAsync(resourceType, resourceId, new[] { relation }, subjectType, subjectId, optionalSubjectRelation, operation);
return await UpdateRelationshipsAsync(resourceType, resourceId, new[] { relation }, subjectType, subjectId, optionalSubjectRelation, operation, caveat);
}

public async Task<ZedToken> UpdateRelationshipsAsync(string resourceType, string resourceId, IEnumerable<string> relations,
string subjectType, string subjectId, string optionalSubjectRelation = "",
RelationshipUpdate.Types.Operation operation = RelationshipUpdate.Types.Operation.Touch)
RelationshipUpdate.Types.Operation operation = RelationshipUpdate.Types.Operation.Touch, Caveat? caveat = null)
{
RepeatedField<RelationshipUpdate> updateCollection = new RepeatedField<RelationshipUpdate>();

foreach (var relation in relations)
{
var updateItem = GetRelationshipUpdate(resourceType, resourceId, relation.ToLowerInvariant(), subjectType, subjectId, optionalSubjectRelation, operation);
var updateItem = GetRelationshipUpdate(resourceType, resourceId, relation.ToLowerInvariant(), subjectType, subjectId, optionalSubjectRelation, operation, caveat);
UpdateRelationships(ref updateCollection, updateItem);
}

WriteRelationshipsResponse resp = await WriteRelationshipsAsync(updateCollection);
return resp.WrittenAt;
}

protected ContextualizedCaveat? GetCaveat(Caveat? caveat)
{
if (caveat is null)
{
return null;
}

return new ContextualizedCaveat
{
CaveatName = caveat.Name,
Context = caveat.Context?.ToStruct(),
};
}
}
1 change: 1 addition & 0 deletions SpiceDb/Models/Relationship.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ public Relationship(ResourceReference resource, string relation, ResourceReferen
Resource = resource;
Relation = relation;
Subject = subject;
OptionalCaveat = optionalCaveat;

if (!string.IsNullOrEmpty(Resource.Relation))
{
Expand Down
17 changes: 14 additions & 3 deletions SpiceDb/SpiceDbClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ public async IAsyncEnumerable<ReadRelationshipsResponse> ReadRelationshipsAsync(
OptionalCaveat = x.Relationship.OptionalCaveat != null
? new Authzed.Api.V1.ContextualizedCaveat
{
CaveatName = x.Relationship.OptionalCaveat.Name,
CaveatName = EnsurePrefix(x.Relationship.OptionalCaveat.Name)!,
Context = x.Relationship.OptionalCaveat.Context.ToStruct()
}
: null
Expand Down Expand Up @@ -370,7 +370,7 @@ private PermissionRelationshipTree BuildTree(Authzed.Api.V1.PermissionRelationsh
var request = relationships.Select(x => new RelationshipUpdate
{
Relationship = new Relationship(
x.Resource.EnsurePrefix(_prefix), x.Relation, x.Subject.EnsurePrefix(_prefix), x.OptionalCaveat
x.Resource.EnsurePrefix(_prefix), x.Relation, x.Subject.EnsurePrefix(_prefix), EnsureCaveatIsPrefixed(x.OptionalCaveat)
),
Operation = RelationshipUpdateOperation.Upsert
}).ToList();
Expand All @@ -387,7 +387,7 @@ public async Task<ZedToken> AddRelationshipAsync(Relationship relation)
{
return (await _spiceDbCore.Permissions.UpdateRelationshipAsync(EnsurePrefix(relation.Resource.Type)!,
relation.Resource.Id, relation.Relation, EnsurePrefix(relation.Subject.Type)!, relation.Subject.Id,
relation.Subject.Relation))
relation.Subject.Relation, caveat: EnsureCaveatIsPrefixed(relation.OptionalCaveat)))
.ToSpiceDbToken()!;
}

Expand Down Expand Up @@ -627,4 +627,15 @@ public async Task ImportSchemaFromStringAsync(string schema)

return type.StartsWith(_prefix + "/") ? type : $"{_prefix}/{type}";
}

private Caveat? EnsureCaveatIsPrefixed(Caveat? caveat)
{
if (caveat is null)
{
return null;
}

caveat.Name = EnsurePrefix(caveat.Name)!;
return caveat;
}
}

0 comments on commit d42c688

Please sign in to comment.