mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 20:32:26 +08:00
Apply requested code review changes
This commit is contained in:
parent
8a8df05290
commit
d7fcf8a1c9
|
@ -86,6 +86,18 @@ CLASS lcx_2fa_token_del_failed IMPLEMENTATION.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS lcx_2fa_communication_error DEFINITION INHERITING FROM lcx_2fa_error FINAL.
|
||||||
|
PROTECTED SECTION.
|
||||||
|
METHODS:
|
||||||
|
get_default_text REDEFINITION.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS lcx_2fa_communication_error IMPLEMENTATION.
|
||||||
|
METHOD get_default_text.
|
||||||
|
rv_text = 'Communication error.' ##NO_TEXT.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
"! Defines a two factor authentication authenticator
|
"! Defines a two factor authentication authenticator
|
||||||
"! <p>
|
"! <p>
|
||||||
|
@ -114,7 +126,8 @@ INTERFACE lif_2fa_authenticator.
|
||||||
iv_2fa_token TYPE string
|
iv_2fa_token TYPE string
|
||||||
RETURNING VALUE(rv_access_token) TYPE string
|
RETURNING VALUE(rv_access_token) TYPE string
|
||||||
RAISING lcx_2fa_auth_failed
|
RAISING lcx_2fa_auth_failed
|
||||||
lcx_2fa_token_gen_failed,
|
lcx_2fa_token_gen_failed
|
||||||
|
lcx_2fa_communication_error,
|
||||||
"! Check if this authenticator instance supports the give repository url
|
"! Check if this authenticator instance supports the give repository url
|
||||||
"! @parameter iv_url | Repository url
|
"! @parameter iv_url | Repository url
|
||||||
"! @parameter rv_supported | Is supported
|
"! @parameter rv_supported | Is supported
|
||||||
|
@ -135,7 +148,8 @@ INTERFACE lif_2fa_authenticator.
|
||||||
is_2fa_required IMPORTING iv_url TYPE string
|
is_2fa_required IMPORTING iv_url TYPE string
|
||||||
iv_username TYPE string
|
iv_username TYPE string
|
||||||
iv_password TYPE string
|
iv_password TYPE string
|
||||||
RETURNING VALUE(rv_required) TYPE abap_bool,
|
RETURNING VALUE(rv_required) TYPE abap_bool
|
||||||
|
RAISING lcx_2fa_communication_error,
|
||||||
"! Delete all previously created access tokens for abapGit
|
"! Delete all previously created access tokens for abapGit
|
||||||
"! @parameter iv_url | Repository url
|
"! @parameter iv_url | Repository url
|
||||||
"! @parameter iv_username | Username
|
"! @parameter iv_username | Username
|
||||||
|
@ -148,6 +162,7 @@ INTERFACE lif_2fa_authenticator.
|
||||||
iv_password TYPE string
|
iv_password TYPE string
|
||||||
iv_2fa_token TYPE string
|
iv_2fa_token TYPE string
|
||||||
RAISING lcx_2fa_token_del_failed
|
RAISING lcx_2fa_token_del_failed
|
||||||
|
lcx_2fa_communication_error
|
||||||
lcx_2fa_auth_failed.
|
lcx_2fa_auth_failed.
|
||||||
ENDINTERFACE.
|
ENDINTERFACE.
|
||||||
|
|
||||||
|
@ -176,7 +191,7 @@ CLASS lcl_2fa_authenticator_base DEFINITION
|
||||||
"! <p>
|
"! <p>
|
||||||
"! <em>sy-msg...</em> must be set right before calling!
|
"! <em>sy-msg...</em> must be set right before calling!
|
||||||
"! </p>
|
"! </p>
|
||||||
raise_internal_error_from_sy RAISING lcx_2fa_auth_failed.
|
raise_comm_error_from_sy RAISING lcx_2fa_communication_error.
|
||||||
PRIVATE SECTION.
|
PRIVATE SECTION.
|
||||||
DATA:
|
DATA:
|
||||||
mo_url_regex TYPE REF TO cl_abap_regex.
|
mo_url_regex TYPE REF TO cl_abap_regex.
|
||||||
|
@ -210,15 +225,15 @@ CLASS lcl_2fa_authenticator_base IMPLEMENTATION.
|
||||||
RAISE EXCEPTION TYPE lcx_2fa_token_del_failed. " Needs to be overwritten in subclasses
|
RAISE EXCEPTION TYPE lcx_2fa_token_del_failed. " Needs to be overwritten in subclasses
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD raise_internal_error_from_sy.
|
METHOD raise_comm_error_from_sy.
|
||||||
DATA: lv_error_msg TYPE string.
|
DATA: lv_error_msg TYPE string.
|
||||||
|
|
||||||
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
|
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
|
||||||
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
|
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
|
||||||
INTO lv_error_msg.
|
INTO lv_error_msg.
|
||||||
RAISE EXCEPTION TYPE lcx_2fa_auth_failed
|
RAISE EXCEPTION TYPE lcx_2fa_communication_error
|
||||||
EXPORTING
|
EXPORTING
|
||||||
iv_error_text = |Internal error: { lv_error_msg }| ##NO_TEXT.
|
iv_error_text = |Communication error: { lv_error_msg }| ##NO_TEXT.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
||||||
|
@ -255,12 +270,13 @@ CLASS lcl_2fa_github_authenticator DEFINITION
|
||||||
iv_password TYPE string
|
iv_password TYPE string
|
||||||
iv_2fa_token TYPE string
|
iv_2fa_token TYPE string
|
||||||
RETURNING VALUE(ri_client) TYPE REF TO if_http_client
|
RETURNING VALUE(ri_client) TYPE REF TO if_http_client
|
||||||
RAISING lcx_2fa_auth_failed.
|
RAISING lcx_2fa_auth_failed
|
||||||
|
lcx_2fa_communication_error.
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
||||||
CLASS lcl_2fa_github_authenticator IMPLEMENTATION.
|
CLASS lcl_2fa_github_authenticator IMPLEMENTATION.
|
||||||
METHOD constructor.
|
METHOD constructor.
|
||||||
super->constructor( 'https?:\/\/(www\.)?github.com.*$' ).
|
super->constructor( '^https?://(www\.)?github.com.*$' ).
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD authenticate.
|
METHOD authenticate.
|
||||||
|
@ -280,12 +296,12 @@ CLASS lcl_2fa_github_authenticator IMPLEMENTATION.
|
||||||
|
|
||||||
li_http_client->send( EXCEPTIONS OTHERS = 1 ).
|
li_http_client->send( EXCEPTIONS OTHERS = 1 ).
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc <> 0.
|
||||||
raise_internal_error_from_sy( ).
|
raise_comm_error_from_sy( ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
li_http_client->receive( EXCEPTIONS OTHERS = 1 ).
|
li_http_client->receive( EXCEPTIONS OTHERS = 1 ).
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc <> 0.
|
||||||
raise_internal_error_from_sy( ).
|
raise_comm_error_from_sy( ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
li_http_client->response->get_status(
|
li_http_client->response->get_status(
|
||||||
|
@ -396,20 +412,50 @@ CLASS lcl_2fa_github_authenticator IMPLEMENTATION.
|
||||||
|
|
||||||
METHOD is_2fa_required.
|
METHOD is_2fa_required.
|
||||||
DATA: li_client TYPE REF TO if_http_client,
|
DATA: li_client TYPE REF TO if_http_client,
|
||||||
lv_header_value TYPE string.
|
lv_header_value TYPE string,
|
||||||
|
lo_settings TYPE REF TO lcl_settings.
|
||||||
|
|
||||||
|
lo_settings = lcl_app=>settings( )->read( ).
|
||||||
|
|
||||||
cl_http_client=>create_by_url(
|
cl_http_client=>create_by_url(
|
||||||
EXPORTING
|
EXPORTING
|
||||||
url = gc_github_api_url
|
url = gc_github_api_url
|
||||||
|
ssl_id = 'ANONYM'
|
||||||
|
proxy_host = lo_settings->get_proxy_url( )
|
||||||
|
proxy_service = lo_settings->get_proxy_port( )
|
||||||
IMPORTING
|
IMPORTING
|
||||||
client = li_client ).
|
client = li_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.
|
||||||
|
|
||||||
li_client->propertytype_logon_popup = if_http_client=>co_disabled.
|
li_client->propertytype_logon_popup = if_http_client=>co_disabled.
|
||||||
|
|
||||||
|
" The request needs to use something other than GET and it needs to be send to an endpoint
|
||||||
|
" to trigger a SMS.
|
||||||
|
li_client->request->set_header_field( name = if_http_header_fields_sap=>request_uri
|
||||||
|
value = gc_restendpoint_authorizations ).
|
||||||
|
li_client->request->set_method( if_http_request=>co_request_method_post ).
|
||||||
|
|
||||||
" Try to authenticate, if 2FA is required there will be a specific response header
|
" Try to authenticate, if 2FA is required there will be a specific response header
|
||||||
li_client->authenticate( username = iv_username password = iv_password ).
|
li_client->authenticate( username = iv_username password = iv_password ).
|
||||||
li_client->send( ).
|
|
||||||
li_client->receive( ).
|
li_client->send( EXCEPTIONS OTHERS = 1 ).
|
||||||
|
IF sy-subrc <> 0.
|
||||||
|
raise_comm_error_from_sy( ).
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
li_client->receive( EXCEPTIONS OTHERS = 1 ).
|
||||||
|
IF sy-subrc <> 0.
|
||||||
|
raise_comm_error_from_sy( ).
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
" The response will either be UNAUTHORIZED or MALFORMED which is both fine.
|
||||||
|
|
||||||
IF li_client->response->get_header_field( gc_otp_header_name ) CP 'required*'.
|
IF li_client->response->get_header_field( gc_otp_header_name ) CP 'required*'.
|
||||||
rv_required = abap_true.
|
rv_required = abap_true.
|
||||||
|
@ -430,12 +476,12 @@ CLASS lcl_2fa_github_authenticator IMPLEMENTATION.
|
||||||
set_list_token_request( li_http_client->request ).
|
set_list_token_request( li_http_client->request ).
|
||||||
li_http_client->send( EXCEPTIONS OTHERS = 1 ).
|
li_http_client->send( EXCEPTIONS OTHERS = 1 ).
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc <> 0.
|
||||||
raise_internal_error_from_sy( ).
|
raise_comm_error_from_sy( ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
li_http_client->receive( EXCEPTIONS OTHERS = 1 ).
|
li_http_client->receive( EXCEPTIONS OTHERS = 1 ).
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc <> 0.
|
||||||
raise_internal_error_from_sy( ).
|
raise_comm_error_from_sy( ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
li_http_client->response->get_status(
|
li_http_client->response->get_status(
|
||||||
|
@ -455,12 +501,12 @@ CLASS lcl_2fa_github_authenticator IMPLEMENTATION.
|
||||||
iv_token_id = <lv_id> ).
|
iv_token_id = <lv_id> ).
|
||||||
li_http_client->send( EXCEPTIONS OTHERS = 1 ).
|
li_http_client->send( EXCEPTIONS OTHERS = 1 ).
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc <> 0.
|
||||||
raise_internal_error_from_sy( ).
|
raise_comm_error_from_sy( ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
li_http_client->receive( EXCEPTIONS OTHERS = 1 ).
|
li_http_client->receive( EXCEPTIONS OTHERS = 1 ).
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc <> 0.
|
||||||
raise_internal_error_from_sy( ).
|
raise_comm_error_from_sy( ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
li_http_client->response->get_status(
|
li_http_client->response->get_status(
|
||||||
|
@ -478,12 +524,19 @@ CLASS lcl_2fa_github_authenticator IMPLEMENTATION.
|
||||||
|
|
||||||
METHOD get_authenticated_client.
|
METHOD get_authenticated_client.
|
||||||
DATA: lv_http_code TYPE i,
|
DATA: lv_http_code TYPE i,
|
||||||
lv_http_code_description TYPE string.
|
lv_http_code_description TYPE string,
|
||||||
|
lo_settings TYPE REF TO lcl_settings.
|
||||||
|
|
||||||
" Try to login to GitHub API with username, password and 2fa token
|
" Try to login to GitHub API with username, password and 2fa token
|
||||||
|
|
||||||
|
lo_settings = lcl_app=>settings( )->read( ).
|
||||||
|
|
||||||
cl_http_client=>create_by_url(
|
cl_http_client=>create_by_url(
|
||||||
EXPORTING
|
EXPORTING
|
||||||
url = gc_github_api_url
|
url = gc_github_api_url
|
||||||
|
ssl_id = 'ANONYM'
|
||||||
|
proxy_host = lo_settings->get_proxy_url( )
|
||||||
|
proxy_service = lo_settings->get_proxy_port( )
|
||||||
IMPORTING
|
IMPORTING
|
||||||
client = ri_client
|
client = ri_client
|
||||||
EXCEPTIONS
|
EXCEPTIONS
|
||||||
|
@ -492,7 +545,7 @@ CLASS lcl_2fa_github_authenticator IMPLEMENTATION.
|
||||||
internal_error = 3
|
internal_error = 3
|
||||||
OTHERS = 4 ).
|
OTHERS = 4 ).
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc <> 0.
|
||||||
raise_internal_error_from_sy( ).
|
raise_comm_error_from_sy( ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
" https://developer.github.com/v3/auth/#working-with-two-factor-authentication
|
" https://developer.github.com/v3/auth/#working-with-two-factor-authentication
|
||||||
|
@ -503,12 +556,12 @@ CLASS lcl_2fa_github_authenticator IMPLEMENTATION.
|
||||||
|
|
||||||
ri_client->send( EXCEPTIONS OTHERS = 1 ).
|
ri_client->send( EXCEPTIONS OTHERS = 1 ).
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc <> 0.
|
||||||
raise_internal_error_from_sy( ).
|
raise_comm_error_from_sy( ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
ri_client->receive( EXCEPTIONS OTHERS = 1 ).
|
ri_client->receive( EXCEPTIONS OTHERS = 1 ).
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc <> 0.
|
||||||
raise_internal_error_from_sy( ).
|
raise_comm_error_from_sy( ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
" Check if authentication has succeeded
|
" Check if authentication has succeeded
|
||||||
|
|
Loading…
Reference in New Issue
Block a user