Net2/usr/src/contrib/isode/dsap/x500as/do.py

-- do.py - manually augmented DistributedOperations module

-- $Header: /f/osi/dsap/x500as/RCS/do.py,v 7.2 91/03/09 11:53:54 mrose Exp $
--
-- $Log:	do.py,v $
-- Revision 7.2  91/03/09  11:53:54  mrose
-- update
-- 
-- Revision 7.1  91/02/22  09:21:56  mrose
-- Interim 6.8
-- 
-- Revision 7.0  90/12/06  07:34:44  mrose
-- *** empty log message ***
-- 


--
--				  NOTICE
--
--    Acquisition, use, and distribution of this module and related
--    materials are subject to the restrictions of a license agreement.
--    Consult the Preface in the User's Manual for the full terms of
--    this agreement.
--
--


DO
	{
	joint-iso-ccitt
	ds(5)
	modules(1)
	distributedOperations(3)
	}

DEFINITIONS ::=

PREFIXES encode decode print

BEGIN

-- EXPORTS
--	ContinuationReference ,
--	OperationProgress ,
-- 	DSAReferralParm;

IMPORTS
	DistinguishedName ,
	Name ,
	RelativeDistinguishedName
		FROM IF
			{
			joint-iso-ccitt
			ds(5)
			modules(1)
			informationFramework(1)
			}

	AlgorithmIdentifier
		FROM AF
			{
			joint-iso-ccitt
			ds(5)
			modules(1)
			authenticationFramework(7)
			}

	ReadArgument ,
	ReadResult ,
	CompareArgument ,
	CompareResult ,
	AbandonArgument ,
	AbandonResult ,
	ListArgument ,
	ListResult ,
	SearchArgument ,
	SearchResult ,
	AddEntryArgument ,
	AddEntryResult ,
	RemoveEntryArgument ,
	RemoveEntryResult ,
	ModifyEntryArgument ,
	ModifyEntryResult ,
	ModifyRDNArgument ,
	ModifyRDNResult ,
	SecurityParameters
		FROM DAS
			{
			joint-iso-ccitt
			ds(5)
			modules(1)
			directoryAbstractService(2)
			};

ChainedReadArgument [[P struct ds_op_arg *]]
	::=
	%E{
		if ( ! parm->dca_choice )
				parm->dca_choice = 1;
	%}
	CHOICE <<dca_choice>>
	{
		ChainedReadArgumentData [[p *]] ,
		SEQUENCE [[T struct ds_op_arg * $ * ]]
		{
			ChainedReadArgumentData [[p *]] ,
			AlgorithmIdentifier [[p dca_alg]],
			BIT STRING [[ x dca_bit $ dca_len ]]
		}
	}

ChainedReadArgumentData [[P struct ds_op_arg *]]
	::=
	SET
	{
		ChainingArgument [[p &parm->dca_charg]] ,
		[0] ReadArgument [[p &parm->dca_dsarg.arg_rd]]
	}

ChainedReadResult [[P struct ds_op_res *]]
	::=
	%E{
		if ( ! parm->dcr_choice )
				parm->dcr_choice = 1;
	%}
	CHOICE <<dcr_choice>>
	{
		ChainedReadResultData [[p *]] ,
		SEQUENCE [[T struct ds_op_res * $ *]]
		{
			ChainedReadResultData [[p *]] ,
			AlgorithmIdentifier [[p dcr_alg]],
			BIT STRING [[ x dcr_bit $ dcr_len ]]
		}
	}

ChainedReadResultData [[P struct ds_op_res *]]
	::=
	SET
	{
		ChainingResult [[p &parm->dcr_chres]] ,
		[0] ReadResult [[p &parm->dcr_dsres.res_rd]]
	}

ChainedCompareArgument [[P struct ds_op_arg *]]
	::=
	%E{
		if ( ! parm->dca_choice )
				parm->dca_choice = 1;
	%}
	CHOICE <<dca_choice>>
	{
		ChainedCompareArgumentData [[p *]] ,
		SEQUENCE [[ T struct ds_op_arg * $ * ]]
		{
			ChainedCompareArgumentData [[p *]] ,
			AlgorithmIdentifier [[p dca_alg]],
			BIT STRING [[ x dca_bit $ dca_len ]]
		}
	}

ChainedCompareArgumentData [[P struct ds_op_arg *]]
	::=
	SET
	{
		ChainingArgument [[p &parm->dca_charg]] ,
		[0] CompareArgument [[p &parm->dca_dsarg.arg_cm]]
	}

