Skip to content

Commit 0913239

Browse files
authored
Merge pull request #24 from cryptlex/feat-entitlement-develop
Feat entitlement develop
2 parents ce44096 + 9e79eea commit 0913239

File tree

4 files changed

+142
-0
lines changed

4 files changed

+142
-0
lines changed

cryptlex/lexfloatclient/lexfloatclient.py

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,32 @@
11
import ctypes
22
import json
3+
import functools
4+
import warnings
35
from cryptlex.lexfloatclient import lexfloatclient_native as LexFloatClientNative
46
from cryptlex.lexfloatclient.lexfloatstatus_codes import LexFloatStatusCodes
57
from cryptlex.lexfloatclient.lexfloatclient_exception import LexFloatClientException
68

79
callback_list = []
810

11+
def deprecated(alternative):
12+
"""This is a decorator which can be used to mark functions as deprecated.
13+
It will result in a warning being emitted when the function is used.
14+
15+
Args:
16+
alternative (str): Name of the alternative function to use
17+
"""
18+
def decorator(func):
19+
@functools.wraps(func)
20+
def wrapper(*args, **kwargs):
21+
warnings.warn(
22+
f"The function {func.__name__}() is deprecated. Use {alternative}() instead.",
23+
category=DeprecationWarning,
24+
stacklevel=2
25+
)
26+
return func(*args, **kwargs)
27+
return wrapper
28+
return decorator
29+
930
class PermissionFlags:
1031
LF_USER = 10
1132
LF_ALL_USERS = 11
@@ -23,6 +44,13 @@ def __init__(self, name, enabled, data):
2344
self.enabled = enabled
2445
self.data = data
2546

47+
class HostFeatureEntitlement(object):
48+
def __init__(self, host_feature_entitlement_dict):
49+
self.feature_name = host_feature_entitlement_dict.get("featureName")
50+
self.feature_display_name = host_feature_entitlement_dict.get("featureDisplayName")
51+
self.value = host_feature_entitlement_dict.get("value")
52+
53+
2654
class HostConfig(object):
2755
def __init__(self, max_offline_lease_duration):
2856
self.max_offline_lease_duration = max_offline_lease_duration
@@ -176,6 +204,7 @@ def GetHostConfig():
176204
raise LexFloatClientException(status)
177205

178206
@staticmethod
207+
@deprecated("GetHostLicenseEntitlementSetName")
179208
def GetHostProductVersionName():
180209
"""Gets the product version name.
181210
@@ -194,6 +223,7 @@ def GetHostProductVersionName():
194223
return LexFloatClientNative.byte_to_string(buffer.value)
195224

196225
@staticmethod
226+
@deprecated("GetHostLicenseEntitlementSetDisplayName")
197227
def GetHostProductVersionDisplayName():
198228
"""Gets the product version display name.
199229
@@ -212,6 +242,7 @@ def GetHostProductVersionDisplayName():
212242
return LexFloatClientNative.byte_to_string(buffer.value)
213243

