2023-09-26 10:10:18 +00:00
.PHONY : gen dev -reset all clean test web website
.SHELLFLAGS += ${ SHELLFLAGS } -e
2021-05-11 18:02:17 +00:00
PWD = $( shell pwd )
2021-05-16 21:14:51 +00:00
UID = $( shell id -u)
GID = $( shell id -g)
2021-08-23 08:09:56 +00:00
NPM_VERSION = $( shell python -m scripts.npm_version)
2023-04-18 11:28:19 +00:00
PY_SOURCES = authentik tests scripts lifecycle
2023-09-26 10:10:18 +00:00
DOCKER_IMAGE ?= "authentik:test"
pg_user := $( shell python -m authentik.lib.config postgresql.user 2>/dev/null)
pg_host := $( shell python -m authentik.lib.config postgresql.host 2>/dev/null)
pg_name := $( shell python -m authentik.lib.config postgresql.name 2>/dev/null)
2021-05-11 18:02:17 +00:00
2023-03-23 23:24:55 +00:00
CODESPELL_ARGS = -D - -D .github/codespell-dictionary.txt \
-I .github/codespell-words.txt \
-S 'web/src/locales/**' \
authentik \
internal \
cmd \
web/src \
website/src \
website/blog \
website/developer-docs \
website/docs \
website/integrations \
website/src
2023-09-26 10:10:18 +00:00
all : lint -fix lint test gen web ## Lint, build, and test everything
web: laying the groundwork for future expansion (#7045)
* web: laying the groundwork for future expansion
This commit is a hodge-podge of updates and changes to the web. Functional changes:
- Makefile: Fixed a bug in the `help` section that prevented the WIDTH from being accurately
calculated if `help` was included rather than in-lined.
- ESLint: Modified the "unused vars" rule so that variables starting with an underline are not
considered by the rule. This allows for elided variables in event handlers. It's not a perfect
solution-- a better one would be to use Typescript's function-specialization typing, but there are
too many places where we elide or ignore some variables in a function's usage that switching over
to specialization would be a huge lift.
- locale: It turns out, lit-locale does its own context management. We don't need to have a context
at all in this space, and that's one less listener we need to attach t othe DOM.
- ModalButton: A small thing, but using `nothing` instead of "html``" allows lit better control over
rendering and reduces the number of actual renders of the page.
- FormGroup: Provided a means to modify the aria-label, rather than stick with the just the word
"Details." Specializing this field will both help users of screen readers in the future, and will
allow test suites to find specific form groups now.
- RadioButton: provide a more consistent interface to the RadioButton. First, we dispatch the
events to the outside world, and we set the value locally so that the current `Form.ts` continues
to behave as expected. We also prevent the "button lost value" event from propagating; this
presents a unified select-like interface to users of the RadioButtonGroup. The current value
semantics are preserved; other clients of the RadioButton do not see a change in behavior.
- EventEmitter: If the custom event detail is *not* an object, do not use the object-like semantics
for forwarding it; just send it as-is.
- Comments: In the course of laying the groundwork for the application wizard, I throw a LOT of
comments into the code, describing APIs, interfaces, class and function signatures, to better
document the behavior inside and as signposts for future work.
* web: permit arrays to be sent in custom events without interpolation.
* actually use assignValue or rather serializeFieldRecursive
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
---------
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Jens Langhammer <jens@goauthentik.io>
2023-10-02 20:33:27 +00:00
HELP_WIDTH := $( shell grep -h '^[a-z][^ ]*:.*\#\#' $( MAKEFILE_LIST) 2>/dev/null | \
cut -d':' -f1 | awk '{printf "%d\n", length}' | sort -rn | head -1)
2023-09-26 10:10:18 +00:00
help : ## Show this help
@echo "\nSpecify a command. The choices are:\n"
web: laying the groundwork for future expansion (#7045)
* web: laying the groundwork for future expansion
This commit is a hodge-podge of updates and changes to the web. Functional changes:
- Makefile: Fixed a bug in the `help` section that prevented the WIDTH from being accurately
calculated if `help` was included rather than in-lined.
- ESLint: Modified the "unused vars" rule so that variables starting with an underline are not
considered by the rule. This allows for elided variables in event handlers. It's not a perfect
solution-- a better one would be to use Typescript's function-specialization typing, but there are
too many places where we elide or ignore some variables in a function's usage that switching over
to specialization would be a huge lift.
- locale: It turns out, lit-locale does its own context management. We don't need to have a context
at all in this space, and that's one less listener we need to attach t othe DOM.
- ModalButton: A small thing, but using `nothing` instead of "html``" allows lit better control over
rendering and reduces the number of actual renders of the page.
- FormGroup: Provided a means to modify the aria-label, rather than stick with the just the word
"Details." Specializing this field will both help users of screen readers in the future, and will
allow test suites to find specific form groups now.
- RadioButton: provide a more consistent interface to the RadioButton. First, we dispatch the
events to the outside world, and we set the value locally so that the current `Form.ts` continues
to behave as expected. We also prevent the "button lost value" event from propagating; this
presents a unified select-like interface to users of the RadioButtonGroup. The current value
semantics are preserved; other clients of the RadioButton do not see a change in behavior.
- EventEmitter: If the custom event detail is *not* an object, do not use the object-like semantics
for forwarding it; just send it as-is.
- Comments: In the course of laying the groundwork for the application wizard, I throw a LOT of
comments into the code, describing APIs, interfaces, class and function signatures, to better
document the behavior inside and as signposts for future work.
* web: permit arrays to be sent in custom events without interpolation.
* actually use assignValue or rather serializeFieldRecursive
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
---------
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Jens Langhammer <jens@goauthentik.io>
2023-10-02 20:33:27 +00:00
@grep -Eh '^[0-9a-zA-Z_-]+:.*?## .*$$' $( MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[0;36m%-$(HELP_WIDTH)s \033[m %s\n", $$1, $$2}' | \
2023-09-26 10:10:18 +00:00
sort
@echo ""
2020-09-02 22:04:12 +00:00
2022-01-24 19:50:13 +00:00
test-go :
2022-01-24 20:41:15 +00:00
go test -timeout 0 -v -race -cover ./...
2022-01-24 19:50:13 +00:00
2023-09-26 10:10:18 +00:00
test-docker : ## Run all tests in a docker-compose
2022-05-07 19:22:33 +00:00
echo " PG_PASS= $( openssl rand -base64 32) " >> .env
echo " AUTHENTIK_SECRET_KEY= $( openssl rand -base64 32) " >> .env
docker-compose pull -q
docker-compose up --no-start
docker-compose start postgresql redis
2023-09-26 10:10:18 +00:00
docker-compose run -u root server test-all
2022-05-07 19:22:33 +00:00
rm -f .env
2023-09-26 10:10:18 +00:00
test : ## Run the server tests and produce a coverage report (locally)
2024-01-11 13:57:57 +00:00
coverage run manage.py test --keepdb --failfast authentik
2020-09-02 22:04:12 +00:00
coverage html
coverage report
2023-09-26 10:10:18 +00:00
lint-fix : ## Lint and automatically fix errors in the python source code. Reports spelling errors.
2023-10-19 15:52:27 +00:00
isort $( PY_SOURCES)
black $( PY_SOURCES)
2023-12-30 20:33:14 +00:00
ruff --fix $( PY_SOURCES)
2023-03-23 23:24:55 +00:00
codespell -w $( CODESPELL_ARGS)
2020-09-02 22:04:12 +00:00
2023-09-26 10:10:18 +00:00
lint : ## Lint the python and golang sources
2023-04-18 11:28:19 +00:00
bandit -r $( PY_SOURCES) -x node_modules
2023-10-16 15:31:50 +00:00
./web/node_modules/.bin/pyright $( PY_SOURCES)
pylint $( PY_SOURCES)
2021-12-22 09:33:21 +00:00
golangci-lint run -v
2020-09-02 22:04:12 +00:00
2023-09-26 10:10:18 +00:00
migrate : ## Run the Authentik Django server's migrations
2022-09-11 21:01:26 +00:00
python -m lifecycle.migrate
2023-09-26 10:10:18 +00:00
i18n-extract : i 18n -extract -core web -i 18n -extract ## Extract strings that require translation into files to send to a translation service
2021-11-19 09:20:31 +00:00
i18n-extract-core :
2022-08-05 06:39:00 +00:00
ak makemessages --ignore web --ignore internal --ignore web --ignore web-api --ignore website -l en
2021-10-09 18:07:28 +00:00
2023-09-26 10:10:18 +00:00
install : web -install website -install ## Install all requires dependencies for `web`, `website` and `core`
poetry install
dev-drop-db :
web: package up horizontal elements into their own components (#7053)
* web: laying the groundwork for future expansion
This commit is a hodge-podge of updates and changes to the web. Functional changes:
- Makefile: Fixed a bug in the `help` section that prevented the WIDTH from being accurately
calculated if `help` was included rather than in-lined.
- ESLint: Modified the "unused vars" rule so that variables starting with an underline are not
considered by the rule. This allows for elided variables in event handlers. It's not a perfect
solution-- a better one would be to use Typescript's function-specialization typing, but there are
too many places where we elide or ignore some variables in a function's usage that switching over
to specialization would be a huge lift.
- locale: It turns out, lit-locale does its own context management. We don't need to have a context
at all in this space, and that's one less listener we need to attach t othe DOM.
- ModalButton: A small thing, but using `nothing` instead of "html``" allows lit better control over
rendering and reduces the number of actual renders of the page.
- FormGroup: Provided a means to modify the aria-label, rather than stick with the just the word
"Details." Specializing this field will both help users of screen readers in the future, and will
allow test suites to find specific form groups now.
- RadioButton: provide a more consistent interface to the RadioButton. First, we dispatch the
events to the outside world, and we set the value locally so that the current `Form.ts` continues
to behave as expected. We also prevent the "button lost value" event from propagating; this
presents a unified select-like interface to users of the RadioButtonGroup. The current value
semantics are preserved; other clients of the RadioButton do not see a change in behavior.
- EventEmitter: If the custom event detail is *not* an object, do not use the object-like semantics
for forwarding it; just send it as-is.
- Comments: In the course of laying the groundwork for the application wizard, I throw a LOT of
comments into the code, describing APIs, interfaces, class and function signatures, to better
document the behavior inside and as signposts for future work.
* web: permit arrays to be sent in custom events without interpolation.
* actually use assignValue or rather serializeFieldRecursive
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
* web: package up horizontal elements into their own components.
This commit introduces a number of "components." Jens has this idiom:
```
<ak-form-element-horizontal label=${msg("Name")} name="name" ?required=${true}>
<input
type="text"
value="${ifDefined(this.instance?.name)}"
class="pf-c-form-control"
required
/>
</ak-form-element-horizontal>
```
It's a very web-oriented idiom in that it's built out of two building blocks, the "element-horizontal" descriptor,
and the input object itself. This idiom is repeated a lot throughout the code. As an alternative, let's wrap
everything into an inheritable interface:
```
<ak-text-input
name="name"
label=${msg("Name")}
value="${ifDefined(this.instance?.name)}
required
>
</ak-text-input>
```
This preserves all the information of the above, makes it much clearer what kind of interaction we're having
(sometimes the `type=` information in an input is lost or easily missed), and while it does require you know
that there are provided components rather than the pair of layout-behavior as in the original it also gives
the developer more precision over the look and feel of the components.
*Right now* these components are placed into the LightDOM, as they are in the existing source code, because
the Form handler has a need to be able to "peer into" the "element-horizontal" component to find the values
of the input objects. In a future revision I hope to place the burden of type/value processing onto the
input objects themselves such that the form handler will need only look for the `.value` of the associated
input control.
Other fixes:
- update the FlowSearch() such that it actually emits an input event when its value changes.
- Disable the storybook shortcuts; on Chrome, at least, they get confused with simple inputs
- Fix an issue with precommit to not scan any Python with ESLint! :-)
* web: provide storybook stories for the components
This commit provides storybook stories for the ak-horizontal-element wrappers. A few
bugs were found along the way, including one rather nasty one from Radio where we
were still getting the "set/unset" pair in the wrong order, so I had to knuckle down
and fix the event handler properly.
* web: test oauth2 provider "guinea pig" for new components
I used the Oauth2 provider page as my experiment in seeing if the
horizontal-element wrappers could be used instead of the raw wrappers
themselves, and I wanted to make sure a test existed that asserts
that filling out THAT form in the ProvidersList and ProvidersForm
didn't break anything.
This commit updates the WDIO tests to do just that; the test is
simple, but it does exercise the `name` field of the Provider,
something not needed in the Wizard because it's set automatically
based on the Application name, and it even asserts that the new
Provider exists in the list of available Providers when it's done.
* web: making sure ESlint and Prettier are happy
* "fix" lint
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
---------
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Jens Langhammer <jens@goauthentik.io>
2023-10-04 20:07:52 +00:00
dropdb -U ${ pg_user } -h ${ pg_host } ${ pg_name }
2023-09-26 10:10:18 +00:00
# Also remove the test-db if it exists
dropdb -U ${ pg_user } -h ${ pg_host } test_${ pg_name } || true
2023-10-04 23:04:55 +00:00
redis-cli -n 0 flushall
2023-09-26 10:10:18 +00:00
dev-create-db :
createdb -U ${ pg_user } -h ${ pg_host } ${ pg_name }
dev-reset : dev -drop -db dev -create -db migrate ## Drop and restore the Authentik PostgreSQL instance to a "fresh install" state.
2022-09-11 21:01:26 +00:00
#########################
## API Schema
#########################
2023-09-26 10:10:18 +00:00
gen-build : ## Extract the schema from the database
2022-08-05 06:39:00 +00:00
AUTHENTIK_DEBUG = true ak make_blueprint_schema > blueprints/schema.json
AUTHENTIK_DEBUG = true ak spectacular --file schema.yml
2021-05-16 19:07:01 +00:00
2023-09-26 10:10:18 +00:00
gen-changelog : ## (Release) generate the changelog based from the commits since the last tag
2023-03-28 10:05:44 +00:00
git log --pretty= format:" - %s" $( shell git describe --tags $( shell git rev-list --tags --max-count= 1) ) ...$( shell git branch --show-current) | sort > changelog.md
2023-04-13 12:11:46 +00:00
npx prettier --write changelog.md
2023-03-28 10:05:44 +00:00
2023-09-26 10:10:18 +00:00
gen-diff : ## (Release) generate the changelog diff between the current schema and the last tag
2023-03-28 10:05:44 +00:00
git show $( shell git describe --tags $( shell git rev-list --tags --max-count= 1) ) :schema.yml > old_schema.yml
2022-09-11 21:01:26 +00:00
docker run \
--rm -v ${ PWD } :/local \
--user ${ UID } :${ GID } \
2023-04-01 16:10:52 +00:00
docker.io/openapitools/openapi-diff:2.1.0-beta.6 \
2022-09-11 21:01:26 +00:00
--markdown /local/diff.md \
/local/old_schema.yml /local/schema.yml
rm old_schema.yml
2023-11-06 14:12:23 +00:00
sed -i 's/{/{/g' diff.md
sed -i 's/}/}/g' diff.md
2023-04-13 12:11:46 +00:00
npx prettier --write diff.md
2022-09-11 21:01:26 +00:00
2023-12-27 11:37:03 +00:00
gen-clean-ts : ## Remove generated API client for Typescript
2023-12-18 21:07:59 +00:00
rm -rf gen-ts-api/
rm -rf web/node_modules/@goauthentik/api/
2021-05-20 20:06:55 +00:00
2023-12-27 11:37:03 +00:00
gen-clean-go : ## Remove generated API client for Go
rm -rf gen-go-api/
gen-clean : gen -clean -ts gen -clean -go ## Remove generated API clients
gen-client-ts : gen -clean -ts ## Build and install the authentik API for Typescript into the authentik UI Application
2021-05-11 18:02:17 +00:00
docker run \
--rm -v ${ PWD } :/local \
2021-05-16 21:14:51 +00:00
--user ${ UID } :${ GID } \
2023-04-01 16:10:52 +00:00
docker.io/openapitools/openapi-generator-cli:v6.5.0 generate \
2021-05-15 21:57:28 +00:00
-i /local/schema.yml \
2021-05-11 18:02:17 +00:00
-g typescript-fetch \
2022-05-08 14:48:53 +00:00
-o /local/gen-ts-api \
2022-10-21 07:08:25 +00:00
-c /local/scripts/api-ts-config.yaml \
--additional-properties= npmVersion = ${ NPM_VERSION } \
2022-09-14 22:05:21 +00:00
--git-repo-id authentik \
--git-user-id goauthentik
2021-08-23 08:32:37 +00:00
mkdir -p web/node_modules/@goauthentik/api
2022-05-08 14:48:53 +00:00
cd gen-ts-api && npm i
2022-06-30 20:18:21 +00:00
\c p -rfv gen-ts-api/* web/node_modules/@goauthentik/api
2020-09-10 14:58:25 +00:00
2023-12-27 11:37:03 +00:00
gen-client-go : gen -clean -go ## Build and install the authentik API for Golang
2023-04-01 16:10:52 +00:00
mkdir -p ./gen-go-api ./gen-go-api/templates
wget https://raw.githubusercontent.com/goauthentik/client-go/main/config.yaml -O ./gen-go-api/config.yaml
wget https://raw.githubusercontent.com/goauthentik/client-go/main/templates/README.mustache -O ./gen-go-api/templates/README.mustache
wget https://raw.githubusercontent.com/goauthentik/client-go/main/templates/go.mod.mustache -O ./gen-go-api/templates/go.mod.mustache
cp schema.yml ./gen-go-api/
2021-05-16 19:07:01 +00:00
docker run \
2023-04-01 16:10:52 +00:00
--rm -v ${ PWD } /gen-go-api:/local \
2021-05-16 21:14:51 +00:00
--user ${ UID } :${ GID } \
2023-04-01 16:10:52 +00:00
docker.io/openapitools/openapi-generator-cli:v6.5.0 generate \
2021-05-16 19:07:01 +00:00
-i /local/schema.yml \
-g go \
2023-04-01 16:10:52 +00:00
-o /local/ \
2021-11-05 09:37:30 +00:00
-c /local/config.yaml
2022-05-08 14:48:53 +00:00
go mod edit -replace goauthentik.io/api/v3= ./gen-go-api
2023-04-01 16:10:52 +00:00
rm -rf ./gen-go-api/config.yaml ./gen-go-api/templates/
2021-05-16 19:07:01 +00:00
2023-09-26 10:10:18 +00:00
gen-dev-config : ## Generate a local development config file
2022-08-01 21:05:58 +00:00
python -m scripts.generate_config
2023-12-27 11:37:03 +00:00
gen : gen -build gen -client -ts
2021-11-18 20:01:58 +00:00
2022-05-10 19:05:22 +00:00
#########################
## Web
#########################
2021-12-06 20:13:04 +00:00
2023-09-26 10:10:18 +00:00
web-build : web -install ## Build the Authentik UI
2022-06-05 21:26:08 +00:00
cd web && npm run build
2023-09-26 10:10:18 +00:00
web : web -lint -fix web -lint web -check -compile web -i 18n -extract ## Automatically fix formatting issues in the Authentik UI source code, lint the code, and compile it
2021-11-18 20:01:58 +00:00
2023-09-26 10:10:18 +00:00
web-install : ## Install the necessary libraries to build the Authentik UI
2022-05-10 19:05:22 +00:00
cd web && npm ci
2023-09-26 10:10:18 +00:00
web-watch : ## Build and watch the Authentik UI for changes, updating automatically
2022-06-25 22:46:40 +00:00
rm -rf web/dist/
mkdir web/dist/
touch web/dist/.gitkeep
2022-05-10 19:05:22 +00:00
cd web && npm run watch
2023-09-26 10:10:18 +00:00
web-storybook-watch : ## Build and run the storybook documentation server
2023-08-03 15:27:58 +00:00
cd web && npm run storybook
2021-11-18 20:01:58 +00:00
web-lint-fix :
cd web && npm run prettier
web-lint :
cd web && npm run lint
2023-08-30 10:46:58 +00:00
cd web && npm run lit-analyse
2021-11-19 09:20:31 +00:00
2023-01-01 22:32:05 +00:00
web-check-compile :
cd web && npm run tsc
2023-06-06 10:32:32 +00:00
web-i18n-extract :
2023-06-12 13:41:44 +00:00
cd web && npm run extract-locales
2021-11-21 21:47:10 +00:00
2022-05-10 19:05:22 +00:00
#########################
## Website
#########################
2023-09-26 10:10:18 +00:00
website : website -lint -fix website -build ## Automatically fix formatting issues in the Authentik website/docs source code, lint the code, and compile it
2022-05-10 19:05:22 +00:00
website-install :
cd website && npm ci
website-lint-fix :
cd website && npm run prettier
2022-10-18 19:38:01 +00:00
website-build :
cd website && npm run build
2023-09-26 10:10:18 +00:00
website-watch : ## Build and watch the documentation website, updating automatically
2022-05-10 19:05:22 +00:00
cd website && npm run watch
2023-09-13 13:00:51 +00:00
#########################
## Docker
#########################
2023-09-26 10:10:18 +00:00
docker : ## Build a docker image of the current source tree
DOCKER_BUILDKIT = 1 docker build . --progress plain --tag ${ DOCKER_IMAGE }
2023-09-13 13:00:51 +00:00
#########################
## CI
#########################
2021-11-21 21:47:10 +00:00
# These targets are use by GitHub actions to allow usage of matrix
# which makes the YAML File a lot smaller
2023-09-13 13:00:51 +00:00
2021-12-24 22:25:38 +00:00
ci--meta-debug :
python -V
node --version
ci-pylint : ci --meta -debug
2022-09-06 22:23:25 +00:00
pylint $( PY_SOURCES)
2021-11-21 21:47:10 +00:00
2021-12-24 22:25:38 +00:00
ci-black : ci --meta -debug
2022-09-06 22:23:25 +00:00
black --check $( PY_SOURCES)
2021-11-21 21:47:10 +00:00
2023-04-18 11:28:19 +00:00
ci-ruff : ci --meta -debug
ruff check $( PY_SOURCES)
2023-03-23 23:24:55 +00:00
ci-codespell : ci --meta -debug
codespell $( CODESPELL_ARGS) -s
2021-12-24 22:25:38 +00:00
ci-isort : ci --meta -debug
2022-09-06 22:23:25 +00:00
isort --check $( PY_SOURCES)
2021-11-21 21:47:10 +00:00
2021-12-24 22:25:38 +00:00
ci-bandit : ci --meta -debug
2022-09-06 22:23:25 +00:00
bandit -r $( PY_SOURCES)
2021-11-21 21:47:10 +00:00
2021-12-24 22:25:38 +00:00
ci-pyright : ci --meta -debug
2022-09-06 22:23:25 +00:00
./web/node_modules/.bin/pyright $( PY_SOURCES)
2021-12-03 09:05:21 +00:00
2021-12-24 22:25:38 +00:00
ci-pending-migrations : ci --meta -debug
2022-08-05 06:39:00 +00:00
ak makemigrations --check