Improved validation of URLs (#3486)

* Limit URLs to http and https

* Validate URLs

* Raise error only for validation (not for get_name)

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Marc Bernard 2020-06-14 20:14:39 +02:00 committed by GitHub
parent 6e12e1e0f4
commit 38099501b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 62 additions and 15 deletions

View File

@ -1128,6 +1128,7 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION.
lv_finished = abap_true.
TRY.
zcl_abapgit_url=>validate( rs_popup-url ).
zcl_abapgit_repo_srv=>get_instance( )->validate_package( rs_popup-package ).
validate_folder_logic( rs_popup-folder_logic ).
@ -1276,7 +1277,9 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION.
lv_finished = abap_true.
TRY.
IF iv_freeze_url = abap_false.
zcl_abapgit_url=>validate( |{ lv_url }| ).
ENDIF.
IF iv_freeze_package = abap_false.
zcl_abapgit_repo_srv=>get_instance( )->validate_package( iv_package = lv_package
iv_ign_subpkg = lv_ign_subpkg ).

View File

@ -20,6 +20,7 @@ CLASS zcl_abapgit_url DEFINITION
CLASS-METHODS name
IMPORTING
!iv_url TYPE string
!iv_validate TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(rv_name) TYPE string
RAISING
@ -47,7 +48,7 @@ ENDCLASS.
CLASS zcl_abapgit_url IMPLEMENTATION.
CLASS ZCL_ABAPGIT_URL IMPLEMENTATION.
METHOD host.
@ -62,6 +63,7 @@ CLASS zcl_abapgit_url IMPLEMENTATION.
DATA: lv_path TYPE string.
TRY.
regex( EXPORTING iv_url = iv_url
IMPORTING ev_name = rv_name
ev_path = lv_path ).
@ -73,6 +75,14 @@ CLASS zcl_abapgit_url IMPLEMENTATION.
ENDIF.
ENDIF.
CATCH zcx_abapgit_exception.
IF iv_validate = abap_true.
zcx_abapgit_exception=>raise( 'Malformed URL' ).
ELSE.
rv_name = 'URL error (fix repo with "Advanced > Change Remote")'.
ENDIF.
ENDTRY.
ENDMETHOD.
@ -88,7 +98,7 @@ CLASS zcl_abapgit_url IMPLEMENTATION.
METHOD regex.
FIND REGEX '(.*://[^/]*)(.*/)([^\.]*)[\.git]?' IN iv_url
FIND REGEX '(https?://[^/]*)(.*/)([^\.]*)[\.git]?' IN iv_url
SUBMATCHES ev_host ev_path ev_name.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'Malformed URL' ).
@ -99,7 +109,8 @@ CLASS zcl_abapgit_url IMPLEMENTATION.
METHOD validate.
name( iv_url ).
name( iv_url = iv_url
iv_validate = abap_true ).
ENDMETHOD.
ENDCLASS.

View File

@ -9,7 +9,10 @@ CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
repo_name3 FOR TESTING RAISING zcx_abapgit_exception,
repo_name4 FOR TESTING RAISING zcx_abapgit_exception,
repo_name5 FOR TESTING RAISING zcx_abapgit_exception,
repo_error FOR TESTING.
repo_error FOR TESTING,
url_validate1 FOR TESTING,
url_validate2 FOR TESTING,
url_validate3 FOR TESTING.
ENDCLASS.
@ -98,4 +101,35 @@ CLASS ltcl_test IMPLEMENTATION.
ENDMETHOD.
METHOD url_validate1.
TRY.
zcl_abapgit_url=>validate( 'http://github.com/larshp/Foobar.git' ). "#EC NOTEXT
CATCH zcx_abapgit_exception. "#EC NO_HANDLER
cl_abap_unit_assert=>fail( ).
ENDTRY.
ENDMETHOD.
METHOD url_validate2.
TRY.
zcl_abapgit_url=>validate( 'https://github.com/larshp/Foobar.git' ). "#EC NOTEXT
CATCH zcx_abapgit_exception. "#EC NO_HANDLER
cl_abap_unit_assert=>fail( ).
ENDTRY.
ENDMETHOD.
METHOD url_validate3.
TRY.
zcl_abapgit_url=>validate( 'XYZ://github.com/larshp/Foobar.git' ). "#EC NOTEXT
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception. "#EC NO_HANDLER
ENDTRY.
ENDMETHOD.
ENDCLASS.

View File

@ -111,7 +111,6 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION.
METHOD get_name.
rv_name = zcl_abapgit_url=>name( ms_data-url ).
rv_name = super->get_name( ).
IF rv_name IS INITIAL.
rv_name = zcl_abapgit_url=>name( ms_data-url ).