Monday, 22 April 2019

Step By Step Process To Unlocking The Users Password Using Gateway Service(OData) When ever it is locked

In this blog I want to explain about how to unlock the users password when it is locked using OData and Resetting the users password by giving temporary password which is been sending through mail.

Step 1. Go to t-code SEGW to create service.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 2. Create an entity type by giving the name as user details.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 3. Now provide the properties.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material


Step 4. Now get entity set is automatically created.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 5. Now we have to implement the code by redefining the methods get entity in DPC_EXT class.

Now right click on get entity and Choose Redefine.

In our scenario we have redefined get_entity and update_entity methods as shown below.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 6. And we have to write the code in the Re-defined method .

Based on the login user to get the user details using get entity method.

method USERDETAILSSET_GET_ENTITY.

 DATA: is_key_tab TYPE /IWBEP/s_MGW_NAME_VALUE_PAIR.

 READ TABLE it_key_tab INTO is_key_tab INDEX 1.
 DATA(lv) = is_key_tab-value.

TRANSLATE lv TO UPPER CASE.
 SELECT SINGLE  Bname
        Langu
        FROM usr01 INTO CORRESPONDING FIELDS OF ER_ENTITY WHERE Bname = lv."is_key_tab-VALUE.

  endmethod.

Step 7. After getting the user details we have to update the user password using update entity.

METHOD userdetailsset_update_entity.

    DATA:is_update TYPE zcl_zuser_unlock_mpc=>ts_userdetails.
    io_data_provider->read_entry_data( IMPORTING es_data = is_update ).

    DATA(lv_user) = is_update-bname.
    DATA:logondata TYPE uslogond.
    DATA(repid) = sy-repid.
    DATA(reptitle) = sy-title.

    CALL FUNCTION 'SUSR_USER_LOGONDATA_GET'
      EXPORTING
        user_name           = lv_user
      IMPORTING
        user_logondata      = logondata
      EXCEPTIONS
        user_name_not_exist = 1
        OTHERS              = 2.
  
Step 8. Logic to generate a random password

 DATA: lv_password(8),
     lv_newpassword TYPE xu400-newcode.

    DATA:lc_alphanum TYPE c.
    CALL FUNCTION 'RSEC_GENERATE_PASSWORD'
      EXPORTING
        alphabet      = lc_alphanum
        output_length = 8
      IMPORTING
        output        = lv_password
      EXCEPTIONS
        some_error    = 1
        OTHERS        = 2.

Step 9. Now we have to assign a password to the user .

 IF lv_password IS NOT INITIAL.
** If no number in password, insert a number to meet security policy
      IF lv_password NA '123456789'.
        lv_password+7(1) = '5'.
      ENDIF.
      lv_newpassword = lv_password.
      CALL FUNCTION 'SUSR_USER_PASSWORD_PUT'
        EXPORTING
          user_name            = lv_user
          password             = lv_newpassword
        EXCEPTIONS
          user_name_not_exist  = 1
          password_not_allowed = 2
          OTHERS               = 3.

      IF sy-subrc = 0.

        CALL FUNCTION 'SUSR_USER_BUFFERS_TO_DB'
          EXPORTING
            message_out               = 'X'  " note 173081
          EXCEPTIONS
            no_logondata_for_new_user = 1
            no_init_password          = 2
            db_insert_usr02_failed    = 3
            db_update_usr02_failed    = 4
            db_insert_usr01_failed    = 5
            db_update_usr01_failed    = 6
            db_insert_usr05_failed    = 7
            db_update_usr05_failed    = 8
            db_insert_usr21_failed    = 9
            db_update_usr21_failed    = 10.

         IF sy-subrc <> 0.

         ENDIF.

         MESSAGE 'Generated password has been copied to clipboard!' TYPE 'S'.

         COMMIT WORK.

         DATA:wa_address TYPE bapiaddr3,
              it_returns TYPE bapiret2_t,
               it_email      TYPE STANDARD TABLE OF bapiadsmtp,
                lo_container TYPE REF TO /iwbep/if_message_container.
         CALL FUNCTION 'BAPI_USER_GET_DETAIL'
          EXPORTING
            username = lv_user