ChainedCompareResult [[P struct ds_op_res *]]
	::=
	%E{
		if ( ! parm->dcr_choice )
				parm->dcr_choice = 1;
	%}
	CHOICE <<dcr_choice>>
	{
		ChainedCompareResultData [[p *]] ,
		SEQUENCE [[T struct ds_op_res * $ *]]
		{
			ChainedCompareResultData [[p *]] ,
			AlgorithmIdentifier [[p dcr_alg]],
			BIT STRING [[ x dcr_bit $ dcr_len ]]
		}
	}

ChainedCompareResultData [[P struct ds_op_res *]]
	::=
	SET
	{
		ChainingResult [[p &parm->dcr_chres]] ,
		[0] CompareResult [[p &parm->dcr_dsres.res_cm]]
	}

ChainedAbandonArgument [[P struct ds_op_arg *]]
	::=
	AbandonArgument [[p &parm->dca_dsarg.arg_ab]]

ChainedAbandonResult [[P struct ds_op_res *]]
	::=
	AbandonResult

ChainedListArgument [[P struct ds_op_arg *]]
	::=
	%E{
		if ( ! parm->dca_choice )
				parm->dca_choice = 1;
	%}
	CHOICE <<dca_choice>>
	{
		ChainedListArgumentData [[p *]] ,
		SEQUENCE [[ T struct ds_op_arg * $ * ]]
		{
			ChainedListArgumentData [[p *]] ,
			AlgorithmIdentifier [[p dca_alg]],
			BIT STRING [[ x dca_bit $ dca_len ]]
		}
	}

ChainedListArgumentData [[P struct ds_op_arg *]]
	::=
	SET
	{
		ChainingArgument [[p &parm->dca_charg]] ,
		[0] ListArgument [[p &parm->dca_dsarg.arg_ls]]
	}

ChainedListResult [[P struct ds_op_res *]]
	::=
	%E{
		if ( ! parm->dcr_choice )
				parm->dcr_choice = 1;
	%}
	CHOICE <<dcr_choice>>
	{
		ChainedListResultData [[p *]] ,
		SEQUENCE [[T struct ds_op_res * $ *]]
		{
			ChainedListResultData [[p *]] ,
			AlgorithmIdentifier [[p dcr_alg]],
			BIT STRING [[ x dcr_bit $ dcr_len ]]
		}
}


ChainedListResultData [[P struct ds_op_res *]]
	::=
	SET
	{
		ChainingResult [[p &parm->dcr_chres]] ,
		[0] ListResult [[p &parm->dcr_dsres.res_ls]]
	}

ChainedSearchArgument [[P struct ds_op_arg *]]
	::=
	%E{
		if ( ! parm->dca_choice )
				parm->dca_choice = 1;
	%}
	CHOICE <<dca_choice>>
	{
		ChainedSearchArgumentData [[p *]] ,
		SEQUENCE [[ T struct ds_op_arg * $ * ]]
		{
			ChainedSearchArgumentData [[p *]] ,
			AlgorithmIdentifier [[p dca_alg]],
			BIT STRING [[ x dca_bit $ dca_len ]]
		}
	}

ChainedSearchArgumentData [[P struct ds_op_arg *]]
	::=
	SET
	{
		ChainingArgument [[p &parm->dca_charg]] ,
		[0] SearchArgument [[p &parm->dca_dsarg.arg_sr]]
	}

ChainedSearchResult [[P struct ds_op_res *]]
	::=
	%E{
		if ( ! parm->dcr_choice )
				parm->dcr_choice = 1;
	%}
	CHOICE <<dcr_choice>>
	{
		ChainedSearchResultData [[p *]] ,
		SEQUENCE [[T struct ds_op_res * $ *]]
		{
			ChainedSearchResultData [[p *]] ,
			AlgorithmIdentifier [[p dcr_alg]],
			BIT STRING [[ x dcr_bit $ dcr_len ]]
		}
	}

ChainedSearchResultData [[P struct ds_op_res *]]
	::=
	SET
	{
		ChainingResult [[p &parm->dcr_chres]] ,
		[0] SearchResult [[p &parm->dcr_dsres.res_sr]]
	}

