149 lines
5.3 KiB
Python
149 lines
5.3 KiB
Python
# Python imports
|
|
from smtplib import (
|
|
SMTPAuthenticationError,
|
|
SMTPConnectError,
|
|
SMTPRecipientsRefused,
|
|
SMTPSenderRefused,
|
|
SMTPServerDisconnected,
|
|
)
|
|
|
|
# Django imports
|
|
from django.core.mail import BadHeaderError, EmailMultiAlternatives, get_connection
|
|
|
|
# Third party imports
|
|
from rest_framework import status
|
|
from rest_framework.response import Response
|
|
|
|
# Module imports
|
|
from .base import BaseAPIView
|
|
from plane.license.api.permissions import InstanceAdminPermission
|
|
from plane.license.models import InstanceConfiguration
|
|
from plane.license.api.serializers import InstanceConfigurationSerializer
|
|
from plane.license.utils.encryption import encrypt_data
|
|
from plane.utils.cache import cache_response, invalidate_cache
|
|
from plane.license.utils.instance_value import get_email_configuration
|
|
|
|
|
|
class InstanceConfigurationEndpoint(BaseAPIView):
|
|
permission_classes = [InstanceAdminPermission]
|
|
|
|
@cache_response(60 * 60 * 2, user=False)
|
|
def get(self, request):
|
|
instance_configurations = InstanceConfiguration.objects.all()
|
|
serializer = InstanceConfigurationSerializer(instance_configurations, many=True)
|
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
|
|
@invalidate_cache(path="/api/instances/configurations/", user=False)
|
|
@invalidate_cache(path="/api/instances/", user=False)
|
|
def patch(self, request):
|
|
configurations = InstanceConfiguration.objects.filter(
|
|
key__in=request.data.keys()
|
|
)
|
|
|
|
bulk_configurations = []
|
|
for configuration in configurations:
|
|
value = request.data.get(configuration.key, configuration.value)
|
|
if configuration.is_encrypted:
|
|
configuration.value = encrypt_data(value)
|
|
else:
|
|
configuration.value = value
|
|
bulk_configurations.append(configuration)
|
|
|
|
InstanceConfiguration.objects.bulk_update(
|
|
bulk_configurations, ["value"], batch_size=100
|
|
)
|
|
|
|
serializer = InstanceConfigurationSerializer(configurations, many=True)
|
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class EmailCredentialCheckEndpoint(BaseAPIView):
|
|
def post(self, request):
|
|
receiver_email = request.data.get("receiver_email", False)
|
|
if not receiver_email:
|
|
return Response(
|
|
{"error": "Receiver email is required"},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
|
|
(
|
|
EMAIL_HOST,
|
|
EMAIL_HOST_USER,
|
|
EMAIL_HOST_PASSWORD,
|
|
EMAIL_PORT,
|
|
EMAIL_USE_TLS,
|
|
EMAIL_USE_SSL,
|
|
EMAIL_FROM,
|
|
) = get_email_configuration()
|
|
|
|
# Configure all the connections
|
|
connection = get_connection(
|
|
host=EMAIL_HOST,
|
|
port=int(EMAIL_PORT),
|
|
username=EMAIL_HOST_USER,
|
|
password=EMAIL_HOST_PASSWORD,
|
|
use_tls=EMAIL_USE_TLS == "1",
|
|
use_ssl=EMAIL_USE_SSL == "1",
|
|
)
|
|
# Prepare email details
|
|
subject = "Email Notification from Plane"
|
|
message = "This is a sample email notification sent from Plane application."
|
|
# Send the email
|
|
try:
|
|
msg = EmailMultiAlternatives(
|
|
subject=subject,
|
|
body=message,
|
|
from_email=EMAIL_FROM,
|
|
to=[receiver_email],
|
|
connection=connection,
|
|
)
|
|
msg.send(fail_silently=False)
|
|
return Response(
|
|
{"message": "Email successfully sent."}, status=status.HTTP_200_OK
|
|
)
|
|
except BadHeaderError:
|
|
return Response(
|
|
{"error": "Invalid email header."}, status=status.HTTP_400_BAD_REQUEST
|
|
)
|
|
except SMTPAuthenticationError:
|
|
return Response(
|
|
{"error": "Invalid credentials provided"},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
except SMTPConnectError:
|
|
return Response(
|
|
{"error": "Could not connect with the SMTP server."},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
except SMTPSenderRefused:
|
|
return Response(
|
|
{"error": "From address is invalid."},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
except SMTPServerDisconnected:
|
|
return Response(
|
|
{"error": "SMTP server disconnected unexpectedly."},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
except SMTPRecipientsRefused:
|
|
return Response(
|
|
{"error": "All recipient addresses were refused."},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
except TimeoutError:
|
|
return Response(
|
|
{"error": "Timeout error while trying to connect to the SMTP server."},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
except ConnectionError:
|
|
return Response(
|
|
{
|
|
"error": "Network connection error. Please check your internet connection."
|
|
},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
except Exception:
|
|
return Response(
|
|
{"error": "Could not send email. Please check your configuration"},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|