util.roles: Return nil if the role has no explicit policy (fixes inheritance)
Previously, if the first inherited role had no opinion, it returned false and
prevented further consultation of other inherited roles.
This bug was found thanks to the implementation of missing test cases
identified through mutation testing.
local enum error_type
"auth"
"cancel"
"continue"
"modify"
"wait"
end
local enum error_condition
"bad-request"
"conflict"
"feature-not-implemented"
"forbidden"
"gone"
"internal-server-error"
"item-not-found"
"jid-malformed"
"not-acceptable"
"not-allowed"
"not-authorized"
"policy-violation"
"recipient-unavailable"
"redirect"
"registration-required"
"remote-server-not-found"
"remote-server-timeout"
"resource-constraint"
"service-unavailable"
"subscription-required"
"undefined-condition"
"unexpected-request"
end
local record protoerror
type : error_type
condition : error_condition
text : string
code : integer
end
local record Error
type : error_type
condition : error_condition
text : string
code : integer
context : { any : any }
source : string
end
local type compact_registry_item = { string, string, string, string }
local type compact_registry = { compact_registry_item }
local type registry = { string : protoerror }
local type context = { string : any }
local record error_registry_wrapper
source : string
registry : registry
new : function (string, context) : Error
coerce : function (any, string) : any, Error
wrap : function (Error) : Error
wrap : function (string, context) : Error
is_error : function (any) : boolean
end
local record lib
record configure_opt
auto_inject_traceback : boolean
end
new : function (protoerror, context, { string : protoerror }, string) : Error
init : function (string, string, registry | compact_registry) : error_registry_wrapper
init : function (string, registry | compact_registry) : error_registry_wrapper
is_error : function (any) : boolean
coerce : function (any, string) : any, Error
from_stanza : function (table, context, string) : Error
configure : function
end
return lib