ChainedAddEntryArgument [[P struct ds_op_arg *]]
	::=
	%E{
		if ( ! parm->dca_choice )
				parm->dca_choice = 1;
	%}
	CHOICE <<dca_choice>>
	{
		ChainedAddEntryArgumentData [[p *]] ,
		SEQUENCE [[ T struct ds_op_arg * $ * ]]
		{
			ChainedAddEntryArgumentData [[p *]] ,
			AlgorithmIdentifier [[p dca_alg]],
			BIT STRING [[ x dca_bit $ dca_len ]]
		}
	}

ChainedAddEntryArgumentData [[P struct ds_op_arg *]]
	::=
	SET
	{
		ChainingArgument [[p &parm->dca_charg]] ,
		[0] AddEntryArgument [[p &parm->dca_dsarg.arg_ad]]
	}

ChainedAddEntryResult [[P struct ds_op_res *]]
	::=
	%E{
		if ( ! parm->dcr_choice )
				parm->dcr_choice = 1;
	%}	
	CHOICE <<dcr_choice>>
	{
		ChainedAddEntryResultData [[p *]] ,
		SEQUENCE [[T struct ds_op_res * $ *]]
		{
			ChainedAddEntryResultData [[p *]] ,
			AlgorithmIdentifier [[p dcr_alg]],
			BIT STRING [[ x dcr_bit $ dcr_len ]]
		}
	}

ChainedAddEntryResultData [[P struct ds_op_res *]]
	::=
	SET
	{
		ChainingResult [[p &parm->dcr_chres]] ,
		[0] AddEntryResult [[p dcr_choice]] -- never set for pespy !
	}

ChainedRemoveEntryArgument [[P struct ds_op_arg *]]
	::=
	%E{
		if ( ! parm->dca_choice )
				parm->dca_choice = 1;
	%}	
	CHOICE <<dca_choice>>
	{
		ChainedRemoveEntryArgumentData [[p *]] ,
		SEQUENCE [[ T struct ds_op_arg * $ * ]]
		{
			ChainedRemoveEntryArgumentData [[p *]] ,
			AlgorithmIdentifier [[p dca_alg]],
			BIT STRING [[ x dca_bit $ dca_len ]]
		}
	}

ChainedRemoveEntryArgumentData [[P struct ds_op_arg *]]
	::=
	SET
	{
		ChainingArgument [[p &parm->dca_charg]] ,
		[0] RemoveEntryArgument [[p &parm->dca_dsarg.arg_rm]]
	}

ChainedRemoveEntryResult [[P struct ds_op_res *]]
	::=
	%E{
		if ( ! parm->dcr_choice )
				parm->dcr_choice = 1;
	%}	
	CHOICE <<dcr_choice>>
	{
		ChainedRemoveEntryResultData [[p *]] ,
		SEQUENCE [[T struct ds_op_res * $ *]]
		{
			ChainedRemoveEntryResultData [[p *]] ,
			AlgorithmIdentifier [[p dcr_alg]],
			BIT STRING [[ x dcr_bit $ dcr_len ]]
		}
	}	

ChainedRemoveEntryResultData [[P struct ds_op_res *]]
	::=
	SET
	{
		ChainingResult [[p &parm->dcr_chres]] ,
		[0] RemoveEntryResult [[p dcr_choice]] -- never set for pespy !
	}

ChainedModifyEntryArgument [[P struct ds_op_arg *]]
	::=
	%E{
		if ( ! parm->dca_choice )
				parm->dca_choice = 1;
	%}
	CHOICE <<dca_choice>>
	{
		ChainedModifyEntryArgumentData [[p *]] ,
		SEQUENCE [[ T struct ds_op_arg * $ * ]]
		{
			ChainedModifyEntryArgumentData [[p *]] ,
			AlgorithmIdentifier [[p dca_alg]],
			BIT STRING [[ x dca_bit $ dca_len ]]
		}
	}

ChainedModifyEntryArgumentData [[P struct ds_op_arg *]]
	::=
	SET
	{
		ChainingArgument [[p &parm->dca_charg]] ,
		[0] ModifyEntryArgument [[p &parm->dca_dsarg.arg_me]]
	}

ChainedModifyEntryResult [[P struct ds_op_res *]]
	::=
	%E{
		if ( ! parm->dcr_choice )
				parm->dcr_choice = 1;
	%}
	CHOICE <<dcr_choice>>
	{
		ChainedModifyEntryResultData [[p *]] ,
		SEQUENCE [[T struct ds_op_res * $ *]]
		{
			ChainedModifyEntryResultData [[p *]] ,
			AlgorithmIdentifier [[p dcr_alg]],
			BIT STRING [[ x dcr_bit $ dcr_len ]]
		}
	}

