Copy password from a mandant to another

z_pwd_swap_type_h.abap
REPORT z_pwd_swap_type_h.
 
DATA: ls_usr02_source TYPE usr02,
      ls_usr02_target TYPE usr02,
      ls_usr02_temp   TYPE usr02,
      lv_pwdhash_temp TYPE usr02-pwdsaltedhash.
 
PARAMETERS: p_user    TYPE usr02-bname OBLIGATORY,
            p_clnt1   TYPE sy-mandt OBLIGATORY,
            p_clnt2   TYPE sy-mandt OBLIGATORY,
            p_execu TYPE c LENGTH 1 DEFAULT space.
 
START-OF-SELECTION.
  " Contrôle des autorisations
  AUTHORITY-CHECK OBJECT 'S_USER_GRP'
    ID 'CLASS' FIELD '*'
    ID 'ACTVT' FIELD '02'.
  IF sy-subrc NE 0.
    MESSAGE 'Autorisation insuffisante pour modification utilisateur' TYPE 'E'.
    EXIT.
  ENDIF.
 
  " Lecture des données utilisateur avec type H uniquement
  SELECT SINGLE * FROM usr02 CLIENT SPECIFIED
    INTO ls_usr02_source
    WHERE bname = p_user AND mandt = p_clnt1.
 
  SELECT SINGLE * FROM usr02 CLIENT SPECIFIED
    INTO ls_usr02_target
    WHERE bname = p_user AND mandt = p_clnt2.
 
  " Vérification existence et type de hachage
  IF ls_usr02_source IS INITIAL.
    WRITE: / 'Utilisateur', p_user, 'non trouvé dans mandant', p_clnt1.
    EXIT.
  ENDIF.
 
  IF ls_usr02_target IS INITIAL.
    WRITE: / 'Utilisateur', p_user, 'non trouvé dans mandant', p_clnt2.
    EXIT.
  ENDIF.
 
  " Vérification type de hachage H (iSSHA-1)
  IF ls_usr02_source-codvn NE 'H'.
    WRITE: / 'ERREUR: Utilisateur mandant', p_clnt1, 'ne possède pas de mot de passe type H (iSSHA-1)'.
    WRITE: / 'Type actuel:', ls_usr02_source-codvn.
    EXIT.
  ENDIF.
 
  IF ls_usr02_target-codvn NE 'H'.
    WRITE: / 'ERREUR: Utilisateur mandant', p_clnt2, 'ne possède pas de mot de passe type H (iSSHA-1)'.
    WRITE: / 'Type actuel:', ls_usr02_target-codvn.
    EXIT.
  ENDIF.
 
  " Vérification présence PWDSALTEDHASH
  IF ls_usr02_source-pwdsaltedhash IS INITIAL.
    WRITE: / 'ERREUR: PWDSALTEDHASH vide pour mandant', p_clnt1.
    EXIT.
  ENDIF.
 
  IF ls_usr02_target-pwdsaltedhash IS INITIAL.
    WRITE: / 'ERREUR: PWDSALTEDHASH vide pour mandant', p_clnt2.
    EXIT.
  ENDIF.
 
  " Exécution de l'échange
  IF p_execu = 'X'.
    " Sauvegarde mot de passe type H mandant 1
    lv_pwdhash_temp = ls_usr02_source-pwdsaltedhash.
 
    " Échange mandant 1 <- mandant 2 (type H)
    ls_usr02_temp = ls_usr02_source.
    ls_usr02_temp-pwdsaltedhash = ls_usr02_target-pwdsaltedhash.
    ls_usr02_temp-codvn = 'H'.
    ls_usr02_temp-uflag = '0'.
    MODIFY usr02 CLIENT SPECIFIED FROM ls_usr02_temp.
    WRITE: / 'Transfert mot de passe type H', p_clnt2, '->', p_clnt1, ':', sy-subrc.
 
    " Échange mandant 2 <- mandant 1 (sauvegarde type H)
    ls_usr02_temp = ls_usr02_target.
    ls_usr02_temp-pwdsaltedhash = lv_pwdhash_temp.
    ls_usr02_temp-codvn = 'H'.
    ls_usr02_temp-uflag = '0'.
    MODIFY usr02 CLIENT SPECIFIED FROM ls_usr02_temp.
   " WRITE: / 'Transfert mot de passe type H', p_clnt1, '->', p_clnt2, ':', sy-subrc."
 
    COMMIT WORK.
    WRITE: / 'Échange des mots de passe type H (iSSHA-1) terminé avec succès'.
  ELSE.
    WRITE: / 'Mode simulation activé - Aucune modification effectuée'.
    WRITE: / 'Utilisateur', p_user, 'trouvé avec type H dans les deux mandants'.
    WRITE: / 'Mandant source:', p_clnt1, '- Type:', ls_usr02_source-codvn, '- Hash:', ls_usr02_source-pwdsaltedhash(20), '...'.
    WRITE: / 'Mandant cible:', p_clnt2, '- Type:', ls_usr02_target-codvn, '- Hash:', ls_usr02_target-pwdsaltedhash(20), '...'.
  ENDIF.