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

View File

@ -20,6 +20,7 @@ CLASS zcl_abapgit_url DEFINITION
CLASS-METHODS name CLASS-METHODS name
IMPORTING IMPORTING
!iv_url TYPE string !iv_url TYPE string
!iv_validate TYPE abap_bool DEFAULT abap_false
RETURNING RETURNING
VALUE(rv_name) TYPE string VALUE(rv_name) TYPE string
RAISING RAISING
@ -47,7 +48,7 @@ ENDCLASS.
CLASS zcl_abapgit_url IMPLEMENTATION. CLASS ZCL_ABAPGIT_URL IMPLEMENTATION.
METHOD host. METHOD host.
@ -62,6 +63,7 @@ CLASS zcl_abapgit_url IMPLEMENTATION.
DATA: lv_path TYPE string. DATA: lv_path TYPE string.
TRY.
regex( EXPORTING iv_url = iv_url regex( EXPORTING iv_url = iv_url
IMPORTING ev_name = rv_name IMPORTING ev_name = rv_name
ev_path = lv_path ). ev_path = lv_path ).
@ -73,6 +75,14 @@ CLASS zcl_abapgit_url IMPLEMENTATION.
ENDIF. ENDIF.
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. ENDMETHOD.
@ -88,7 +98,7 @@ CLASS zcl_abapgit_url IMPLEMENTATION.
METHOD regex. METHOD regex.
FIND REGEX '(.*://[^/]*)(.*/)([^\.]*)[\.git]?' IN iv_url FIND REGEX '(https?://[^/]*)(.*/)([^\.]*)[\.git]?' IN iv_url
SUBMATCHES ev_host ev_path ev_name. SUBMATCHES ev_host ev_path ev_name.
IF sy-subrc <> 0. IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'Malformed URL' ). zcx_abapgit_exception=>raise( 'Malformed URL' ).
@ -99,7 +109,8 @@ CLASS zcl_abapgit_url IMPLEMENTATION.
METHOD validate. METHOD validate.
name( iv_url ). name( iv_url = iv_url
iv_validate = abap_true ).
ENDMETHOD. ENDMETHOD.
ENDCLASS. 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_name3 FOR TESTING RAISING zcx_abapgit_exception,
repo_name4 FOR TESTING RAISING zcx_abapgit_exception, repo_name4 FOR TESTING RAISING zcx_abapgit_exception,
repo_name5 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. ENDCLASS.
@ -98,4 +101,35 @@ CLASS ltcl_test IMPLEMENTATION.
ENDMETHOD. 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. ENDCLASS.

View File

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