ChainedModifyEntryResultData [[P struct ds_op_res *]]
	::=
	SET
	{
		ChainingResult [[p &parm->dcr_chres]] ,
		[0] ModifyEntryResult [[p dcr_choice]] -- never set for pespy !
	}

ChainedModifyRDNArgument [[P struct ds_op_arg *]]
	::=
	%E{
		if ( ! parm->dca_choice )
				parm->dca_choice = 1;
	%}
	CHOICE <<dca_choice>>
	{
		ChainedModifyRDNArgumentData [[p *]] ,
		SEQUENCE [[ T struct ds_op_arg * $ *]]
		{
			ChainedModifyRDNArgumentData [[p *]] ,
			AlgorithmIdentifier [[p dca_alg]],
			BIT STRING [[ x dca_bit $ dca_len ]]
		}
	}

ChainedModifyRDNArgumentData [[P struct ds_op_arg *]]
	::=
	SET
	{
		ChainingArgument [[p &parm->dca_charg]] ,
		[0] ModifyRDNArgument [[p &parm->dca_dsarg.arg_mr]]
	}

ChainedModifyRDNResult [[P struct ds_op_res *]]
	::=
	%E{
		if ( ! parm->dcr_choice )
				parm->dcr_choice = 1;
	%}
	CHOICE <<dcr_choice>>
	{
		ChainedModifyRDNResultData [[p *]] ,
		SEQUENCE [[T struct ds_op_res * $ *]]
		{
			ChainedModifyRDNResultData [[p *]] ,
			AlgorithmIdentifier [[p dcr_alg]],
			BIT STRING [[ x dcr_bit $ dcr_len ]]
		}
	}

ChainedModifyRDNResultData [[P struct ds_op_res *]]
	::=
	SET
	{
		ChainingResult [[p &parm->dcr_chres]] ,
		[0] ModifyRDNResult [[p dcr_choice]] -- never set for pespy !
	}

DSAReferralParm [[P struct DSE_referral *]]
	::=
	SET
	{
		[0] ContinuationReference [[p DSE_ref_candidates]] ,
	contextPrefix
		[1] DistinguishedName [[p DSE_ref_prefix]]
		    OPTIONAL
	}

ChainingArgument [[P struct chain_arg *]]
	::=
	SET
	{
	originator
		[0] DistinguishedName [[p cha_originator]]
		    OPTIONAL,
	targetObject
		[1] DistinguishedName [[p cha_target]]
		    OPTIONAL,
	operationProgress
		[2] OperationProgress [[p &parm->cha_progress]]
		    -- DEFAULT {notStarted} ,
		    OPTIONAL <D<0>>
			     <E<parm->cha_progress.op_resolution_phase > 1>>,
	traceInformation
		[3] TraceInformation [[p cha_trace]] ,
	aliasDereferenced
		[4] BOOLEAN [[b cha_aliasderef]]
		    DEFAULT FALSE ,
	aliasedRDNs
		[5] INTEGER [[i cha_aliasedrdns]]
		    OPTIONAL <D<0>>
			     <E<parm->cha_aliasedrdns != CR_NOALIASEDRDNS>>,
	entryOnly
		[11] BOOLEAN [[b cha_entryonly]]
		    DEFAULT FALSE ,
	returnCrossRefs
		[6] BOOLEAN [[b cha_returnrefs]]
		    DEFAULT FALSE ,
	referenceType
		[7] ReferenceType [[i cha_reftype]]
		    DEFAULT superior ,
	info
		[8] DomainInfo [[a cha_domaininfo]]
		    OPTIONAL,
	timeLimit
		[9] UTCTime [[s cha_timelimit]]
		    OPTIONAL,
		[10] SecurityParameters [[p cha_security]]
		    -- DEFAULT {}
		    OPTIONAL
	}

ChainingResult [[P struct chain_res *]]
	::=
	SET
	{
	info
		[0] DomainInfo [[a chr_domaininfo]]
		    OPTIONAL,
	crossReferences
		[1] SEQUENCE OF [[ T struct cross_ref * $ chr_crossrefs]] <<xref_next>>
			CrossReference [[p *]]
		    OPTIONAL,
		[2] SecurityParameters [[p chr_security]]
		    -- DEFAULT {}
		    OPTIONAL
	}

