* Feature/7137/gitea sso (#7940) * added gitea auth to admin panel with configs , added api calls * added gitea to oauth root (for signup and signin) * removed log * replace github oauth with gitea ouath error messages * added gitea to auth root * fix: update token expiration handling and remove unused variable in Gitea callback * fix: include Gitea in OAuth enabled checks * fix: improve error handling when fetching emails from Gitea * chore : remove logs and add semicolons * refactor: update Gitea authentication components and imports for consistency * fix: enhance Gitea authentication form to auto-populate host value and improve OAuth checks * refactor: enhance Gitea OAuth provider with improved error handling and URL validation * fix: update authentication success messages to check for string value "1" --------- Co-authored-by: Shivam Jain <shivam.clgstash@gmail.com> Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
353 lines
14 KiB
Python
353 lines
14 KiB
Python
# Python imports
|
|
import os
|
|
|
|
# Django imports
|
|
from django.core.management.base import BaseCommand, CommandError
|
|
|
|
# Module imports
|
|
from plane.license.models import InstanceConfiguration
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Configure instance variables"
|
|
|
|
def handle(self, *args, **options):
|
|
from plane.license.utils.encryption import encrypt_data
|
|
from plane.license.utils.instance_value import get_configuration_value
|
|
|
|
mandatory_keys = ["SECRET_KEY"]
|
|
|
|
for item in mandatory_keys:
|
|
if not os.environ.get(item):
|
|
raise CommandError(f"{item} env variable is required.")
|
|
|
|
config_keys = [
|
|
# Authentication Settings
|
|
{
|
|
"key": "ENABLE_SIGNUP",
|
|
"value": os.environ.get("ENABLE_SIGNUP", "1"),
|
|
"category": "AUTHENTICATION",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "DISABLE_WORKSPACE_CREATION",
|
|
"value": os.environ.get("DISABLE_WORKSPACE_CREATION", "0"),
|
|
"category": "WORKSPACE_MANAGEMENT",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "ENABLE_EMAIL_PASSWORD",
|
|
"value": os.environ.get("ENABLE_EMAIL_PASSWORD", "1"),
|
|
"category": "AUTHENTICATION",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "ENABLE_MAGIC_LINK_LOGIN",
|
|
"value": os.environ.get("ENABLE_MAGIC_LINK_LOGIN", "0"),
|
|
"category": "AUTHENTICATION",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "GOOGLE_CLIENT_ID",
|
|
"value": os.environ.get("GOOGLE_CLIENT_ID"),
|
|
"category": "GOOGLE",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "GOOGLE_CLIENT_SECRET",
|
|
"value": os.environ.get("GOOGLE_CLIENT_SECRET"),
|
|
"category": "GOOGLE",
|
|
"is_encrypted": True,
|
|
},
|
|
{
|
|
"key": "GITHUB_CLIENT_ID",
|
|
"value": os.environ.get("GITHUB_CLIENT_ID"),
|
|
"category": "GITHUB",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "GITHUB_CLIENT_SECRET",
|
|
"value": os.environ.get("GITHUB_CLIENT_SECRET"),
|
|
"category": "GITHUB",
|
|
"is_encrypted": True,
|
|
},
|
|
{
|
|
"key": "GITHUB_ORGANIZATION_ID",
|
|
"value": os.environ.get("GITHUB_ORGANIZATION_ID"),
|
|
"category": "GITHUB",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "GITLAB_HOST",
|
|
"value": os.environ.get("GITLAB_HOST"),
|
|
"category": "GITLAB",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "GITLAB_CLIENT_ID",
|
|
"value": os.environ.get("GITLAB_CLIENT_ID"),
|
|
"category": "GITLAB",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "ENABLE_SMTP",
|
|
"value": os.environ.get("ENABLE_SMTP", "0"),
|
|
"category": "SMTP",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "GITLAB_CLIENT_SECRET",
|
|
"value": os.environ.get("GITLAB_CLIENT_SECRET"),
|
|
"category": "GITLAB",
|
|
"is_encrypted": True,
|
|
},
|
|
{
|
|
"key": "EMAIL_HOST",
|
|
"value": os.environ.get("EMAIL_HOST", ""),
|
|
"category": "SMTP",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "EMAIL_HOST_USER",
|
|
"value": os.environ.get("EMAIL_HOST_USER", ""),
|
|
"category": "SMTP",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "EMAIL_HOST_PASSWORD",
|
|
"value": os.environ.get("EMAIL_HOST_PASSWORD", ""),
|
|
"category": "SMTP",
|
|
"is_encrypted": True,
|
|
},
|
|
{
|
|
"key": "EMAIL_PORT",
|
|
"value": os.environ.get("EMAIL_PORT", "587"),
|
|
"category": "SMTP",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "EMAIL_FROM",
|
|
"value": os.environ.get("EMAIL_FROM", ""),
|
|
"category": "SMTP",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "EMAIL_USE_TLS",
|
|
"value": os.environ.get("EMAIL_USE_TLS", "1"),
|
|
"category": "SMTP",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "EMAIL_USE_SSL",
|
|
"value": os.environ.get("EMAIL_USE_SSL", "0"),
|
|
"category": "SMTP",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "LLM_API_KEY",
|
|
"value": os.environ.get("LLM_API_KEY"),
|
|
"category": "AI",
|
|
"is_encrypted": True,
|
|
},
|
|
{
|
|
"key": "LLM_PROVIDER",
|
|
"value": os.environ.get("LLM_PROVIDER", "openai"),
|
|
"category": "AI",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "LLM_MODEL",
|
|
"value": os.environ.get("LLM_MODEL", "gpt-4o-mini"),
|
|
"category": "AI",
|
|
"is_encrypted": False,
|
|
},
|
|
# Deprecated, use LLM_MODEL
|
|
{
|
|
"key": "GPT_ENGINE",
|
|
"value": os.environ.get("GPT_ENGINE", "gpt-3.5-turbo"),
|
|
"category": "SMTP",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "UNSPLASH_ACCESS_KEY",
|
|
"value": os.environ.get("UNSPLASH_ACCESS_KEY", ""),
|
|
"category": "UNSPLASH",
|
|
"is_encrypted": True,
|
|
},
|
|
# intercom settings
|
|
{
|
|
"key": "IS_INTERCOM_ENABLED",
|
|
"value": os.environ.get("IS_INTERCOM_ENABLED", "1"),
|
|
"category": "INTERCOM",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "INTERCOM_APP_ID",
|
|
"value": os.environ.get("INTERCOM_APP_ID", ""),
|
|
"category": "INTERCOM",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "IS_GITEA_ENABLED",
|
|
"value": os.environ.get("IS_GITEA_ENABLED", "0"),
|
|
"category": "GITEA",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "GITEA_HOST",
|
|
"value": os.environ.get("GITEA_HOST"),
|
|
"category": "GITEA",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "GITEA_CLIENT_ID",
|
|
"value": os.environ.get("GITEA_CLIENT_ID"),
|
|
"category": "GITEA",
|
|
"is_encrypted": False,
|
|
},
|
|
{
|
|
"key": "GITEA_CLIENT_SECRET",
|
|
"value": os.environ.get("GITEA_CLIENT_SECRET"),
|
|
"category": "GITEA",
|
|
"is_encrypted": True,
|
|
},
|
|
]
|
|
|
|
for item in config_keys:
|
|
obj, created = InstanceConfiguration.objects.get_or_create(key=item.get("key"))
|
|
if created:
|
|
obj.category = item.get("category")
|
|
obj.is_encrypted = item.get("is_encrypted", False)
|
|
if item.get("is_encrypted", False):
|
|
obj.value = encrypt_data(item.get("value"))
|
|
else:
|
|
obj.value = item.get("value")
|
|
obj.save()
|
|
self.stdout.write(self.style.SUCCESS(f"{obj.key} loaded with value from environment variable."))
|
|
else:
|
|
self.stdout.write(self.style.WARNING(f"{obj.key} configuration already exists"))
|
|
|
|
keys = ["IS_GOOGLE_ENABLED", "IS_GITHUB_ENABLED", "IS_GITLAB_ENABLED", "IS_GITEA_ENABLED"]
|
|
if not InstanceConfiguration.objects.filter(key__in=keys).exists():
|
|
for key in keys:
|
|
if key == "IS_GOOGLE_ENABLED":
|
|
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET = get_configuration_value(
|
|
[
|
|
{
|
|
"key": "GOOGLE_CLIENT_ID",
|
|
"default": os.environ.get("GOOGLE_CLIENT_ID", ""),
|
|
},
|
|
{
|
|
"key": "GOOGLE_CLIENT_SECRET",
|
|
"default": os.environ.get("GOOGLE_CLIENT_SECRET", "0"),
|
|
},
|
|
]
|
|
)
|
|
if bool(GOOGLE_CLIENT_ID) and bool(GOOGLE_CLIENT_SECRET):
|
|
value = "1"
|
|
else:
|
|
value = "0"
|
|
InstanceConfiguration.objects.create(
|
|
key=key,
|
|
value=value,
|
|
category="AUTHENTICATION",
|
|
is_encrypted=False,
|
|
)
|
|
self.stdout.write(self.style.SUCCESS(f"{key} loaded with value from environment variable."))
|
|
if key == "IS_GITHUB_ENABLED":
|
|
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET = get_configuration_value(
|
|
[
|
|
{
|
|
"key": "GITHUB_CLIENT_ID",
|
|
"default": os.environ.get("GITHUB_CLIENT_ID", ""),
|
|
},
|
|
{
|
|
"key": "GITHUB_CLIENT_SECRET",
|
|
"default": os.environ.get("GITHUB_CLIENT_SECRET", "0"),
|
|
},
|
|
]
|
|
)
|
|
if bool(GITHUB_CLIENT_ID) and bool(GITHUB_CLIENT_SECRET):
|
|
value = "1"
|
|
else:
|
|
value = "0"
|
|
InstanceConfiguration.objects.create(
|
|
key="IS_GITHUB_ENABLED",
|
|
value=value,
|
|
category="AUTHENTICATION",
|
|
is_encrypted=False,
|
|
)
|
|
self.stdout.write(self.style.SUCCESS(f"{key} loaded with value from environment variable."))
|
|
if key == "IS_GITLAB_ENABLED":
|
|
GITLAB_HOST, GITLAB_CLIENT_ID, GITLAB_CLIENT_SECRET = get_configuration_value(
|
|
[
|
|
{
|
|
"key": "GITLAB_HOST",
|
|
"default": os.environ.get("GITLAB_HOST", "https://gitlab.com"),
|
|
},
|
|
{
|
|
"key": "GITLAB_CLIENT_ID",
|
|
"default": os.environ.get("GITLAB_CLIENT_ID", ""),
|
|
},
|
|
{
|
|
"key": "GITLAB_CLIENT_SECRET",
|
|
"default": os.environ.get("GITLAB_CLIENT_SECRET", ""),
|
|
},
|
|
]
|
|
)
|
|
if bool(GITLAB_HOST) and bool(GITLAB_CLIENT_ID) and bool(GITLAB_CLIENT_SECRET):
|
|
value = "1"
|
|
else:
|
|
value = "0"
|
|
InstanceConfiguration.objects.create(
|
|
key="IS_GITLAB_ENABLED",
|
|
value=value,
|
|
category="AUTHENTICATION",
|
|
is_encrypted=False,
|
|
)
|
|
self.stdout.write(self.style.SUCCESS(f"{key} loaded with value from environment variable."))
|
|
if key == "IS_GITEA_ENABLED":
|
|
GITEA_HOST, GITEA_CLIENT_ID, GITEA_CLIENT_SECRET = (
|
|
get_configuration_value(
|
|
[
|
|
{
|
|
"key": "GITEA_HOST",
|
|
"default": os.environ.get(
|
|
"GITEA_HOST", ""
|
|
),
|
|
},
|
|
{
|
|
"key": "GITEA_CLIENT_ID",
|
|
"default": os.environ.get("GITEA_CLIENT_ID", ""),
|
|
},
|
|
{
|
|
"key": "GITEA_CLIENT_SECRET",
|
|
"default": os.environ.get(
|
|
"GITEA_CLIENT_SECRET", ""
|
|
),
|
|
},
|
|
]
|
|
)
|
|
)
|
|
if (
|
|
bool(GITEA_HOST)
|
|
and bool(GITEA_CLIENT_ID)
|
|
and bool(GITEA_CLIENT_SECRET)
|
|
):
|
|
value = "1"
|
|
else:
|
|
value = "0"
|
|
InstanceConfiguration.objects.create(
|
|
key="IS_GITEA_ENABLED",
|
|
value=value,
|
|
category="AUTHENTICATION",
|
|
is_encrypted=False,
|
|
)
|
|
self.stdout.write(
|
|
self.style.SUCCESS(
|
|
f"{key} loaded with value from environment variable."
|
|
)
|
|
)
|
|
else:
|
|
for key in keys:
|
|
self.stdout.write(self.style.WARNING(f"{key} configuration already exists"))
|