-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1045 from Fenny/master
🔐 use uuid v4 in session
- Loading branch information
Showing
18 changed files
with
950 additions
and
3 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,9 @@ | ||
Paul Borman <borman@google.com> | ||
bmatsuo | ||
shawnps | ||
theory | ||
jboverfelt | ||
dsymonds | ||
cd1 | ||
wallclockbuilder | ||
dansouza |
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,2014 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,80 @@ | ||
// 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)) | ||
} |
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,12 @@ | ||
// 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 generates and inspects UUIDs. | ||
// | ||
// UUIDs are based on RFC 4122 and DCE 1.1: Authentication and Security | ||
// Services. | ||
// | ||
// A UUID is a 16 byte (128 bit) array. UUIDs may be used as keys to | ||
// maps or compared directly. | ||
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 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 ( | ||
"crypto/md5" | ||
"crypto/sha1" | ||
"hash" | ||
) | ||
|
||
// Well known namespace IDs and UUIDs | ||
var ( | ||
NameSpaceDNS = Must(Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")) | ||
NameSpaceURL = Must(Parse("6ba7b811-9dad-11d1-80b4-00c04fd430c8")) | ||
NameSpaceOID = Must(Parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8")) | ||
NameSpaceX500 = Must(Parse("6ba7b814-9dad-11d1-80b4-00c04fd430c8")) | ||
Nil UUID // empty UUID, all zeros | ||
) | ||
|
||
// NewHash returns a new UUID derived 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(data) | ||
s := h.Sum(nil) | ||
var uuid UUID | ||
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. It is the same as calling: | ||
// | ||
// 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. It is the same as calling: | ||
// | ||
// 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,38 @@ | ||
// 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 "fmt" | ||
|
||
// MarshalText implements encoding.TextMarshaler. | ||
func (uuid UUID) MarshalText() ([]byte, error) { | ||
var js [36]byte | ||
encodeHex(js[:], uuid) | ||
return js[:], nil | ||
} | ||
|
||
// UnmarshalText implements encoding.TextUnmarshaler. | ||
func (uuid *UUID) UnmarshalText(data []byte) error { | ||
id, err := ParseBytes(data) | ||
if err != nil { | ||
return err | ||
} | ||
*uuid = id | ||
return nil | ||
} | ||
|
||
// MarshalBinary implements encoding.BinaryMarshaler. | ||
func (uuid UUID) MarshalBinary() ([]byte, error) { | ||
return uuid[:], nil | ||
} | ||
|
||
// UnmarshalBinary implements encoding.BinaryUnmarshaler. | ||
func (uuid *UUID) UnmarshalBinary(data []byte) error { | ||
if len(data) != 16 { | ||
return fmt.Errorf("invalid UUID (got %d bytes)", len(data)) | ||
} | ||
copy(uuid[:], data) | ||
return nil | ||
} |
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,90 @@ | ||
// 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 ( | ||
"sync" | ||
) | ||
|
||
var ( | ||
nodeMu sync.Mutex | ||
ifname string // name of interface being used | ||
nodeID [6]byte // hardware for version 1 UUIDs | ||
zeroID [6]byte // nodeID with only 0's | ||
) | ||
|
||
// 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 { | ||
defer nodeMu.Unlock() | ||
nodeMu.Lock() | ||
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 { | ||
defer nodeMu.Unlock() | ||
nodeMu.Lock() | ||
return setNodeInterface(name) | ||
} | ||
|
||
func setNodeInterface(name string) bool { | ||
iname, addr := getHardwareInterface(name) // null implementation for js | ||
if iname != "" && addr != nil { | ||
ifname = iname | ||
copy(nodeID[:], addr) | ||
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 == "" { | ||
ifname = "random" | ||
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 { | ||
defer nodeMu.Unlock() | ||
nodeMu.Lock() | ||
if nodeID == zeroID { | ||
setNodeInterface("") | ||
} | ||
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 len(id) < 6 { | ||
return false | ||
} | ||
defer nodeMu.Unlock() | ||
nodeMu.Lock() | ||
copy(nodeID[:], id) | ||
ifname = "user" | ||
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 { | ||
var node [6]byte | ||
copy(node[:], uuid[10:]) | ||
return node[:] | ||
} |
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,12 @@ | ||
// Copyright 2017 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. | ||
|
||
// +build js | ||
|
||
package uuid | ||
|
||
// getHardwareInterface returns nil values for the JS version of the code. | ||
// This remvoves the "net" dependency, because it is not used in the browser. | ||
// Using the "net" library inflates the size of the transpiled JS code by 673k bytes. | ||
func getHardwareInterface(name string) (string, []byte) { return "", nil } |
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,33 @@ | ||
// Copyright 2017 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. | ||
|
||
// +build !js | ||
|
||
package uuid | ||
|
||
import "net" | ||
|
||
var interfaces []net.Interface // cached list of interfaces | ||
|
||
// getHardwareInterface returns the name and hardware address of interface name. | ||
// If name is "" then the name and hardware address of one of the system's | ||
// interfaces is returned. If no interfaces are found (name does not exist or | ||
// there are no interfaces) then "", nil is returned. | ||
// | ||
// Only addresses of at least 6 bytes are returned. | ||
func getHardwareInterface(name string) (string, []byte) { | ||
if interfaces == nil { | ||
var err error | ||
interfaces, err = net.Interfaces() | ||
if err != nil { | ||
return "", nil | ||
} | ||
} | ||
for _, ifs := range interfaces { | ||
if len(ifs.HardwareAddr) >= 6 && (name == "" || name == ifs.Name) { | ||
return ifs.Name, ifs.HardwareAddr | ||
} | ||
} | ||
return "", nil | ||
} |
Oops, something went wrong.