src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

dce.go (2072B)


      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 }