| // Copyright 2016 Google Inc. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package uuid |
| |
| import ( |
| "encoding/binary" |
| "fmt" |
| "os" |
| ) |
| |
| // A Domain represents a Version 2 domain |
| type Domain byte |
| |
| // Domain constants for DCE Security (Version 2) UUIDs. |
| const ( |
| Person = Domain(0) |
| Group = Domain(1) |
| Org = Domain(2) |
| ) |
| |
| // NewDCESecurity returns a DCE Security (Version 2) UUID. |
| // |
| // The domain should be one of Person, Group or Org. |
| // On a POSIX system the id should be the users UID for the Person |
| // domain and the users GID for the Group. The meaning of id for |
| // the domain Org or on non-POSIX systems is site defined. |
| // |
| // For a given domain/id pair the same token may be returned for up to |
| // 7 minutes and 10 seconds. |
| func NewDCESecurity(domain Domain, id uint32) (UUID, error) { |
| uuid, err := NewUUID() |
| if err == nil { |
| uuid[6] = (uuid[6] & 0x0f) | 0x20 // Version 2 |
| uuid[9] = byte(domain) |
| binary.BigEndian.PutUint32(uuid[0:], id) |
| } |
| return uuid, err |
| } |
| |
| // NewDCEPerson returns a DCE Security (Version 2) UUID in the person |
| // domain with the id returned by os.Getuid. |
| // |
| // NewDCESecurity(Person, uint32(os.Getuid())) |
| func NewDCEPerson() (UUID, error) { |
| return NewDCESecurity(Person, uint32(os.Getuid())) |
| } |
| |
| // NewDCEGroup returns a DCE Security (Version 2) UUID in the group |
| // domain with the id returned by os.Getgid. |
| // |
| // NewDCESecurity(Group, uint32(os.Getgid())) |
| func NewDCEGroup() (UUID, error) { |
| return NewDCESecurity(Group, uint32(os.Getgid())) |
| } |
| |
| // Domain returns the domain for a Version 2 UUID. Domains are only defined |
| // for Version 2 UUIDs. |
| func (uuid UUID) Domain() Domain { |
| return Domain(uuid[9]) |
| } |
| |
| // ID returns the id for a Version 2 UUID. IDs are only defined for Version 2 |
| // UUIDs. |
| func (uuid UUID) ID() uint32 { |
| return binary.BigEndian.Uint32(uuid[0:4]) |
| } |
| |
| func (d Domain) String() string { |
| switch d { |
| case Person: |
| return "Person" |
| case Group: |
| return "Group" |
| case Org: |
| return "Org" |
| } |
| return fmt.Sprintf("Domain%d", int(d)) |
| } |