util/id.lua
author Kim Alvefur <zash@zash.se>
Sat, 23 Mar 2024 20:48:19 +0100
changeset 13465 c673ff1075bd
parent 12979 d10957394a3c
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:
8019
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- Prosody IM
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
-- Copyright (C) 2008-2017 Matthew Wild
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
-- Copyright (C) 2008-2017 Waqas Hussain
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
-- Copyright (C) 2008-2017 Kim Alvefur
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
--
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
-- This project is MIT/X11 licensed. Please see the
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
-- COPYING file in the source package for more information.
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
--
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
local s_gsub = string.gsub;
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12115
diff changeset
    11
local random_bytes = require "prosody.util.random".bytes;
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12115
diff changeset
    12
local base64_encode = require "prosody.util.encodings".base64.encode;
8019
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
local b64url = { ["+"] = "-", ["/"] = "_", ["="] = "" };
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
local function b64url_random(len)
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
	return (s_gsub(base64_encode(random_bytes(len)), "[+/=]", b64url));
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
end
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
return {
12114
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    20
	-- sizes divisible by 3 fit nicely into base64 without padding==
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    21
12115
f8d280215633 util.id: Add a 'tiny' variant
Kim Alvefur <zash@zash.se>
parents: 12114
diff changeset
    22
	-- for short lived things with low risk of collisions
f8d280215633 util.id: Add a 'tiny' variant
Kim Alvefur <zash@zash.se>
parents: 12114
diff changeset
    23
	tiny = function() return b64url_random(3); end;
f8d280215633 util.id: Add a 'tiny' variant
Kim Alvefur <zash@zash.se>
parents: 12114
diff changeset
    24
12114
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    25
	-- close to 8 bytes, should be good enough for relatively short lived or uses
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    26
	-- scoped by host or users, half the size of an uuid
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    27
	short = function() return b64url_random(9); end;
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    28
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    29
	-- more entropy than uuid at 2/3 the size
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    30
	-- should be okay for globally scoped ids or security token
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    31
	medium = function() return b64url_random(18); end;
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    32
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    33
	-- as long as an uuid but MOAR entropy
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    34
	long = function() return b64url_random(27); end;
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    35
b5b799a2a10c util.id: Adjust entropy levels, with rationales
Kim Alvefur <zash@zash.se>
parents: 8019
diff changeset
    36
	-- pick your own adventure
8019
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
	custom = function (size)
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
		return function () return b64url_random(size); end;
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
	end;
9546c629289b util.id: New util for producing random identifiers of varying sizes
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
}