Skip to content

Commit ac141d7

Browse files
cziebuhroroulet
authored andcommitted
Fix specifying allowed UserIdentityTokens
1 parent 4fa6142 commit ac141d7

File tree

5 files changed

+29
-21
lines changed

5 files changed

+29
-21
lines changed

asyncua/server/internal_server.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def __init__(self, user_manager: UserManager = None):
7878
self._time_task_stop = False
7979
self.match_discovery_endpoint_url: bool = True
8080
self.match_discovery_source_ip: bool = True
81-
self.supported_tokens = []
81+
self.supported_tokens = (ua.AnonymousIdentityToken, ua.X509IdentityToken, ua.UserNameIdentityToken)
8282

8383
async def init(self, shelffile: Optional[Path] = None):
8484
await self.load_standard_address_space(shelffile)

asyncua/server/server.py

+23-18
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ def __init__(self, iserver: InternalServer = None, user_manager=None):
110110
]
111111
# allow all certificates by default
112112
self._permission_ruleset = SimpleRoleRuleset()
113-
self._policyIDs = ["Anonymous", "Basic256Sha256", "Username", "Aes128Sha256RsaOaep", "Aes256Sha256RsaPss"]
114113
self.certificate: Optional[x509.Certificate] = None
115114
# Use acceptable limits
116115
buffer_sz = 65535
@@ -349,19 +348,29 @@ def set_security_policy(self, security_policy, permission_ruleset=None):
349348

350349
def set_security_IDs(self, policy_ids):
351350
"""
352-
Method setting up the security endpoints for identification
353-
of clients. During server object initialization, all possible
354-
endpoints are enabled:
355-
356-
self._policyIDs = ["Anonymous", "Basic256Sha256", "Username"]
351+
DEPRECATED!
352+
Only available for backwards compatibility.
353+
Use set_identity_tokens instead.
354+
"""
355+
_logger.warning("set_security_IDs is deprecated, use set_identity_tokens instead!")
356+
tokens = []
357+
if "Anonymous" in policy_ids:
358+
tokens.append(ua.AnonymousIdentityToken)
359+
if "Basic256Sha256" in policy_ids:
360+
tokens.append(ua.X509IdentityToken)
361+
if "Username" in policy_ids:
362+
tokens.append(ua.UserNameIdentityToken)
363+
self.set_identity_tokens(tokens)
357364

358-
E.g. to limit the number of IDs and disable anonymous clients:
365+
def set_identity_tokens(self, tokens):
366+
"""
367+
Method setting up allowed identity token types for authentication.
359368
360-
set_security_IDs(["Basic256Sha256"])
369+
E.g. to disable anonymous clients:
361370
362-
(Implementation for ID check is currently not finalized...)
371+
set_identity_tokens([ua.X509IdentityToken, ua.UserNameIdentityToken])
363372
"""
364-
self._policyIDs = policy_ids
373+
self.iserver.supported_tokens = tuple(tokens)
365374

366375
async def _setup_server_nodes(self):
367376
# to be called just before starting server since it needs all parameters to be setup
@@ -492,30 +501,27 @@ def determine_security_level(security_policy_uri: str, security_mode: ua.Message
492501

493502
def _set_endpoints(self, policy=ua.SecurityPolicy, mode=ua.MessageSecurityMode.None_):
494503
idtokens = []
495-
supported_token_classes = []
496-
if "Anonymous" in self._policyIDs:
504+
tokens = self.iserver.supported_tokens
505+
if ua.AnonymousIdentityToken in tokens:
497506
idtoken = ua.UserTokenPolicy()
498507
idtoken.PolicyId = "anonymous"
499508
idtoken.TokenType = ua.UserTokenType.Anonymous
500509
idtoken.SecurityPolicyUri = policy.URI
501510
idtokens.append(idtoken)
502-
supported_token_classes.append(ua.AnonymousIdentityToken)
503511

504-
if "Basic256Sha256" in self._policyIDs:
512+
if ua.X509IdentityToken in tokens:
505513
idtoken = ua.UserTokenPolicy()
506514
idtoken.PolicyId = 'certificate_basic256sha256'
507515
idtoken.TokenType = ua.UserTokenType.Certificate
508516
idtoken.SecurityPolicyUri = policy.URI
509517
idtokens.append(idtoken)
510-
supported_token_classes.append(ua.X509IdentityToken)
511518

512-
if "Username" in self._policyIDs:
519+
if ua.UserNameIdentityToken in tokens:
513520
idtoken = ua.UserTokenPolicy()
514521
idtoken.PolicyId = "username"
515522
idtoken.TokenType = ua.UserTokenType.UserName
516523
idtoken.SecurityPolicyUri = policy.URI
517524
idtokens.append(idtoken)
518-
supported_token_classes.append(ua.UserNameIdentityToken)
519525

520526
appdesc = ua.ApplicationDescription()
521527
appdesc.ApplicationName = ua.LocalizedText(self.name)
@@ -535,7 +541,6 @@ def _set_endpoints(self, policy=ua.SecurityPolicy, mode=ua.MessageSecurityMode.N
535541
edp.TransportProfileUri = "http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary"
536542
edp.SecurityLevel = Server.determine_security_level(policy.URI, mode)
537543
self.iserver.add_endpoint(edp)
538-
self.iserver.supported_tokens = tuple(supported_token_classes)
539544

540545
def set_server_name(self, name):
541546
self.name = name

asyncua/sync.py

+3
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,9 @@ def set_security_policy(self, security_policy, permission_ruleset=None):
580580
def set_security_IDs(self, policy_ids):
581581
return self.aio_obj.set_security_IDs(policy_ids)
582582

583+
def set_identity_tokens(self, tokens):
584+
return self.aio_obj.set_identity_tokens(tokens)
585+
583586
def disable_clock(self, val: bool = True):
584587
return self.aio_obj.disable_clock(val)
585588

tests/test_crypto_connect.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ async def test_anonymous_rejection():
481481
await srv.init()
482482
srv.set_endpoint(uri_crypto_cert)
483483
srv.set_security_policy([ua.SecurityPolicyType.Basic256Sha256_SignAndEncrypt])
484-
srv.set_security_IDs(["Username", "Basic256Sha256"])
484+
srv.set_identity_tokens([ua.UserNameIdentityToken, ua.X509IdentityToken])
485485
await srv.load_certificate(cert)
486486
await srv.load_private_key(key)
487487
await srv.start()

tests/test_password.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def get_user(self, iserver, username=None, password=None, certificate=None):
1919
async def srv_user():
2020
srv = Server(user_manager=UserManager())
2121
srv.set_endpoint(uri)
22-
srv.set_security_IDs(["Username"])
22+
srv.set_identity_tokens([ua.UserNameIdentityToken])
2323

2424
await srv.init()
2525
await srv.start()

0 commit comments

Comments
 (0)