anchor.diff:        EXPORTING
           iv_error_text = |Communication error: { lv_error_msg }| ##NO_TEXT.
     ENDMETHOD.
  +
  +  METHOD begin.
  +    IF mv_session_running = abap_true.
  +      RAISE EXCEPTION TYPE lcx_2fa_illegal_state.
  +    ENDIF.
  +
  +    mv_session_running = abap_true.
  +  ENDMETHOD.
  +
  +  METHOD end.
  +    IF mv_session_running = abap_false.
  +      RAISE EXCEPTION TYPE lcx_2fa_illegal_state.
  +    ENDIF.
  +
  +    mv_session_running = abap_false.
  +  ENDMETHOD.
  +
  +  METHOD is_session_running.
  +    rv_running = mv_session_running.
  +  ENDMETHOD.
   ENDCLASS.
   
   CLASS lcl_2fa_github_authenticator DEFINITION
  
positive.code:       supports_url FOR lif_2fa_authenticator~supports_url,
        get_service_id_from_url FOR lif_2fa_authenticator~get_service_id_from_url,
        is_2fa_required FOR lif_2fa_authenticator~is_2fa_required,
        delete_access_tokens FOR lif_2fa_authenticator~delete_access_tokens.
      METHODS:
        "! @parameter iv_supported_url_regex | Regular expression to check if a repository url is
        "!                                     supported, used for default implementation of
  
negative.code:           cv_password = lv_access_token.
          ENDIF.
  
          li_authenticator->end( ).
  
        CATCH lcx_2fa_error INTO lx_ex.
          TRY.
              li_authenticator->end( ).
            CATCH lcx_2fa_illegal_state ##NO_HANDLER.
          ENDTRY.
  
          RAISE EXCEPTION TYPE lcx_exception
            EXPORTING
              iv_text     = |2FA error: { lx_ex->get_text( ) }|
  