Completed POC for SuperOffice integration with the following key achievements: - Switched from RSA/SOAP to OAuth 2.0 (Refresh Token Flow) for better compatibility with SOD environment. - Implemented robust token refreshing and caching mechanism in . - Solved 'Wrong Subdomain' issue by enforcing for tenant . - Created for REST API interaction (Search, Create, Update UDFs). - Added helper scripts: , , . - Documented usage and configuration in . - Updated configuration requirements. [2ff88f42]
48 lines
1.8 KiB
Python
48 lines
1.8 KiB
Python
import base64
|
|
from cryptography.hazmat.primitives import serialization
|
|
from cryptography.hazmat.primitives.asymmetric import rsa
|
|
|
|
# The XML data provided by the user
|
|
modulus_b64 = "3PlhZKih1S9AKmsOcnPuS6FfPyYdKg6ltCUypt4EOi2++oM5O26YFxODBtQHO+UmsEoNcz6X2A5BE9kv4y8Xyv+hDxQrHsyavrkq2Yn5Mf/BFAquYuRoX5FtvH6ht+yllfBJQs3wE9m/O8LKHomKE5HXiaV/QMDRLoYeAwzQwcE="
|
|
exponent_b64 = "AQAB"
|
|
d_b64 = "i8TdWprjSgHKF0qB59j2WDYpFbtY5RpAq3J/2FZD3DzFOJU55SKt5qK71NzV+oeV8hnU6hkkWE+j0BcnGA7Yf6xGIoVNVhrenU18hrd6vSUPDeOuerkv+u98pNEqs6jcfYwhKKEJ2nFl4AacdQ7RaQPEWb41pVYvP+qaX6PeQAE="
|
|
p_b64 = "8fGRi846fRCbc8oaUGnw1dR2BXOopzxfAMeKEOCUeRP/Yj1kUcW9k4zUeaFc2upnfAeUbX38Bk5VW5edCDIjAQ=="
|
|
q_b64 = "6c/usvg8/4quH8Z70tSotmN+N6UxiuaTF51oOeTnIVUjXMqB3gc5sRCbipGj1u+DJUYh4LQLZp+W2LU7uCpewQ=="
|
|
dp_b64 = "y2q8YVwh5tbYrHCm0SdRWqcIF6tXiEwE4EXkOi5oBqielr1hJDNqIa1NU3os9M4R9cD1tV0wUSj5MUn2uFZXAQ=="
|
|
dq_b64 = "yc9+8Z0QUWVrC+QvBngls1/HFtKQI5sHRS/JQYdQ9FVfM31bgL/tzOZPytgQebm8EdUp8qCU4pxHAH/Vrw1rQQ=="
|
|
inverse_q_b64 = "VX4SRxVQ130enAqw9M0Nyl+875vmhc6cbsJQQ3E/fJjQvkB8EgjxBp6JVTeY1U5ga56Hvzngomk335pA6gli0A=="
|
|
|
|
def b64_to_int(b64_str):
|
|
return int.from_bytes(base64.b64decode(b64_str), byteorder='big')
|
|
|
|
# Convert components to integers
|
|
n = b64_to_int(modulus_b64)
|
|
e = b64_to_int(exponent_b64)
|
|
d = b64_to_int(d_b64)
|
|
p = b64_to_int(p_b64)
|
|
q = b64_to_int(q_b64)
|
|
dmp1 = b64_to_int(dp_b64)
|
|
dmq1 = b64_to_int(dq_b64)
|
|
iqmp = b64_to_int(inverse_q_b64)
|
|
|
|
# Reconstruct the private key object
|
|
private_key = rsa.RSAPrivateNumbers(
|
|
p=p,
|
|
q=q,
|
|
d=d,
|
|
dmp1=dmp1,
|
|
dmq1=dmq1,
|
|
iqmp=iqmp,
|
|
public_numbers=rsa.RSAPublicNumbers(e, n)
|
|
).private_key()
|
|
|
|
# Serialize to PEM
|
|
pem_private = private_key.private_bytes(
|
|
encoding=serialization.Encoding.PEM,
|
|
format=serialization.PrivateFormat.PKCS8,
|
|
encryption_algorithm=serialization.NoEncryption()
|
|
)
|
|
|
|
# Print for the user
|
|
print(pem_private.decode('utf-8'))
|