abapGit/src/http/zcl_abapgit_2fa_auth_base.clas.abap
Chris Mills c82a101bbe Fix issue 1298 - 2FA behind HTTP Proxy
Fix for issue 1298. Previously code was not checking if HTTP proxy authenticaiton was required. Pushed basic method of getting a HTTP client with proxy configured in to 2FA base class. There's some overlap with logic in zcl_abapgit_http%3D>create_by_url but not extracted method at this point
2018-04-05 12:41:26 +08:00

147 lines
4.4 KiB
ABAP

"! Default <em>LIF_2FA-AUTHENTICATOR</em> implememtation
CLASS zcl_abapgit_2fa_auth_base DEFINITION
PUBLIC
ABSTRACT
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES:
zif_abapgit_2fa_authenticator.
ALIASES:
authenticate FOR zif_abapgit_2fa_authenticator~authenticate,
supports_url FOR zif_abapgit_2fa_authenticator~supports_url,
is_2fa_required FOR zif_abapgit_2fa_authenticator~is_2fa_required,
delete_access_tokens FOR zif_abapgit_2fa_authenticator~delete_access_tokens,
begin FOR zif_abapgit_2fa_authenticator~begin,
end FOR zif_abapgit_2fa_authenticator~end.
METHODS:
"! @parameter iv_supported_url_regex | Regular expression to check if a repository url is
"! supported, used for default implementation of
"! <em>SUPPORTS_URL</em>
constructor IMPORTING iv_supported_url_regex TYPE clike.
PROTECTED SECTION.
CLASS-METHODS:
"! Helper method to raise class based exception after traditional exception was raised
"! <p>
"! <em>sy-msg...</em> must be set right before calling!
"! </p>
raise_comm_error_from_sy RAISING zcx_abapgit_2fa_comm_error.
METHODS:
"! @parameter rv_running | Internal session is currently active
is_session_running RETURNING VALUE(rv_running) TYPE abap_bool,
"! Returns HTTP client configured with proxy (where required) for the given URL
get_http_client_for_url
IMPORTING iv_url TYPE string
RETURNING VALUE(ri_client) TYPE REF TO if_http_client
RAISING zcx_abapgit_2fa_comm_error.
PRIVATE SECTION.
DATA:
mo_url_regex TYPE REF TO cl_abap_regex,
mv_session_running TYPE abap_bool.
ENDCLASS.
CLASS zcl_abapgit_2fa_auth_base IMPLEMENTATION.
METHOD constructor.
CREATE OBJECT mo_url_regex
EXPORTING
pattern = iv_supported_url_regex
ignore_case = abap_true.
ENDMETHOD.
METHOD is_session_running.
rv_running = mv_session_running.
ENDMETHOD.
METHOD raise_comm_error_from_sy.
DATA: lv_error_msg TYPE string.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
INTO lv_error_msg.
RAISE EXCEPTION TYPE zcx_abapgit_2fa_comm_error
EXPORTING
mv_text = |Communication error: { lv_error_msg }| ##NO_TEXT.
ENDMETHOD.
METHOD authenticate.
RAISE EXCEPTION TYPE zcx_abapgit_2fa_auth_failed. " Needs to be overwritten in subclasses
ENDMETHOD.
METHOD begin.
IF mv_session_running = abap_true.
RAISE EXCEPTION TYPE zcx_abapgit_2fa_illegal_state.
ENDIF.
mv_session_running = abap_true.
ENDMETHOD.
METHOD delete_access_tokens.
RAISE EXCEPTION TYPE zcx_abapgit_2fa_del_failed. " Needs to be overwritten in subclasses
ENDMETHOD.
METHOD end.
IF mv_session_running = abap_false.
RAISE EXCEPTION TYPE zcx_abapgit_2fa_illegal_state.
ENDIF.
mv_session_running = abap_false.
ENDMETHOD.
METHOD is_2fa_required.
rv_required = abap_false.
ENDMETHOD.
METHOD supports_url.
rv_supported = mo_url_regex->create_matcher( text = iv_url )->match( ).
ENDMETHOD.
METHOD get_http_client_for_url.
DATA: lo_proxy TYPE REF TO zcl_abapgit_proxy_config,
lo_abapgit_exc TYPE REF TO zcx_abapgit_exception,
lv_error_text TYPE string.
CREATE OBJECT lo_proxy.
cl_http_client=>create_by_url(
EXPORTING
url = iv_url
ssl_id = 'ANONYM'
proxy_host = lo_proxy->get_proxy_url( iv_url )
proxy_service = lo_proxy->get_proxy_port( iv_url )
IMPORTING
client = ri_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4 ).
IF sy-subrc <> 0.
raise_comm_error_from_sy( ).
ENDIF.
IF lo_proxy->get_proxy_authentication( iv_url ) = abap_true.
TRY.
zcl_abapgit_proxy_auth=>run( ri_client ).
CATCH zcx_abapgit_exception INTO lo_abapgit_exc.
lv_error_text = lo_abapgit_exc->get_text( ).
IF lv_error_text IS INITIAL.
lv_error_text = `Proxy authentication error`.
ENDIF.
RAISE EXCEPTION TYPE zcx_abapgit_2fa_comm_error EXPORTING mv_text = lv_error_text previous = lo_abapgit_exc.
ENDTRY.
ENDIF.
ENDMETHOD.
ENDCLASS.