From a04246cddc07f91031a57696b319b0862721718f Mon Sep 17 00:00:00 2001 From: tijl Date: Wed, 21 Aug 2024 15:43:24 +0200 Subject: [PATCH] updates --- .air.toml | 4 +- cmd/server/main.go | 16 ++++- go.mod | 19 +++-- go.sum | 72 +++++++++++++++++-- internal/assets/svg.go | 2 +- internal/config/config.go | 20 ++---- internal/db/db.go | 51 +++++++++++++ internal/i18n/i18n.go | 2 +- internal/oidc/callback.go | 17 +++++ internal/oidc/handler.go | 53 ++++++++++++++ internal/oidc/oidc.go | 39 +++++++++- internal/utils/random.go | 15 ++++ ...1_init.down.sql => 00000001_init.down.sql} | 0 migrations/00000002_analytics.up.sql | 0 modules/{db => database}/db.go | 2 +- modules/{db => database}/models.go | 2 +- modules/{db => database}/sessions.sql | 0 modules/{db => database}/sessions.sql.go | 2 +- modules/{db => database}/users.sql | 0 modules/{db => database}/users.sql.go | 2 +- sqlc.yaml | 6 +- tailwind.config.js => tailwind.config.ts | 0 views/partials/menu.html | 2 +- vite.config.js => vite.config.ts | 20 ++---- 24 files changed, 290 insertions(+), 56 deletions(-) create mode 100644 internal/db/db.go create mode 100644 internal/oidc/callback.go create mode 100644 internal/oidc/handler.go create mode 100644 internal/utils/random.go rename migrations/{0000001_init.down.sql => 00000001_init.down.sql} (100%) create mode 100644 migrations/00000002_analytics.up.sql rename modules/{db => database}/db.go (97%) rename modules/{db => database}/models.go (97%) rename modules/{db => database}/sessions.sql (100%) rename modules/{db => database}/sessions.sql.go (99%) rename modules/{db => database}/users.sql (100%) rename modules/{db => database}/users.sql.go (99%) rename tailwind.config.js => tailwind.config.ts (100%) rename vite.config.js => vite.config.ts (52%) diff --git a/.air.toml b/.air.toml index 07c42bd..b38a4f0 100644 --- a/.air.toml +++ b/.air.toml @@ -5,10 +5,10 @@ tmp_dir = ".air-tmp" bin = "./tijl.dev" cmd = "just build" delay = 1000 - exclude_dir = ["node_modules","modules/db","static/js","static/css"] + exclude_dir = ["node_modules","modules/database","static/js","static/css"] exclude_unchanged = false follow_symlink = false - include_ext = ["go", "html"] + include_ext = ["go", "html", "js", "ts"] kill_delay = "0s" log = "build-errors.log" send_interrupt = false diff --git a/cmd/server/main.go b/cmd/server/main.go index 0ab9f83..69d8e9e 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -1,11 +1,14 @@ package main import ( + "context" "net/http" "git.tijl.dev/tijl/tijl.dev/internal/assets" "git.tijl.dev/tijl/tijl.dev/internal/config" + "git.tijl.dev/tijl/tijl.dev/internal/db" "git.tijl.dev/tijl/tijl.dev/internal/i18n" + "git.tijl.dev/tijl/tijl.dev/internal/oidc" "git.tijl.dev/tijl/tijl.dev/modules/logger" "git.tijl.dev/tijl/tijl.dev/static" "git.tijl.dev/tijl/tijl.dev/views" @@ -16,17 +19,23 @@ import ( ) func main() { + // Load initial context + ctx := context.Background() // Load config config.Load() + // Load database + db.Load() + + // Setup oidc + oidc.Load(ctx) + // Load assets assets.Load() // Load translations i18n.Load() - // Todo load db, migrations and plugins - // Init templating engine engine := html.NewFileSystem(http.FS(views.Embed), ".html") engine.AddFunc("icon", assets.Svg) @@ -79,6 +88,9 @@ func main() { return nil }) + app.Get("/login", oidc.HandleRedirect) + app.Get(config.Config.Oidc.CallbackUrl, oidc.HandleCallback) + // Static routes app.Use("/static", filesystem.New(filesystem.Config{ Root: http.FS(static.Embed), diff --git a/go.mod b/go.mod index eda027a..d560d57 100644 --- a/go.mod +++ b/go.mod @@ -4,31 +4,42 @@ go 1.22.5 require ( github.com/coreos/go-oidc/v3 v3.11.0 + github.com/gofiber/contrib/fiberzerolog v1.0.2 github.com/gofiber/fiber/v2 v2.52.5 github.com/gofiber/template/html/v2 v2.1.2 - github.com/mikhail-bigun/fiberlogrus v0.1.3 + github.com/golang-migrate/migrate/v4 v4.17.1 + github.com/jackc/pgx/v5 v5.6.0 github.com/rs/zerolog v1.33.0 - github.com/sirupsen/logrus v1.9.3 github.com/sqlc-dev/pqtype v0.3.0 + golang.org/x/oauth2 v0.21.0 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/andybalholm/brotli v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.0.2 // indirect - github.com/gofiber/contrib/fiberzerolog v1.0.2 // indirect github.com/gofiber/template v1.8.3 // indirect github.com/gofiber/utils v1.1.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/klauspost/compress v1.17.9 // indirect + github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/rivo/uniseg v0.4.4 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.55.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect + go.uber.org/atomic v1.7.0 // indirect golang.org/x/crypto v0.25.0 // indirect - golang.org/x/oauth2 v0.21.0 // indirect + golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.22.0 // indirect + golang.org/x/text v0.16.0 // indirect ) diff --git a/go.sum b/go.sum index e5a2e68..3349829 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,26 @@ +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dhui/dktest v0.4.1 h1:/w+IWuDXVymg3IrRJCHHOkMK10m9aNVMOyD0X12YVTg= +github.com/dhui/dktest v0.4.1/go.mod h1:DdOqcUpL7vgyP4GlF3X3w7HbSlz8cEQzwewPveYEQbA= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= +github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk= github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -19,12 +34,37 @@ github.com/gofiber/template/html/v2 v2.1.2 h1:wkK/mYJ3nIhongTkG3t0QgV4ADdgOYJYVS github.com/gofiber/template/html/v2 v2.1.2/go.mod h1:E98Z/FzvpaSib06aWEgYk6GXNf3ctoyaJH8yW5ay5ak= github.com/gofiber/utils v1.1.0 h1:vdEBpn7AzIUJRhe+CiTOJdUcTg4Q9RK+pEa0KPbLdrM= github.com/gofiber/utils v1.1.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQmb2e0= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-migrate/migrate/v4 v4.17.1 h1:4zQ6iqL6t6AiItphxJctQb3cFqWiSpMnX7wLTPnnYO4= +github.com/golang-migrate/migrate/v4 v4.17.1/go.mod h1:m8hinFyWBn0SA4QKHuKh175Pm9wjmxj3S2Mia7dbXzM= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa h1:s+4MhCQ6YrzisK6hFJUX53drDT4UsSW3DEhKn0ifuHw= +github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= +github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -33,22 +73,30 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mikhail-bigun/fiberlogrus v0.1.3 h1:2aVtFSfMr/T8J2p4228TwV6txvUEOQxKlu5LpcKyym0= -github.com/mikhail-bigun/fiberlogrus v0.1.3/go.mod h1:Tt0FrmLd2maF8VSHsx1pfiWNRTrjyBrKfDA2JW5hvmY= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sqlc-dev/pqtype v0.3.0 h1:b09TewZ3cSnO5+M1Kqq05y0+OjqIptxELaSayg7bmqk= github.com/sqlc-dev/pqtype v0.3.0/go.mod h1:oyUjp5981ctiL9UYvj1bVvCKi8OXkCa0u645hce7CAs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= @@ -58,18 +106,30 @@ github.com/valyala/fasthttp v1.55.0 h1:Zkefzgt6a7+bVKHnu/YaYSOPfNYNisSVBo/unVCf8 github.com/valyala/fasthttp v1.55.0/go.mod h1:NkY9JtkrpPKmgwV3HTaS2HWaJss9RSIsRVfcxxoHiOM= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/assets/svg.go b/internal/assets/svg.go index b65e6fc..fcdf5b4 100644 --- a/internal/assets/svg.go +++ b/internal/assets/svg.go @@ -32,7 +32,7 @@ func loadSVGs() { SVGData[key] = string(data) } - log.Debug().Msg("Loaded SVG files") + log.Debug().Msg("loaded svg files") } func Svg(name string) template.HTML { diff --git a/internal/config/config.go b/internal/config/config.go index 5ae463f..5933926 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -29,23 +29,15 @@ func Load() { } type ConfigType struct { - UrlBase string `yaml:"url_base"` - DB `yaml:"database"` - Oidc `yaml:"oidc"` -} - -type DB struct { - User string `yaml:"user"` - Passsword string `yaml:"password"` - Database string `yaml:"database"` - Host string `yaml:"host"` - Port int `yaml:"port"` - - UrlExtention string `yaml:"connection_url_extention"` + UrlBase string `yaml:"url_base"` + JsonLogging bool `yaml:"log_json"` + DB string `yaml:"database"` + Oidc `yaml:"oidc"` } type Oidc struct { ClientID string `yaml:"client_id"` ClientSecret string `yaml:"client_secret"` - Issuer string `yaml:"issuer"` + Provider string `yaml:"issuer"` + CallbackUrl string `yaml:"callback_url"` } diff --git a/internal/db/db.go b/internal/db/db.go new file mode 100644 index 0000000..287f57d --- /dev/null +++ b/internal/db/db.go @@ -0,0 +1,51 @@ +package db + +import ( + "database/sql" + "errors" + + "git.tijl.dev/tijl/tijl.dev/internal/config" + "git.tijl.dev/tijl/tijl.dev/migrations" + dbmanager "git.tijl.dev/tijl/tijl.dev/modules/database" + log "git.tijl.dev/tijl/tijl.dev/modules/logger" + "github.com/golang-migrate/migrate/v4" + "github.com/golang-migrate/migrate/v4/database/pgx/v5" + "github.com/golang-migrate/migrate/v4/source/iofs" + _ "github.com/jackc/pgx/v5/stdlib" +) + +var DB *sql.DB +var Queries *dbmanager.Queries + +func Load() { + var err error + DB, err = sql.Open("pgx", config.Config.DB) + if err != nil { + log.Fatal().Err(err).Msg("failed to connect to database") + } + defer DB.Close() + Queries = dbmanager.New(DB) + log.Debug().Msg("connected to database") + + /* + Migrate + */ + driver, err := pgx.WithInstance(DB, &pgx.Config{}) + if err != nil { + log.Fatal().Err(err).Msg("failed to get database driver for migration") + } + source, err := iofs.New(migrations.Embed, ".") + if err != nil { + log.Fatal().Err(err).Msg("failed to get migrations source") + } + m, err := migrate.NewWithInstance("iofs", source, "pgx", driver) + if err != nil { + log.Fatal().Err(err).Msg("failed to initialize migration") + } + migerr := m.Up() + if (migerr != nil) && (!errors.Is(migerr, migrate.ErrNoChange)) { + log.Fatal().Err(migerr).Msg("failed to run migrations") + } + log.Debug().Msg("migrated database") + +} diff --git a/internal/i18n/i18n.go b/internal/i18n/i18n.go index 7b31cb0..1f6b088 100644 --- a/internal/i18n/i18n.go +++ b/internal/i18n/i18n.go @@ -41,7 +41,7 @@ func Load() { translations[lang] = messages } - log.Debug().Msg("Loaded translations") + log.Debug().Msg("loaded translations") } func Translate(c *fiber.Ctx, key string) string { diff --git a/internal/oidc/callback.go b/internal/oidc/callback.go new file mode 100644 index 0000000..1e7a926 --- /dev/null +++ b/internal/oidc/callback.go @@ -0,0 +1,17 @@ +package oidc + +import ( + "time" + + "github.com/gofiber/fiber/v2" +) + +func setCallbackCookie(c *fiber.Ctx, name, value string) { + c.Cookie(&fiber.Cookie{ + Name: name, + Value: value, + MaxAge: int(time.Hour.Seconds()), + Secure: true, + HTTPOnly: true, + }) +} diff --git a/internal/oidc/handler.go b/internal/oidc/handler.go new file mode 100644 index 0000000..58fdb9e --- /dev/null +++ b/internal/oidc/handler.go @@ -0,0 +1,53 @@ +package oidc + +import ( + "context" + "errors" + "net/http" + + "git.tijl.dev/tijl/tijl.dev/internal/utils" + log "git.tijl.dev/tijl/tijl.dev/modules/logger" + "github.com/gofiber/fiber/v2" + "golang.org/x/oauth2" +) + +func HandleRedirect(c *fiber.Ctx) error { + state, err := utils.RandString(16) + if err != nil { + return err + } + setCallbackCookie(c, "state", state) + return c.Redirect(Config.AuthCodeURL(state), http.StatusFound) +} + +func HandleCallback(c *fiber.Ctx) error { + ctx := context.Background() + state := c.Cookies("state") + if c.Query("state") != state { + return errors.New("invalid state") + } + + oauth2Token, err := Config.Exchange(ctx, c.Query("code")) + if err != nil { + return err + } + rawIDToken, ok := oauth2Token.Extra("id_token").(string) + if !ok { + return err + } + idToken, err := Verifier.Verify(ctx, rawIDToken) + if err != nil { + return err + } + + userInfo, err := Provider.UserInfo(ctx, oauth2.StaticTokenSource(oauth2Token)) + if err != nil { + return err + } + + log.Debug().Interface("userInfo", userInfo).Interface("idToken", idToken).Msg("data") + + // now we can create a user account and session in the db + + return c.Redirect("/") +} diff --git a/internal/oidc/oidc.go b/internal/oidc/oidc.go index f659050..9899c04 100644 --- a/internal/oidc/oidc.go +++ b/internal/oidc/oidc.go @@ -1,8 +1,41 @@ package oidc -func Setup() { -} +import ( + "context" -func Login() { + "git.tijl.dev/tijl/tijl.dev/internal/config" + log "git.tijl.dev/tijl/tijl.dev/modules/logger" + "github.com/coreos/go-oidc/v3/oidc" + "golang.org/x/oauth2" +) +var Config *oauth2.Config +var Provider *oidc.Provider +var Verifier *oidc.IDTokenVerifier + +func Load(ctx context.Context) { + var err error + Provider, err = oidc.NewProvider(ctx, config.Config.Oidc.Provider) + if err != nil { + log.Fatal().Err(err).Msg("failed to load oidc") + } + + oidcConfig := &oidc.Config{ + ClientID: config.Config.ClientID, + } + + Config = &oauth2.Config{ + ClientID: config.Config.Oidc.ClientID, + ClientSecret: config.Config.Oidc.ClientSecret, + RedirectURL: config.Config.UrlBase + config.Config.Oidc.CallbackUrl, + + Endpoint: Provider.Endpoint(), + + Scopes: []string{oidc.ScopeOpenID, "profile", "email"}, + } + + Verifier = Provider.Verifier(oidcConfig) + + log.Debug().Msg("loaded oidc") + log.Debug().Interface("Config", Config).Msg("data") } diff --git a/internal/utils/random.go b/internal/utils/random.go new file mode 100644 index 0000000..d7c7684 --- /dev/null +++ b/internal/utils/random.go @@ -0,0 +1,15 @@ +package utils + +import ( + "crypto/rand" + "encoding/base64" + "io" +) + +func RandString(nByte int) (string, error) { + b := make([]byte, nByte) + if _, err := io.ReadFull(rand.Reader, b); err != nil { + return "", err + } + return base64.RawURLEncoding.EncodeToString(b), nil +} diff --git a/migrations/0000001_init.down.sql b/migrations/00000001_init.down.sql similarity index 100% rename from migrations/0000001_init.down.sql rename to migrations/00000001_init.down.sql diff --git a/migrations/00000002_analytics.up.sql b/migrations/00000002_analytics.up.sql new file mode 100644 index 0000000..e69de29 diff --git a/modules/db/db.go b/modules/database/db.go similarity index 97% rename from modules/db/db.go rename to modules/database/db.go index 41b7a34..dacb52e 100644 --- a/modules/db/db.go +++ b/modules/database/db.go @@ -2,7 +2,7 @@ // versions: // sqlc v1.27.0 -package db +package database import ( "context" diff --git a/modules/db/models.go b/modules/database/models.go similarity index 97% rename from modules/db/models.go rename to modules/database/models.go index c1d553e..18e81dd 100644 --- a/modules/db/models.go +++ b/modules/database/models.go @@ -2,7 +2,7 @@ // versions: // sqlc v1.27.0 -package db +package database import ( "database/sql" diff --git a/modules/db/sessions.sql b/modules/database/sessions.sql similarity index 100% rename from modules/db/sessions.sql rename to modules/database/sessions.sql diff --git a/modules/db/sessions.sql.go b/modules/database/sessions.sql.go similarity index 99% rename from modules/db/sessions.sql.go rename to modules/database/sessions.sql.go index c52f3fe..87b5b19 100644 --- a/modules/db/sessions.sql.go +++ b/modules/database/sessions.sql.go @@ -3,7 +3,7 @@ // sqlc v1.27.0 // source: sessions.sql -package db +package database import ( "context" diff --git a/modules/db/users.sql b/modules/database/users.sql similarity index 100% rename from modules/db/users.sql rename to modules/database/users.sql diff --git a/modules/db/users.sql.go b/modules/database/users.sql.go similarity index 99% rename from modules/db/users.sql.go rename to modules/database/users.sql.go index d7ccf1b..4f62e72 100644 --- a/modules/db/users.sql.go +++ b/modules/database/users.sql.go @@ -3,7 +3,7 @@ // sqlc v1.27.0 // source: users.sql -package db +package database import ( "context" diff --git a/sqlc.yaml b/sqlc.yaml index a525185..c612d69 100644 --- a/sqlc.yaml +++ b/sqlc.yaml @@ -1,10 +1,10 @@ version: "2" sql: - engine: "postgresql" - queries: "modules/db/*.sql" + queries: "modules/database/*.sql" schema: "migrations/*.sql" gen: go: - package: "db" - out: "modules/db/" + package: "database" + out: "modules/database/" sql_package: "database/sql" diff --git a/tailwind.config.js b/tailwind.config.ts similarity index 100% rename from tailwind.config.js rename to tailwind.config.ts diff --git a/views/partials/menu.html b/views/partials/menu.html index 58f9036..97b31a6 100644 --- a/views/partials/menu.html +++ b/views/partials/menu.html @@ -81,7 +81,7 @@ -
  • +
  • {{icon "login"}} diff --git a/vite.config.js b/vite.config.ts similarity index 52% rename from vite.config.js rename to vite.config.ts index 552e7d6..18c1c73 100644 --- a/vite.config.js +++ b/vite.config.ts @@ -13,22 +13,12 @@ export default defineConfig({ input: { interactive: "web/lib/index.ts", }, - onwarn: (entry, next) => { - if ( - entry.loc?.file && - /htmx\.esm\.js$/.test(entry.loc.file) && - /Use of eval in/.test(entry.message) - ) { - return; - } - return next(entry); - }, }, - server: { - port: 3001, - proxy: { - "/api": "http://localhost:3000", // Proxy API requests to the Go server - }, + }, + server: { + port: 3001, + proxy: { + "/api": "http://localhost:3000", }, }, });