diff --git a/sdk/communication/azure-communication-chat/azure/communication/chat/_shared/models.py b/sdk/communication/azure-communication-chat/azure/communication/chat/_shared/models.py index 859cedd798d7..45aa585aed4d 100644 --- a/sdk/communication/azure-communication-chat/azure/communication/chat/_shared/models.py +++ b/sdk/communication/azure-communication-chat/azure/communication/chat/_shared/models.py @@ -5,7 +5,6 @@ # pylint: skip-file from enum import Enum, EnumMeta -import re from six import with_metaclass from typing import Mapping, Optional, Union, Any try: @@ -68,7 +67,7 @@ class CommunicationUserIdentifier(object): def __init__(self, id, **kwargs): # type: (str, Any) -> None - self.raw_id = kwargs.get('raw_id', id) + self.raw_id = kwargs.get('raw_id') self.properties = CommunicationUserProperties(id=id) @@ -96,19 +95,6 @@ def __init__(self, value, **kwargs): # type: (str, Any) -> None self.raw_id = kwargs.get('raw_id') self.properties = PhoneNumberProperties(value=value) - if self.raw_id is None: - self.raw_id = _phone_number_raw_id(self) - - -_PHONE_NUMBER_PREFIX = re.compile(r'^\+') - - -def _phone_number_raw_id(identifier): - # type (PhoneNumberIdentifier) -> str - value = identifier.properties['value'] - # strip the leading +. We just assume correct E.164 format here because - # validation should only happen server-side, not client-side. - return '4:{}'.format(_PHONE_NUMBER_PREFIX.sub('', value)) class UnknownIdentifier(object): @@ -168,72 +154,3 @@ def __init__(self, user_id, **kwargs): is_anonymous=kwargs.get('is_anonymous', False), cloud=kwargs.get('cloud') or CommunicationCloudEnvironment.PUBLIC ) - if self.raw_id is None: - self.raw_id = _microsoft_teams_user_raw_id(self) - - -def _microsoft_teams_user_raw_id(identifier): - # type (MicrosoftTeamsUserIdentifier) -> str - user_id = identifier.properties['user_id'] - if identifier.properties['is_anonymous']: - return '8:teamsvisitor:{}'.format(user_id) - cloud = identifier.properties['cloud'] - if cloud == CommunicationCloudEnvironment.DOD: - return '8:dod:{}'.format(user_id) - elif cloud == CommunicationCloudEnvironment.GCCH: - return '8:gcch:{}'.format(user_id) - elif cloud == CommunicationCloudEnvironment.PUBLIC: - return '8:orgid:{}'.format(user_id) - return '8:orgid:{}'.format(user_id) - - -def identifier_from_raw_id(raw_id): - """ - Creates a CommunicationIdentifier from a given raw ID. - - When storing raw IDs use this function to restore the identifier that was encoded in the raw ID. - - :param raw ID to construct the CommunicationIdentifier from. - """ - # type (str) -> CommunicationIdentifier - if raw_id.startswith('4:'): - return PhoneNumberIdentifier( - value='+{}'.format(raw_id[len('4:'):]) - ) - - segments = raw_id.split(':', maxsplit=2) - if len(segments) < 3: - return UnknownIdentifier(identifier=raw_id) - - prefix = '{}:{}:'.format(segments[0], segments[1]) - suffix = raw_id[len(prefix):] - if prefix == '8:teamsvisitor:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=True - ) - elif prefix == '8:orgid:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='PUBLIC' - ) - elif prefix == '8:dod:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='DOD' - ) - elif prefix == '8:gcch:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='GCCH' - ) - elif prefix in ['8:acs:', '8:spool:', '8:dod-acs:', '8:gcch-acs:']: - return CommunicationUserIdentifier( - id=raw_id - ) - return UnknownIdentifier( - identifier=raw_id - ) diff --git a/sdk/communication/azure-communication-identity/CHANGELOG.md b/sdk/communication/azure-communication-identity/CHANGELOG.md index 79b3bd0e396e..728ed4c81062 100644 --- a/sdk/communication/azure-communication-identity/CHANGELOG.md +++ b/sdk/communication/azure-communication-identity/CHANGELOG.md @@ -1,19 +1,13 @@ # Release History -## 1.1.0 (Unreleased) +## 1.1.0 (2022-08-01) ### Features Added -- Added support to build a custom Teams endpoint using Microsoft 365 Teams identities: +- Added support to integrate communication as Teams user with Azure Communication Services: - Added `get_token_for_teams_user(aad_token, client_id, user_object_id)` method that provides the ability to exchange an Azure AD access token of a Teams user for a Communication Identity access token to `CommunicationIdentityClient`. - Removed `ApiVersion.V2021_10_31_preview` from API versions. -- Added a new API version `ApiVersion.V2022_06_01` that is now the deafult API version -- Exported types `MicrosoftTeamsUserIdentifier`, `PhoneNumberIdentifier`, `UnknownIdentifier` for non Azure Communication Services `CommunicationIdentifier` identities. -- Added `identifier_from_raw_id` and ensured that `CommunicationIdentifier.raw_id` is populated on creation. Together, these can be used to translate between a `CommunicationIdentifier` and its underlying canonical raw ID representation. Developers can now use the raw ID as an encoded format for identifiers to store in their databases or as stable keys in general. - -### Breaking Changes - -### Bugs Fixed +- Added a new API version `ApiVersion.V2022_06_01` that is now the default API version ### Other Changes - Python 2.7 is no longer supported. Please use Python version 3.7 or later. For more details, please read our page on [Azure SDK for Python version support policy](https://github.com/Azure/azure-sdk-for-python/wiki/Azure-SDKs-Python-version-support-policy). @@ -22,7 +16,7 @@ ### Features Added -- Added support for Microsoft 365 Teams identities +- Added support to integrate communication as Teams user with Azure Communication Services: - `CommunicationIdentityClient` added a new method `get_token_for_teams_user` that provides the ability to exchange an Azure AD access token of a Teams user for a Communication Identity access token ## 1.0.1 (2021-06-08) diff --git a/sdk/communication/azure-communication-identity/azure/communication/identity/__init__.py b/sdk/communication/azure-communication-identity/azure/communication/identity/__init__.py index aae62a5fddd1..19d7301c6bfe 100644 --- a/sdk/communication/azure-communication-identity/azure/communication/identity/__init__.py +++ b/sdk/communication/azure-communication-identity/azure/communication/identity/__init__.py @@ -14,11 +14,7 @@ CommunicationIdentifier, CommunicationIdentifierKind, CommunicationUserIdentifier, - CommunicationUserProperties, - MicrosoftTeamsUserIdentifier, - PhoneNumberIdentifier, - UnknownIdentifier, - identifier_from_raw_id + CommunicationUserProperties ) __all__ = [ @@ -31,9 +27,5 @@ 'CommunicationIdentifier', 'CommunicationIdentifierKind', 'CommunicationUserIdentifier', - 'CommunicationUserProperties', - 'MicrosoftTeamsUserIdentifier', - 'PhoneNumberIdentifier', - 'UnknownIdentifier', - 'identifier_from_raw_id' + 'CommunicationUserProperties' ] diff --git a/sdk/communication/azure-communication-identity/azure/communication/identity/_shared/models.py b/sdk/communication/azure-communication-identity/azure/communication/identity/_shared/models.py index 859cedd798d7..45aa585aed4d 100644 --- a/sdk/communication/azure-communication-identity/azure/communication/identity/_shared/models.py +++ b/sdk/communication/azure-communication-identity/azure/communication/identity/_shared/models.py @@ -5,7 +5,6 @@ # pylint: skip-file from enum import Enum, EnumMeta -import re from six import with_metaclass from typing import Mapping, Optional, Union, Any try: @@ -68,7 +67,7 @@ class CommunicationUserIdentifier(object): def __init__(self, id, **kwargs): # type: (str, Any) -> None - self.raw_id = kwargs.get('raw_id', id) + self.raw_id = kwargs.get('raw_id') self.properties = CommunicationUserProperties(id=id) @@ -96,19 +95,6 @@ def __init__(self, value, **kwargs): # type: (str, Any) -> None self.raw_id = kwargs.get('raw_id') self.properties = PhoneNumberProperties(value=value) - if self.raw_id is None: - self.raw_id = _phone_number_raw_id(self) - - -_PHONE_NUMBER_PREFIX = re.compile(r'^\+') - - -def _phone_number_raw_id(identifier): - # type (PhoneNumberIdentifier) -> str - value = identifier.properties['value'] - # strip the leading +. We just assume correct E.164 format here because - # validation should only happen server-side, not client-side. - return '4:{}'.format(_PHONE_NUMBER_PREFIX.sub('', value)) class UnknownIdentifier(object): @@ -168,72 +154,3 @@ def __init__(self, user_id, **kwargs): is_anonymous=kwargs.get('is_anonymous', False), cloud=kwargs.get('cloud') or CommunicationCloudEnvironment.PUBLIC ) - if self.raw_id is None: - self.raw_id = _microsoft_teams_user_raw_id(self) - - -def _microsoft_teams_user_raw_id(identifier): - # type (MicrosoftTeamsUserIdentifier) -> str - user_id = identifier.properties['user_id'] - if identifier.properties['is_anonymous']: - return '8:teamsvisitor:{}'.format(user_id) - cloud = identifier.properties['cloud'] - if cloud == CommunicationCloudEnvironment.DOD: - return '8:dod:{}'.format(user_id) - elif cloud == CommunicationCloudEnvironment.GCCH: - return '8:gcch:{}'.format(user_id) - elif cloud == CommunicationCloudEnvironment.PUBLIC: - return '8:orgid:{}'.format(user_id) - return '8:orgid:{}'.format(user_id) - - -def identifier_from_raw_id(raw_id): - """ - Creates a CommunicationIdentifier from a given raw ID. - - When storing raw IDs use this function to restore the identifier that was encoded in the raw ID. - - :param raw ID to construct the CommunicationIdentifier from. - """ - # type (str) -> CommunicationIdentifier - if raw_id.startswith('4:'): - return PhoneNumberIdentifier( - value='+{}'.format(raw_id[len('4:'):]) - ) - - segments = raw_id.split(':', maxsplit=2) - if len(segments) < 3: - return UnknownIdentifier(identifier=raw_id) - - prefix = '{}:{}:'.format(segments[0], segments[1]) - suffix = raw_id[len(prefix):] - if prefix == '8:teamsvisitor:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=True - ) - elif prefix == '8:orgid:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='PUBLIC' - ) - elif prefix == '8:dod:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='DOD' - ) - elif prefix == '8:gcch:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='GCCH' - ) - elif prefix in ['8:acs:', '8:spool:', '8:dod-acs:', '8:gcch-acs:']: - return CommunicationUserIdentifier( - id=raw_id - ) - return UnknownIdentifier( - identifier=raw_id - ) diff --git a/sdk/communication/azure-communication-identity/setup.py b/sdk/communication/azure-communication-identity/setup.py index 687bac8e1672..ebfbb5ea49df 100644 --- a/sdk/communication/azure-communication-identity/setup.py +++ b/sdk/communication/azure-communication-identity/setup.py @@ -43,7 +43,7 @@ license='MIT License', # ensure that the development status reflects the status of your package classifiers=[ - "Development Status :: 4 - Beta", + "Development Status :: 5 - Production/Stable", 'Programming Language :: Python', 'Programming Language :: Python :: 3 :: Only', diff --git a/sdk/communication/azure-communication-identity/tests/test_identifier_raw_id.py b/sdk/communication/azure-communication-identity/tests/test_identifier_raw_id.py deleted file mode 100644 index d3e3e68a5168..000000000000 --- a/sdk/communication/azure-communication-identity/tests/test_identifier_raw_id.py +++ /dev/null @@ -1,238 +0,0 @@ -# coding: utf-8 -# ------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for -# license information. -# -------------------------------------------------------------------------- - -import pytest -import unittest -from azure.communication.identity import * - -class IdentifierRawIdTest(unittest.TestCase): - def test_raw_id(self): - _assert_raw_id( - CommunicationUserIdentifier( - id='8:acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130' - ), - '8:acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - _assert_raw_id( - CommunicationUserIdentifier( - id='8:gcch-acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130' - ), - '8:gcch-acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - _assert_raw_id( - CommunicationUserIdentifier( - id='someFutureFormat' - ), - 'someFutureFormat' - ) - _assert_raw_id( - MicrosoftTeamsUserIdentifier( - user_id='45ab2481-1c1c-4005-be24-0ffb879b1130' - ), - '8:orgid:45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - _assert_raw_id( - MicrosoftTeamsUserIdentifier( - user_id='45ab2481-1c1c-4005-be24-0ffb879b1130', - cloud='PUBLIC' - ), - '8:orgid:45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - _assert_raw_id( - MicrosoftTeamsUserIdentifier( - user_id='45ab2481-1c1c-4005-be24-0ffb879b1130', - cloud='DOD' - ), - '8:dod:45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - _assert_raw_id( - MicrosoftTeamsUserIdentifier( - user_id='45ab2481-1c1c-4005-be24-0ffb879b1130', - cloud='GCCH' - ), - '8:gcch:45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - _assert_raw_id( - MicrosoftTeamsUserIdentifier( - user_id='45ab2481-1c1c-4005-be24-0ffb879b1130', - is_anonymous=False - ), - '8:orgid:45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - _assert_raw_id( - MicrosoftTeamsUserIdentifier( - user_id='45ab2481-1c1c-4005-be24-0ffb879b1130', - is_anonymous=True - ), - '8:teamsvisitor:45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - _assert_raw_id( - MicrosoftTeamsUserIdentifier( - user_id='45ab2481-1c1c-4005-be24-0ffb879b1130', - raw_id='8:orgid:legacyFormat' - ), - '8:orgid:legacyFormat' - ) - _assert_raw_id( - PhoneNumberIdentifier( - value='+112345556789' - ), - '4:112345556789' - ) - _assert_raw_id( - PhoneNumberIdentifier( - value='112345556789' - ), - '4:112345556789' - ) - _assert_raw_id( - PhoneNumberIdentifier( - value='+112345556789', - raw_id='4:otherFormat' - ), - '4:otherFormat' - ) - _assert_raw_id( - UnknownIdentifier( - identifier='28:45ab2481-1c1c-4005-be24-0ffb879b1130' - ), - '28:45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - - def test_identifier_from_raw_id(self): - _assert_communication_identifier( - '8:acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130', - CommunicationUserIdentifier( - id='8:acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - ) - _assert_communication_identifier( - '8:spool:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130', - CommunicationUserIdentifier( - id='8:spool:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - ) - _assert_communication_identifier( - '8:dod-acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130', - CommunicationUserIdentifier( - id='8:dod-acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - ) - _assert_communication_identifier( - '8:gcch-acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130', - CommunicationUserIdentifier( - id='8:gcch-acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - ) - _assert_communication_identifier( - '8:acs:something', - CommunicationUserIdentifier( - id='8:acs:something' - ) - ) - _assert_communication_identifier( - '8:orgid:45ab2481-1c1c-4005-be24-0ffb879b1130', - MicrosoftTeamsUserIdentifier( - user_id='45ab2481-1c1c-4005-be24-0ffb879b1130', - cloud='PUBLIC', - is_anonymous=False - ) - ) - _assert_communication_identifier( - '8:dod:45ab2481-1c1c-4005-be24-0ffb879b1130', - MicrosoftTeamsUserIdentifier( - user_id='45ab2481-1c1c-4005-be24-0ffb879b1130', - cloud='DOD', - is_anonymous=False - ) - ) - _assert_communication_identifier( - '8:gcch:45ab2481-1c1c-4005-be24-0ffb879b1130', - MicrosoftTeamsUserIdentifier( - user_id='45ab2481-1c1c-4005-be24-0ffb879b1130', - cloud='GCCH', - is_anonymous=False - ) - ) - _assert_communication_identifier( - '8:teamsvisitor:45ab2481-1c1c-4005-be24-0ffb879b1130', - MicrosoftTeamsUserIdentifier( - user_id='45ab2481-1c1c-4005-be24-0ffb879b1130', - is_anonymous=True - ) - ) - _assert_communication_identifier( - '8:orgid:legacyFormat', - MicrosoftTeamsUserIdentifier( - user_id='legacyFormat', - cloud='PUBLIC', - is_anonymous=False - ) - ) - _assert_communication_identifier( - '4:112345556789', - PhoneNumberIdentifier( - value='+112345556789' - ) - ) - _assert_communication_identifier( - '4:otherFormat', - PhoneNumberIdentifier( - value='+otherFormat' - ) - ) - _assert_communication_identifier( - '28:45ab2481-1c1c-4005-be24-0ffb879b1130', - UnknownIdentifier( - identifier='28:45ab2481-1c1c-4005-be24-0ffb879b1130' - ) - ) - _assert_communication_identifier( - '', - UnknownIdentifier( - identifier='' - ) - ) - with pytest.raises(Exception): - identifier_from_raw_id(None) - - def test_roundtrip(self): - _assert_roundtrip('8:acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130') - _assert_roundtrip('8:spool:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130') - _assert_roundtrip('8:dod-acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130') - _assert_roundtrip('8:gcch-acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130') - _assert_roundtrip('8:acs:something') - _assert_roundtrip('8:orgid:45ab2481-1c1c-4005-be24-0ffb879b1130') - _assert_roundtrip('8:dod:45ab2481-1c1c-4005-be24-0ffb879b1130') - _assert_roundtrip('8:gcch:45ab2481-1c1c-4005-be24-0ffb879b1130') - _assert_roundtrip('8:teamsvisitor:45ab2481-1c1c-4005-be24-0ffb879b1130') - _assert_roundtrip('8:orgid:legacyFormat') - _assert_roundtrip('4:112345556789') - _assert_roundtrip('4:otherFormat') - _assert_roundtrip('28:45ab2481-1c1c-4005-be24-0ffb879b1130') - _assert_roundtrip('') - - -def _assert_raw_id(identifier, want): - # type: (CommunicationIdentifier, str) -> None - assert identifier.raw_id == want - - -def _assert_communication_identifier(raw_id, want): - # type: (str, CommunicationIdentifier) -> None - got = identifier_from_raw_id(raw_id) - assert got.raw_id == want.raw_id - assert got.kind == want.kind - assert len(got.properties) == len(want.properties) - for key in want.properties: - assert key in got.properties - assert got.properties[key] == want.properties[key] - - -def _assert_roundtrip(raw_id): - # type: (str) -> None - assert identifier_from_raw_id(raw_id).raw_id == raw_id \ No newline at end of file diff --git a/sdk/communication/azure-communication-networktraversal/azure/communication/networktraversal/_shared/models.py b/sdk/communication/azure-communication-networktraversal/azure/communication/networktraversal/_shared/models.py index 859cedd798d7..45aa585aed4d 100644 --- a/sdk/communication/azure-communication-networktraversal/azure/communication/networktraversal/_shared/models.py +++ b/sdk/communication/azure-communication-networktraversal/azure/communication/networktraversal/_shared/models.py @@ -5,7 +5,6 @@ # pylint: skip-file from enum import Enum, EnumMeta -import re from six import with_metaclass from typing import Mapping, Optional, Union, Any try: @@ -68,7 +67,7 @@ class CommunicationUserIdentifier(object): def __init__(self, id, **kwargs): # type: (str, Any) -> None - self.raw_id = kwargs.get('raw_id', id) + self.raw_id = kwargs.get('raw_id') self.properties = CommunicationUserProperties(id=id) @@ -96,19 +95,6 @@ def __init__(self, value, **kwargs): # type: (str, Any) -> None self.raw_id = kwargs.get('raw_id') self.properties = PhoneNumberProperties(value=value) - if self.raw_id is None: - self.raw_id = _phone_number_raw_id(self) - - -_PHONE_NUMBER_PREFIX = re.compile(r'^\+') - - -def _phone_number_raw_id(identifier): - # type (PhoneNumberIdentifier) -> str - value = identifier.properties['value'] - # strip the leading +. We just assume correct E.164 format here because - # validation should only happen server-side, not client-side. - return '4:{}'.format(_PHONE_NUMBER_PREFIX.sub('', value)) class UnknownIdentifier(object): @@ -168,72 +154,3 @@ def __init__(self, user_id, **kwargs): is_anonymous=kwargs.get('is_anonymous', False), cloud=kwargs.get('cloud') or CommunicationCloudEnvironment.PUBLIC ) - if self.raw_id is None: - self.raw_id = _microsoft_teams_user_raw_id(self) - - -def _microsoft_teams_user_raw_id(identifier): - # type (MicrosoftTeamsUserIdentifier) -> str - user_id = identifier.properties['user_id'] - if identifier.properties['is_anonymous']: - return '8:teamsvisitor:{}'.format(user_id) - cloud = identifier.properties['cloud'] - if cloud == CommunicationCloudEnvironment.DOD: - return '8:dod:{}'.format(user_id) - elif cloud == CommunicationCloudEnvironment.GCCH: - return '8:gcch:{}'.format(user_id) - elif cloud == CommunicationCloudEnvironment.PUBLIC: - return '8:orgid:{}'.format(user_id) - return '8:orgid:{}'.format(user_id) - - -def identifier_from_raw_id(raw_id): - """ - Creates a CommunicationIdentifier from a given raw ID. - - When storing raw IDs use this function to restore the identifier that was encoded in the raw ID. - - :param raw ID to construct the CommunicationIdentifier from. - """ - # type (str) -> CommunicationIdentifier - if raw_id.startswith('4:'): - return PhoneNumberIdentifier( - value='+{}'.format(raw_id[len('4:'):]) - ) - - segments = raw_id.split(':', maxsplit=2) - if len(segments) < 3: - return UnknownIdentifier(identifier=raw_id) - - prefix = '{}:{}:'.format(segments[0], segments[1]) - suffix = raw_id[len(prefix):] - if prefix == '8:teamsvisitor:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=True - ) - elif prefix == '8:orgid:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='PUBLIC' - ) - elif prefix == '8:dod:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='DOD' - ) - elif prefix == '8:gcch:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='GCCH' - ) - elif prefix in ['8:acs:', '8:spool:', '8:dod-acs:', '8:gcch-acs:']: - return CommunicationUserIdentifier( - id=raw_id - ) - return UnknownIdentifier( - identifier=raw_id - ) diff --git a/sdk/communication/azure-communication-phonenumbers/azure/communication/phonenumbers/_shared/models.py b/sdk/communication/azure-communication-phonenumbers/azure/communication/phonenumbers/_shared/models.py index 859cedd798d7..45aa585aed4d 100644 --- a/sdk/communication/azure-communication-phonenumbers/azure/communication/phonenumbers/_shared/models.py +++ b/sdk/communication/azure-communication-phonenumbers/azure/communication/phonenumbers/_shared/models.py @@ -5,7 +5,6 @@ # pylint: skip-file from enum import Enum, EnumMeta -import re from six import with_metaclass from typing import Mapping, Optional, Union, Any try: @@ -68,7 +67,7 @@ class CommunicationUserIdentifier(object): def __init__(self, id, **kwargs): # type: (str, Any) -> None - self.raw_id = kwargs.get('raw_id', id) + self.raw_id = kwargs.get('raw_id') self.properties = CommunicationUserProperties(id=id) @@ -96,19 +95,6 @@ def __init__(self, value, **kwargs): # type: (str, Any) -> None self.raw_id = kwargs.get('raw_id') self.properties = PhoneNumberProperties(value=value) - if self.raw_id is None: - self.raw_id = _phone_number_raw_id(self) - - -_PHONE_NUMBER_PREFIX = re.compile(r'^\+') - - -def _phone_number_raw_id(identifier): - # type (PhoneNumberIdentifier) -> str - value = identifier.properties['value'] - # strip the leading +. We just assume correct E.164 format here because - # validation should only happen server-side, not client-side. - return '4:{}'.format(_PHONE_NUMBER_PREFIX.sub('', value)) class UnknownIdentifier(object): @@ -168,72 +154,3 @@ def __init__(self, user_id, **kwargs): is_anonymous=kwargs.get('is_anonymous', False), cloud=kwargs.get('cloud') or CommunicationCloudEnvironment.PUBLIC ) - if self.raw_id is None: - self.raw_id = _microsoft_teams_user_raw_id(self) - - -def _microsoft_teams_user_raw_id(identifier): - # type (MicrosoftTeamsUserIdentifier) -> str - user_id = identifier.properties['user_id'] - if identifier.properties['is_anonymous']: - return '8:teamsvisitor:{}'.format(user_id) - cloud = identifier.properties['cloud'] - if cloud == CommunicationCloudEnvironment.DOD: - return '8:dod:{}'.format(user_id) - elif cloud == CommunicationCloudEnvironment.GCCH: - return '8:gcch:{}'.format(user_id) - elif cloud == CommunicationCloudEnvironment.PUBLIC: - return '8:orgid:{}'.format(user_id) - return '8:orgid:{}'.format(user_id) - - -def identifier_from_raw_id(raw_id): - """ - Creates a CommunicationIdentifier from a given raw ID. - - When storing raw IDs use this function to restore the identifier that was encoded in the raw ID. - - :param raw ID to construct the CommunicationIdentifier from. - """ - # type (str) -> CommunicationIdentifier - if raw_id.startswith('4:'): - return PhoneNumberIdentifier( - value='+{}'.format(raw_id[len('4:'):]) - ) - - segments = raw_id.split(':', maxsplit=2) - if len(segments) < 3: - return UnknownIdentifier(identifier=raw_id) - - prefix = '{}:{}:'.format(segments[0], segments[1]) - suffix = raw_id[len(prefix):] - if prefix == '8:teamsvisitor:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=True - ) - elif prefix == '8:orgid:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='PUBLIC' - ) - elif prefix == '8:dod:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='DOD' - ) - elif prefix == '8:gcch:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='GCCH' - ) - elif prefix in ['8:acs:', '8:spool:', '8:dod-acs:', '8:gcch-acs:']: - return CommunicationUserIdentifier( - id=raw_id - ) - return UnknownIdentifier( - identifier=raw_id - ) diff --git a/sdk/communication/azure-communication-sms/azure/communication/sms/_shared/models.py b/sdk/communication/azure-communication-sms/azure/communication/sms/_shared/models.py index 859cedd798d7..45aa585aed4d 100644 --- a/sdk/communication/azure-communication-sms/azure/communication/sms/_shared/models.py +++ b/sdk/communication/azure-communication-sms/azure/communication/sms/_shared/models.py @@ -5,7 +5,6 @@ # pylint: skip-file from enum import Enum, EnumMeta -import re from six import with_metaclass from typing import Mapping, Optional, Union, Any try: @@ -68,7 +67,7 @@ class CommunicationUserIdentifier(object): def __init__(self, id, **kwargs): # type: (str, Any) -> None - self.raw_id = kwargs.get('raw_id', id) + self.raw_id = kwargs.get('raw_id') self.properties = CommunicationUserProperties(id=id) @@ -96,19 +95,6 @@ def __init__(self, value, **kwargs): # type: (str, Any) -> None self.raw_id = kwargs.get('raw_id') self.properties = PhoneNumberProperties(value=value) - if self.raw_id is None: - self.raw_id = _phone_number_raw_id(self) - - -_PHONE_NUMBER_PREFIX = re.compile(r'^\+') - - -def _phone_number_raw_id(identifier): - # type (PhoneNumberIdentifier) -> str - value = identifier.properties['value'] - # strip the leading +. We just assume correct E.164 format here because - # validation should only happen server-side, not client-side. - return '4:{}'.format(_PHONE_NUMBER_PREFIX.sub('', value)) class UnknownIdentifier(object): @@ -168,72 +154,3 @@ def __init__(self, user_id, **kwargs): is_anonymous=kwargs.get('is_anonymous', False), cloud=kwargs.get('cloud') or CommunicationCloudEnvironment.PUBLIC ) - if self.raw_id is None: - self.raw_id = _microsoft_teams_user_raw_id(self) - - -def _microsoft_teams_user_raw_id(identifier): - # type (MicrosoftTeamsUserIdentifier) -> str - user_id = identifier.properties['user_id'] - if identifier.properties['is_anonymous']: - return '8:teamsvisitor:{}'.format(user_id) - cloud = identifier.properties['cloud'] - if cloud == CommunicationCloudEnvironment.DOD: - return '8:dod:{}'.format(user_id) - elif cloud == CommunicationCloudEnvironment.GCCH: - return '8:gcch:{}'.format(user_id) - elif cloud == CommunicationCloudEnvironment.PUBLIC: - return '8:orgid:{}'.format(user_id) - return '8:orgid:{}'.format(user_id) - - -def identifier_from_raw_id(raw_id): - """ - Creates a CommunicationIdentifier from a given raw ID. - - When storing raw IDs use this function to restore the identifier that was encoded in the raw ID. - - :param raw ID to construct the CommunicationIdentifier from. - """ - # type (str) -> CommunicationIdentifier - if raw_id.startswith('4:'): - return PhoneNumberIdentifier( - value='+{}'.format(raw_id[len('4:'):]) - ) - - segments = raw_id.split(':', maxsplit=2) - if len(segments) < 3: - return UnknownIdentifier(identifier=raw_id) - - prefix = '{}:{}:'.format(segments[0], segments[1]) - suffix = raw_id[len(prefix):] - if prefix == '8:teamsvisitor:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=True - ) - elif prefix == '8:orgid:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='PUBLIC' - ) - elif prefix == '8:dod:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='DOD' - ) - elif prefix == '8:gcch:': - return MicrosoftTeamsUserIdentifier( - user_id=suffix, - is_anonymous=False, - cloud='GCCH' - ) - elif prefix in ['8:acs:', '8:spool:', '8:dod-acs:', '8:gcch-acs:']: - return CommunicationUserIdentifier( - id=raw_id - ) - return UnknownIdentifier( - identifier=raw_id - ) diff --git a/sdk/communication/cspell.json b/sdk/communication/cspell.json deleted file mode 100644 index 9bd2f530bf09..000000000000 --- a/sdk/communication/cspell.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "0.2", - "ignoreWords": [ - "orgid" - ] -} \ No newline at end of file