|
| 1 | +export type AttributeCategory = 'rs'; |
| 2 | + |
| 3 | +export interface AttributeInfo { |
| 4 | + friendlyName: string; |
| 5 | + categories: AttributeCategory[]; |
| 6 | +} |
| 7 | + |
| 8 | +export const EPPN_OID = 'urn:oid:1.3.6.1.4.1.5923.1.1.1.6'; |
| 9 | + |
| 10 | +export const ATTRIBUTE_REGISTRY: Record<string, AttributeInfo> = { |
| 11 | + // ── eduPerson ───────────────────────────────────────────────────────────────── |
| 12 | + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.1': { friendlyName: 'eduPersonAffiliation', categories: [] }, |
| 13 | + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.2': { friendlyName: 'eduPersonNickname', categories: [] }, |
| 14 | + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.5': { friendlyName: 'eduPersonPrimaryAffiliation', categories: [] }, |
| 15 | + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.6': { friendlyName: 'eduPersonPrincipalName', categories: ['rs'] }, |
| 16 | + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.7': { friendlyName: 'eduPersonEntitlement', categories: [] }, |
| 17 | + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.9': { friendlyName: 'eduPersonScopedAffiliation', categories: ['rs'] }, |
| 18 | + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.10': { friendlyName: 'eduPersonTargetedID', categories: ['rs'] }, |
| 19 | + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.11': { friendlyName: 'eduPersonAssurance', categories: [] }, |
| 20 | + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.12': { friendlyName: 'eduPersonUniqueId', categories: ['rs'] }, |
| 21 | + 'urn:oid:1.3.6.1.4.1.5923.1.1.1.13': { friendlyName: 'eduPersonOrcid', categories: [] }, |
| 22 | + // ── inetOrgPerson / person ──────────────────────────────────────────────────── |
| 23 | + 'urn:oid:0.9.2342.19200300.100.1.1': { friendlyName: 'uid', categories: [] }, |
| 24 | + 'urn:oid:0.9.2342.19200300.100.1.3': { friendlyName: 'mail', categories: ['rs'] }, |
| 25 | + 'urn:oid:0.9.2342.19200300.100.1.37': { friendlyName: 'labeledUri', categories: [] }, |
| 26 | + 'urn:oid:0.9.2342.19200300.100.1.41': { friendlyName: 'mobile', categories: [] }, |
| 27 | + 'urn:oid:2.5.4.3': { friendlyName: 'cn', categories: [] }, |
| 28 | + 'urn:oid:2.5.4.4': { friendlyName: 'sn', categories: ['rs'] }, |
| 29 | + 'urn:oid:2.5.4.6': { friendlyName: 'c', categories: [] }, |
| 30 | + 'urn:oid:2.5.4.7': { friendlyName: 'l', categories: [] }, |
| 31 | + 'urn:oid:2.5.4.8': { friendlyName: 'st', categories: [] }, |
| 32 | + 'urn:oid:2.5.4.9': { friendlyName: 'street', categories: [] }, |
| 33 | + 'urn:oid:2.5.4.10': { friendlyName: 'o', categories: [] }, |
| 34 | + 'urn:oid:2.5.4.11': { friendlyName: 'ou', categories: [] }, |
| 35 | + 'urn:oid:2.5.4.12': { friendlyName: 'title', categories: [] }, |
| 36 | + 'urn:oid:2.5.4.17': { friendlyName: 'postalCode', categories: [] }, |
| 37 | + 'urn:oid:2.5.4.20': { friendlyName: 'telephoneNumber', categories: [] }, |
| 38 | + 'urn:oid:2.5.4.42': { friendlyName: 'givenName', categories: ['rs'] }, |
| 39 | + 'urn:oid:2.16.840.1.113730.3.1.2': { friendlyName: 'employeeType', categories: [] }, |
| 40 | + 'urn:oid:2.16.840.1.113730.3.1.3': { friendlyName: 'employeeNumber', categories: [] }, |
| 41 | + 'urn:oid:2.16.840.1.113730.3.1.4': { friendlyName: 'departmentNumber', categories: [] }, |
| 42 | + 'urn:oid:2.16.840.1.113730.3.1.39': { friendlyName: 'preferredLanguage', categories: [] }, |
| 43 | + 'urn:oid:2.16.840.1.113730.3.1.241': { friendlyName: 'displayName', categories: ['rs'] }, |
| 44 | + // ── SCHAC ───────────────────────────────────────────────────────────────────── |
| 45 | + 'urn:oid:1.3.6.1.4.1.25178.1.2.9': { friendlyName: 'schacHomeOrganization', categories: [] }, |
| 46 | + 'urn:oid:1.3.6.1.4.1.25178.1.2.10': { friendlyName: 'schacHomeOrganizationType', categories: [] }, |
| 47 | + 'urn:oid:1.3.6.1.4.1.25178.1.2.14': { friendlyName: 'schacPersonalUniqueCode', categories: [] }, |
| 48 | + 'urn:oid:1.3.6.1.4.1.25178.1.2.15': { friendlyName: 'schacPersonalUniqueID', categories: [] }, |
| 49 | + // ── Grouper / isMemberOf ────────────────────────────────────────────────────── |
| 50 | + 'urn:oid:1.3.6.1.4.1.5923.1.5.1.1': { friendlyName: 'isMemberOf', categories: [] }, |
| 51 | +}; |
| 52 | + |
| 53 | +export function getAttributeInfo(name: string): AttributeInfo | undefined { |
| 54 | + return ATTRIBUTE_REGISTRY[name]; |
| 55 | +} |
| 56 | + |
| 57 | +// Returns 'scoped' if the ePPN value contains @scope, 'unscoped' if not, null if not an ePPN attribute. |
| 58 | +export function eppnScopedStatus(name: string, values: string[]): 'scoped' | 'unscoped' | null { |
| 59 | + if (name !== EPPN_OID) return null; |
| 60 | + if (values.length === 0) return null; |
| 61 | + return values[0].includes('@') ? 'scoped' : 'unscoped'; |
| 62 | +} |
0 commit comments