+
{meta.touched && meta.error && (
)}
diff --git a/src/main/frontend/routes.tsx b/src/main/frontend/routes.tsx
index d241efd..95c53b9 100644
--- a/src/main/frontend/routes.tsx
+++ b/src/main/frontend/routes.tsx
@@ -12,6 +12,7 @@ import ProfileManagement from "Frontend/components/administration/ProfileManagem
import {SsoManagement} from "Frontend/components/administration/SsoManagement";
import {AdministrationView} from "Frontend/views/AdministrationView";
import {ProfileView} from "Frontend/views/ProfileView";
+import {NotificationManagement} from "Frontend/components/administration/NotificationManagement";
export const routes = protectRoutes([
{
@@ -40,6 +41,7 @@ export const routes = protectRoutes([
{path: 'libraries', element: },
{path: 'users', element: },
{path: 'sso', element: },
+ {path: 'notifications', element: }
]
}
]
diff --git a/src/main/kotlin/de/grimsi/gameyfin/config/ConfigProperties.kt b/src/main/kotlin/de/grimsi/gameyfin/config/ConfigProperties.kt
index d3932b9..2e4866a 100644
--- a/src/main/kotlin/de/grimsi/gameyfin/config/ConfigProperties.kt
+++ b/src/main/kotlin/de/grimsi/gameyfin/config/ConfigProperties.kt
@@ -127,17 +127,37 @@ sealed class ConfigProperties(
)
/** Notifications */
- data object NotificationsEmailHost :
- ConfigProperties(String::class, "notifications.email.host", "URL of the email server")
+ data object NotificationsEnabled : ConfigProperties(
+ Boolean::class,
+ "notifications.enabled",
+ "Enable notifications",
+ false
+ )
- data object NotificationsEmailPort :
- ConfigProperties(String::class, "notifications.email.port", "Port of the email server")
+ data object NotificationsEmailHost : ConfigProperties(
+ String::class,
+ "notifications.email.host",
+ "URL of the email server"
+ )
- data object NotificationsEmailUsername :
- ConfigProperties(String::class, "notifications.email.username", "Username for the email account")
+ data object NotificationsEmailPort : ConfigProperties(
+ Int::class,
+ "notifications.email.port",
+ "Port of the email server",
+ 587
+ )
- data object NotificationsEmailPassword :
- ConfigProperties(String::class, "notifications.email.password", "Password for the email account")
+ data object NotificationsEmailUsername : ConfigProperties(
+ String::class,
+ "notifications.email.username",
+ "Username for the email account"
+ )
+
+ data object NotificationsEmailPassword : ConfigProperties(
+ String::class,
+ "notifications.email.password",
+ "Password for the email account"
+ )
}
enum class MatchUsersBy {
diff --git a/src/main/kotlin/de/grimsi/gameyfin/config/ConfigService.kt b/src/main/kotlin/de/grimsi/gameyfin/config/ConfigService.kt
index 28eb8d3..0cc3346 100644
--- a/src/main/kotlin/de/grimsi/gameyfin/config/ConfigService.kt
+++ b/src/main/kotlin/de/grimsi/gameyfin/config/ConfigService.kt
@@ -119,7 +119,7 @@ class ConfigService(
* @throws IllegalArgumentException if the value can't be cast to the type defined for the config property
*/
fun set(key: String, value: T) {
- log.info { "Set config value '$key' to '$value'" }
+ log.info { "Set config value '$key'" }
val configKey = findConfigProperty(key)
diff --git a/src/main/kotlin/de/grimsi/gameyfin/notifications/NotificationEndpoint.kt b/src/main/kotlin/de/grimsi/gameyfin/notifications/NotificationEndpoint.kt
new file mode 100644
index 0000000..83c71ce
--- /dev/null
+++ b/src/main/kotlin/de/grimsi/gameyfin/notifications/NotificationEndpoint.kt
@@ -0,0 +1,33 @@
+package de.grimsi.gameyfin.notifications
+
+import com.vaadin.hilla.Endpoint
+import de.grimsi.gameyfin.meta.Roles
+import de.grimsi.gameyfin.notifications.dto.EmailCredentialsDto
+import jakarta.annotation.security.RolesAllowed
+import jakarta.mail.MessagingException
+import jakarta.mail.Session
+import java.util.*
+
+@Endpoint
+@RolesAllowed(Roles.Names.SUPERADMIN, Roles.Names.ADMIN)
+class NotificationEndpoint {
+
+ fun verifyEmailCredentials(credentials: EmailCredentialsDto): Boolean {
+ val properties = Properties()
+ properties["mail.smtp.auth"] = "true"
+ properties["mail.smtp.starttls.enable"] = "true"
+ properties["mail.smtp.host"] = credentials.host
+ properties["mail.smtp.port"] = credentials.port
+
+ val session = Session.getInstance(properties, null)
+
+ try {
+ val transport = session.getTransport("smtp")
+ transport.connect(credentials.host, credentials.port, credentials.username, credentials.password)
+ transport.close()
+ return true
+ } catch (ex: MessagingException) {
+ return false
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/de/grimsi/gameyfin/notifications/dto/EmailCredentialsDto.kt b/src/main/kotlin/de/grimsi/gameyfin/notifications/dto/EmailCredentialsDto.kt
new file mode 100644
index 0000000..cf177d0
--- /dev/null
+++ b/src/main/kotlin/de/grimsi/gameyfin/notifications/dto/EmailCredentialsDto.kt
@@ -0,0 +1,8 @@
+package de.grimsi.gameyfin.notifications.dto
+
+data class EmailCredentialsDto(
+ val host: String,
+ val port: Int,
+ val username: String,
+ val password: String?
+)
\ No newline at end of file