forked from kubernetes/kubernetes
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bump(code.google.com/p/go-uuid/uuid): 3da0bf12e76e1048469b95fb20e29f1…
…bc9799ae1
- Loading branch information
1 parent
e6ee45d
commit 31e40e1
Showing
11 changed files
with
1,067 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
Copyright (c) 2009 Google Inc. All rights reserved. | ||
|
||
Redistribution and use in source and binary forms, with or without | ||
modification, are permitted provided that the following conditions are | ||
met: | ||
|
||
* Redistributions of source code must retain the above copyright | ||
notice, this list of conditions and the following disclaimer. | ||
* Redistributions in binary form must reproduce the above | ||
copyright notice, this list of conditions and the following disclaimer | ||
in the documentation and/or other materials provided with the | ||
distribution. | ||
* Neither the name of Google Inc. nor the names of its | ||
contributors may be used to endorse or promote products derived from | ||
this software without specific prior written permission. | ||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
// Copyright 2011 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 { | ||
uuid := NewUUID() | ||
if uuid != nil { | ||
uuid[6] = (uuid[6] & 0x0f) | 0x20 // Version 2 | ||
uuid[9] = byte(domain) | ||
binary.BigEndian.PutUint32(uuid[0:], id) | ||
} | ||
return uuid | ||
} | ||
|
||
// NewDCEPerson returns a DCE Security (Version 2) UUID in the person | ||
// domain with the id returned by os.Getuid. | ||
// | ||
// NewDCEPerson(Person, uint32(os.Getuid())) | ||
func NewDCEPerson() UUID { | ||
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. | ||
// | ||
// NewDCEGroup(Group, uint32(os.Getgid())) | ||
func NewDCEGroup() UUID { | ||
return NewDCESecurity(Group, uint32(os.Getgid())) | ||
} | ||
|
||
// Domain returns the domain for a Version 2 UUID or false. | ||
func (uuid UUID) Domain() (Domain, bool) { | ||
if v, _ := uuid.Version(); v != 2 { | ||
return 0, false | ||
} | ||
return Domain(uuid[9]), true | ||
} | ||
|
||
// Id returns the id for a Version 2 UUID or false. | ||
func (uuid UUID) Id() (uint32, bool) { | ||
if v, _ := uuid.Version(); v != 2 { | ||
return 0, false | ||
} | ||
return binary.BigEndian.Uint32(uuid[0:4]), true | ||
} | ||
|
||
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)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
// Copyright 2011 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. | ||
|
||
// The uuid package generates and inspects UUIDs. | ||
// | ||
// UUIDs are based on RFC 4122 and DCE 1.1: Authentication and Security Services. | ||
package uuid |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
// Copyright 2011 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 ( | ||
"crypto/md5" | ||
"crypto/sha1" | ||
"hash" | ||
) | ||
|
||
// Well known Name Space IDs and UUIDs | ||
var ( | ||
NameSpace_DNS = Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8") | ||
NameSpace_URL = Parse("6ba7b811-9dad-11d1-80b4-00c04fd430c8") | ||
NameSpace_OID = Parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8") | ||
NameSpace_X500 = Parse("6ba7b814-9dad-11d1-80b4-00c04fd430c8") | ||
NIL = Parse("00000000-0000-0000-0000-000000000000") | ||
) | ||
|
||
// NewHash returns a new UUID dervied from the hash of space concatenated with | ||
// data generated by h. The hash should be at least 16 byte in length. The | ||
// first 16 bytes of the hash are used to form the UUID. The version of the | ||
// UUID will be the lower 4 bits of version. NewHash is used to implement | ||
// NewMD5 and NewSHA1. | ||
func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID { | ||
h.Reset() | ||
h.Write(space) | ||
h.Write([]byte(data)) | ||
s := h.Sum(nil) | ||
uuid := make([]byte, 16) | ||
copy(uuid, s) | ||
uuid[6] = (uuid[6] & 0x0f) | uint8((version&0xf)<<4) | ||
uuid[8] = (uuid[8] & 0x3f) | 0x80 // RFC 4122 variant | ||
return uuid | ||
} | ||
|
||
// NewMD5 returns a new MD5 (Version 3) UUID based on the | ||
// supplied name space and data. | ||
// | ||
// NewHash(md5.New(), space, data, 3) | ||
func NewMD5(space UUID, data []byte) UUID { | ||
return NewHash(md5.New(), space, data, 3) | ||
} | ||
|
||
// NewSHA1 returns a new SHA1 (Version 5) UUID based on the | ||
// supplied name space and data. | ||
// | ||
// NewHash(sha1.New(), space, data, 5) | ||
func NewSHA1(space UUID, data []byte) UUID { | ||
return NewHash(sha1.New(), space, data, 5) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
// Copyright 2011 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 "net" | ||
|
||
var ( | ||
interfaces []net.Interface // cached list of interfaces | ||
ifname string // name of interface being used | ||
nodeID []byte // hardware for version 1 UUIDs | ||
) | ||
|
||
// NodeInterface returns the name of the interface from which the NodeID was | ||
// derived. The interface "user" is returned if the NodeID was set by | ||
// SetNodeID. | ||
func NodeInterface() string { | ||
return ifname | ||
} | ||
|
||
// SetNodeInterface selects the hardware address to be used for Version 1 UUIDs. | ||
// If name is "" then the first usable interface found will be used or a random | ||
// Node ID will be generated. If a named interface cannot be found then false | ||
// is returned. | ||
// | ||
// SetNodeInterface never fails when name is "". | ||
func SetNodeInterface(name string) bool { | ||
if interfaces == nil { | ||
var err error | ||
interfaces, err = net.Interfaces() | ||
if err != nil && name != "" { | ||
return false | ||
} | ||
} | ||
|
||
for _, ifs := range interfaces { | ||
if len(ifs.HardwareAddr) >= 6 && (name == "" || name == ifs.Name) { | ||
if setNodeID(ifs.HardwareAddr) { | ||
ifname = ifs.Name | ||
return true | ||
} | ||
} | ||
} | ||
|
||
// We found no interfaces with a valid hardware address. If name | ||
// does not specify a specific interface generate a random Node ID | ||
// (section 4.1.6) | ||
if name == "" { | ||
if nodeID == nil { | ||
nodeID = make([]byte, 6) | ||
} | ||
randomBits(nodeID) | ||
return true | ||
} | ||
return false | ||
} | ||
|
||
// NodeID returns a slice of a copy of the current Node ID, setting the Node ID | ||
// if not already set. | ||
func NodeID() []byte { | ||
if nodeID == nil { | ||
SetNodeInterface("") | ||
} | ||
nid := make([]byte, 6) | ||
copy(nid, nodeID) | ||
return nid | ||
} | ||
|
||
// SetNodeID sets the Node ID to be used for Version 1 UUIDs. The first 6 bytes | ||
// of id are used. If id is less than 6 bytes then false is returned and the | ||
// Node ID is not set. | ||
func SetNodeID(id []byte) bool { | ||
if setNodeID(id) { | ||
ifname = "user" | ||
return true | ||
} | ||
return false | ||
} | ||
|
||
func setNodeID(id []byte) bool { | ||
if len(id) < 6 { | ||
return false | ||
} | ||
if nodeID == nil { | ||
nodeID = make([]byte, 6) | ||
} | ||
copy(nodeID, id) | ||
return true | ||
} | ||
|
||
// NodeID returns the 6 byte node id encoded in uuid. It returns nil if uuid is | ||
// not valid. The NodeID is only well defined for version 1 and 2 UUIDs. | ||
func (uuid UUID) NodeID() []byte { | ||
if len(uuid) != 16 { | ||
return nil | ||
} | ||
node := make([]byte, 6) | ||
copy(node, uuid[10:]) | ||
return node | ||
} |
Oops, something went wrong.