19 changed files with 890 additions and 0 deletions
-
247keycloak-dev/bin/Activate.ps1
-
69keycloak-dev/bin/activate
-
26keycloak-dev/bin/activate.csh
-
69keycloak-dev/bin/activate.fish
-
8keycloak-dev/bin/httpx
-
8keycloak-dev/bin/normalizer
-
8keycloak-dev/bin/pip
-
8keycloak-dev/bin/pip3
-
8keycloak-dev/bin/pip3.10
-
1keycloak-dev/bin/python
-
1keycloak-dev/bin/python3
-
1keycloak-dev/bin/python3.10
-
1keycloak-dev/lib64
-
3keycloak-dev/pyvenv.cfg
-
165keycloak-dev/share/doc/jwcrypto/LICENSE
-
48keycloak-dev/share/doc/jwcrypto/README.md
-
132src/keycloak/keycloak_admin.py
-
13src/keycloak/urls_patterns.py
-
74tests/test_orgs.py
@ -0,0 +1,247 @@ |
|||
<# |
|||
.Synopsis |
|||
Activate a Python virtual environment for the current PowerShell session. |
|||
|
|||
.Description |
|||
Pushes the python executable for a virtual environment to the front of the |
|||
$Env:PATH environment variable and sets the prompt to signify that you are |
|||
in a Python virtual environment. Makes use of the command line switches as |
|||
well as the `pyvenv.cfg` file values present in the virtual environment. |
|||
|
|||
.Parameter VenvDir |
|||
Path to the directory that contains the virtual environment to activate. The |
|||
default value for this is the parent of the directory that the Activate.ps1 |
|||
script is located within. |
|||
|
|||
.Parameter Prompt |
|||
The prompt prefix to display when this virtual environment is activated. By |
|||
default, this prompt is the name of the virtual environment folder (VenvDir) |
|||
surrounded by parentheses and followed by a single space (ie. '(.venv) '). |
|||
|
|||
.Example |
|||
Activate.ps1 |
|||
Activates the Python virtual environment that contains the Activate.ps1 script. |
|||
|
|||
.Example |
|||
Activate.ps1 -Verbose |
|||
Activates the Python virtual environment that contains the Activate.ps1 script, |
|||
and shows extra information about the activation as it executes. |
|||
|
|||
.Example |
|||
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv |
|||
Activates the Python virtual environment located in the specified location. |
|||
|
|||
.Example |
|||
Activate.ps1 -Prompt "MyPython" |
|||
Activates the Python virtual environment that contains the Activate.ps1 script, |
|||
and prefixes the current prompt with the specified string (surrounded in |
|||
parentheses) while the virtual environment is active. |
|||
|
|||
.Notes |
|||
On Windows, it may be required to enable this Activate.ps1 script by setting the |
|||
execution policy for the user. You can do this by issuing the following PowerShell |
|||
command: |
|||
|
|||
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser |
|||
|
|||
For more information on Execution Policies: |
|||
https://go.microsoft.com/fwlink/?LinkID=135170 |
|||
|
|||
#> |
|||
Param( |
|||
[Parameter(Mandatory = $false)] |
|||
[String] |
|||
$VenvDir, |
|||
[Parameter(Mandatory = $false)] |
|||
[String] |
|||
$Prompt |
|||
) |
|||
|
|||
<# Function declarations --------------------------------------------------- #> |
|||
|
|||
<# |
|||
.Synopsis |
|||
Remove all shell session elements added by the Activate script, including the |
|||
addition of the virtual environment's Python executable from the beginning of |
|||
the PATH variable. |
|||
|
|||
.Parameter NonDestructive |
|||
If present, do not remove this function from the global namespace for the |
|||
session. |
|||
|
|||
#> |
|||
function global:deactivate ([switch]$NonDestructive) { |
|||
# Revert to original values |
|||
|
|||
# The prior prompt: |
|||
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { |
|||
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt |
|||
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT |
|||
} |
|||
|
|||
# The prior PYTHONHOME: |
|||
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { |
|||
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME |
|||
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME |
|||
} |
|||
|
|||
# The prior PATH: |
|||
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { |
|||
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH |
|||
Remove-Item -Path Env:_OLD_VIRTUAL_PATH |
|||
} |
|||
|
|||
# Just remove the VIRTUAL_ENV altogether: |
|||
if (Test-Path -Path Env:VIRTUAL_ENV) { |
|||
Remove-Item -Path env:VIRTUAL_ENV |
|||
} |
|||
|
|||
# Just remove VIRTUAL_ENV_PROMPT altogether. |
|||
if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { |
|||
Remove-Item -Path env:VIRTUAL_ENV_PROMPT |
|||
} |
|||
|
|||
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: |
|||
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { |
|||
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force |
|||
} |
|||
|
|||
# Leave deactivate function in the global namespace if requested: |
|||
if (-not $NonDestructive) { |
|||
Remove-Item -Path function:deactivate |
|||
} |
|||
} |
|||
|
|||
<# |
|||
.Description |
|||
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the |
|||
given folder, and returns them in a map. |
|||
|
|||
For each line in the pyvenv.cfg file, if that line can be parsed into exactly |
|||
two strings separated by `=` (with any amount of whitespace surrounding the =) |
|||
then it is considered a `key = value` line. The left hand string is the key, |
|||
the right hand is the value. |
|||
|
|||
If the value starts with a `'` or a `"` then the first and last character is |
|||
stripped from the value before being captured. |
|||
|
|||
.Parameter ConfigDir |
|||
Path to the directory that contains the `pyvenv.cfg` file. |
|||
#> |
|||
function Get-PyVenvConfig( |
|||
[String] |
|||
$ConfigDir |
|||
) { |
|||
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" |
|||
|
|||
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). |
|||
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue |
|||
|
|||
# An empty map will be returned if no config file is found. |
|||
$pyvenvConfig = @{ } |
|||
|
|||
if ($pyvenvConfigPath) { |
|||
|
|||
Write-Verbose "File exists, parse `key = value` lines" |
|||
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath |
|||
|
|||
$pyvenvConfigContent | ForEach-Object { |
|||
$keyval = $PSItem -split "\s*=\s*", 2 |
|||
if ($keyval[0] -and $keyval[1]) { |
|||
$val = $keyval[1] |
|||
|
|||
# Remove extraneous quotations around a string value. |
|||
if ("'""".Contains($val.Substring(0, 1))) { |
|||
$val = $val.Substring(1, $val.Length - 2) |
|||
} |
|||
|
|||
$pyvenvConfig[$keyval[0]] = $val |
|||
Write-Verbose "Adding Key: '$($keyval[0])'='$val'" |
|||
} |
|||
} |
|||
} |
|||
return $pyvenvConfig |
|||
} |
|||
|
|||
|
|||
<# Begin Activate script --------------------------------------------------- #> |
|||
|
|||
# Determine the containing directory of this script |
|||
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition |
|||
$VenvExecDir = Get-Item -Path $VenvExecPath |
|||
|
|||
Write-Verbose "Activation script is located in path: '$VenvExecPath'" |
|||
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" |
|||
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" |
|||
|
|||
# Set values required in priority: CmdLine, ConfigFile, Default |
|||
# First, get the location of the virtual environment, it might not be |
|||
# VenvExecDir if specified on the command line. |
|||
if ($VenvDir) { |
|||
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" |
|||
} |
|||
else { |
|||
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." |
|||
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") |
|||
Write-Verbose "VenvDir=$VenvDir" |
|||
} |
|||
|
|||
# Next, read the `pyvenv.cfg` file to determine any required value such |
|||
# as `prompt`. |
|||
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir |
|||
|
|||
# Next, set the prompt from the command line, or the config file, or |
|||
# just use the name of the virtual environment folder. |
|||
if ($Prompt) { |
|||
Write-Verbose "Prompt specified as argument, using '$Prompt'" |
|||
} |
|||
else { |
|||
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" |
|||
if ($pyvenvCfg -and $pyvenvCfg['prompt']) { |
|||
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" |
|||
$Prompt = $pyvenvCfg['prompt']; |
|||
} |
|||
else { |
|||
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" |
|||
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" |
|||
$Prompt = Split-Path -Path $venvDir -Leaf |
|||
} |
|||
} |
|||
|
|||
Write-Verbose "Prompt = '$Prompt'" |
|||
Write-Verbose "VenvDir='$VenvDir'" |
|||
|
|||
# Deactivate any currently active virtual environment, but leave the |
|||
# deactivate function in place. |
|||
deactivate -nondestructive |
|||
|
|||
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine |
|||
# that there is an activated venv. |
|||
$env:VIRTUAL_ENV = $VenvDir |
|||
|
|||
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { |
|||
|
|||
Write-Verbose "Setting prompt to '$Prompt'" |
|||
|
|||
# Set the prompt to include the env name |
|||
# Make sure _OLD_VIRTUAL_PROMPT is global |
|||
function global:_OLD_VIRTUAL_PROMPT { "" } |
|||
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT |
|||
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt |
|||
|
|||
function global:prompt { |
|||
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " |
|||
_OLD_VIRTUAL_PROMPT |
|||
} |
|||
$env:VIRTUAL_ENV_PROMPT = $Prompt |
|||
} |
|||
|
|||
# Clear PYTHONHOME |
|||
if (Test-Path -Path Env:PYTHONHOME) { |
|||
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME |
|||
Remove-Item -Path Env:PYTHONHOME |
|||
} |
|||
|
|||
# Add the venv to the PATH |
|||
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH |
|||
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" |
@ -0,0 +1,69 @@ |
|||
# This file must be used with "source bin/activate" *from bash* |
|||
# you cannot run it directly |
|||
|
|||
deactivate () { |
|||
# reset old environment variables |
|||
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then |
|||
PATH="${_OLD_VIRTUAL_PATH:-}" |
|||
export PATH |
|||
unset _OLD_VIRTUAL_PATH |
|||
fi |
|||
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then |
|||
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" |
|||
export PYTHONHOME |
|||
unset _OLD_VIRTUAL_PYTHONHOME |
|||
fi |
|||
|
|||
# This should detect bash and zsh, which have a hash command that must |
|||
# be called to get it to forget past commands. Without forgetting |
|||
# past commands the $PATH changes we made may not be respected |
|||
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then |
|||
hash -r 2> /dev/null |
|||
fi |
|||
|
|||
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then |
|||
PS1="${_OLD_VIRTUAL_PS1:-}" |
|||
export PS1 |
|||
unset _OLD_VIRTUAL_PS1 |
|||
fi |
|||
|
|||
unset VIRTUAL_ENV |
|||
unset VIRTUAL_ENV_PROMPT |
|||
if [ ! "${1:-}" = "nondestructive" ] ; then |
|||
# Self destruct! |
|||
unset -f deactivate |
|||
fi |
|||
} |
|||
|
|||
# unset irrelevant variables |
|||
deactivate nondestructive |
|||
|
|||
VIRTUAL_ENV=/home/development/projects/illysky/python-keycloak/keycloak-dev |
|||
export VIRTUAL_ENV |
|||
|
|||
_OLD_VIRTUAL_PATH="$PATH" |
|||
PATH="$VIRTUAL_ENV/"bin":$PATH" |
|||
export PATH |
|||
|
|||
# unset PYTHONHOME if set |
|||
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) |
|||
# could use `if (set -u; : $PYTHONHOME) ;` in bash |
|||
if [ -n "${PYTHONHOME:-}" ] ; then |
|||
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" |
|||
unset PYTHONHOME |
|||
fi |
|||
|
|||
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then |
|||
_OLD_VIRTUAL_PS1="${PS1:-}" |
|||
PS1='(keycloak-dev) '"${PS1:-}" |
|||
export PS1 |
|||
VIRTUAL_ENV_PROMPT='(keycloak-dev) ' |
|||
export VIRTUAL_ENV_PROMPT |
|||
fi |
|||
|
|||
# This should detect bash and zsh, which have a hash command that must |
|||
# be called to get it to forget past commands. Without forgetting |
|||
# past commands the $PATH changes we made may not be respected |
|||
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then |
|||
hash -r 2> /dev/null |
|||
fi |
@ -0,0 +1,26 @@ |
|||
# This file must be used with "source bin/activate.csh" *from csh*. |
|||
# You cannot run it directly. |
|||
# Created by Davide Di Blasi <davidedb@gmail.com>. |
|||
# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com> |
|||
|
|||
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' |
|||
|
|||
# Unset irrelevant variables. |
|||
deactivate nondestructive |
|||
|
|||
setenv VIRTUAL_ENV /home/development/projects/illysky/python-keycloak/keycloak-dev |
|||
|
|||
set _OLD_VIRTUAL_PATH="$PATH" |
|||
setenv PATH "$VIRTUAL_ENV/"bin":$PATH" |
|||
|
|||
|
|||
set _OLD_VIRTUAL_PROMPT="$prompt" |
|||
|
|||
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then |
|||
set prompt = '(keycloak-dev) '"$prompt" |
|||
setenv VIRTUAL_ENV_PROMPT '(keycloak-dev) ' |
|||
endif |
|||
|
|||
alias pydoc python -m pydoc |
|||
|
|||
rehash |
@ -0,0 +1,69 @@ |
|||
# This file must be used with "source <venv>/bin/activate.fish" *from fish* |
|||
# (https://fishshell.com/); you cannot run it directly. |
|||
|
|||
function deactivate -d "Exit virtual environment and return to normal shell environment" |
|||
# reset old environment variables |
|||
if test -n "$_OLD_VIRTUAL_PATH" |
|||
set -gx PATH $_OLD_VIRTUAL_PATH |
|||
set -e _OLD_VIRTUAL_PATH |
|||
end |
|||
if test -n "$_OLD_VIRTUAL_PYTHONHOME" |
|||
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME |
|||
set -e _OLD_VIRTUAL_PYTHONHOME |
|||
end |
|||
|
|||
if test -n "$_OLD_FISH_PROMPT_OVERRIDE" |
|||
set -e _OLD_FISH_PROMPT_OVERRIDE |
|||
# prevents error when using nested fish instances (Issue #93858) |
|||
if functions -q _old_fish_prompt |
|||
functions -e fish_prompt |
|||
functions -c _old_fish_prompt fish_prompt |
|||
functions -e _old_fish_prompt |
|||
end |
|||
end |
|||
|
|||
set -e VIRTUAL_ENV |
|||
set -e VIRTUAL_ENV_PROMPT |
|||
if test "$argv[1]" != "nondestructive" |
|||
# Self-destruct! |
|||
functions -e deactivate |
|||
end |
|||
end |
|||
|
|||
# Unset irrelevant variables. |
|||
deactivate nondestructive |
|||
|
|||
set -gx VIRTUAL_ENV /home/development/projects/illysky/python-keycloak/keycloak-dev |
|||
|
|||
set -gx _OLD_VIRTUAL_PATH $PATH |
|||
set -gx PATH "$VIRTUAL_ENV/"bin $PATH |
|||
|
|||
# Unset PYTHONHOME if set. |
|||
if set -q PYTHONHOME |
|||
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME |
|||
set -e PYTHONHOME |
|||
end |
|||
|
|||
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" |
|||
# fish uses a function instead of an env var to generate the prompt. |
|||
|
|||
# Save the current fish_prompt function as the function _old_fish_prompt. |
|||
functions -c fish_prompt _old_fish_prompt |
|||
|
|||
# With the original prompt function renamed, we can override with our own. |
|||
function fish_prompt |
|||
# Save the return status of the last command. |
|||
set -l old_status $status |
|||
|
|||
# Output the venv prompt; color taken from the blue of the Python logo. |
|||
printf "%s%s%s" (set_color 4B8BBE) '(keycloak-dev) ' (set_color normal) |
|||
|
|||
# Restore the return status of the previous command. |
|||
echo "exit $old_status" | . |
|||
# Output the original/"old" prompt. |
|||
_old_fish_prompt |
|||
end |
|||
|
|||
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" |
|||
set -gx VIRTUAL_ENV_PROMPT '(keycloak-dev) ' |
|||
end |
@ -0,0 +1,8 @@ |
|||
#!/home/development/projects/illysky/python-keycloak/keycloak-dev/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
from httpx import main |
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,8 @@ |
|||
#!/home/development/projects/illysky/python-keycloak/keycloak-dev/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
from charset_normalizer import cli |
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(cli.cli_detect()) |
@ -0,0 +1,8 @@ |
|||
#!/home/development/projects/illysky/python-keycloak/keycloak-dev/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
from pip._internal.cli.main import main |
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,8 @@ |
|||
#!/home/development/projects/illysky/python-keycloak/keycloak-dev/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
from pip._internal.cli.main import main |
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,8 @@ |
|||
#!/home/development/projects/illysky/python-keycloak/keycloak-dev/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
from pip._internal.cli.main import main |
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1 @@ |
|||
python3 |
@ -0,0 +1 @@ |
|||
/usr/bin/python3 |
@ -0,0 +1 @@ |
|||
python3 |
@ -0,0 +1 @@ |
|||
lib |
@ -0,0 +1,3 @@ |
|||
home = /usr/bin |
|||
include-system-site-packages = false |
|||
version = 3.10.12 |
@ -0,0 +1,165 @@ |
|||
GNU LESSER GENERAL PUBLIC LICENSE |
|||
Version 3, 29 June 2007 |
|||
|
|||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
|||
Everyone is permitted to copy and distribute verbatim copies |
|||
of this license document, but changing it is not allowed. |
|||
|
|||
|
|||
This version of the GNU Lesser General Public License incorporates |
|||
the terms and conditions of version 3 of the GNU General Public |
|||
License, supplemented by the additional permissions listed below. |
|||
|
|||
0. Additional Definitions. |
|||
|
|||
As used herein, "this License" refers to version 3 of the GNU Lesser |
|||
General Public License, and the "GNU GPL" refers to version 3 of the GNU |
|||
General Public License. |
|||
|
|||
"The Library" refers to a covered work governed by this License, |
|||
other than an Application or a Combined Work as defined below. |
|||
|
|||
An "Application" is any work that makes use of an interface provided |
|||
by the Library, but which is not otherwise based on the Library. |
|||
Defining a subclass of a class defined by the Library is deemed a mode |
|||
of using an interface provided by the Library. |
|||
|
|||
A "Combined Work" is a work produced by combining or linking an |
|||
Application with the Library. The particular version of the Library |
|||
with which the Combined Work was made is also called the "Linked |
|||
Version". |
|||
|
|||
The "Minimal Corresponding Source" for a Combined Work means the |
|||
Corresponding Source for the Combined Work, excluding any source code |
|||
for portions of the Combined Work that, considered in isolation, are |
|||
based on the Application, and not on the Linked Version. |
|||
|
|||
The "Corresponding Application Code" for a Combined Work means the |
|||
object code and/or source code for the Application, including any data |
|||
and utility programs needed for reproducing the Combined Work from the |
|||
Application, but excluding the System Libraries of the Combined Work. |
|||
|
|||
1. Exception to Section 3 of the GNU GPL. |
|||
|
|||
You may convey a covered work under sections 3 and 4 of this License |
|||
without being bound by section 3 of the GNU GPL. |
|||
|
|||
2. Conveying Modified Versions. |
|||
|
|||
If you modify a copy of the Library, and, in your modifications, a |
|||
facility refers to a function or data to be supplied by an Application |
|||
that uses the facility (other than as an argument passed when the |
|||
facility is invoked), then you may convey a copy of the modified |
|||
version: |
|||
|
|||
a) under this License, provided that you make a good faith effort to |
|||
ensure that, in the event an Application does not supply the |
|||
function or data, the facility still operates, and performs |
|||
whatever part of its purpose remains meaningful, or |
|||
|
|||
b) under the GNU GPL, with none of the additional permissions of |
|||
this License applicable to that copy. |
|||
|
|||
3. Object Code Incorporating Material from Library Header Files. |
|||
|
|||
The object code form of an Application may incorporate material from |
|||
a header file that is part of the Library. You may convey such object |
|||
code under terms of your choice, provided that, if the incorporated |
|||
material is not limited to numerical parameters, data structure |
|||
layouts and accessors, or small macros, inline functions and templates |
|||
(ten or fewer lines in length), you do both of the following: |
|||
|
|||
a) Give prominent notice with each copy of the object code that the |
|||
Library is used in it and that the Library and its use are |
|||
covered by this License. |
|||
|
|||
b) Accompany the object code with a copy of the GNU GPL and this license |
|||
document. |
|||
|
|||
4. Combined Works. |
|||
|
|||
You may convey a Combined Work under terms of your choice that, |
|||
taken together, effectively do not restrict modification of the |
|||
portions of the Library contained in the Combined Work and reverse |
|||
engineering for debugging such modifications, if you also do each of |
|||
the following: |
|||
|
|||
a) Give prominent notice with each copy of the Combined Work that |
|||
the Library is used in it and that the Library and its use are |
|||
covered by this License. |
|||
|
|||
b) Accompany the Combined Work with a copy of the GNU GPL and this license |
|||
document. |
|||
|
|||
c) For a Combined Work that displays copyright notices during |
|||
execution, include the copyright notice for the Library among |
|||
these notices, as well as a reference directing the user to the |
|||
copies of the GNU GPL and this license document. |
|||
|
|||
d) Do one of the following: |
|||
|
|||
0) Convey the Minimal Corresponding Source under the terms of this |
|||
License, and the Corresponding Application Code in a form |
|||
suitable for, and under terms that permit, the user to |
|||
recombine or relink the Application with a modified version of |
|||
the Linked Version to produce a modified Combined Work, in the |
|||
manner specified by section 6 of the GNU GPL for conveying |
|||
Corresponding Source. |
|||
|
|||
1) Use a suitable shared library mechanism for linking with the |
|||
Library. A suitable mechanism is one that (a) uses at run time |
|||
a copy of the Library already present on the user's computer |
|||
system, and (b) will operate properly with a modified version |
|||
of the Library that is interface-compatible with the Linked |
|||
Version. |
|||
|
|||
e) Provide Installation Information, but only if you would otherwise |
|||
be required to provide such information under section 6 of the |
|||
GNU GPL, and only to the extent that such information is |
|||
necessary to install and execute a modified version of the |
|||
Combined Work produced by recombining or relinking the |
|||
Application with a modified version of the Linked Version. (If |
|||
you use option 4d0, the Installation Information must accompany |
|||
the Minimal Corresponding Source and Corresponding Application |
|||
Code. If you use option 4d1, you must provide the Installation |
|||
Information in the manner specified by section 6 of the GNU GPL |
|||
for conveying Corresponding Source.) |
|||
|
|||
5. Combined Libraries. |
|||
|
|||
You may place library facilities that are a work based on the |
|||
Library side by side in a single library together with other library |
|||
facilities that are not Applications and are not covered by this |
|||
License, and convey such a combined library under terms of your |
|||
choice, if you do both of the following: |
|||
|
|||
a) Accompany the combined library with a copy of the same work based |
|||
on the Library, uncombined with any other library facilities, |
|||
conveyed under the terms of this License. |
|||
|
|||
b) Give prominent notice with the combined library that part of it |
|||
is a work based on the Library, and explaining where to find the |
|||
accompanying uncombined form of the same work. |
|||
|
|||
6. Revised Versions of the GNU Lesser General Public License. |
|||
|
|||
The Free Software Foundation may publish revised and/or new versions |
|||
of the GNU Lesser General Public License from time to time. Such new |
|||
versions will be similar in spirit to the present version, but may |
|||
differ in detail to address new problems or concerns. |
|||
|
|||
Each version is given a distinguishing version number. If the |
|||
Library as you received it specifies that a certain numbered version |
|||
of the GNU Lesser General Public License "or any later version" |
|||
applies to it, you have the option of following the terms and |
|||
conditions either of that published version or of any later version |
|||
published by the Free Software Foundation. If the Library as you |
|||
received it does not specify a version number of the GNU Lesser |
|||
General Public License, you may choose any version of the GNU Lesser |
|||
General Public License ever published by the Free Software Foundation. |
|||
|
|||
If the Library as you received it specifies that a proxy can decide |
|||
whether future versions of the GNU Lesser General Public License shall |
|||
apply, that proxy's public statement of acceptance of any version is |
|||
permanent authorization for you to choose that version for the |
|||
Library. |
@ -0,0 +1,48 @@ |
|||
[](https://pypi.org/project/jwcrypto/) |
|||
[](https://github.com/latchset/jwcrypto/releases) |
|||
[](https://github.com/latchset/jwcrypto/actions/workflows/build.yml) |
|||
[](https://github.com/latchset/jwcrypto/actions/workflows/ppc64le.yml) |
|||
[](https://github.com/latchset/jwcrypto/actions/workflows/codeql-analysis.yml) |
|||
[](https://jwcrypto.readthedocs.io/en/latest/?badge=latest) |
|||
|
|||
JWCrypto |
|||
======== |
|||
|
|||
An implementation of the JOSE Working Group documents: |
|||
- RFC 7515 - JSON Web Signature (JWS) |
|||
- RFC 7516 - JSON Web Encryption (JWE) |
|||
- RFC 7517 - JSON Web Key (JWK) |
|||
- RFC 7518 - JSON Web Algorithms (JWA) |
|||
- RFC 7519 - JSON Web Token (JWT) |
|||
- RFC 7520 - Examples of Protecting Content Using JSON Object Signing and |
|||
Encryption (JOSE) |
|||
|
|||
Installation |
|||
============ |
|||
|
|||
pip install jwcrypto |
|||
|
|||
Documentation |
|||
============= |
|||
|
|||
http://jwcrypto.readthedocs.org |
|||
|
|||
Deprecation Notices |
|||
=================== |
|||
|
|||
2020.12.11: The RSA1_5 algorithm is now considered deprecated due to numerous |
|||
implementation issues that make it a very problematic tool to use safely. |
|||
The algorithm can still be used but requires explicitly allowing it on object |
|||
instantiation. If your application depends on it there are examples of how to |
|||
re-enable RSA1_5 usage in the tests files. |
|||
|
|||
Note: if you enable support for `RSA1_5` and the attacker can send you chosen |
|||
ciphertext and is able to measure the processing times of your application, |
|||
then your application will be vulnerable to a Bleichenbacher RSA padding |
|||
oracle, allowing the so-called "Million messages attack". That attack allows |
|||
to decrypt intercepted messages (even if they were encrypted with RSA-OAEP) or |
|||
forge signatures (both RSA-PKCS#1 v1.5 and RSASSA-PSS). |
|||
|
|||
Given JWT is generally used in tokens to sign authorization assertions or to |
|||
encrypt private key material, this is a particularly severe issue, and must |
|||
not be underestimated. |
@ -0,0 +1,74 @@ |
|||
from keycloak import KeycloakAdmin |
|||
import json |
|||
|
|||
# Keycloak Configuration |
|||
KEYCLOAK_URL = "https://auth.illysky.io" |
|||
REALM_NAME = "cassandra" |
|||
CLIENT_ID = "administration" |
|||
CLIENT_SECRET = "JMFYMbWfPBYG3t6C4ZtQ5tfXjBE6n2PY" |
|||
|
|||
|
|||
keycloak_admin = KeycloakAdmin( |
|||
server_url=f"{KEYCLOAK_URL}/", |
|||
realm_name=REALM_NAME, |
|||
client_id=CLIENT_ID, |
|||
client_secret_key=CLIENT_SECRET, |
|||
verify=True |
|||
) |
|||
|
|||
|
|||
|
|||
# 🟢 Test fetching all organizations |
|||
print("\n🔹 Fetching all organizations...") |
|||
organizations = keycloak_admin.get_organizations() |
|||
print(json.dumps(organizations, indent=4)) |
|||
|
|||
# 🟢 Test creating an organization |
|||
print("\n🔹 Creating a new organization...") |
|||
new_org = {"name": "St Leonards Academy", "alias": "st-leonards-academy", "description": "This is a test organization", "domains": ["test.com"]} |
|||
keycloak_admin.create_organization(new_org) |
|||
print("Created Organization") |
|||
|
|||
# 🟢 Test fetching all organizations |
|||
print("\n🔹 Fetching all organizations...") |
|||
organizations = keycloak_admin.get_organizations() |
|||
print(json.dumps(organizations, indent=4)) |
|||
organization_id = next((org["id"] for org in organizations if org["name"] == new_org["name"]), None) |
|||
|
|||
|
|||
# 🟢 Test fetching organization details |
|||
print(f"\n🔹 Fetching organization details for {organization_id}...") |
|||
org_details = keycloak_admin.get_organization(organization_id) |
|||
print(org_details) |
|||
|
|||
# 🟢 Test updating organization |
|||
print("\n🔹 Updating organization...") |
|||
|
|||
|
|||
|
|||
# 🟢 Test listing organization members |
|||
print("\n🔹 Fetching members of the organization...") |
|||
org_members = keycloak_admin.get_organization_members(organization_id) |
|||
print(json.dumps(org_members, indent=4)) |
|||
|
|||
# 🟢 Test adding a user to an organization |
|||
user_id = "e9dc913d-9d55-4e01-b70b-4cf5d3b3393a" # Replace with a real user ID |
|||
print(f"\n🔹 Adding user {user_id} to organization {organization_id}...") |
|||
add_response = keycloak_admin.add_user_to_organization(organization_id, user_id) |
|||
print("Added User") |
|||
|
|||
|
|||
# 🟢 Test listing organization members |
|||
print("\n🔹 Fetching members of the organization...") |
|||
org_members = keycloak_admin.get_organization_members(organization_id) |
|||
print(json.dumps(org_members, indent=4)) |
|||
|
|||
# 🟢 Test removing a user from an organization |
|||
print(f"\n🔹 Removing user {user_id} from organization {organization_id}...") |
|||
remove_response = keycloak_admin.remove_user_from_organization(organization_id, user_id) |
|||
print("Removed User Response:", remove_response) |
|||
|
|||
# 🟢 Test deleting an organization |
|||
print("\n🔹 Deleting organization...") |
|||
delete_response = keycloak_admin.delete_organization(organization_id) |
|||
print("Deleted Organization Response:", delete_response) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue