git.sr.ht/~pingoo/stdx@v0.0.0-20240218134121-094174641f6e/uuid/dce.go (about) 1 // Copyright 2016 Google Inc. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package uuid 6 7 import ( 8 "encoding/binary" 9 "fmt" 10 "os" 11 ) 12 13 // A Domain represents a Version 2 domain 14 type Domain byte 15 16 // Domain constants for DCE Security (Version 2) UUIDs. 17 const ( 18 Person = Domain(0) 19 Group = Domain(1) 20 Org = Domain(2) 21 ) 22 23 // NewDCESecurity returns a DCE Security (Version 2) UUID. 24 // 25 // The domain should be one of Person, Group or Org. 26 // On a POSIX system the id should be the users UID for the Person 27 // domain and the users GID for the Group. The meaning of id for 28 // the domain Org or on non-POSIX systems is site defined. 29 // 30 // For a given domain/id pair the same token may be returned for up to 31 // 7 minutes and 10 seconds. 32 func NewDCESecurity(domain Domain, id uint32) (UUID, error) { 33 uuid, err := NewUUID() 34 if err == nil { 35 uuid[6] = (uuid[6] & 0x0f) | 0x20 // Version 2 36 uuid[9] = byte(domain) 37 binary.BigEndian.PutUint32(uuid[0:], id) 38 } 39 return uuid, err 40 } 41 42 // NewDCEPerson returns a DCE Security (Version 2) UUID in the person 43 // domain with the id returned by os.Getuid. 44 // 45 // NewDCESecurity(Person, uint32(os.Getuid())) 46 func NewDCEPerson() (UUID, error) { 47 return NewDCESecurity(Person, uint32(os.Getuid())) 48 } 49 50 // NewDCEGroup returns a DCE Security (Version 2) UUID in the group 51 // domain with the id returned by os.Getgid. 52 // 53 // NewDCESecurity(Group, uint32(os.Getgid())) 54 func NewDCEGroup() (UUID, error) { 55 return NewDCESecurity(Group, uint32(os.Getgid())) 56 } 57 58 // Domain returns the domain for a Version 2 UUID. Domains are only defined 59 // for Version 2 UUIDs. 60 func (uuid UUID) Domain() Domain { 61 return Domain(uuid[9]) 62 } 63 64 // ID returns the id for a Version 2 UUID. IDs are only defined for Version 2 65 // UUIDs. 66 func (uuid UUID) ID() uint32 { 67 return binary.BigEndian.Uint32(uuid[0:4]) 68 } 69 70 func (d Domain) String() string { 71 switch d { 72 case Person: 73 return "Person" 74 case Group: 75 return "Group" 76 case Org: 77 return "Org" 78 } 79 return fmt.Sprintf("Domain%d", int(d)) 80 }