chore(auth): new port offset calculation
This commit is contained in:
parent
3f5a22c85d
commit
bbeebc641e
64
.ports/assign.hs
Normal file
64
.ports/assign.hs
Normal file
@ -0,0 +1,64 @@
|
||||
-- SPDX-FileCopyrightText: 2024 David Mosbach <david.mosbach@uniworx.de>
|
||||
--
|
||||
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
{-# Language OverloadedStrings, LambdaCase, TypeApplications #-}
|
||||
|
||||
import Data.Text (Text)
|
||||
import qualified Data.Text as T
|
||||
import System.Directory
|
||||
import System.Environment
|
||||
import System.IO
|
||||
|
||||
main :: IO ()
|
||||
main = getArgs >>= \case
|
||||
["--assign", offsetFile] -> parseOffsets offsetFile >>= uncurry nextOffset
|
||||
["--remove", offset] -> removeOffset offset
|
||||
_ -> fail "unsupported args"
|
||||
|
||||
parseOffsets :: FilePath -> IO (Int,Int)
|
||||
parseOffsets offsetFile = do
|
||||
user <- T.pack <$> getEnv "USER"
|
||||
let pred x = "//" `T.isPrefixOf` x || T.null (T.strip x)
|
||||
tokenise = map (filter (not . pred) . T.lines) . T.split (=='#')
|
||||
extract = map tail . filter (\u -> not (null u) && user == (T.strip $ head u))
|
||||
((extract . tokenise . T.pack) <$> readFile offsetFile) >>= \case
|
||||
[[min,max]] -> return (read $ T.unpack min, read $ T.unpack max)
|
||||
x -> print x >> fail "malformed offset file"
|
||||
|
||||
nextOffset :: Int -> Int -> IO ()
|
||||
nextOffset min max
|
||||
| min > max = nextOffset max min
|
||||
| otherwise = do
|
||||
home <- getEnv "HOME"
|
||||
offset <- findFile [home] ".port-offsets" >>= \case
|
||||
Nothing -> writeFile (home ++ "/.port-offsets") (show min) >> return min
|
||||
Just path -> do
|
||||
used <- (map (read @Int) . filter (not . null) . lines) <$> readFile path
|
||||
o <- next min max used
|
||||
appendFile path ('\n' : show o)
|
||||
return o
|
||||
print offset
|
||||
where
|
||||
next :: Int -> Int -> [Int] -> IO Int
|
||||
next min max used
|
||||
| min > max = fail "all offsets currently in use"
|
||||
| min `elem` used = next (min+1) max used
|
||||
| otherwise = return min
|
||||
|
||||
removeOffset :: String -> IO ()
|
||||
removeOffset offset = do
|
||||
home <- getEnv "HOME"
|
||||
findFile [home] ".port-offsets" >>= \case
|
||||
Nothing -> fail "offset file does not exist"
|
||||
Just path -> do
|
||||
remaining <- (filter (/= offset) . lines) <$> readFile path
|
||||
run <- getEnv "XDG_RUNTIME_DIR"
|
||||
(tempPath, fh) <- openTempFile run ".port-offsets"
|
||||
let out = unlines remaining
|
||||
hPutStr fh $ out
|
||||
case T.null (T.strip $ T.pack out) of
|
||||
True -> removeFile path
|
||||
False -> writeFile path $ out
|
||||
removeFile tempPath
|
||||
|
||||
24
.ports/offsets
Normal file
24
.ports/offsets
Normal file
@ -0,0 +1,24 @@
|
||||
// SPDX-FileCopyrightText: 2024 David Mosbach <david.mosbach@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
# gkleen
|
||||
-1000
|
||||
-950
|
||||
|
||||
# ishka
|
||||
-949
|
||||
-899
|
||||
|
||||
# jost
|
||||
-898
|
||||
-848
|
||||
|
||||
# mosbach
|
||||
-847
|
||||
-797
|
||||
|
||||
# savau
|
||||
-796
|
||||
-746
|
||||
|
||||
@ -63,6 +63,7 @@ let
|
||||
type cleanup_maildev &>/dev/null && cleanup_maildev
|
||||
[[ -z "$OAUTH2_PGDIR" ]] || source ${killOauth2DB}/bin/killOauth2DB
|
||||
[[ -z "$OAUTH2_PGHOST" ]] || pkill oauth2-mock-ser
|
||||
[[ -z "$PORT_OFFSET" ]] || runghc .ports/assign.hs --remove $PORT_OFFSET
|
||||
|
||||
[ -f "''${basePath}/.develop.env" ] && rm -vf "''${basePath}/.develop.env"
|
||||
set +x
|
||||
@ -70,10 +71,13 @@ let
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
export PORT_OFFSET=$(((16#$(sha256sum <<<"$(hostname -f):''${basePath}" | head -c 16)) % 1000))
|
||||
export PORT_OFFSET=$(runghc .ports/assign.hs --assign .ports/offsets)
|
||||
# export PORT_OFFSET=$(((16#$(sha256sum <<<"$(hostname -f):''${basePath}" | head -c 16)) % 1000))
|
||||
|
||||
if [[ -z "$OAUTH2_PGHOST" ]]; then
|
||||
set -xe
|
||||
export OAUTH2_SERVER_PORT=$((9443 + $PORT_OFFSET))
|
||||
export OAUTH2_DB_PORT=$((9444 + $PORT_OFFSET))
|
||||
source ${mkOauth2DB}/bin/mkOauth2DB
|
||||
${oauth2MockServer}/bin/oauth2-mock-server&
|
||||
set +xe
|
||||
@ -300,8 +304,6 @@ in pkgs.mkShell {
|
||||
OAUTH2_HBA = oauth2Hba;
|
||||
OAUTH2_DB_SCHEMA = oauth2Schema;
|
||||
OAUTH2_TEST_USERS = ./test/Database/test-users.yaml;
|
||||
OAUTH2_SERVER_PORT = 9443;
|
||||
OAUTH2_DB_PORT = 9444;
|
||||
nativeBuildInputs = [develop inDevelop killallUni2work diffRunning]
|
||||
++ (with pkgs;
|
||||
[ stack nodejs-14_x postgresql_12 openldap exiftool memcached minio minio-client
|
||||
|
||||
Loading…
Reference in New Issue
Block a user