mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-16 15:31:19 +00:00
feat: add metadata based permissions for dynamic secret
This commit is contained in:
+94
-6
@@ -266,11 +266,59 @@ const convertCaslConditionToFormOperator = (caslConditions: TPermissionCondition
|
||||
} else {
|
||||
Object.keys(condition).forEach((conditionOperator) => {
|
||||
const rhs = condition[conditionOperator as PermissionConditionOperators];
|
||||
formConditions.push({
|
||||
operator: conditionOperator,
|
||||
lhs: type,
|
||||
rhs: typeof rhs === "string" ? rhs : rhs.join(",")
|
||||
});
|
||||
if (Array.isArray(rhs) || typeof rhs === "string") {
|
||||
formConditions.push({
|
||||
operator: conditionOperator,
|
||||
lhs: type,
|
||||
rhs: typeof rhs === "string" ? rhs : rhs.join(",")
|
||||
});
|
||||
} else if (
|
||||
conditionOperator === PermissionConditionOperators.$ELEMENTMATCH &&
|
||||
type === "metadata"
|
||||
) {
|
||||
const deepKeyCondition = rhs.key;
|
||||
if (deepKeyCondition) {
|
||||
if (typeof deepKeyCondition === "string") {
|
||||
formConditions.push({
|
||||
operator: PermissionConditionOperators.$EQ,
|
||||
lhs: "metadataKey",
|
||||
rhs: deepKeyCondition
|
||||
});
|
||||
} else {
|
||||
Object.keys(deepKeyCondition).forEach((keyOperator) => {
|
||||
const deepRhs = deepKeyCondition?.[keyOperator as PermissionConditionOperators];
|
||||
if (deepRhs && (Array.isArray(deepRhs) || typeof deepRhs === "string")) {
|
||||
formConditions.push({
|
||||
operator: keyOperator,
|
||||
lhs: "metadataKey",
|
||||
rhs: typeof deepRhs === "string" ? deepRhs : deepRhs.join(",")
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
const deepValueCondition = rhs.value;
|
||||
if (deepValueCondition) {
|
||||
if (typeof deepValueCondition === "string") {
|
||||
formConditions.push({
|
||||
operator: PermissionConditionOperators.$EQ,
|
||||
lhs: "metadataValue",
|
||||
rhs: deepValueCondition
|
||||
});
|
||||
} else {
|
||||
Object.keys(deepValueCondition).forEach((keyOperator) => {
|
||||
const deepRhs = deepValueCondition?.[keyOperator as PermissionConditionOperators];
|
||||
if (deepRhs && (Array.isArray(deepRhs) || typeof deepRhs === "string")) {
|
||||
formConditions.push({
|
||||
operator: keyOperator,
|
||||
lhs: "metadataValue",
|
||||
rhs: typeof deepRhs === "string" ? deepRhs : deepRhs.join(",")
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -585,7 +633,45 @@ const convertFormOperatorToCaslCondition = (
|
||||
conditions: { lhs: string; rhs: string; operator: string }[]
|
||||
) => {
|
||||
const caslCondition: Record<string, Partial<TPermissionConditionOperators>> = {};
|
||||
|
||||
const metadataKeyCondition = conditions.find((condition) => condition.lhs === "metadataKey");
|
||||
const metadataValueCondition = conditions.find((condition) => condition.lhs === "metadataValue");
|
||||
|
||||
if (metadataKeyCondition || metadataValueCondition) {
|
||||
caslCondition.metadata = {
|
||||
[PermissionConditionOperators.$ELEMENTMATCH]: {}
|
||||
};
|
||||
|
||||
if (metadataKeyCondition) {
|
||||
const operator = metadataKeyCondition.operator as PermissionConditionOperators;
|
||||
caslCondition.metadata[PermissionConditionOperators.$ELEMENTMATCH]!.key = {
|
||||
[metadataKeyCondition.operator]: [
|
||||
PermissionConditionOperators.$IN,
|
||||
PermissionConditionOperators.$ALL
|
||||
].includes(operator)
|
||||
? metadataKeyCondition.rhs.split(",")
|
||||
: metadataKeyCondition.rhs
|
||||
};
|
||||
}
|
||||
|
||||
if (metadataValueCondition) {
|
||||
const operator = metadataValueCondition.operator as PermissionConditionOperators;
|
||||
caslCondition.metadata[PermissionConditionOperators.$ELEMENTMATCH]!.value = {
|
||||
[metadataValueCondition.operator]: [
|
||||
PermissionConditionOperators.$IN,
|
||||
PermissionConditionOperators.$ALL
|
||||
].includes(operator)
|
||||
? metadataValueCondition.rhs.split(",")
|
||||
: metadataValueCondition.rhs
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
conditions.forEach((el) => {
|
||||
// these are special fields and handled above
|
||||
if (el.lhs === "metadataKey" || el.lhs === "metadataValue") {
|
||||
return;
|
||||
}
|
||||
if (!caslCondition[el.lhs]) caslCondition[el.lhs] = {};
|
||||
if (
|
||||
el.operator === PermissionConditionOperators.$IN ||
|
||||
@@ -596,7 +682,9 @@ const convertFormOperatorToCaslCondition = (
|
||||
caslCondition[el.lhs][
|
||||
el.operator as Exclude<
|
||||
PermissionConditionOperators,
|
||||
PermissionConditionOperators.$ALL | PermissionConditionOperators.$IN
|
||||
| PermissionConditionOperators.$ALL
|
||||
| PermissionConditionOperators.$IN
|
||||
| PermissionConditionOperators.$ELEMENTMATCH
|
||||
>
|
||||
] = el.rhs;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user