CrossReference [[P struct cross_ref *]]
	::=
	SET
	{
	contextPrefix
		[0] DistinguishedName [[p xref_dn]] ,
	accessPoint
		[1] AccessPoint [[p xref_ap]]
	}

-- This is pulled up as an 'i' type, so no parameters are needed.
ReferenceType
        ::=
        ENUMERATED
        {
        superior(1) ,
        subordinate(2) ,
        cross(3) ,
        nonSpecificSubordinate(4)
        }

TraceInformation [[P struct trace_info *]]
	::=
	SEQUENCE OF [[ T struct trace_info * $ *]] <<ti_next>>
		TraceItem [[p *]]

TraceItem [[P struct trace_info *]]
	::=
	SET
	{
	dsa
                [0] Name [[p ti_dsa]] ,
	targetObject
		[1] Name [[p ti_target]]
		    OPTIONAL,
	operationProgress
		[2] OperationProgress [[p &parm->ti_progress]]
	}

OperationProgress [[P struct op_progress *]]
	::=
        SET
        {
	%E{
		if (parm->op_resolution_phase < 0)
		   parm->op_resolution_phase = 1;
		else if (parm->op_resolution_phase > 3)
		   parm->op_resolution_phase = 3;
	%}
        nameResolutionPhase
                [0] ENUMERATED [[i op_resolution_phase]]
                {
                notStarted(1) ,
                proceeding(2) ,
                completed(3)
                },
        nextRDNToBeResolved
                [1] INTEGER [[i op_nextrdntoberesolved]]
		    OPTIONAL <D<0>>
			     <E< parm->op_nextrdntoberesolved != -1>>
        }

-- Pulled up
DomainInfo ::=	ANY

ContinuationReference [[P continuation_ref * ]]
        ::=
        SET
        {
	%D{
		(*parm)->cr_aliasedRDNs  = CR_RDNRESOLVED_NOTDEFINED;
		(*parm)->cr_rdn_resolved = CR_NOALIASEDRDNS;
		(*parm)->cr_reftype = RT_UNDEFINED;
	%}
        targetObject
                [0] Name [[p cr_name]],
        aliasedRDNs
                [1] INTEGER [[i cr_aliasedRDNs]]
                    OPTIONAL <E< parm->cr_aliasedRDNs != CR_NOALIASEDRDNS>> <D<0>>,
        operationProgress
                [2] OperationProgress [[p &parm->cr_progress]],
        rdnsResolved
                [3] INTEGER [[i cr_rdn_resolved]]
                    OPTIONAL <E< parm->cr_rdn_resolved != CR_RDNRESOLVED_NOTDEFINED>> <D<0>>,
        referenceType
                [4] ReferenceType [[i cr_reftype]]
                    OPTIONAL <E< parm->cr_reftype != RT_UNDEFINED>> <D<0>>,
        accessPoints
                [5] SET OF [[ T struct  access_point * $ cr_accesspoints]] <<ap_next>>
                        AccessPoint [[p *]]
        }

AccessPoint [[P struct access_point *]]
        ::=
        SET
        {
                [0] Name [[p ap_name]],
                [1] ISODEPresentationAddress [[p ap_address ]]
				[[E enc_ipa ]][[D dec_ipa ]]
				
        }

-- Quipu Access point.  Should be in qu.py but easier to put it here.
-- Same as above Access Point, but PresentationAddress is optional.
QAccessPoint [[P struct access_point *]]
        ::=
        SET
        {
                [0] Name [[p ap_name]],
                [1] ISODEPresentationAddress [[p ap_address ]]
				[[E enc_ipa ]][[D dec_ipa]]
		    OPTIONAL <E<parm->ap_address != NULLPA>><D<0>>
        }

-- Pulled up
ISODEPresentationAddress ::= ANY -- DSE.PSAPaddr 

-- Pulled up
InvokeID ::= INTEGER

END

%{

enc_ipa (parm,ppe)
struct access_point *parm;
PE *ppe;
{
	return build_DSE_PSAPaddr (ppe, 0, 0, NULLCP, (char *)parm->ap_address);
}

dec_ipa (parm,pe)
struct access_point ** parm;
PE pe;
{
struct PSAPaddr *psap;
int res;

	psap = (struct PSAPaddr *) smalloc (sizeof *psap);

	if ((res = parse_DSE_PSAPaddr (pe, 0, NULLIP, NULLVP, psap)) == NOTOK) {
	   free ((char *) psap);
	   return res;
	}

	(*parm)->ap_address = psap;
	return res;
}

%}