
|
// A partir d'un exemple trouvé sur le NET // http://forums.iprodeveloper.com/forums/aft/147271 // adapté aux spécificités VOLUBIS H DFTACTGRP(*NO) ACTGRp(*caller) *--------------------------------------------------------------------- * - CRTRPGMOD MODULE(QTEMP/*CTLSPEC) SRCMBR(EIM01) * - CRTPGM PGM(EIM01) MODULE(QTEMP/EIM01) BNDSRVPGM((QSYEIM)) * ACTGRP(*CALLER) AUT(*EXCLUDE) USRPRF(*OWNER) *--------------------------------------------------------------------- * This Program create an EIM Identifier and Association in EIM * It Receive parameters : the User (10a) and an Action (3a) * The Action can be 'CRT', 'CHG' or 'DLT' * 'ADD' & 'CHG' have the same behaviour. *--------------------------------------------------------------------- *--------------------------------------------------------------------- * Header File Name: eim.h * Enterprise Identity Mapping (EIM) APIs *--------------------------------------------------------------------- *Description: * * Defines prototypes, macros, variables, and * structures to be used with the EIM APIs. * *------------ * EIMHandle *------------ DEIMANDLE DS * EIMHandle D EIMANDLE00 1 16 * handle *--------------------------------------------* *eimErr2String -- errrc to string message *--------------------------------------------* deimErr2String pr * extproc('eimErr2String') d rtcdds like(eimrc) *--------------------------------------------* * Variables for eimErr2String *--------------------------------------------* d errMsg£ s * d errMsg ds 256 based(errMsg£) d RtnMsg s 256 *-------------------------- |
* Eim Connect Information *-------------------------- DEIMSCI DS * EimSimpleConnectInfo D EIMOTECT 1 4B 0 * protect D EIMBD 17 32* * bindDn D EIMBP 33 48* * bindPw DEIMCI DS * EimConnectInfo D EIMTYPE 1 4B 0 * type D EIMERVED00 5 16 * Reserved D EIMCREDS 17 64 * CREDS * GSS-CRED-ID-T-EIM-R REDEFINES CREDS D EIMGCI 17 32* * gss cred id t * SIMPLECREDS REDEFINES CREDS D EIMOTECT00 17 20B 0 * protect D EIMBD00 33 48* * bindDn D EIMBP00 49 64* * bindPw D EIMSSL 65 80* * ssl *---------------------- *Return code structure *---------------------- DEIMRC DS * EimRC D EIMMPBC 1 4U 0 * Input: Size of the entire RC * structure. This is filled in by * the caller. This is used to tell * the API how much space was provided * for substitution text D EIMMRTRD 5 8U 0 * Output: Filled in by API |
* to tell caller how much data could * have been returned. Caller can then * determine if the caller provided * enough space (i.e. if the entire * substitution string was able to be * copied to this structure. D EIMRC00 9 12B 0 * Same as the errno returned as the * rc for the API D EIMMCSN 13 16B 0 * Message catalog set number D EIMMCMID 17 20B 0 * Message catalog message id D EIMLE 21 24B 0 * ldap error, if available D EIMSE 25 28B 0 * SLL error, if available D EIMERVED01 29 44 * Reserved for future use D EIMSTL 45 48U 0 * Length of substitution text * excluding a null-terminator which * may or may not be present D EIMST 49 49 * further info describing the * error. D*-------------------------------------------------------------------- D*EimIdentifierInfo D*-------------------------------------------------------------------- D EIMUSER s 11 DEIMII00 DS D* EimIdentifierInfo D EIMID 1 16 D* ID D* UNIQUENAME-EIM-R REDEFINES ID-FIELD D EIMUN 1 16* D* uniqueName D* ENTRYUUID-EIM-R REDEFINES ID-FIELD D EIMEUUID 1 16* D* entryUUID D* NAME-EIM-R REDEFINES ID-FIELD D EIMNAME 1 16* D* name D EIMDTYPE 17 20B 0 |
D* idtype
*--------------------------------------------*
* Varibles for EIM Handles (create & destroy)
*--------------------------------------------*
d handle s like(eimandle)
**
d rtcd s like(EIMMPBC)
d null c x'00'
d pwdl s 10
* EimConnect
d BindDn s 80
d BindPw s 80
*--------------------------------------------*
*eimCreateHandle -- create eim handle
*--------------------------------------------*
deimCreateHandle pr 10U 0 extproc('eimCreateHandle')
d handle like(eimandle)
d * value
d rtcdds like(eimrc)
*--------------------------------------------*
*eimDestHandle -- destroy handle and connection
*--------------------------------------------*
deimDestHandle pr 10U 0 extproc('eimDestroyHandle')
d handle like(eimandle)
d rtcdds like(eimrc)
*--------------------------------------------*
*eimConnect -- connect to eim directory
*--------------------------------------------*
deimConnect pr 10U 0 extproc('eimConnect')
d handle like(eimandle)
d conInfo like(eimci) value
d rtcdds like(eimrc)
*--------------------------------------------*
*eimAddIdentifier - Add new user
*--------------------------------------------*
* Variables for the API
d EIM_FAIL c 0
*
d eimRemoveIdentifier...
d pr 10U 0 extproc('eimRemoveIdentifier')
d Handle like(eimandle)
d Identifier * value
|
d rtcdds like(eimrc)
*
d eimAddIdentifier...
d pr 10U 0 extproc('eimAddIdentifier')
d Handle like(eimandle)
d Identifier * value
d Action 4b 0 value
d * value
d * value
d Description * value
d rtcdds like(eimrc)
*--------------------------------------------*
*eimAddAssociation - Add Eim Association
*--------------------------------------------*
* Variables for the API
d EIM_TARGET c 1
d EIM_SOURCE c 2
d EIM_SOURCE_AND_TARGET...
d c 3
d EIM_ADMIN c 4
d EIM_ENTRY_UUID c 2
*
d Domain s 80 Varying
d Source s 80
d Target s 80
d eimAddAssociation...
d pr 10U 0 extproc('eimAddAssociation')
d Handle like(eimandle)
d Action 4b 0 value
d Identifier * value
d RegName * value
d RegUserName * value
d rtcdds like(eimrc)
*---------------------------------------------------------------------
* Api for the RTVNETA to get back the SYSTEM NAME
*---------------------------------------------------------------------
D SystemName PR 8A
*---------------------------------------------------------------------
* Api for get user profile informations
*---------------------------------------------------------------------
D GetUserInfo PR ExtPgm('QSYRUSRI')
d 32767a Options(*VarSize)
d 10I 0
d 8A
|
d 10A
d 256A
* User Profile Information data structure
d UsrInfo DS
d ByteRtrn 10I 0 inz
d ByteAvail 10I 0 inz
d UserName 50A overlay(UsrInfo:199)
* Misc variables
D wsize S 10I 0 Inz(%size(UsrInfo))
D FormatName S 8A Inz('USRI0300')
D ldapurl S 256A
* Error data structure
d dsError DS 256
d ErrSize 10I 0 inz(116)
d overlay(dsError:1)
d ErrBytes 10I 0 inz(0)
d overlay(dsError:5)
d ErrMsgID 7A
d overlay(dsError:9)
d Err 1A
d overlay(dsError:16)
d ErrMsgTxt 100A
d overlay(dsError:17)
*---------------------------------------------------------------------
* Entry Point
*---------------------------------------------------------------------
c *entry plist
c parm User 10
c parm Action 3
c parm ppwd 10
*
* Action : CRT, CHG, DLT.
*
*---------------------------------------------------------------------
* Main Program
*---------------------------------------------------------------------
/free
If not(%subst(User :1 :1) = 'Q');
BindDn = 'cn=administrateur' + null ;
if %parms() < 3;
dsply 'mot de passe ?' 'QSYSOPR' pwd;
|
else; pwd = ppwd; ENDIF; BindPw = %trim(pwd) + null ; Domain = 'VOLUBIS.INTRA'; Source = 'DOMAINENT' + '.' + Domain + null; Target = %trim(SystemName()) + '.' + Domain + null; // ------------------------- // - Create Handle for EIM - // ------------------------- eimmpbc = 256; rtcd = eimCreateHandle(handle:*NULL:eimrc); ou ldapurl = 'ldap://as400.volubis.intra:389/ibm-eimDomainName=VOLUBIS+ ,dc=as400,dc=volubis,dc=fr' + null; rtcd=eimCreateHandle(handle:%addr(ldapurl):eimrc); // ------------------ // - Connect to EIM - // ------------------ // It is not good practice to store unencrypted user names // and passwords in programs. It is reccomended that you // some other method. eimtype = *zero ; eimotect00 = *zero ; eimotect = *zero ; eimbd00 = %addr(BindDn) ; eimbp00 = %addr(BindPw) ; rtcd = eimConnect(handle:eimci:eimrc); Exsr RtvErr; EimUser = %trim(User) + null; EIMUN = %addr(EimUser); EIMDTYPE = EIM_ENTRY_UUID; //-------------------------------------------- // Remove EIM Identifier //-------------------------------------------- |
rtcd = eimRemoveIdentifier(handle :%addr(EIMII00) : eimrc); Exsr RtvErr; If not (Action = 'DLT'); //-------------------------------------------- // Retreive the User Profile Text Description //-------------------------------------------- GetUserInfo(UsrInfo:wSize:FormatName:User:dsError); UserName = %trim(Username) + null; //-------------------------------------------- // Add EIM Identifier //-------------------------------------------- rtcd = eimAddIdentifier(handle: EIMUN :EIM_FAIL : *null : *null : %addr(UserName) : eimrc); Exsr RtvErr; //-------------------------------------------- // Add Association *SOURCE //-------------------------------------------- rtcd = eimAddAssociation(handle: EIM_SOURCE :%addr(EIMII00) :%addr(Source) : EIMUN : eimrc); Exsr RtvErr; //-------------------------------------------- // Add Association *TARGET //-------------------------------------------- rtcd = eimAddAssociation(handle: EIM_TARGET :%addr(EIMII00) :%addr(Target) : EIMUN : eimrc); Exsr RtvErr; Endif; //-------------------------------------------- // Detroy Handle //-------------------------------------------- rtcd = eimDestHandle(handle:eimrc); |
Endif;
*inlr = *on;
//*--------------------------------------------*
//* Retrieve Error (for debug)
//*--------------------------------------------*
Begsr RtvErr;
errMsg£ = eimErr2String(eimrc);
RtnMsg = %str(errMsg£:%size(errMsg));
Endsr;
/end-free
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* Retrieve System Name procedure: SystemName()
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
P SystemName B
D SystemName PI 8A
D QWCRNETA PR ExtPgm('QWCRNETA')
D RcvVar 32766A OPTIONS(*VARSIZE)
D RcvVarLen 10I 0 const
D NbrNetAtr 10I 0 const
D AttrNames 10A const
D ErrorCode 256A
D* Receiver variable for QWCRNETA with only one attribute
D RV ds
D* Number of Attrs returned
D RV_Attrs 10I 0
D* Offset to first attribute
D RV_Offset 10I 0
D* Add'l data returned.
D RV_Data 1A DIM(1000)
D* Network attribute structure
D p_NA S *
D NA ds based(p_NA)
D* Attribute Name
D NA_Attr 10A
D* Type of Data. C=Char, B=Binary
D NA_Type 1A
D* Status. L=Locked, Blank=Normal
D NA_Status 1A
D* Length of Data
D NA_Length 10I 0
|
D* Actual Data (in character) D NA_DataChr 1000A D* Actual Data (in binary) D NA_DataInt 10I 0 overlay(NA_DataChr:1) /free |