214244
@staticmethod
245+
@deprecated("GetHostFeatureEntitlement")
215246
def GetHostProductVersionFeatureFlag(name):
216247
"""Gets the product version feature flag.
217248
@@ -234,6 +265,93 @@ def GetHostProductVersionFeatureFlag(name):
234265
return HostProductVersionFeatureFlag(name, isEnabled, LexFloatClientNative.byte_to_string(buffer.value))
235266
else:
236267
raise LexFloatClientException(status)
268+
269+
@staticmethod
270+
def GetHostLicenseEntitlementSetName():
271+
"""Gets the name of the entitlement set associated with the LexFloatServer license.
272+
273+
Raises:
274+
LexFloatClientException
275+
276+
Returns:
277+
str: host license entitlement set name
278+
"""
279+
buffer_size = 256
280+
buffer = LexFloatClientNative.get_ctype_string_buffer(buffer_size)
281+
status = LexFloatClientNative.GetHostLicenseEntitlementSetName(buffer, buffer_size)
282+
if status != LexFloatStatusCodes.LF_OK:
283+
raise LexFloatClientException(status)
284+
return LexFloatClientNative.byte_to_string(buffer.value)
285+
286+
@staticmethod
287+
def GetHostLicenseEntitlementSetDisplayName():
288+
"""Gets the display name of the entitlement set associated with the LexFloatServer license.
289+
290+
Raises:
291+
LexFloatClientException
292+
293+
Returns:
294+
str: host license entitlement set display name
295+
"""
296+
buffer_size = 256
297+
buffer = LexFloatClientNative.get_ctype_string_buffer(buffer_size)
298+
status = LexFloatClientNative.GetHostLicenseEntitlementSetDisplayName(buffer, buffer_size)
299+
if status != LexFloatStatusCodes.LF_OK:
300+
raise LexFloatClientException(status)
301+
return LexFloatClientNative.byte_to_string(buffer.value)
302+
303+
@staticmethod
304+
def GetHostFeatureEntitlements():
305+
"""Gets the feature entitlements associated with the LexFloatServer license.
306+
307+
Feature entitlements can be linked directly to a license (license feature entitlements)
308+
or via entitlement sets. If a feature entitlement is defined in both, the value from
309+
the license feature entitlement takes precedence, overriding the entitlement set value.
310+
311+
Raises:
312+
LexFloatClientException
313+
314+
Returns:
315+
HostFeatureEntitlements[]: list of host feature entitlements
316+
"""
317+
buffer_size = 4096
318+
buffer = LexFloatClientNative.get_ctype_string_buffer(buffer_size)
319+
status = LexFloatClientNative.GetHostFeatureEntitlements(buffer, buffer_size)
320+
if status == LexFloatStatusCodes.LF_OK:
321+
host_feature_entitlements_json = LexFloatClientNative.byte_to_string(buffer.value)
322+
if not host_feature_entitlements_json.strip():
323+
return []
324+
else:
325+
host_feature_entitlements = json.loads(host_feature_entitlements_json)
326+
host_feature_entitlements_list = [HostFeatureEntitlement(feature_detail) for feature_detail in host_feature_entitlements]
327+
return host_feature_entitlements_list
328+
else:
329+
raise LexFloatClientException(status)
330+
331+
@staticmethod
332+
def GetHostFeatureEntitlement(feature_name):
333+
"""Gets the feature entitlement associated with the LexFloatServer license.
334+
335+
Feature entitlements can be linked directly to a license (license feature entitlements)
336+
or via entitlement sets. If a feature entitlement is defined in both, the value from
337+
the license feature entitlement takes precedence, overriding the entitlement set value.
338+
339+
Raises:
340+
LexFloatClientException
341+
342+
Returns:
343+
HostFeatureEntitlement: host feature entitlement
344+
"""
345+
cstring_feature_name = LexFloatClientNative.get_ctype_string(feature_name)
346+
buffer_size = 1024
347+
buffer = LexFloatClientNative.get_ctype_string_buffer(buffer_size)
348+
status = LexFloatClientNative.GetHostFeatureEntitlement(cstring_feature_name, buffer, buffer_size)
349+
if status == LexFloatStatusCodes.LF_OK:
350+
host_feature_entitlement_json = LexFloatClientNative.byte_to_string(buffer.value)
351+
host_feature_entitlement = json.loads(host_feature_entitlement_json)
352+
return HostFeatureEntitlement(host_feature_entitlement)
353+
else:
354+
raise LexFloatClientException(status)
237355

238356
@staticmethod
239357
def GetHostLicenseMetadata(key):

cryptlex/lexfloatclient/lexfloatclient_exception.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,8 @@ def get_error_message(code):
8080
return 'Machine fingerprint has changed since activation.'
8181
if code == LexFloatStatusCodes.LF_E_PROXY_NOT_TRUSTED:
8282
return 'Request blocked due to untrusted proxy.'
83+
if code == LexFloatStatusCodes.LF_E_ENTITLEMENT_SET_NOT_LINKED:
84+
return 'No entitlement set is linked to the license.'
85+
if code == LexFloatStatusCodes.LF_E_FEATURE_ENTITLEMENT_NOT_FOUND:
86+
return 'The feature entitlement does not exist.'
8387
return 'Unknown error!'

cryptlex/lexfloatclient/lexfloatclient_native.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,22 @@ def byte_to_string(input):
155155
GetHostConfig.argtypes = [STRTYPE, c_uint32]
156156
GetHostConfig.restype = c_int
157157

158+
GetHostLicenseEntitlementSetName = library.GetHostLicenseEntitlementSetName
159+
GetHostLicenseEntitlementSetName.argtypes = [STRTYPE, c_uint32]
160+
GetHostLicenseEntitlementSetName.restype = c_int
161+
162+
GetHostLicenseEntitlementSetDisplayName = library.GetHostLicenseEntitlementSetDisplayName
163+
GetHostLicenseEntitlementSetDisplayName.argtypes = [STRTYPE, c_uint32]
164+
GetHostLicenseEntitlementSetDisplayName.restype = c_int
165+
166+
GetHostFeatureEntitlements = library.GetHostFeatureEntitlementsInternal
167+
GetHostFeatureEntitlements.argtypes = [STRTYPE, c_uint32]
168+
GetHostFeatureEntitlements.restype = c_int
169+
170+
GetHostFeatureEntitlement = library.GetHostFeatureEntitlementInternal
171+
GetHostFeatureEntitlement.argtypes = [CSTRTYPE, STRTYPE, c_uint32]
172+
GetHostFeatureEntitlement.restype = c_int
173+
158174
GetHostLicenseMetadata = library.GetHostLicenseMetadata
159175
GetHostLicenseMetadata.argtypes = [CSTRTYPE, STRTYPE, c_uint32]
160176
GetHostLicenseMetadata.restype = c_int

cryptlex/lexfloatclient/lexfloatstatus_codes.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ class LexFloatStatusCodes:
6060

6161
LF_E_PROXY_NOT_TRUSTED = 67
6262

63+
LF_E_ENTITLEMENT_SET_NOT_LINKED = 68
64+
65+
LF_E_FEATURE_ENTITLEMENT_NOT_FOUND = 69
66+
6367
LF_E_CLIENT = 70
6468

6569
LF_E_SERVER = 71

0 commit comments

Comments
 (0)