in src/zadf/zcl_adf_service_blob.clas.abap [0:0]
METHOD get_sas_token.
DATA : body_xstring TYPE xstring,
sign TYPE string,
final_token TYPE string,
lv_decoded_xstr TYPE xstring,
conv TYPE REF TO cl_abap_conv_out_ce,
lv_sas_key TYPE string,
lv_format TYPE i.
conv = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ).
conv->convert( EXPORTING data = gv_string_to_sign IMPORTING buffer = body_xstring ).
DEFINE encrypt_key.
decode_sign( RECEIVING rv_secret = lv_sas_key ).
CALL FUNCTION 'SSFC_BASE64_DECODE'
EXPORTING
b64data = lv_sas_key
IMPORTING
bindata = lv_decoded_xstr
EXCEPTIONS
ssf_krn_error = 1
ssf_krn_noop = 2
ssf_krn_nomemory = 3
ssf_krn_opinv = 4
ssf_krn_input_data_error = 5
ssf_krn_invalid_par = 6
ssf_krn_invalid_parlen = 7
OTHERS = 8.
IF sy-subrc <> 0.
* Implement suitable error handling here
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>error_in_sas_key_encryption
interface_id = gv_interface_id.
ENDIF.
CALL METHOD cl_abap_hmac=>calculate_hmac_for_raw
EXPORTING
if_algorithm = 'sha-256'
if_key = lv_decoded_xstr "decoded
if_data = body_xstring
if_length = 0
IMPORTING
ef_hmacb64string = sign.
CLEAR : lv_sas_key,lv_decoded_xstr.
END-OF-DEFINITION.
encrypt_key.
IF NOT sign IS INITIAL.
lv_format = 18.
sign = escape( val = sign format = lv_format ).
gv_start_utc_time = escape( val = gv_start_utc_time format = lv_format ).
gv_expiry_utc_time = escape( val = gv_expiry_utc_time format = lv_format ).
IF NOT gv_expiry_utc_time IS INITIAL.
CONCATENATE '?sv=' gv_service_version '&sr=c' '&sig=' sign '&st=' gv_start_utc_time
'&se=' gv_expiry_utc_time '&sp=' gv_permisson INTO final_token.
CONCATENATE '/' gv_container_name '/' gv_blob_name INTO rv_sas_token.
CONCATENATE rv_sas_token final_token INTO rv_sas_token.
ENDIF.
ELSE.
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>sas_key_not_generated
interface_id = gv_interface_id.
ENDIF.