util/uuid.lua
author Kim Alvefur <zash@zash.se>
Sat, 23 Mar 2024 20:48:19 +0100
changeset 13465 c673ff1075bd
parent 13321 e6a5f196fc1f
permissions -rw-r--r--
mod_posix: Move everything to util.startup This allows greater control over the order of events. Notably, the internal ordering between daemonization, initialization of libunbound and setup of signal handling is sensitive. libunbound starts a separate thread for processing DNS requests. If this thread is started before signal handling has been set up, it will not inherit the signal handlers and instead behave as it would have before signal handlers were set up, i.e. cause the whole process to immediately exit. libunbound is usually initialized on the first DNS request, usually triggered by an outgoing s2s connection attempt. If daemonization happens before signals have been set up, signals may not be processed at all.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1304
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 2957
diff changeset
     4
--
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
     6
-- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
     7
--
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
     8
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12359
diff changeset
     9
local random = require "prosody.util.random";
6377
50e5aed4eeea util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    10
local random_bytes = random.bytes;
13321
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    11
local time = require "prosody.util.time";
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12359
diff changeset
    12
local hex = require "prosody.util.hex".encode;
6377
50e5aed4eeea util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    13
local m_ceil = math.ceil;
13321
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    14
local m_floor = math.floor;
44
80d2ade0fd69 Add "uuid" library and make sessionmanager use this.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
1303
2170e2c0d57a util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents: 1302
diff changeset
    16
local function get_nibbles(n)
6377
50e5aed4eeea util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    17
	return hex(random_bytes(m_ceil(n/2))):sub(1, n);
1303
2170e2c0d57a util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents: 1302
diff changeset
    18
end
2170e2c0d57a util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents: 1302
diff changeset
    19
2170e2c0d57a util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents: 1302
diff changeset
    20
local function get_twobits()
7052
0eee56075901 util.uuid: Take random byte directly instead of the low bits from the ascii value of a hex nibble
Kim Alvefur <zash@zash.se>
parents: 7015
diff changeset
    21
	return ("%x"):format(random_bytes(1):byte() % 4 + 8);
1303
2170e2c0d57a util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents: 1302
diff changeset
    22
end
2170e2c0d57a util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents: 1302
diff changeset
    23
6377
50e5aed4eeea util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    24
local function generate()
1303
2170e2c0d57a util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents: 1302
diff changeset
    25
	-- generate RFC 4122 complaint UUIDs (version 4 - random)
2170e2c0d57a util.uuid: Now generates RFC 4122 complaint UUIDs (version 4 - random)
Waqas Hussain <waqas20@gmail.com>
parents: 1302
diff changeset
    26
	return get_nibbles(8).."-"..get_nibbles(4).."-4"..get_nibbles(3).."-"..(get_twobits())..get_nibbles(3).."-"..get_nibbles(12);
1302
4561c6d95339 util.uuid: More uniqueness!
Waqas Hussain <waqas20@gmail.com>
parents: 896
diff changeset
    27
end
7060
c633e1338554 util.uuid: Use /dev/urandom
Kim Alvefur <zash@zash.se>
parents: 7013
diff changeset
    28
13321
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    29
local function generate_v7()
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    30
	-- Sortable based on time and random
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    31
	-- https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-01#section-4.4
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    32
	local t = time.now();
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    33
	local unixts = m_floor(t);
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    34
	local unixts_a = m_floor(unixts / 16);
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    35
	local unixts_b = m_floor(unixts % 16);
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    36
	local subsec = t % 1;
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    37
	local subsec_a = m_floor(subsec * 0x1000);
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    38
	local subsec_b = m_floor(subsec * 0x1000000) % 0x1000;
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    39
	return ("%08x-%x%03x-7%03x-%4s-%12s"):format(unixts_a, unixts_b, subsec_a, subsec_b, get_twobits() .. get_nibbles(3), get_nibbles(12));
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    40
end
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    41
6377
50e5aed4eeea util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    42
return {
13321
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    43
	v4 = generate;
e6a5f196fc1f util.uuid: Add UUIDv7
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
    44
	v7 = generate_v7;
6377
50e5aed4eeea util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    45
	get_nibbles=get_nibbles;
50e5aed4eeea util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    46
	generate = generate ;
50e5aed4eeea util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    47
	-- COMPAT
50e5aed4eeea util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    48
	seed = random.seed;
50e5aed4eeea util.uuid: Use util.hex and util.random
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    49
};