From bde6333974dbe35510d580e9fc893fa7fa665ec4 Mon Sep 17 00:00:00 2001 From: jscyo Date: Mon, 28 Mar 2022 16:04:09 +0530 Subject: [PATCH 01/21] adds recipe interface --- CHANGELOG.md | 2 + build.gradle | 2 +- jar/plugin-interface-2.14.0.jar | Bin 0 -> 46782 bytes .../pluginInterface/RECIPE_ID.java | 3 +- .../userroles/UserRolesStorage.java | 46 ++++++++++++++++++ .../exception/UnknownRoleException.java | 24 +++++++++ .../exception/UserRolesException.java | 24 +++++++++ .../sqlStorage/UserRolesSQLStorage.java | 40 +++++++++++++++ 8 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 jar/plugin-interface-2.14.0.jar create mode 100644 src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java create mode 100644 src/main/java/io/supertokens/pluginInterface/userroles/exception/UnknownRoleException.java create mode 100644 src/main/java/io/supertokens/pluginInterface/userroles/exception/UserRolesException.java create mode 100644 src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java diff --git a/CHANGELOG.md b/CHANGELOG.md index a024f1a8..c9daaf7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- User Roles interface + ## [2.13.0] - 2022-03-04 ### Added diff --git a/build.gradle b/build.gradle index 9172a4fb..7d1883a0 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java-library' } -version = "2.13.0" +version = "2.14.0" repositories { mavenCentral() diff --git a/jar/plugin-interface-2.14.0.jar b/jar/plugin-interface-2.14.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..e1a37435807323486d7ab4d96435a00b038c52e8 GIT binary patch literal 46782 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 OUpfN>1Y#uUxBmk*0g$2q literal 0 HcmV?d00001 diff --git a/src/main/java/io/supertokens/pluginInterface/RECIPE_ID.java b/src/main/java/io/supertokens/pluginInterface/RECIPE_ID.java index e0ada4a2..684fe3b2 100644 --- a/src/main/java/io/supertokens/pluginInterface/RECIPE_ID.java +++ b/src/main/java/io/supertokens/pluginInterface/RECIPE_ID.java @@ -20,7 +20,8 @@ public enum RECIPE_ID { EMAIL_PASSWORD("emailpassword"), THIRD_PARTY("thirdparty"), SESSION("session"), - EMAIL_VERIFICATION("emailverification"), JWT("jwt"), PASSWORDLESS("passwordless"), USER_METADATA("usermetadata"); + EMAIL_VERIFICATION("emailverification"), JWT("jwt"), PASSWORDLESS("passwordless"), USER_METADATA("usermetadata"), + USER_ROLES("userroles"); private final String name; diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java new file mode 100644 index 00000000..2df8af37 --- /dev/null +++ b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package io.supertokens.pluginInterface.userroles; + +import com.google.gson.JsonObject; +import io.supertokens.pluginInterface.Storage; +import io.supertokens.pluginInterface.exceptions.StorageQueryException; +import io.supertokens.pluginInterface.userroles.exception.UnknownRoleException; + +public interface UserRolesStorage extends Storage { + + // associate a user with a role that exists + void setUserRole(String userId, String role) throws StorageQueryException, UnknownRoleException; + + // get all roles associated with a user + String[] getUserRoles(String userId) throws StorageQueryException; + + // get all users associated with a role + String[] getRoleUsers(String role) throws StorageQueryException; + + // get permissions associated with a role + String[] getRolePermissions(String role) throws StorageQueryException, UnknownRoleException; + + // get roles associated with a permission + String[] getPermissionRoles(String permission) throws StorageQueryException; + + // delete a role + void deleteRole(String role) throws StorageQueryException; + + // get all roles + String[] getRoles() throws StorageQueryException; +} diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/exception/UnknownRoleException.java b/src/main/java/io/supertokens/pluginInterface/userroles/exception/UnknownRoleException.java new file mode 100644 index 00000000..a76970bd --- /dev/null +++ b/src/main/java/io/supertokens/pluginInterface/userroles/exception/UnknownRoleException.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2022, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package io.supertokens.pluginInterface.userroles.exception; + +import java.io.Serial; + +public class UnknownRoleException extends UserRolesException { + @Serial + private static final long serialVersionUID = -8116261429148675130L; +} diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/exception/UserRolesException.java b/src/main/java/io/supertokens/pluginInterface/userroles/exception/UserRolesException.java new file mode 100644 index 00000000..4024b676 --- /dev/null +++ b/src/main/java/io/supertokens/pluginInterface/userroles/exception/UserRolesException.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2022, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package io.supertokens.pluginInterface.userroles.exception; + +import java.io.Serial; + +public class UserRolesException extends Exception { + @Serial + private static final long serialVersionUID = 5476530661862027675L; +} diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java new file mode 100644 index 00000000..2c9a1754 --- /dev/null +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package io.supertokens.pluginInterface.userroles.sqlStorage; + +import io.supertokens.pluginInterface.exceptions.StorageQueryException; +import io.supertokens.pluginInterface.sqlStorage.SQLStorage; +import io.supertokens.pluginInterface.sqlStorage.TransactionConnection; +import io.supertokens.pluginInterface.userroles.UserRolesStorage; +import io.supertokens.pluginInterface.userroles.exception.UnknownRoleException; + +import javax.annotation.Nullable; + +public interface UserRolesSQLStorage extends UserRolesStorage, SQLStorage { + + // delete input roles associated with the input userId, if roles is null then all roles associated with the userId + // are removed + void deleteUserRoles_Transaction(TransactionConnection con, String userId, @Nullable String[] roles) + throws StorageQueryException; + + // create a role with permissions / add additional permissions to a role if it already exists + void setRole_Transaction(TransactionConnection con, String role, String[] permissions) throws StorageQueryException; + + // remove permissions associated with a role, if permissions is NULL then all permissions are removed from the role + void deleteRolePermissions_Transaction(TransactionConnection con, String role, @Nullable String[] permissions) + throws StorageQueryException, UnknownRoleException; +} From a0a6af18ee3105194dff2802a360182cf69725f9 Mon Sep 17 00:00:00 2001 From: jscyo Date: Mon, 28 Mar 2022 16:25:41 +0530 Subject: [PATCH 02/21] feat(userroles): fixs comments --- .../pluginInterface/userroles/UserRolesStorage.java | 12 ++++++------ .../userroles/sqlStorage/UserRolesSQLStorage.java | 5 +++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java index 2df8af37..ce587c09 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java @@ -23,24 +23,24 @@ public interface UserRolesStorage extends Storage { - // associate a user with a role that exists + // associate a userId with a role that exists void setUserRole(String userId, String role) throws StorageQueryException, UnknownRoleException; - // get all roles associated with a user + // get all roles associated with the input userId String[] getUserRoles(String userId) throws StorageQueryException; - // get all users associated with a role + // get all users associated with the input role String[] getRoleUsers(String role) throws StorageQueryException; - // get permissions associated with a role + // get permissions associated with the input role String[] getRolePermissions(String role) throws StorageQueryException, UnknownRoleException; - // get roles associated with a permission + // get roles associated with the input permission String[] getPermissionRoles(String permission) throws StorageQueryException; // delete a role void deleteRole(String role) throws StorageQueryException; - // get all roles + // get all created roles String[] getRoles() throws StorageQueryException; } diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index 2c9a1754..1463e93f 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -26,12 +26,13 @@ public interface UserRolesSQLStorage extends UserRolesStorage, SQLStorage { - // delete input roles associated with the input userId, if roles is null then all roles associated with the userId + // delete roles associated with the input userId from the input roles, if roles is null then all roles associated + // with the userId // are removed void deleteUserRoles_Transaction(TransactionConnection con, String userId, @Nullable String[] roles) throws StorageQueryException; - // create a role with permissions / add additional permissions to a role if it already exists + // create a role with permissions | add additional permissions to a role if it already exists void setRole_Transaction(TransactionConnection con, String role, String[] permissions) throws StorageQueryException; // remove permissions associated with a role, if permissions is NULL then all permissions are removed from the role From 1eda233fa778694d1b0f9cdc3ed52830fc5e2d77 Mon Sep 17 00:00:00 2001 From: jscyo Date: Mon, 28 Mar 2022 16:34:23 +0530 Subject: [PATCH 03/21] feat(userroles): fixs --- .../supertokens/pluginInterface/userroles/UserRolesStorage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java index ce587c09..fda37383 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java @@ -30,7 +30,7 @@ public interface UserRolesStorage extends Storage { String[] getUserRoles(String userId) throws StorageQueryException; // get all users associated with the input role - String[] getRoleUsers(String role) throws StorageQueryException; + String[] getRoleUsers(String role) throws StorageQueryException, UnknownRoleException; // get permissions associated with the input role String[] getRolePermissions(String role) throws StorageQueryException, UnknownRoleException; From 48c4ee8518c6c5301b0cc9628da6d516e83a9f98 Mon Sep 17 00:00:00 2001 From: jscyo Date: Mon, 28 Mar 2022 16:35:44 +0530 Subject: [PATCH 04/21] feat(userroles): fixs comment --- .../userroles/sqlStorage/UserRolesSQLStorage.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index 1463e93f..ba50fadd 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -27,8 +27,7 @@ public interface UserRolesSQLStorage extends UserRolesStorage, SQLStorage { // delete roles associated with the input userId from the input roles, if roles is null then all roles associated - // with the userId - // are removed + // with the userId are removed void deleteUserRoles_Transaction(TransactionConnection con, String userId, @Nullable String[] roles) throws StorageQueryException; From 8cc03bdca1d6e0004b36c1b20f0a43bb36f5d497 Mon Sep 17 00:00:00 2001 From: jscyo Date: Thu, 31 Mar 2022 14:47:33 +0530 Subject: [PATCH 05/21] adds feedback --- .../exception/DuplicateRoleException.java | 25 +++++++++++++++++++ ...plicateRolePermissionMappingException.java | 24 ++++++++++++++++++ .../DuplicateUserRoleMappingException.java | 25 +++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRoleException.java create mode 100644 src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRolePermissionMappingException.java create mode 100644 src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateUserRoleMappingException.java diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRoleException.java b/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRoleException.java new file mode 100644 index 00000000..28a6fde4 --- /dev/null +++ b/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRoleException.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2022, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package io.supertokens.pluginInterface.userroles.exception; + +import java.io.Serial; + +public class DuplicateRoleException extends UserRolesException { + + @Serial + private static final long serialVersionUID = 103548803061186533L; +} diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRolePermissionMappingException.java b/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRolePermissionMappingException.java new file mode 100644 index 00000000..61bab78f --- /dev/null +++ b/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRolePermissionMappingException.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2022, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package io.supertokens.pluginInterface.userroles.exception; + +import java.io.Serial; + +public class DuplicateRolePermissionMappingException extends UserRolesException { + @Serial + private static final long serialVersionUID = 6923539592089302804L; +} diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateUserRoleMappingException.java b/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateUserRoleMappingException.java new file mode 100644 index 00000000..6596220a --- /dev/null +++ b/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateUserRoleMappingException.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2022, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package io.supertokens.pluginInterface.userroles.exception; + +import java.io.Serial; + +public class DuplicateUserRoleMappingException extends UserRolesException { + + @Serial + private static final long serialVersionUID = -7619796272179436664L; +} From 16ba6377815531ea1e34a5a90387bcf48cf2f50d Mon Sep 17 00:00:00 2001 From: jscyo Date: Thu, 31 Mar 2022 17:03:28 +0530 Subject: [PATCH 06/21] fixs --- .../userroles/UserRolesStorage.java | 21 ++++++++++---- .../sqlStorage/UserRolesSQLStorage.java | 29 ++++++++++++++++--- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java index fda37383..9bcd80ca 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java @@ -19,28 +19,37 @@ import com.google.gson.JsonObject; import io.supertokens.pluginInterface.Storage; import io.supertokens.pluginInterface.exceptions.StorageQueryException; +import io.supertokens.pluginInterface.userroles.exception.DuplicateUserRoleMappingException; import io.supertokens.pluginInterface.userroles.exception.UnknownRoleException; public interface UserRolesStorage extends Storage { // associate a userId with a role that exists - void setUserRole(String userId, String role) throws StorageQueryException, UnknownRoleException; + void addRoleToUser(String userId, String role) + throws StorageQueryException, UnknownRoleException, DuplicateUserRoleMappingException; // get all roles associated with the input userId - String[] getUserRoles(String userId) throws StorageQueryException; + String[] getRolesForUser(String userId) throws StorageQueryException; // get all users associated with the input role - String[] getRoleUsers(String role) throws StorageQueryException, UnknownRoleException; + String[] getUsersForRole(String role) throws StorageQueryException, UnknownRoleException; // get permissions associated with the input role - String[] getRolePermissions(String role) throws StorageQueryException, UnknownRoleException; + String[] getPermissionsForRole(String role) throws StorageQueryException, UnknownRoleException; // get roles associated with the input permission - String[] getPermissionRoles(String permission) throws StorageQueryException; + String[] getRolesThatHavePermission(String permission) throws StorageQueryException; // delete a role - void deleteRole(String role) throws StorageQueryException; + int deleteRole(String role) throws StorageQueryException; // get all created roles String[] getRoles() throws StorageQueryException; + + // check if input roles exists + boolean doesRoleExist(String role) throws StorageQueryException; + + // delete all roles for the input userId + int deleteAllRolesForUser(String userId) throws StorageQueryException; + } diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index ba50fadd..56adf478 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -20,21 +20,42 @@ import io.supertokens.pluginInterface.sqlStorage.SQLStorage; import io.supertokens.pluginInterface.sqlStorage.TransactionConnection; import io.supertokens.pluginInterface.userroles.UserRolesStorage; +import io.supertokens.pluginInterface.userroles.exception.DuplicateRoleException; +import io.supertokens.pluginInterface.userroles.exception.DuplicateRolePermissionMappingException; import io.supertokens.pluginInterface.userroles.exception.UnknownRoleException; import javax.annotation.Nullable; public interface UserRolesSQLStorage extends UserRolesStorage, SQLStorage { - // delete roles associated with the input userId from the input roles, if roles is null then all roles associated - // with the userId are removed - void deleteUserRoles_Transaction(TransactionConnection con, String userId, @Nullable String[] roles) - throws StorageQueryException; + // delete role associated with the input userId from the input roles + boolean deleteRoleForUser_Transaction(TransactionConnection con, String userId, String role) + throws StorageQueryException, UnknownRoleException; + + // delete all roles associated with the input userId + int deleteAllRolesForUser_Transaction(TransactionConnection con, String userId); // create a role with permissions | add additional permissions to a role if it already exists void setRole_Transaction(TransactionConnection con, String role, String[] permissions) throws StorageQueryException; + // create a new role + void createNewRole_Transaction(TransactionConnection con, String role) throws DuplicateRoleException; + + // associate a permission with a role + void addPermissionToRole_Transaction(TransactionConnection con, String role, String permission) + throws UnknownRoleException, DuplicateRolePermissionMappingException; + // remove permissions associated with a role, if permissions is NULL then all permissions are removed from the role void deleteRolePermissions_Transaction(TransactionConnection con, String role, @Nullable String[] permissions) throws StorageQueryException, UnknownRoleException; + + // delete a permission associated with the input role + boolean deletePermissionForRole_Transaction(TransactionConnection con, String role, String permission) + throws StorageQueryException, UnknownRoleException; + + // delete all permissions associated with the input role + int deleteAllPermissionsForRole_Transaction(TransactionConnection con, String role); + + // check if a role exists + boolean doesRoleExist_Transaction(String role) throws StorageQueryException; } From 672f8a7489af8236ed8b1071fa610f4356d5eb14 Mon Sep 17 00:00:00 2001 From: jscyo Date: Thu, 31 Mar 2022 17:09:03 +0530 Subject: [PATCH 07/21] fixs --- .../pluginInterface/userroles/UserRolesStorage.java | 1 - .../userroles/sqlStorage/UserRolesSQLStorage.java | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java index 9bcd80ca..e7b378d1 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java @@ -51,5 +51,4 @@ void addRoleToUser(String userId, String role) // delete all roles for the input userId int deleteAllRolesForUser(String userId) throws StorageQueryException; - } diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index 56adf478..8a9bfd88 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -32,9 +32,6 @@ public interface UserRolesSQLStorage extends UserRolesStorage, SQLStorage { boolean deleteRoleForUser_Transaction(TransactionConnection con, String userId, String role) throws StorageQueryException, UnknownRoleException; - // delete all roles associated with the input userId - int deleteAllRolesForUser_Transaction(TransactionConnection con, String userId); - // create a role with permissions | add additional permissions to a role if it already exists void setRole_Transaction(TransactionConnection con, String role, String[] permissions) throws StorageQueryException; From 07c8b80de0d86f1b79fd479f28ef9ba4592da4c7 Mon Sep 17 00:00:00 2001 From: jscyo Date: Thu, 31 Mar 2022 17:30:31 +0530 Subject: [PATCH 08/21] removes version changes --- build.gradle | 2 +- jar/plugin-interface-2.14.0.jar | Bin 46782 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 jar/plugin-interface-2.14.0.jar diff --git a/build.gradle b/build.gradle index 7d1883a0..9172a4fb 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java-library' } -version = "2.14.0" +version = "2.13.0" repositories { mavenCentral() diff --git a/jar/plugin-interface-2.14.0.jar b/jar/plugin-interface-2.14.0.jar deleted file mode 100644 index e1a37435807323486d7ab4d96435a00b038c52e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46782 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 OUpfN>1Y#uUxBmk*0g$2q From 9a55c5c9ef50c98cb71840dbad66d09aee8fe55c Mon Sep 17 00:00:00 2001 From: jscyo Date: Thu, 31 Mar 2022 17:48:22 +0530 Subject: [PATCH 09/21] removes unnecessary function --- .../userroles/sqlStorage/UserRolesSQLStorage.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index 8a9bfd88..3e965c2b 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -32,9 +32,6 @@ public interface UserRolesSQLStorage extends UserRolesStorage, SQLStorage { boolean deleteRoleForUser_Transaction(TransactionConnection con, String userId, String role) throws StorageQueryException, UnknownRoleException; - // create a role with permissions | add additional permissions to a role if it already exists - void setRole_Transaction(TransactionConnection con, String role, String[] permissions) throws StorageQueryException; - // create a new role void createNewRole_Transaction(TransactionConnection con, String role) throws DuplicateRoleException; From 4818582ed2cbdb702875624c9f46f0c4d6a178cf Mon Sep 17 00:00:00 2001 From: jscyo Date: Mon, 4 Apr 2022 15:51:16 +0530 Subject: [PATCH 10/21] feedback changes --- .../userroles/sqlStorage/UserRolesSQLStorage.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index 3e965c2b..084772f9 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -30,25 +30,22 @@ public interface UserRolesSQLStorage extends UserRolesStorage, SQLStorage { // delete role associated with the input userId from the input roles boolean deleteRoleForUser_Transaction(TransactionConnection con, String userId, String role) - throws StorageQueryException, UnknownRoleException; + throws StorageQueryException; // create a new role - void createNewRole_Transaction(TransactionConnection con, String role) throws DuplicateRoleException; + void createNewRole_Transaction(TransactionConnection con, String role) + throws StorageQueryException, DuplicateRoleException; // associate a permission with a role void addPermissionToRole_Transaction(TransactionConnection con, String role, String permission) - throws UnknownRoleException, DuplicateRolePermissionMappingException; - - // remove permissions associated with a role, if permissions is NULL then all permissions are removed from the role - void deleteRolePermissions_Transaction(TransactionConnection con, String role, @Nullable String[] permissions) - throws StorageQueryException, UnknownRoleException; + throws StorageQueryException, UnknownRoleException, DuplicateRolePermissionMappingException; // delete a permission associated with the input role boolean deletePermissionForRole_Transaction(TransactionConnection con, String role, String permission) throws StorageQueryException, UnknownRoleException; // delete all permissions associated with the input role - int deleteAllPermissionsForRole_Transaction(TransactionConnection con, String role); + int deleteAllPermissionsForRole_Transaction(TransactionConnection con, String role) throws StorageQueryException; // check if a role exists boolean doesRoleExist_Transaction(String role) throws StorageQueryException; From e1b2970aaaea061b8ee0172dcdf20d4c1f1b2240 Mon Sep 17 00:00:00 2001 From: jscyo Date: Tue, 5 Apr 2022 15:07:26 +0530 Subject: [PATCH 11/21] fixs function signiture --- .../userroles/sqlStorage/UserRolesSQLStorage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index 084772f9..0e0f2c7c 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -48,5 +48,5 @@ boolean deletePermissionForRole_Transaction(TransactionConnection con, String ro int deleteAllPermissionsForRole_Transaction(TransactionConnection con, String role) throws StorageQueryException; // check if a role exists - boolean doesRoleExist_Transaction(String role) throws StorageQueryException; + boolean doesRoleExist_Transaction(TransactionConnection con, String role) throws StorageQueryException; } From 9ebceb5605b2208384a7ae37e8e2b6c38c93748d Mon Sep 17 00:00:00 2001 From: jscyo Date: Wed, 6 Apr 2022 12:52:05 +0530 Subject: [PATCH 12/21] implements feedback --- .../pluginInterface/userroles/UserRolesStorage.java | 4 ++-- .../userroles/sqlStorage/UserRolesSQLStorage.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java index e7b378d1..bae875ec 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java @@ -32,10 +32,10 @@ void addRoleToUser(String userId, String role) String[] getRolesForUser(String userId) throws StorageQueryException; // get all users associated with the input role - String[] getUsersForRole(String role) throws StorageQueryException, UnknownRoleException; + String[] getUsersForRole(String role) throws StorageQueryException; // get permissions associated with the input role - String[] getPermissionsForRole(String role) throws StorageQueryException, UnknownRoleException; + String[] getPermissionsForRole(String role) throws StorageQueryException; // get roles associated with the input permission String[] getRolesThatHavePermission(String permission) throws StorageQueryException; diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index 0e0f2c7c..0871373c 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -42,7 +42,7 @@ void addPermissionToRole_Transaction(TransactionConnection con, String role, Str // delete a permission associated with the input role boolean deletePermissionForRole_Transaction(TransactionConnection con, String role, String permission) - throws StorageQueryException, UnknownRoleException; + throws StorageQueryException; // delete all permissions associated with the input role int deleteAllPermissionsForRole_Transaction(TransactionConnection con, String role) throws StorageQueryException; From 1c1838d57fcc9064aaf48f180afe3df176c27e4b Mon Sep 17 00:00:00 2001 From: jscyo Date: Wed, 6 Apr 2022 17:36:15 +0530 Subject: [PATCH 13/21] updates deleteRole return type --- .../supertokens/pluginInterface/userroles/UserRolesStorage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java index bae875ec..216b7a2a 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/UserRolesStorage.java @@ -41,7 +41,7 @@ void addRoleToUser(String userId, String role) String[] getRolesThatHavePermission(String permission) throws StorageQueryException; // delete a role - int deleteRole(String role) throws StorageQueryException; + boolean deleteRole(String role) throws StorageQueryException; // get all created roles String[] getRoles() throws StorageQueryException; From 74445611f59fb2d5bd0b27287697b84fbcb50c49 Mon Sep 17 00:00:00 2001 From: jscyo Date: Tue, 12 Apr 2022 18:38:40 +0530 Subject: [PATCH 14/21] removes duplicateRoleException --- .../exception/DuplicateRoleException.java | 25 ------------------- .../sqlStorage/UserRolesSQLStorage.java | 6 +---- 2 files changed, 1 insertion(+), 30 deletions(-) delete mode 100644 src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRoleException.java diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRoleException.java b/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRoleException.java deleted file mode 100644 index 28a6fde4..00000000 --- a/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRoleException.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2022, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -package io.supertokens.pluginInterface.userroles.exception; - -import java.io.Serial; - -public class DuplicateRoleException extends UserRolesException { - - @Serial - private static final long serialVersionUID = 103548803061186533L; -} diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index 0871373c..9c9d2510 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -20,12 +20,9 @@ import io.supertokens.pluginInterface.sqlStorage.SQLStorage; import io.supertokens.pluginInterface.sqlStorage.TransactionConnection; import io.supertokens.pluginInterface.userroles.UserRolesStorage; -import io.supertokens.pluginInterface.userroles.exception.DuplicateRoleException; import io.supertokens.pluginInterface.userroles.exception.DuplicateRolePermissionMappingException; import io.supertokens.pluginInterface.userroles.exception.UnknownRoleException; -import javax.annotation.Nullable; - public interface UserRolesSQLStorage extends UserRolesStorage, SQLStorage { // delete role associated with the input userId from the input roles @@ -33,8 +30,7 @@ boolean deleteRoleForUser_Transaction(TransactionConnection con, String userId, throws StorageQueryException; // create a new role - void createNewRole_Transaction(TransactionConnection con, String role) - throws StorageQueryException, DuplicateRoleException; + void createNewRole_Transaction(TransactionConnection con, String role) throws StorageQueryException; // associate a permission with a role void addPermissionToRole_Transaction(TransactionConnection con, String role, String permission) From bf278ab218a71148cde6835120067934c0deab79 Mon Sep 17 00:00:00 2001 From: jscyo Date: Tue, 12 Apr 2022 19:44:05 +0530 Subject: [PATCH 15/21] renames createNewRole_Transaction, removes DuplicateRolePermissionMapping --- .../userroles/sqlStorage/UserRolesSQLStorage.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index 9c9d2510..9f7555ae 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -30,11 +30,12 @@ boolean deleteRoleForUser_Transaction(TransactionConnection con, String userId, throws StorageQueryException; // create a new role - void createNewRole_Transaction(TransactionConnection con, String role) throws StorageQueryException; + void createNewRoleOrDoNothingIfExists_Transaction(TransactionConnection con, String role) + throws StorageQueryException; // associate a permission with a role void addPermissionToRole_Transaction(TransactionConnection con, String role, String permission) - throws StorageQueryException, UnknownRoleException, DuplicateRolePermissionMappingException; + throws StorageQueryException, UnknownRoleException; // delete a permission associated with the input role boolean deletePermissionForRole_Transaction(TransactionConnection con, String role, String permission) From 03e68a2ec767301fa764ced2ace936bdae3fe681 Mon Sep 17 00:00:00 2001 From: jscyo Date: Wed, 13 Apr 2022 10:47:57 +0530 Subject: [PATCH 16/21] removes DuplicateRolePermissionMappingException --- ...plicateRolePermissionMappingException.java | 24 ------------------- .../sqlStorage/UserRolesSQLStorage.java | 1 - 2 files changed, 25 deletions(-) delete mode 100644 src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRolePermissionMappingException.java diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRolePermissionMappingException.java b/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRolePermissionMappingException.java deleted file mode 100644 index 61bab78f..00000000 --- a/src/main/java/io/supertokens/pluginInterface/userroles/exception/DuplicateRolePermissionMappingException.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2022, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -package io.supertokens.pluginInterface.userroles.exception; - -import java.io.Serial; - -public class DuplicateRolePermissionMappingException extends UserRolesException { - @Serial - private static final long serialVersionUID = 6923539592089302804L; -} diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index 9f7555ae..e040ec69 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -20,7 +20,6 @@ import io.supertokens.pluginInterface.sqlStorage.SQLStorage; import io.supertokens.pluginInterface.sqlStorage.TransactionConnection; import io.supertokens.pluginInterface.userroles.UserRolesStorage; -import io.supertokens.pluginInterface.userroles.exception.DuplicateRolePermissionMappingException; import io.supertokens.pluginInterface.userroles.exception.UnknownRoleException; public interface UserRolesSQLStorage extends UserRolesStorage, SQLStorage { From d8f61394cb7aba9f36dbec598a84e93819abd194 Mon Sep 17 00:00:00 2001 From: Joel Coutinho Date: Thu, 14 Apr 2022 14:18:20 +0530 Subject: [PATCH 17/21] renames addPermissionToRole function (#35) --- .../userroles/sqlStorage/UserRolesSQLStorage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index e040ec69..91e38428 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -33,7 +33,7 @@ void createNewRoleOrDoNothingIfExists_Transaction(TransactionConnection con, Str throws StorageQueryException; // associate a permission with a role - void addPermissionToRole_Transaction(TransactionConnection con, String role, String permission) + void addPermissionToRoleOrDoNothingIfExists_Transaction(TransactionConnection con, String role, String permission) throws StorageQueryException, UnknownRoleException; // delete a permission associated with the input role From 50ac57850662426b127d4b278e4dd7e1af7c0974 Mon Sep 17 00:00:00 2001 From: Joel Coutinho Date: Wed, 20 Apr 2022 12:23:30 +0530 Subject: [PATCH 18/21] fix: updates function signitures (#36) * fix: updates addRoleToUser and createNewRoleOrDoNothingIfExists_Transaction function signitures * changes to boolean * undos change * fixs typo --- .../userroles/sqlStorage/UserRolesSQLStorage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java index 91e38428..0a51a071 100644 --- a/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java +++ b/src/main/java/io/supertokens/pluginInterface/userroles/sqlStorage/UserRolesSQLStorage.java @@ -28,8 +28,8 @@ public interface UserRolesSQLStorage extends UserRolesStorage, SQLStorage { boolean deleteRoleForUser_Transaction(TransactionConnection con, String userId, String role) throws StorageQueryException; - // create a new role - void createNewRoleOrDoNothingIfExists_Transaction(TransactionConnection con, String role) + // create a new role if it doesnt exist + boolean createNewRoleOrDoNothingIfExists_Transaction(TransactionConnection con, String role) throws StorageQueryException; // associate a permission with a role From af8381ce22a96d803a190724797f26faa90a5407 Mon Sep 17 00:00:00 2001 From: Joel Coutinho Date: Mon, 2 May 2022 20:55:13 +0530 Subject: [PATCH 19/21] updates build.gradle (#37) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9172a4fb..7d1883a0 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java-library' } -version = "2.13.0" +version = "2.14.0" repositories { mavenCentral() From dea0f0f0a3f84abe1cb7e40c071cf0f2786c7f82 Mon Sep 17 00:00:00 2001 From: Joel Coutinho Date: Tue, 3 May 2022 16:30:22 +0530 Subject: [PATCH 20/21] chore: updates changelog (#38) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9daaf7f..96a4220f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.14.0] - User Roles interface ## [2.13.0] - 2022-03-04 From 452641dc2f8f7cddf16d8eb22a6972d085ec48da Mon Sep 17 00:00:00 2001 From: jscyo Date: Thu, 5 May 2022 18:31:41 +0530 Subject: [PATCH 21/21] updates CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96a4220f..ee87d586 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [2.14.0] +## [2.14.0] - 2022-05-05 - User Roles interface ## [2.13.0] - 2022-03-04