1 1.1 christos /* $NetBSD: jts.c,v 1.2 2021/08/14 16:14:53 christos Exp $ */ 2 1.1 christos 3 1.1 christos /* jts.c - RBAC JTS initialization */ 4 1.1 christos /* $OpenLDAP$ */ 5 1.1 christos /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 6 1.1 christos * 7 1.1 christos * 8 1.1 christos * All rights reserved. 9 1.1 christos * 10 1.1 christos * Redistribution and use in source and binary forms, with or without 11 1.1 christos * modification, are permitted only as authorized by the OpenLDAP 12 1.1 christos * Public License. 13 1.1 christos * 14 1.1 christos * A copy of this license is available in the file LICENSE in the 15 1.1 christos * top-level directory of the distribution or, alternatively, at 16 1.1 christos * <http://www.OpenLDAP.org/license.html>. 17 1.1 christos */ 18 1.1 christos /* ACKNOWLEDGEMENTS: 19 1.1 christos */ 20 1.1 christos 21 1.1 christos #include <sys/cdefs.h> 22 1.1 christos __RCSID("$NetBSD: jts.c,v 1.2 2021/08/14 16:14:53 christos Exp $"); 23 1.1 christos 24 1.1 christos #include "portable.h" 25 1.1 christos 26 1.1 christos #include <stdio.h> 27 1.1 christos 28 1.1 christos #include <ac/string.h> 29 1.1 christos 30 1.1 christos #include "slap.h" 31 1.1 christos #include "slap-config.h" 32 1.1 christos #include "lutil.h" 33 1.1 christos 34 1.1 christos #include "rbac.h" 35 1.1 christos 36 1.1 christos struct slap_rbac_tenant_schema slap_rbac_jts_schema; 37 1.1 christos 38 1.1 christos /* to replace all JTS schema initialization */ 39 1.1 christos rbac_ad_t ft_ads[] = { 40 1.1 christos { RBAC_ROLE_ASSIGNMENT, 41 1.1 christos BER_BVC("ftRA"), &slap_rbac_jts_schema.ad_role }, 42 1.1 christos { RBAC_ROLE_CONSTRAINTS, 43 1.1 christos BER_BVC("ftRC"), &slap_rbac_jts_schema.ad_role_constraint }, 44 1.1 christos { RBAC_USER_CONSTRAINTS, 45 1.1 christos BER_BVC("ftCstr"), &slap_rbac_jts_schema.ad_user_constraint }, 46 1.1 christos { RBAC_UID, 47 1.1 christos BER_BVC("uid"), &slap_rbac_jts_schema.ad_uid }, 48 1.1 christos { RBAC_USERS, 49 1.1 christos BER_BVC("ftUsers"), &slap_rbac_jts_schema.ad_permission_users }, 50 1.1 christos { RBAC_ROLES, 51 1.1 christos BER_BVC("ftRoles"), &slap_rbac_jts_schema.ad_permission_roles }, 52 1.1 christos { RBAC_OBJ_NAME, 53 1.1 christos BER_BVC("ftObjNm"), &slap_rbac_jts_schema.ad_permission_objname }, 54 1.1 christos { RBAC_OP_NAME, 55 1.1 christos BER_BVC("ftOpNm"), &slap_rbac_jts_schema.ad_permission_opname }, 56 1.1 christos 57 1.1 christos { RBAC_NONE, BER_BVNULL, NULL } 58 1.1 christos }; 59 1.1 christos 60 1.1 christos rbac_ad_t ft_user_ads[] = { 61 1.1 christos { RBAC_ROLE_ASSIGNMENT, 62 1.1 christos BER_BVC("ftRA"), &slap_rbac_jts_schema.ad_role }, 63 1.1 christos { RBAC_ROLE_CONSTRAINTS, 64 1.1 christos BER_BVC("ftRC"), &slap_rbac_jts_schema.ad_role_constraint }, 65 1.1 christos { RBAC_USER_CONSTRAINTS, 66 1.1 christos BER_BVC("ftCstr"), &slap_rbac_jts_schema.ad_user_constraint }, 67 1.1 christos { RBAC_UID, 68 1.1 christos BER_BVC("uid"), &slap_rbac_jts_schema.ad_uid }, 69 1.1 christos 70 1.1 christos { RBAC_NONE, BER_BVNULL, NULL } 71 1.1 christos }; 72 1.1 christos 73 1.1 christos rbac_ad_t ft_perm_ads[] = { 74 1.1 christos { RBAC_USERS, 75 1.1 christos BER_BVC("ftUsers"), &slap_rbac_jts_schema.ad_permission_users }, 76 1.1 christos { RBAC_ROLES, 77 1.1 christos BER_BVC("ftRoles"), &slap_rbac_jts_schema.ad_permission_roles }, 78 1.1 christos 79 1.1 christos { RBAC_NONE, BER_BVNULL, NULL } 80 1.1 christos }; 81 1.1 christos 82 1.1 christos rbac_ad_t ft_session_perm_ads[] = { 83 1.1 christos { RBAC_USERS, 84 1.1 christos BER_BVC("ftUsers"), &slap_rbac_jts_schema.ad_permission_users }, 85 1.1 christos { RBAC_ROLES, 86 1.1 christos BER_BVC("ftRoles"), &slap_rbac_jts_schema.ad_permission_roles }, 87 1.1 christos { RBAC_OBJ_NAME, 88 1.1 christos BER_BVC("ftObjNm"), &slap_rbac_jts_schema.ad_permission_objname }, 89 1.1 christos { RBAC_OP_NAME, 90 1.1 christos BER_BVC("ftOpNm"), &slap_rbac_jts_schema.ad_permission_opname }, 91 1.1 christos 92 1.1 christos { RBAC_NONE, BER_BVNULL, NULL } 93 1.1 christos }; 94 1.1 christos 95 1.1 christos static int 96 1.1 christos initialize_jts_session_permission_ads() 97 1.1 christos { 98 1.1 christos int i, nattrs, rc = LDAP_SUCCESS; 99 1.1 christos 100 1.1 christos for ( nattrs = 0; !BER_BVISNULL( &ft_session_perm_ads[nattrs].attr ); 101 1.1 christos nattrs++ ) 102 1.1 christos ; /* count the number of attrs */ 103 1.1 christos 104 1.1 christos slap_rbac_jts_schema.session_perm_attrs = 105 1.1 christos slap_sl_calloc( sizeof(AttributeName), nattrs + 1, NULL ); 106 1.1 christos 107 1.1 christos for ( i = 0; !BER_BVISNULL( &ft_session_perm_ads[i].attr ); i++ ) { 108 1.1 christos slap_rbac_jts_schema.session_perm_attrs[i].an_name = 109 1.1 christos ft_session_perm_ads[i].attr; 110 1.1 christos slap_rbac_jts_schema.session_perm_attrs[i].an_desc = 111 1.1 christos *ft_session_perm_ads[i].ad; 112 1.1 christos } 113 1.1 christos 114 1.1 christos BER_BVZERO( &slap_rbac_jts_schema.session_perm_attrs[nattrs].an_name ); 115 1.1 christos 116 1.1 christos slap_rbac_jts_schema.session_permissions_ads = ft_session_perm_ads; 117 1.1 christos 118 1.1 christos return rc; 119 1.1 christos } 120 1.1 christos 121 1.1 christos static int 122 1.1 christos initialize_jts_permission_ads() 123 1.1 christos { 124 1.1 christos int i, nattrs, rc = LDAP_SUCCESS; 125 1.1 christos 126 1.1 christos /* jts permissions configuration */ 127 1.1 christos 128 1.1 christos for ( nattrs = 0; !BER_BVISNULL( &ft_perm_ads[nattrs].attr ); nattrs++ ) 129 1.1 christos ; /* count the number of attrs */ 130 1.1 christos 131 1.1 christos slap_rbac_jts_schema.perm_attrs = 132 1.1 christos slap_sl_calloc( sizeof(AttributeName), nattrs + 1, NULL ); 133 1.1 christos 134 1.1 christos for ( i = 0; !BER_BVISNULL( &ft_perm_ads[i].attr ); i++ ) { 135 1.1 christos slap_rbac_jts_schema.perm_attrs[i].an_name = ft_perm_ads[i].attr; 136 1.1 christos slap_rbac_jts_schema.perm_attrs[i].an_desc = *ft_perm_ads[i].ad; 137 1.1 christos } 138 1.1 christos 139 1.1 christos BER_BVZERO( &slap_rbac_jts_schema.perm_attrs[nattrs].an_name ); 140 1.1 christos 141 1.1 christos slap_rbac_jts_schema.permission_ads = ft_perm_ads; 142 1.1 christos 143 1.1 christos return rc; 144 1.1 christos } 145 1.1 christos 146 1.1 christos static int 147 1.1 christos initialize_jts_user_ads() 148 1.1 christos { 149 1.1 christos int i, nattrs, rc = LDAP_SUCCESS; 150 1.1 christos 151 1.1 christos /* jts user attribute descriptions */ 152 1.1 christos 153 1.1 christos /* jts user attributes */ 154 1.1 christos for ( nattrs = 0; !BER_BVISNULL( &ft_user_ads[nattrs].attr ); nattrs++ ) 155 1.1 christos ; /* count the number of attrs */ 156 1.1 christos 157 1.1 christos slap_rbac_jts_schema.user_attrs = 158 1.1 christos slap_sl_calloc( sizeof(AttributeName), nattrs + 1, NULL ); 159 1.1 christos 160 1.1 christos for ( i = 0; !BER_BVISNULL( &ft_user_ads[i].attr ); i++ ) { 161 1.1 christos slap_rbac_jts_schema.user_attrs[i].an_name = ft_user_ads[i].attr; 162 1.1 christos slap_rbac_jts_schema.user_attrs[i].an_desc = *ft_user_ads[i].ad; 163 1.1 christos } 164 1.1 christos 165 1.1 christos BER_BVZERO( &slap_rbac_jts_schema.user_attrs[nattrs].an_name ); 166 1.1 christos 167 1.1 christos slap_rbac_jts_schema.user_ads = ft_user_ads; 168 1.1 christos 169 1.1 christos return rc; 170 1.1 christos } 171 1.1 christos 172 1.1 christos int 173 1.1 christos initialize_jts() 174 1.1 christos { 175 1.1 christos int i, rc; 176 1.1 christos const char *text; 177 1.1 christos 178 1.1 christos /* jts attributes */ 179 1.1 christos for ( i = 0; !BER_BVISNULL( &ft_ads[i].attr ); i++ ) { 180 1.1 christos rc = slap_bv2ad( &ft_ads[i].attr, ft_ads[i].ad, &text ); 181 1.1 christos if ( rc != LDAP_SUCCESS ) { 182 1.1 christos goto done; 183 1.1 christos } 184 1.1 christos } 185 1.1 christos 186 1.1 christos rc = initialize_jts_user_ads(); 187 1.1 christos if ( rc != LDAP_SUCCESS ) { 188 1.1 christos return rc; 189 1.1 christos } 190 1.1 christos 191 1.1 christos rc = initialize_jts_permission_ads(); 192 1.1 christos if ( rc != LDAP_SUCCESS ) { 193 1.1 christos return rc; 194 1.1 christos } 195 1.1 christos 196 1.1 christos rc = initialize_jts_session_permission_ads(); 197 1.1 christos if ( rc != LDAP_SUCCESS ) { 198 1.1 christos return rc; 199 1.1 christos } 200 1.1 christos 201 1.1 christos done:; 202 1.1 christos return rc; 203 1.1 christos } 204