local b64 = require("ssso_base64") local function build_profile(user, password, name, email) return { u = user, p = password, n = name, e = email, } end local function serialize(profile) return (profile.u or "\025") .. "\031" .. (profile.p or "\025") .. "\031" .. (profile.n or "\025") .. "\031" .. (profile.e or "\025") .. "\031" end local function deserialize(ser) local profile local remainder = ser:gsub("^(.-)\031(.-)\031(.-)\031(.-)\031", function (u, p, n, e) if u == "\025" then u = nil end if p == "\025" then p = nil end if n == "\025" then n = nil end if e == "\025" then e = nil end profile = build_profile(u, p, n, e) return "" end) return profile, remainder end local function format(template, profile) local s = template s = s:gsub("\ru%.", profile.u or "") s = s:gsub("\rp%.", profile.p or "") s = s:gsub("\rn%.", profile.n or "") s = s:gsub("\re%.", profile.e or "") s = s:gsub("\rb64%(([^\r]-)%)%.", function(x) return b64.encode_base64(x) end) s = s:gsub("\ru64%(([^\r]-)%)%.", function(x) return b64.encode_base64url(x) end) return s end local function email(profile) return profile.e end local function name(profile) return profile.n end local function user(profile) return profile.u end return { build_profile = build_profile, deserialize = deserialize, -- TODO: test serialize = serialize, -- TODO: test email = email, format = format, name = name, user = user, }