*           CACHE_RESULTS        = 'X'
          IMPORTING
            address  = wa_address
          TABLES
            addsmtp  = it_email
            return   = it_returns.

        IF it_email IS NOT INITIAL.

          READ TABLE it_email ASSIGNING FIELD-SYMBOL(<fs_email>) INDEX 1.
          DATA(v_email) = <fs_email>-e_mail.
        ENDIF.

        DATA: wa_docdata  TYPE sodocchgi1,
              wa_objpack  TYPE sopcklsti1,
              it_objpack  TYPE TABLE OF sopcklsti1,
              wa_objtxt   TYPE solisti1,
              it_objtxt   TYPE TABLE OF solisti1,
              wa_reclist  TYPE somlreci1,
              it_reclist  TYPE TABLE OF somlreci1,
              it_lines    TYPE TABLE OF tline,
              lv_link(35) TYPE  c VALUE 'www.thesummitgroup.net',
              tab_lines   TYPE i,
              ls_returns  TYPE bapiret2.

        DATA: lt_tvarcv_config TYPE TABLE OF tvarvc,
              ls_tvarcv_config TYPE tvarvc,
              lv_launchpad_url TYPE string,
              lv_supinfo_url   TYPE string.



        CONSTANTS: c_htm   TYPE char3  VALUE 'HTM',
                   c_u     TYPE c      VALUE 'U',
                   c_x     TYPE c      VALUE 'X',
                   c_space TYPE c      VALUE ' ',
                   c_e     TYPE c      VALUE 'E',
                   c_pw    TYPE char5  VALUE '{PWD}'.


          IF sy-subrc = 0.

          CALL FUNCTION 'READ_TEXT'
            EXPORTING
              client                  = sy-mandt
              id                      = 'ST'
              language                = sy-langu
              name                    = 'ZSRM_PWD_UNLOCK'
              object                  = 'TEXT'
            TABLES
              lines                   = it_lines
            EXCEPTIONS
              id                      = 1
              language                = 2
              name                    = 3
              not_found               = 4
              object                  = 5
              reference_check         = 6
              wrong_access_to_archive = 7
              OTHERS                  = 8.
          IF sy-subrc <> 0.

          ENDIF.

          LOOP AT it_lines INTO DATA(wa_lines).
            APPEND wa_lines-tdline TO it_objtxt.
          ENDLOOP.

          REPLACE ALL OCCURRENCES OF c_pw IN TABLE
          it_objtxt WITH lv_newpassword IN CHARACTER MODE.

          DESCRIBE TABLE it_objtxt LINES tab_lines.
          READ TABLE it_objtxt INTO wa_objtxt INDEX tab_lines.
          wa_docdata-obj_name = text-020.  "'TEST_HTML'.
          wa_docdata-obj_descr = text-031.  "'HISD - Password has been reset and your new password'.
          wa_docdata-doc_size = ( tab_lines - 1 ) * 255 + strlen( wa_objtxt ).

          CLEAR wa_objpack-transf_bin.
          wa_objpack-head_start = 1.
          wa_objpack-head_num = 0.
          wa_objpack-body_start = 1.
          wa_objpack-body_num = tab_lines.
          wa_objpack-doc_type = c_htm.
          APPEND wa_objpack TO it_objpack.

          wa_reclist-receiver = v_email .
          wa_reclist-rec_type = c_u.
          APPEND wa_reclist TO it_reclist.

Step 10. Logic to send an email to user with new password.

CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
             EXPORTING
              document_data              = wa_docdata
              put_in_outbox              = c_space
              commit_work                = c_x
            TABLES
              packing_list               = it_objpack
              contents_txt               = it_objtxt
              receivers                  = it_reclist
            EXCEPTIONS
              too_many_receivers         = 1
              document_not_sent          = 2
              document_type_not_exist    = 3
              operation_no_authorization = 4
              parameter_error            = 5
              x_error                    = 6
              enqueue_error              = 7
              OTHERS                     = 8.
          IF sy-subrc <> 0.
            CALL FUNCTION 'BAPI_MESSAGE_GETDETAIL'
              EXPORTING
                id         = sy-msgid
                number     = sy-msgno
                textformat = c_htm
                message_v1 = sy-msgv1
                message_v2 = sy-msgv2
                message_v3 = sy-msgv3
                message_v4 = sy-msgv4
              IMPORTING
                message    = ls_returns-message.
            IF ls_returns-message IS INITIAL.
              ls_returns-message = text-022.  "'Failed to Send an Email to Supplier'.
            ENDIF.

          ENDIF.

        ENDIF.
      ENDIF.
    ELSE.
      lo_container = me->mo_context->get_message_container( ).
      CALL METHOD lo_container->add_message_text_only
        EXPORTING
          iv_msg_type               = /iwbep/if_message_container=>gcs_message_type-error
          iv_msg_text               = 'Order Number not Valid! Do you require pass through codes to get out of line?'
          iv_error_category         = /iwbep/if_message_container=>gcs_error_category-processing
          iv_is_leading_message     = abap_true
          iv_add_to_response_header = abap_true.
    ENDIF.

  ENDMETHOD.

Step 11. we have successfully  done with coding part, now we have to execute the service.

Step 12. Go to the t-code /n/IWFND/MAINT_SERVICE and click on enter.

Step 13. Now enter your project name and click on enter .

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 14. Now we have to load the metadata by pressing the load metadata button and click on sap gateway client.

Step 15. It will navigate to execution phase of Request Uri.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 16. Now double click on Entity sets button and it will give pop-up like as shown below.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 17. Double click on the entity set name and the service url is as shown below.

specify the particular user to reset the password in the url as shown below.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 18. Now click on Execute button the output can be displayed as shown below.

And click on Use as request the data is displayed in left side and choose radio button as put.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Simply execute status will be 204.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 19. Now the temporary password is been sent to the mail .

Go to SOST t-code there we can check the temporary password as shown below.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 20. Choose the send status and click on display button then the following screen we can see.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 21. Now user can copy this password and Re-Login using SAP GUI as shown below.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

Step 22. Now user can create new password as shown below.

SAP ABAP Tutorial and Material, SAP ABAP Guides, SAP ABAP Learning, SAP ABAP Study Material

No comments:

Post a Comment