Browse Source

Fix error message for '/perm cancel' (#1918)

* fix: cancel error info

* fix: use UnsupportedOperationException

* fix: test

* fix: equals
cssxsh 3 years ago
parent
commit
a727704061

+ 14 - 9
mirai-console/backend/mirai-console/src/internal/permission/AbstractConcurrentPermissionService.kt

@@ -12,6 +12,7 @@ package net.mamoe.mirai.console.internal.permission
 import net.mamoe.mirai.console.data.PluginDataExtensions
 import net.mamoe.mirai.console.data.PluginDataExtensions
 import net.mamoe.mirai.console.permission.*
 import net.mamoe.mirai.console.permission.*
 import net.mamoe.mirai.console.permission.Permission.Companion.parentsWithSelf
 import net.mamoe.mirai.console.permission.Permission.Companion.parentsWithSelf
+import net.mamoe.mirai.console.permission.PermitteeId.Companion.allParentsWithSelf
 import net.mamoe.mirai.console.permission.PermitteeId.Companion.hasChild
 import net.mamoe.mirai.console.permission.PermitteeId.Companion.hasChild
 
 
 internal abstract class AbstractConcurrentPermissionService<P : Permission> : PermissionService<P> {
 internal abstract class AbstractConcurrentPermissionService<P : Permission> : PermissionService<P> {
@@ -41,27 +42,31 @@ internal abstract class AbstractConcurrentPermissionService<P : Permission> : Pe
         } else {
         } else {
             grantedPermissionsMap[permission.id].remove(permitteeId)
             grantedPermissionsMap[permission.id].remove(permitteeId)
         }
         }
-        check(success) {
+        if (!success) {
             val about = buildList {
             val about = buildList {
                 for ((permissionIdentifier, permissibleIdentifiers) in grantedPermissionsMap) {
                 for ((permissionIdentifier, permissibleIdentifiers) in grantedPermissionsMap) {
                     val parent = get(permissionIdentifier) ?: continue
                     val parent = get(permissionIdentifier) ?: continue
                     if (parent !in permission.parentsWithSelf) continue
                     if (parent !in permission.parentsWithSelf) continue
                     for (permissibleId in permissibleIdentifiers) {
                     for (permissibleId in permissibleIdentifiers) {
-                        if (permitteeId.hasChild(permitteeId)) {
+                        if (permissibleId in permitteeId.allParentsWithSelf) {
                             add(parent to permissibleId)
                             add(parent to permissibleId)
                         }
                         }
                     }
                     }
                 }
                 }
             }
             }
-            if (about.isEmpty()) {
-                "${permitteeId.asString()} 不拥有权限 ${permission.id} "
+            val message = if (about.isEmpty()) {
+                "${permitteeId.asString()} 不拥有权限 ${permission.id}"
             } else {
             } else {
-                """
-                    ${permitteeId.asString()} 的 ${permission.id} 权限来自
-                    ${about.joinToString("\n") { (parent, permitted) -> "${permitted.asString()} ${parent.id}" }}
-                    Mirai Console 内置权限系统目前不支持单独禁用继承得到的权限. 可取消继承来源再为其分别分配.
-                """.trimIndent()
+                buildString {
+                    appendLine("${permitteeId.asString()} 的 ${permission.id} 权限来自")
+                    about.forEach { (parent, permitted) ->
+                        appendLine("${permitted.asString()} ${parent.id}")
+                    }
+                    appendLine("Mirai Console 内置权限系统目前不支持单独禁用继承得到的权限. 可取消继承来源再为其分别分配.")
+                }
             }
             }
+
+            throw UnsupportedOperationException(message)
         }
         }
     }
     }
 
 

+ 14 - 3
mirai-console/backend/mirai-console/test/permission/PermissionServiceTest.kt

@@ -39,7 +39,15 @@ internal class PermissionServiceTest {
         assertTrue { builtIn.testPermission(any, command) }
         assertTrue { builtIn.testPermission(any, command) }
         assertTrue { builtIn.testPermission(member, command) }
         assertTrue { builtIn.testPermission(member, command) }
 
 
-        assertFails { builtIn.cancel(member, command, false) }
+        // test cancel fail (by parent)
+        val cause1 = assertFails { builtIn.cancel(member, command, false) }
+        assertTrue { cause1 is UnsupportedOperationException }
+        assertEquals("""
+            m12345.6789 的 plugin:command 权限来自
+            m12345.* plugin:*
+            Mirai Console 内置权限系统目前不支持单独禁用继承得到的权限. 可取消继承来源再为其分别分配.
+            
+        """.trimIndent(), cause1.message)
 
 
         // test recursive cancel
         // test recursive cancel
         builtIn.cancel(any, builtIn.rootPermission, true)
         builtIn.cancel(any, builtIn.rootPermission, true)
@@ -48,6 +56,11 @@ internal class PermissionServiceTest {
         assertFalse { builtIn.testPermission(any, command) }
         assertFalse { builtIn.testPermission(any, command) }
         assertFalse { builtIn.testPermission(member, command) }
         assertFalse { builtIn.testPermission(member, command) }
 
 
+        // test cancel (no permit)
+        val cause2 = assertFails { builtIn.cancel(member, command, false) }
+        assertTrue { cause2 is UnsupportedOperationException }
+        assertEquals("${member.asString()} 不拥有权限 ${command.id}", cause2.message)
+
         // test not recursive cancel
         // test not recursive cancel
         builtIn.permit(any, plugin)
         builtIn.permit(any, plugin)
         builtIn.permit(any, command)
         builtIn.permit(any, command)
@@ -56,7 +69,5 @@ internal class PermissionServiceTest {
         assertFalse { builtIn.testPermission(member, plugin) }
         assertFalse { builtIn.testPermission(member, plugin) }
         assertTrue { builtIn.testPermission(any, command) }
         assertTrue { builtIn.testPermission(any, command) }
         assertTrue { builtIn.testPermission(member, command) }
         assertTrue { builtIn.testPermission(member, command) }
-
-        assertFails { builtIn.cancel(member, command, false) }
     }
     }
 }
 }