Notes
view release on metacpan or search on metacpan
AclEntry/AclEntry.xs view on Meta::CPAN
int ln_sp_i;
char * acl_entry_name;
LN_Acl * a;
/* we avoid using SPAGAIN instead, */
/* because it adjusts the _global_ stack_sp */
SP = ( (LN_Acl_EnumEntry*)ln_e )->sp;
ln_sp_i = ( (LN_Acl_EnumEntry*)ln_e )->items;
/* parent obj for creation of new obj below */
a = ( (LN_Acl_EnumEntry*)ln_e )->obj;
/* note: Notes C API docs says nothing about */
/* memory management for acl_entry_name;*/
/* perl computes length and each string gets */
/* _copied_ in a new SV on the perl stack */
Newz( 1, acl_entry_name, strlen(ln_enum_entry_name) + 1, char );
ln_stat = (acl_entry_name != (char *) NULL) ? LN_OK : LN_NOT_OK;
if ( LN_IS_OK ) {
strcpy( acl_entry_name, ln_enum_entry_name);
LN_PUSH_NEW_O( "Notes::AclEntry", a );
LN_SET_H( ln_o ) = (long) acl_entry_name;
LN_SET_OK( ln_o );
ln_sp_i += 1;
ln_stat = LN_OK;
} else {
((LN_Acl_EnumEntry* )ln_e)->stat = ln_stat;
}
/* we avoid using PUTBACK instead, */
/* because it adjusts the _global_ stack_sp */
( (LN_Acl_EnumEntry* )ln_e)->sp = SP;
( (LN_Acl_EnumEntry* )ln_e)->items = ln_sp_i;
return;
}
MODULE = Notes::AclEntry PACKAGE = Notes::Acl
PROTOTYPES: DISABLE
void
entries_by_name( a, ... )
LN_Acl * a;
PREINIT:
d_LN_XSVARS;
LN_Acl_Impl* a_impl;
HANDLE a_h;
int i;
int sp_i;
LN_Acl_EnumEntry ae;
char * ae_name;
ALIAS:
entries = 0
entries_by_name = 1
PPCODE:
if ( items == 1 ) { XSRETURN( 0 ); }
a_impl = (LN_Acl_Impl*) LN_H(a);
a_h = a_impl->h;
for ( LN_SET_OK(a), i = 1, sp_i = 0; i < items; i++ ) {
ln_stat = DNCanonicalize(
0L,
NULL,
SvPV( ST(i), na ),
ae.name,
MAXUSERNAME,
NULL
); /* skip, if error in DNCanon */
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
ae.found = LN_NOT_OK;
ae.stat = LN_OK;
ln_stat = ACLEnumEntries(
a_h,
&XS_Notes__AclEntry_enum_has_entryname,
&ae
); /* skip, if error in ACLEnum */
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
ln_stat = ae.found; /* skip, if name not found */
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
ln_stat = ae.stat; /* skip, if multiply found */
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
/* name found once, so try to create new Notes::ACLEntry */
Newz( 1, ae_name, strlen(ae.name) + 1, char );
ln_stat = (ae_name != (char*) NULL) ? LN_OK : LN_NOT_OK;
/* skip, if malloc problem */
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
strcpy( ae_name, ae.name );
LN_PUSH_NEW_O( "Notes::AclEntry", a );
LN_SET_H( ln_o ) = (long) ae_name;
LN_SET_OK( ln_o );
sp_i += 1;
ln_stat = LN_OK;
} /* end for i < items */
XSRETURN( sp_i );
void
all_entryobjects( a )
LN_Acl * a;
PREINIT:
d_LN_XSVARS;
LN_Acl_Impl* a_impl;
HANDLE a_h;
int sp_i;
LN_Acl_EnumEntry ae;
ALIAS:
all_entries = 0
all_entryobjects = 1
PPCODE:
a_impl = (LN_Acl_Impl*) LN_H(a);
a_h = a_impl->h;
sp_i = 0;
ln_stat = LN_OK;
ae.sp = SP; /* we avoid using PUTBACK instead, */
ae.items= sp_i; /* cause it adjusts _global_ stack ptr*/
ae.stat = ln_stat;
ae.obj = a;
LN_STAT(a) = ACLEnumEntries(
a_h,
&XS_Notes__AclEntry_enum_xpush_all_entryobjects,
&ae
);
SP = ae.sp; /* we avoid using SPAGAIN instead, */
sp_i = ae.items;/* cause it adjusts _global_ stack ptr*/
ln_stat = ae.stat;
if ( LN_IS_NOT_OK ) { LN_STAT(a) = ln_stat; }
XSRETURN( sp_i );
void
add_entries_by_name( a, ... )
LN_Acl * a;
PREINIT:
d_LN_XSVARS;
LN_Acl_Impl* a_impl;
HANDLE a_h;
int i = 0;
int sp_i = 0;
char name[ MAXUSERNAME ];
char * ae_name;
WORD level = ACL_LEVEL_NOACCESS;
ACL_PRIVILEGES rolebits = { (0,0,0,0,0,0,0,0) };
WORD flags = 0;
ALIAS:
# maybe the default should better be Author with no deletion
# note: the Notes C API documentation don't show the flag
# values for person groups and server groups
add_entries_by_name = 0
add_entries = 1
# note: convenience alias with _same_ index
add = 1
add_persons_by_name = 2
add_persons = 3
add_servers_by_name = 4
add_servers = 5
add_groups_by_name = 6
add_groups = 7
add_fullaccess_entries_by_name = 8
add_fullaccess_entries = 9
# note: convenience alias with _same_ index
add_with_fullaccess = 9
add_fullaccess_persons_by_name = 10
add_fullaccess_persons = 11
add_fullaccess_servers_by_name = 12
add_fullaccess_servers = 13
add_fullaccess_groups_by_name = 14
add_fullaccess_groups = 15
PPCODE:
if ( items == 1 ) { XSRETURN_NOT_OK; }
/*
* list of all access level detail flags
* we have found in the Notes C API 4.61 docs;
* Note: ordering is with falling power/relevance
* Note: we miss the flags for person groups and server groups
*
* ACL_FLAG_NODELETE
* ACL_FLAG_AUTHOR_NOCREATE
*
* ACL_FLAG_CREATE_LOTUSSCRIPT
* ACL_FLAG_CREATE_FOLDER
*
* ACL_FLAG_CREATE_PRAGENT
* ACL_FLAG_CREATE_PRFOLDER
*
* ACL_FLAG_PUBLICREADER
* ACL_FLAG_PUBLICWRITER
*
* ACL_FLAG_PERSON
* ACL_FLAG_SERVER
* ACL_FLAG_GROUP
*
* ACL_FLAG_ADMIN_SERVER
* ACL_FLAG_ADMIN_READERAUTHOR
*/
switch ( ix ) { /* first, set level and detail rights */
case 0: case 1: case 2: case 3:
case 4: case 5: case 6: case 7:
level = ACL_LEVEL_AUTHOR; /* default: author*/
flags &= LN_ACL_DETAILS_RESET_POSITIVES;
flags |= LN_ACL_DETAILS_SET_NEGATIVES;
flags &= ~ACL_FLAG_AUTHOR_NOCREATE; /* allow creation */
break;
case 8: case 9: case 10: case 11:
case 12: case 13: case 14: case 15:
level = ACL_LEVEL_HIGHEST;
flags |= LN_ACL_DETAILS_SET_POSITIVES;
flags &= LN_ACL_DETAILS_RESET_NEGATIVES;
break;
default:
XSRETURN_NOT_OK;
break;
}
switch ( ix ) { /* finally, set detail entry type */
case 0: case 1: case 8: case 9:
flags &= LN_ACL_RESET_ANY_TYPE;
break;
case 2: case 3: case 10: case 11:
flags |= ACL_FLAG_PERSON;
break;
case 4: case 5: case 12: case 13:
flags |= ACL_FLAG_SERVER;
break;
case 6: case 7: case 14: case 15:
flags |= ACL_FLAG_GROUP;
break;
}
a_impl = (LN_Acl_Impl*) LN_H(a);
a_h = a_impl->h;
for ( LN_SET_OK(a), i = 1, sp_i = 0 ; i < items; i++ ) {
/*
* Note: the Notes C API docs say nothing about length
* restrictions for the input name to DNCanonicalize()
* and so we do _not_ truncate it;
* however we truncate our role names
* (see add_roles_by_name and remove_roles_by_name)
*/
ln_stat = DNCanonicalize(
0L,
NULL,
SvPV( ST(i), na ),
name,
MAXUSERNAME,
NULL
);
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
ln_stat = ACLAddEntry( a_h, name, level, &rolebits, flags );
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
Newz( 1, ae_name, strlen(name) + 1, char );
ln_stat = (ae_name != (char*) NULL) ? LN_OK : LN_NOT_OK;
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
strcpy( ae_name, name );
LN_PUSH_NEW_O( "Notes::AclEntry", a );
LN_SET_H( ln_o ) = (long) ae_name;
LN_SET_OK( ln_o );
sp_i += 1;
ln_stat = LN_OK;
} /* end for i < items */
XSRETURN( sp_i );
void
remove_entries_by_name( a, ... )
LN_Acl * a;
PREINIT:
d_LN_XSVARS;
LN_Acl_Impl* a_impl;
HANDLE a_h;
int i;
char name[ MAXUSERNAME ];
ALIAS:
remove = 0
remove_entries = 1
remove_entries_by_name = 2
PPCODE:
a_impl = (LN_Acl_Impl*) LN_H(a);
a_h = a_impl->h;
if ( items <= 1 ) { XSRETURN( 0 ); }
for ( LN_SET_OK(a), i = 1; i < items; i++ ) { /* i=0 skipped */
ln_stat =
DNCanonicalize(0L,NULL,SvPV(ST(i),na),name,MAXUSERNAME,NULL);
if ( LN_IS_OK ) { ln_stat = ACLDeleteEntry(a_h, name); }
if ( LN_IS_NOT_OK ) { LN_STAT(a) = ln_stat; }
}
XSRETURN( 0 );
void
rename_entries_by_name( a, ... )
LN_Acl * a;
PREINIT:
d_LN_XSVARS;
LN_Acl_Impl* a_impl;
HANDLE a_h;
int i;
int sp_i;
LN_Acl_EnumEntry ae;
char new_name[ MAXUSERNAME ];
char * ae_name;
ALIAS:
rename = 0
rename_entries = 1
rename_entries_by_name = 2
PPCODE:
if ( (items % 2) == 0 ) { items -= 1; } /*enforce name pairs*/
if ( items <= 1 ) { XSRETURN( 0 ); }
a_impl = (LN_Acl_Impl*) LN_H(a);
a_h = a_impl->h;
/* skip Notes::ACL obj */
for ( LN_STAT(a) = LN_OK, i = 1, sp_i = 0; i < items; i += 2 ) {
/*
* Note: the Notes C API docs say nothing about length
* restrictions for the input name to DNCanonicalize()
* and so we do _not_ truncate it;
* however we truncate our role names
* (see add_roles_by_name and remove_roles_by_name)
*/
ln_stat = DNCanonicalize(
0L,
NULL,
SvPV( ST(i), na ),
ae.name,
MAXUSERNAME,
NULL
); /* skip, if error in DNCanon */
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
ae.found = LN_NOT_OK;
ae.stat = LN_OK;
ln_stat = ACLEnumEntries(
a_h,
&XS_Notes__AclEntry_enum_has_entryname,
&ae
); /* skip, if error in ACLEnum */
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
ln_stat = ae.found; /* skip, if name not found */
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
ln_stat = ae.stat; /* skip, if multiply found */
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
ln_stat = DNCanonicalize(
0L,
NULL,
SvPV( ST(i+1), na ),
new_name,
MAXUSERNAME,
NULL
); /* skip, if error in DNCanon */
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
ln_stat = ACLUpdateEntry(
a_h,
ae.name,
ACL_UPDATE_NAME | ACL_UPDATE_LEVEL
| ACL_UPDATE_PRIVILEGES | ACL_UPDATE_FLAGS,
new_name,
ae.level,
&ae.rolebits,
ae.flags
);
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
Newz( 1, ae_name, strlen(new_name) + 1, char );
ln_stat = (ae_name != (char*) NULL) ? LN_OK : LN_NOT_OK;
if ( LN_IS_NOT_OK ) { LN_STAT(a)=ln_stat; continue; }
strcpy( ae_name, new_name );
LN_PUSH_NEW_O( "Notes::AclEntry", a );
LN_SET_H( ln_o ) = (long) ae_name;
LN_SET_OK( ln_o );
sp_i += 1;
ln_stat = LN_OK;
} /* end for i < items */
XSRETURN( sp_i );
MODULE = Notes::AclEntry PACKAGE = Notes::AclEntry
PROTOTYPES: DISABLE
void
DESTROY( e )
LN_AclEntry * e;
PREINIT:
d_LN_XSVARS;
PPCODE:
Safefree( (char*) LN_H(e) );
XSRETURN( 0 );
void
name( e )
LN_AclEntry * e;
PREINIT:
d_LN_XSVARS;
PPCODE:
XPUSHs( sv_2mortal( newSVpv( (char*) LN_H(e), 0 ) ) );
XSRETURN( 1 );
( run in 0.526 second using v1.01-cache-2.11-cpan-5511b514fd6 )