45.81.243.122

As of: May 12, 2025 1:59pm UTC | Latest

Host

Attribute Value
ip 45.81.243.122
location.continent Europe
location.country France
location.country_code FR
location.city Paris
location.postal_code 75000
location.timezone Europe/Paris
location.province Île-de-France
location.coordinates.latitude 48.85341
location.coordinates.longitude 2.3488
location_updated_at 2025-04-29T17:56:02.775845418Z
autonomous_system.asn 41745
autonomous_system.description FORTIS-AS Hosting services
autonomous_system.bgp_prefix 45.81.243.0/24
autonomous_system.name FORTIS-AS Hosting services
autonomous_system.country_code RU
autonomous_system_updated_at 2025-04-29T17:56:02.775925808Z
whois.network.handle UNIQUE_IP_SOLUTIONS_PRIVATE_LIMITED
whois.network.name Neterra Ltd.
whois.network.cidrs 45.81.243.0/25
whois.network.cidrs 45.81.243.128/26
whois.network.cidrs 45.81.243.192/27
whois.network.cidrs 45.81.243.224/28
whois.network.cidrs 45.81.243.240/29
whois.network.cidrs 45.81.243.248/30
whois.network.cidrs 45.81.243.252/31
whois.network.cidrs 45.81.243.254/32
whois.network.created 2024-07-18T00:00:00Z
whois.network.updated 2024-07-18T00:00:00Z
whois.organization.handle ORG-NL38-RIPE
whois.organization.name Neterra Ltd.
whois.organization.address 9 Vitoshki Kambani Street, Kambanite Green Offices, Fl. 3\n1756\nSofia\nBULGARIA
whois.organization.abuse_contacts.handle NC2110-RIPE
whois.organization.abuse_contacts.name Neterra contacts
whois.organization.abuse_contacts.email [email protected]
whois.organization.admin_contacts.handle AN4419-RIPE
whois.organization.admin_contacts.name Antoniy Nedialkov
whois.organization.admin_contacts.email [email protected]
whois.organization.admin_contacts.handle DB2806-RIPE
whois.organization.admin_contacts.name Dean Belev
whois.organization.admin_contacts.email [email protected]
whois.organization.admin_contacts.handle II919-RIPE
whois.organization.admin_contacts.name Ivan Ivanov
whois.organization.admin_contacts.handle JG4195-RIPE
whois.organization.admin_contacts.name Jordan Grigorov
whois.organization.admin_contacts.email [email protected]
whois.organization.admin_contacts.handle JK4334-RIPE
whois.organization.admin_contacts.name Javor Kliachev
whois.organization.admin_contacts.email [email protected]
operating_system.uniform_resource_identifier cpe:2.3:o:canonical:ubuntu_linux:*:*:*:*:*:*:*:*
operating_system.part o
operating_system.vendor Ubuntu
operating_system.product Linux
operating_system.other.family Linux
last_updated_at 2025-05-12T13:59:35.663Z
labels login-page
labels remote-access
labels vue.js

22/SSH TCP View Definition

Attribute Value
services.banner SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.13
services.banner_hashes sha256:ae1d428cd1ed732e91ff977be9f23485ff3170c00e85d1828ef7f78212ef58c1
services.banner_hex 5353482d322e302d4f70656e5353485f382e397031205562756e74752d337562756e7475302e3133
services.discovery_method IPV4_WALK_FULL_PRIORITY_1
services.extended_service_name SSH
services.labels remote-access
services.observed_at 2025-05-12T13:59:35.102595918Z
services.perspective_id PERSPECTIVE_UNKNOWN
services.port 22
services.service_name SSH
services.software.product openssh
services.software.other.comment Ubuntu-3ubuntu0.13
services.software.source OSI_APPLICATION_LAYER
services.software.uniform_resource_identifier cpe:2.3:o:*:linux:*:*:*:*:*:*:*:*
services.software.part o
services.software.product linux
services.software.source OSI_TRANSPORT_LAYER
services.software.uniform_resource_identifier cpe:2.3:o:canonical:ubuntu_linux:*:*:*:*:*:*:*:*
services.software.part o
services.software.vendor Ubuntu
services.software.product Linux
services.software.other.family Linux
services.software.source OSI_APPLICATION_LAYER
services.software.uniform_resource_identifier cpe:2.3:a:openbsd:openssh:8.9p1:*:*:*:*:*:*:*
services.software.part a
services.software.vendor OpenBSD
services.software.product OpenSSH
services.software.version 8.9p1
services.software.other.family OpenSSH
services.software.source OSI_APPLICATION_LAYER
services.source_ip 206.168.34.119
services.ssh.endpoint_id.raw SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.13
services.ssh.endpoint_id.protocol_version 2.0
services.ssh.endpoint_id.software_version OpenSSH_8.9p1
services.ssh.endpoint_id.comment Ubuntu-3ubuntu0.13
services.ssh.kex_init_message.kex_algorithms curve25519-sha256
services.ssh.kex_init_message.kex_algorithms [email protected]
services.ssh.kex_init_message.kex_algorithms ecdh-sha2-nistp256
services.ssh.kex_init_message.kex_algorithms ecdh-sha2-nistp384
services.ssh.kex_init_message.kex_algorithms ecdh-sha2-nistp521
services.ssh.kex_init_message.kex_algorithms [email protected]
services.ssh.kex_init_message.kex_algorithms diffie-hellman-group-exchange-sha256
services.ssh.kex_init_message.kex_algorithms diffie-hellman-group16-sha512
services.ssh.kex_init_message.kex_algorithms diffie-hellman-group18-sha512
services.ssh.kex_init_message.kex_algorithms diffie-hellman-group14-sha256
services.ssh.kex_init_message.kex_algorithms [email protected]
services.ssh.kex_init_message.host_key_algorithms rsa-sha2-512
services.ssh.kex_init_message.host_key_algorithms rsa-sha2-256
services.ssh.kex_init_message.host_key_algorithms ecdsa-sha2-nistp256
services.ssh.kex_init_message.host_key_algorithms ssh-ed25519
services.ssh.kex_init_message.client_to_server_ciphers [email protected]
services.ssh.kex_init_message.client_to_server_ciphers aes128-ctr
services.ssh.kex_init_message.client_to_server_ciphers aes192-ctr
services.ssh.kex_init_message.client_to_server_ciphers aes256-ctr
services.ssh.kex_init_message.client_to_server_ciphers [email protected]
services.ssh.kex_init_message.client_to_server_ciphers [email protected]
services.ssh.kex_init_message.server_to_client_ciphers [email protected]
services.ssh.kex_init_message.server_to_client_ciphers aes128-ctr
services.ssh.kex_init_message.server_to_client_ciphers aes192-ctr
services.ssh.kex_init_message.server_to_client_ciphers aes256-ctr
services.ssh.kex_init_message.server_to_client_ciphers [email protected]
services.ssh.kex_init_message.server_to_client_ciphers [email protected]
services.ssh.kex_init_message.client_to_server_macs [email protected]
services.ssh.kex_init_message.client_to_server_macs [email protected]
services.ssh.kex_init_message.client_to_server_macs [email protected]
services.ssh.kex_init_message.client_to_server_macs [email protected]
services.ssh.kex_init_message.client_to_server_macs [email protected]
services.ssh.kex_init_message.client_to_server_macs [email protected]
services.ssh.kex_init_message.client_to_server_macs [email protected]
services.ssh.kex_init_message.client_to_server_macs hmac-sha2-256
services.ssh.kex_init_message.client_to_server_macs hmac-sha2-512
services.ssh.kex_init_message.client_to_server_macs hmac-sha1
services.ssh.kex_init_message.server_to_client_macs [email protected]
services.ssh.kex_init_message.server_to_client_macs [email protected]
services.ssh.kex_init_message.server_to_client_macs [email protected]
services.ssh.kex_init_message.server_to_client_macs [email protected]
services.ssh.kex_init_message.server_to_client_macs [email protected]
services.ssh.kex_init_message.server_to_client_macs [email protected]
services.ssh.kex_init_message.server_to_client_macs [email protected]
services.ssh.kex_init_message.server_to_client_macs hmac-sha2-256
services.ssh.kex_init_message.server_to_client_macs hmac-sha2-512
services.ssh.kex_init_message.server_to_client_macs hmac-sha1
services.ssh.kex_init_message.client_to_server_compression none
services.ssh.kex_init_message.client_to_server_compression [email protected]
services.ssh.kex_init_message.server_to_client_compression none
services.ssh.kex_init_message.server_to_client_compression [email protected]
services.ssh.kex_init_message.first_kex_follows false
services.ssh.algorithm_selection.kex_algorithm [email protected]
services.ssh.algorithm_selection.host_key_algorithm ecdsa-sha2-nistp256
services.ssh.algorithm_selection.client_to_server_alg_group.cipher aes128-ctr
services.ssh.algorithm_selection.client_to_server_alg_group.mac hmac-sha2-256
services.ssh.algorithm_selection.client_to_server_alg_group.compression none
services.ssh.algorithm_selection.server_to_client_alg_group.cipher aes128-ctr
services.ssh.algorithm_selection.server_to_client_alg_group.mac hmac-sha2-256
services.ssh.algorithm_selection.server_to_client_alg_group.compression none
services.ssh.server_host_key.fingerprint_sha256 8204ffcc4ff9d29bd645e8a0d3f9c9d54a156be23d4263582d2a537c5bcc66a7
services.ssh.server_host_key.ecdsa_public_key.b WsY12Ko6k+ez671VdpiGvGUdBrDMU7D2O848PifSYEs=
services.ssh.server_host_key.ecdsa_public_key.curve P-256
services.ssh.server_host_key.ecdsa_public_key.gx axfR8uEsQkf4vOblY6RA8ncDfYEt6zOg9KE5RdiYwpY=
services.ssh.server_host_key.ecdsa_public_key.gy T+NC4v4af5uO5+tKfA+eFivOM1drMV7Oy7ZAaDe/UfU=
services.ssh.server_host_key.ecdsa_public_key.length 256
services.ssh.server_host_key.ecdsa_public_key.n /////wAAAAD//////////7zm+q2nF56E87nKwvxjJVE=
services.ssh.server_host_key.ecdsa_public_key.p /////wAAAAEAAAAAAAAAAAAAAAD///////////////8=
services.ssh.server_host_key.ecdsa_public_key.x wcGh9YpMQOoWS8biaKj6msmag2b5+7lz0PIgJwne1xc=
services.ssh.server_host_key.ecdsa_public_key.y 1AAHS2fBodpcnlfbjDXdWG5rTEKuZq/34piH+KhtX3U=
services.ssh.hassh_fingerprint 41ff3ecd1458b0bf86e1b4891636213e
services.transport_fingerprint.id 262
services.transport_fingerprint.os CentOS
services.transport_fingerprint.raw 65160,64,true,MSTNW,1460,false,false
services.transport_protocol TCP
services.truncated false

51821/HTTP TCP View Definition

Attribute Value
services.banner HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nlast-modified: Wed, 04 Sep 2024 16:43:38 GMT\r\ncontent-length: 40602\r\nSet-Cookie: connect.sid=s%3A1dEaR9KjK6FmWIxrzwzncCga9QHL_m_o.9p0sVNxUXa%2F2R81V%2Fn1YLIUo7vaF%2F1YPFSAVEsUEa2E; Path=/; HttpOnly\r\nDate: <REDACTED>\r\nConnection: keep-alive\r\nKeep-Alive: timeout=5\r\n
services.banner_hashes sha256:0b574a5b69e3f6f36fc28068a83bc7ff6752a0be6d9eec09a7a8ef7f05a0f25a
services.banner_hex 485454502f312e3120323030204f4b0d0a436f6e74656e742d547970653a20746578742f68746d6c0d0a6c6173742d6d6f6469666965643a205765642c2030342053657020323032342031363a34333a333820474d540d0a636f6e74656e742d6c656e6774683a2034303630320d0a5365742d436f6f6b69653a20636f6e6e6563742e7369643d732533413164456152394b6a4b36466d574978727a777a6e634367613951484c5f6d5f6f2e39703073564e7855586125324632523831562532466e31594c49556f3776614625324631595046534156457355456132453b20506174683d2f3b20487474704f6e6c790d0a446174653a20203c52454441435445443e0d0a436f6e6e656374696f6e3a206b6565702d616c6976650d0a4b6565702d416c6976653a2074696d656f75743d350d0a
services.discovery_method PREDICTIVE_METHOD_23
services.extended_service_name HTTP
services.http.request.method GET
services.http.request.uri http://45.81.243.122:51821/
services.http.request.headers.User_Agent Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/)
services.http.request.headers.Accept */*
services.http.response.protocol HTTP/1.1
services.http.response.status_code 200
services.http.response.status_reason OK
services.http.response.headers.Content_Type text/html
services.http.response.headers.Keep_Alive timeout=5
services.http.response.headers.last_modified Wed, 04 Sep 2024 16:43:38 GMT
services.http.response.headers.Connection keep-alive
services.http.response.headers.Date <REDACTED>
services.http.response.headers.Set_Cookie connect.sid=s%3A1dEaR9KjK6FmWIxrzwzncCga9QHL_m_o.9p0sVNxUXa%2F2R81V%2Fn1YLIUo7vaF%2F1YPFSAVEsUEa2E; Path=/; HttpOnly
services.http.response.headers.content_length 40602
services.http.response.html_tags <title>WireGuard</title>
services.http.response.html_tags <meta charset="utf-8"/>
services.http.response.html_tags <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
services.http.response.html_tags <meta name="apple-mobile-web-app-capable" content="yes">
services.http.response.html_tags <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
services.http.response.body_size 40602
services.http.response.body <!DOCTYPE html>\n<html>\n\n<head>\n <title>WireGuard</title>\n <meta charset="utf-8"/>\n <link href="./css/app.css" rel="stylesheet">\n <link rel="manifest" href="./manifest.json">\n <link rel="icon" type="image/png" href="./img/favicon.png">\n <link rel="apple-touch-icon" href="./img/apple-touch-icon.png">\n <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">\n <meta name="apple-mobile-web-app-capable" content="yes">\n <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">\n</head>\n<style>\n [v-cloak] {\n display: none;\n }\n .line-chart .apexcharts-svg{\n transform: translateY(3px);\n }\n</style>\n\n<body class="bg-gray-50 dark:bg-neutral-800">\n <div id="app">\n <div v-cloak class="container mx-auto max-w-3xl px-3 md:px-0 mt-4 xs:mt-6">\n <div v-if="authenticated === true">\n <div class="flex flex-col-reverse xxs:flex-row flex-auto items-center items-end gap-3">\n <h1 class="text-4xl dark:text-neutral-200 font-medium flex-grow self-start mb-4">\n <img src="./img/logo.png" width="32" class="inline align-middle dark:bg mr-2" /><span class="align-middle">WireGuard</span>\n </h1>\n <div class="flex items-center grow-0 gap-3 items-end self-end xxs:self-center">\n <!-- Dark / light theme -->\n <button @click="toggleTheme"\n class="flex items-center justify-center w-8 h-8 rounded-full bg-gray-200 hover:bg-gray-300 dark:bg-neutral-700 dark:hover:bg-neutral-600 transition" :title="$t(`theme.${uiTheme}`)">\n <svg v-if="uiTheme === 'light'" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"\n class="w-5 h-5">\n <path stroke-linecap="round" stroke-linejoin="round"\n d="M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z" />\n </svg>\n <svg v-else-if="uiTheme === 'dark'" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"\n class="w-5 h-5 text-neutral-400">\n <path stroke-linecap="round" stroke-linejoin="round"\n d="M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z" />\n </svg>\n <svg v-else xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" \n class="w-5 h-5 fill-gray-600 dark:fill-neutral-400">\n <path\n d="M12,2.2c-5.4,0-9.8,4.4-9.8,9.8s4.4,9.8,9.8,9.8s9.8-4.4,9.8-9.8S17.4,2.2,12,2.2z M3.8,12c0-4.5,3.7-8.2,8.2-8.2v16.5C7.5,20.2,3.8,16.5,3.8,12z" />\n </svg>\n <path stroke-linecap="round" stroke-linejoin="round"\n d="M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25" />\n </svg>\n </button>\n <!-- Show / hide charts -->\n <label v-if="uiChartType > 0" class="inline-flex items-center justify-center cursor-pointer w-8 h-8 rounded-full bg-gray-200 hover:bg-gray-300 dark:bg-neutral-700 dark:hover:bg-neutral-600 whitespace-nowrap transition group" :title="$t('toggleCharts')">\n <input type="checkbox" value="" class="sr-only peer" v-model="uiShowCharts" @change="toggleCharts">\n <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" fill="currentColor"\n class="w-5 h-5 peer fill-gray-400 peer-checked:fill-gray-600 dark:fill-neutral-600 peer-checked:dark:fill-neutral-400 group-hover:dark:fill-neutral-500 transition">\n <path\n d="M18.375 2.25c-1.035 0-1.875.84-1.875 1.875v15.75c0 1.035.84 1.875 1.875 1.875h.75c1.035 0 1.875-.84 1.875-1.875V4.125c0-1.036-.84-1.875-1.875-1.875h-.75ZM9.75 8.625c0-1.036.84-1.875 1.875-1.875h.75c1.036 0 1.875.84 1.875 1.875v11.25c0 1.035-.84 1.875-1.875 1.875h-.75a1.875 1.875 0 0 1-1.875-1.875V8.625ZM3 13.125c0-1.036.84-1.875 1.875-1.875h.75c1.036 0 1.875.84 1.875 1.875v6.75c0 1.035-.84 1.875-1.875 1.875h-.75A1.875 1.875 0 0 1 3 19.875v-6.75Z" />\n </svg>\n </label>\n <span v-if="requiresPassword"\n class="text-sm text-gray-400 dark:text-neutral-400 cursor-pointer hover:underline"\n @click="logout">\n {{$t("logout")}}\n <svg class="h-3 inline" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" />\n </svg>\n </span>\n </div>\n </div>\n <div class="text-sm text-gray-400 dark:text-neutral-400 mb-5"></div>\n <div v-if="latestRelease"\n class="bg-red-800 dark:bg-red-100 p-4 text-white dark:text-red-600 text-sm font-small mb-10 rounded-md shadow-lg"\n :title="`v${currentRelease} → v${latestRelease.version}`">\n <div class="container mx-auto flex flex-row flex-auto items-center">\n <div class="flex-grow">\n <p class="font-bold">{{$t("updateAvailable")}}</p>\n <p>{{latestRelease.changelog}}</p>\n </div>\n\n <a href="https://github.com/wg-easy/wg-easy#updating" target="_blank"\n class="p-3 rounded-md bg-white dark:bg-red-100 float-right font-sm font-semibold text-red-800 dark:text-red-600 flex-shrink-0 border-2 border-red-800 dark:border-red-600 hover:border-white dark:hover:border-red-600 hover:text-white dark:hover:text-red-100 hover:bg-red-800 dark:hover:bg-red-600 transition-all">\n {{$t("update")}} →\n </a>\n </div>\n </div>\n\n <div class="shadow-md rounded-lg bg-white dark:bg-neutral-700 overflow-hidden">\n <div class="flex flex-row flex-auto items-center p-3 px-5 border-b-2 border-gray-100 dark:border-neutral-600">\n <div class="flex-grow">\n <p class="text-2xl font-medium dark:text-neutral-200">{{$t("clients")}}</p>\n </div>\n <div class="flex md:block md:flex-shrink-0">\n <!-- Restore configuration -->\n <label for="inputRC" :title="$t('titleRestoreConfig')"\n class="hover:cursor-pointer hover:bg-red-800 hover:border-red-800 hover:text-white text-gray-700 dark:text-neutral-200 max-md:border-r-0 border-2 border-gray-100 dark:border-neutral-600 py-2 px-4 rounded-l-full md:rounded inline-flex items-center transition">\n <svg inline class="w-4 md:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"></path>\n </svg>\n <span class="max-md:hidden text-sm">{{$t("restore")}}</span>\n <input id="inputRC" type="file" name="configurationfile" accept="text/*,.json" @change="restoreConfig" class="hidden"/>\n </label>\n <!-- Backup configuration -->\n <a href="./api/wireguard/backup" :title="$t('titleBackupConfig')"\n class="hover:bg-red-800 hover:border-red-800 hover:text-white text-gray-700 dark:text-neutral-200 max-md:border-x-0 border-2 border-gray-100 dark:border-neutral-600 py-2 px-4 md:rounded inline-flex items-center transition">\n <svg inline class="w-4 md:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6">\n <path stroke-linecap="round" stroke-linejoin="round" d="M5.25 14.25h13.5m-13.5 0a3 3 0 0 1-3-3m3 3a3 3 0 1 0 0 6h13.5a3 3 0 1 0 0-6m-16.5-3a3 3 0 0 1 3-3h13.5a3 3 0 0 1 3 3m-19.5 0a4.5 4.5 0 0 1 .9-2.7L5.737 5.1a3.375 3.375 0 0 1 2.7-1.35h7.126c1.062 0 2.062.5 2.7 1.35l2.587 3.45a4.5 4.5 0 0 1 .9 2.7m0 0a3 3 0 0 1-3 3m0 3h.008v.008h-.008v-.008Zm0-6h.008v.008h-.008v-.008Zm-3 6h.008v.008h-.008v-.008Zm0-6h.008v.008h-.008v-.008Z"></path>\n </svg>\n <span class="max-md:hidden text-sm">{{$t("backup")}}</span>\n </a>\n <!-- New client -->\n <button @click="clientCreate = true; clientCreateName = '';"\n class="hover:bg-red-800 hover:border-red-800 hover:text-white text-gray-700 dark:text-neutral-200 max-md:border-l-0 border-2 border-gray-100 dark:border-neutral-600 py-2 px-4 rounded-r-full md:rounded inline-flex items-center transition">\n <svg class="w-4 md:mr-2" inline xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"\n stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="M12 6v6m0 0v6m0-6h6m-6 0H6" />\n </svg>\n <span class="max-md:hidden text-sm">{{$t("new")}}</span>\n </button>\n </div>\n </div>\n\n <div>\n <!-- Client -->\n <div v-if="clients && clients.length > 0" v-for="client in clients" :key="client.id"\n class="relative overflow-hidden border-b last:border-b-0 border-gray-100 dark:border-neutral-600 border-solid">\n\n <!-- Chart -->\n <div v-if="uiChartType" :class="`absolute z-0 bottom-0 left-0 right-0 h-6 ${uiChartType === 1 && 'line-chart'}`" >\n <apexchart width="100%" height="100%" :options="chartOptionsTX" :series="client.transferTxSeries">\n </apexchart>\n </div>\n <div v-if="uiChartType" :class="`absolute z-0 top-0 left-0 right-0 h-6 ${uiChartType === 1 && 'line-chart'}`" >\n <apexchart width="100%" height="100%" :options="chartOptionsRX" :series="client.transferRxSeries"\n style="transform: scaleY(-1);">\n </apexchart>\n </div>\n\n <div class="relative py-3 md:py-5 px-3 z-10 flex flex-col sm:flex-row justify-between gap-3">\n <div class="flex gap-3 md:gap-4 w-full items-center ">\n\n <!-- Avatar -->\n <div class="h-10 w-10 mt-2 self-start rounded-full bg-gray-50 relative">\n <svg class="w-6 m-2 text-gray-300" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"\n fill="currentColor">\n <path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z"\n clip-rule="evenodd" />\n </svg>\n <img v-if="client.avatar" :src="client.avatar" class="w-10 rounded-full absolute top-0 left-0" />\n\n <div\n v-if="client.latestHandshakeAt && ((new Date() - new Date(client.latestHandshakeAt) < 1000 * 60 * 10))">\n <div\n class="animate-ping w-4 h-4 p-1 bg-red-100 dark:bg-red-100 rounded-full absolute -bottom-1 -right-1">\n </div>\n <div class="w-2 h-2 bg-red-800 dark:bg-red-600 rounded-full absolute bottom-0 right-0"></div>\n </div>\n </div>\n\n <!-- Name & Info -->\n <div class="flex flex-col xxs:flex-row w-full gap-2">\n\n <!-- Name -->\n <div class="flex flex-col flex-grow gap-1">\n <div class="text-gray-700 dark:text-neutral-200 group text-sm md:text-base"\n :title="$t('createdOn') + dateTime(new Date(client.createdAt))">\n\n <!-- Show -->\n <input v-show="clientEditNameId === client.id" v-model="clientEditName"\n v-on:keyup.enter="updateClientName(client, clientEditName); clientEditName = null; clientEditNameId = null;"\n v-on:keyup.escape="clientEditName = null; clientEditNameId = null;"\n :ref="'client-' + client.id + '-name'"\n class="rounded px-1 border-2 dark:bg-neutral-700 border-gray-100 dark:border-neutral-600 focus:border-gray-200 dark:focus:border-neutral-500 dark:placeholder:text-neutral-500 outline-none w-30" />\n <span v-show="clientEditNameId !== client.id"\n class="border-t-2 border-b-2 border-transparent">{{client.name}}</span>\n\n <!-- Edit -->\n <span v-show="clientEditNameId !== client.id"\n @click="clientEditName = client.name; clientEditNameId = client.id; setTimeout(() => $refs['client-' + client.id + '-name'][0].select(), 1);"\n class="cursor-pointer opacity-0 group-hover:opacity-100 transition-opacity">\n <svg xmlns="http://www.w3.org/2000/svg"\n class="h-4 w-4 inline align-middle opacity-25 hover:opacity-100" fill="none"\n viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z" />\n </svg>\n </span>\n </div>\n <!-- Address -->\n <div class=" block md:inline-block pb-1 md:pb-0 text-gray-500 dark:text-neutral-400 text-xs">\n <span class="group">\n <!-- Show -->\n <input v-show="clientEditAddressId === client.id" v-model="clientEditAddress"\n v-on:keyup.enter="updateClientAddress(client, clientEditAddress); clientEditAddress = null; clientEditAddressId = null;"\n v-on:keyup.escape="clientEditAddress = null; clientEditAddressId = null;"\n :ref="'client-' + client.id + '-address'"\n class="rounded border-2 dark:bg-neutral-700 border-gray-100 dark:border-neutral-600 focus:border-gray-200 dark:focus:border-neutral-500 outline-none w-20 text-black dark:text-neutral-300 dark:placeholder:text-neutral-500" />\n <span v-show="clientEditAddressId !== client.id"\n class="inline-block ">{{client.address}}</span>\n\n <!-- Edit -->\n <span v-show="clientEditAddressId !== client.id"\n @click="clientEditAddress = client.address; clientEditAddressId = client.id; setTimeout(() => $refs['client-' + client.id + '-address'][0].select(), 1);"\n class="cursor-pointer opacity-0 group-hover:opacity-100 transition-opacity">\n <svg xmlns="http://www.w3.org/2000/svg"\n class="h-4 w-4 inline align-middle opacity-25 hover:opacity-100" fill="none"\n viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z" />\n </svg>\n </span>\n </span>\n <!-- Inline Transfer TX -->\n <span v-if="!uiTrafficStats && client.transferTx" class="whitespace-nowrap" :title="$t('totalDownload') + bytes(client.transferTx)">\n ·\n <svg class="align-middle h-3 inline" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd"\n d="M16.707 10.293a1 1 0 010 1.414l-6 6a1 1 0 01-1.414 0l-6-6a1 1 0 111.414-1.414L9 14.586V3a1 1 0 012 0v11.586l4.293-4.293a1 1 0 011.414 0z"\n clip-rule="evenodd" />\n </svg>\n {{client.transferTxCurrent | bytes}}/s\n </span>\n \n <!-- Inline Transfer RX -->\n <span v-if="!uiTrafficStats && client.transferRx" class="whitespace-nowrap" :title="$t('totalUpload') + bytes(client.transferRx)">\n ·\n <svg class="align-middle h-3 inline" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd"\n d="M3.293 9.707a1 1 0 010-1.414l6-6a1 1 0 011.414 0l6 6a1 1 0 01-1.414 1.414L11 5.414V17a1 1 0 11-2 0V5.414L4.707 9.707a1 1 0 01-1.414 0z"\n clip-rule="evenodd" />\n </svg>\n {{client.transferRxCurrent | bytes}}/s\n </span>\n <!-- Last seen -->\n <span class="text-gray-400 dark:text-neutral-500 whitespace-nowrap" v-if="client.latestHandshakeAt"\n :title="$t('lastSeen') + dateTime(new Date(client.latestHandshakeAt))">\n {{!uiTrafficStats ? " · " : ""}}{{new Date(client.latestHandshakeAt) | timeago}}\n </span>\n </div>\n </div>\n\n <!-- Info -->\n <div v-if="uiTrafficStats"\n class="flex gap-2 items-center shrink-0 text-gray-400 dark:text-neutral-400 text-xs mt-px justify-end">\n\n <!-- Transfer TX -->\n <div class="min-w-20 md:min-w-24" v-if="client.transferTx">\n <span class="flex gap-1" :title="$t('totalDownload') + bytes(client.transferTx)">\n <svg class="align-middle h-3 inline mt-0.5" xmlns="http://www.w3.org/2000/svg"\n viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd"\n d="M16.707 10.293a1 1 0 010 1.414l-6 6a1 1 0 01-1.414 0l-6-6a1 1 0 111.414-1.414L9 14.586V3a1 1 0 012 0v11.586l4.293-4.293a1 1 0 011.414 0z"\n clip-rule="evenodd" />\n </svg>\n <div>\n <span class="text-gray-700 dark:text-neutral-200">{{client.transferTxCurrent |\n bytes}}/s</span>\n <!-- Total TX -->\n <br><span class="font-regular" style="font-size:0.85em">{{bytes(client.transferTx)}}</span>\n </div>\n </span>\n\n </div>\n\n <!-- Transfer RX -->\n <div class="min-w-20 md:min-w-24" v-if="client.transferRx">\n <span class="flex gap-1" :title="$t('totalUpload') + bytes(client.transferRx)">\n\n <svg class="align-middle h-3 inline mt-0.5" xmlns="http://www.w3.org/2000/svg"\n viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd"\n d="M3.293 9.707a1 1 0 010-1.414l6-6a1 1 0 011.414 0l6 6a1 1 0 01-1.414 1.414L11 5.414V17a1 1 0 11-2 0V5.414L4.707 9.707a1 1 0 01-1.414 0z"\n clip-rule="evenodd" />\n </svg>\n <div>\n <span class="text-gray-700 dark:text-neutral-200">{{client.transferRxCurrent |\n bytes}}/s</span>\n <!-- Total RX -->\n <br><span class="font-regular" style="font-size:0.85em">{{bytes(client.transferRx)}}</span>\n </div>\n </span>\n </div>\n\n </div>\n </div>\n <!-- </div> --> <!-- <div class="flex flex-grow items-center"> -->\n </div>\n\n <div class="flex items-center justify-end">\n <div class="text-gray-400 dark:text-neutral-400 flex gap-1 items-center justify-between">\n\n <!-- Enable/Disable -->\n <div @click="disableClient(client)" v-if="client.enabled === true" :title="$t('disableClient')"\n class="inline-block align-middle rounded-full w-10 h-6 mr-1 bg-red-800 cursor-pointer hover:bg-red-700 transition-all">\n <div class="rounded-full w-4 h-4 m-1 ml-5 bg-white"></div>\n </div>\n\n <div @click="enableClient(client)" v-if="client.enabled === false" :title="$t('enableClient')"\n class="inline-block align-middle rounded-full w-10 h-6 mr-1 bg-gray-200 dark:bg-neutral-400 cursor-pointer hover:bg-gray-300 dark:hover:bg-neutral-500 transition-all">\n\n <div class="rounded-full w-4 h-4 m-1 bg-white"></div>\n </div>\n\n <!-- Show QR-->\n\n <button :disabled="!client.downloadableConfig"\n class="align-middle bg-gray-100 dark:bg-neutral-600 dark:text-neutral-300 p-2 rounded transition"\n :class="{\n 'hover:bg-red-800 dark:hover:bg-red-800 hover:text-white dark:hover:text-white': client.downloadableConfig,\n 'is-disabled': !client.downloadableConfig\n }"\n :title="!client.downloadableConfig ? $t('noPrivKey') : $t('showQR')"\n @click="qrcode = `./api/wireguard/client/${client.id}/qrcode.svg`">\n <svg class="w-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"\n stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M16 20h4M4 12h4m12 0h.01M5 8h2a1 1 0 001-1V5a1 1 0 00-1-1H5a1 1 0 00-1 1v2a1 1 0 001 1zm12 0h2a1 1 0 001-1V5a1 1 0 00-1-1h-2a1 1 0 00-1 1v2a1 1 0 001 1zM5 20h2a1 1 0 001-1v-2a1 1 0 00-1-1H5a1 1 0 00-1 1v2a1 1 0 001 1z" />\n </svg>\n </button>\n\n <!-- Download Config -->\n <a :disabled="!client.downloadableConfig"\n :href="'./api/wireguard/client/' + client.id + '/configuration'"\n :download="client.downloadableConfig ? 'configuration' : null"\n class="align-middle inline-block bg-gray-100 dark:bg-neutral-600 dark:text-neutral-300 p-2 rounded transition"\n :class="{\n 'hover:bg-red-800 dark:hover:bg-red-800 hover:text-white dark:hover:text-white': client.downloadableConfig,\n 'is-disabled': !client.downloadableConfig\n }"\n :title="!client.downloadableConfig ? $t('noPrivKey') : $t('downloadConfig')"\n @click="if(!client.downloadableConfig) { $event.preventDefault(); }">\n <svg class="w-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"\n stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" />\n </svg>\n </a>\n\n <!-- Delete -->\n\n <button\n class="align-middle bg-gray-100 dark:bg-neutral-600 dark:text-neutral-300 hover:bg-red-800 dark:hover:bg-red-800 hover:text-white dark:hover:text-white p-2 rounded transition"\n :title="$t('deleteClient')" @click="clientDelete = client">\n <svg class="w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd"\n d="M9 2a1 1 0 00-.894.553L7.382 4H4a1 1 0 000 2v10a2 2 0 002 2h8a2 2 0 002-2V6a1 1 0 100-2h-3.382l-.724-1.447A1 1 0 0011 2H9zM7 8a1 1 0 012 0v6a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v6a1 1 0 102 0V8a1 1 0 00-1-1z"\n clip-rule="evenodd" />\n </svg>\n </button>\n </div>\n </div>\n\n </div>\n\n </div>\n <div v-if="clients && clients.length === 0">\n <p class="text-center m-10 text-gray-400 dark:text-neutral-400 text-sm">\n {{$t("noClients")}}<br /><br />\n <button @click="clientCreate = true; clientCreateName = '';"\n class="bg-red-800 hover:bg-red-700 text-white border-2 border-none py-2 px-4 rounded inline-flex items-center transition">\n <svg class="w-4 mr-2" inline xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"\n stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="M12 6v6m0 0v6m0-6h6m-6 0H6" />\n </svg>\n <span class="text-sm">{{$t("newClient")}}</span>\n </button>\n </p>\n </div>\n <div v-if="clients === null" class="text-gray-200 dark:text-red-300 p-5">\n <svg class="w-5 animate-spin mx-auto" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"\n fill="currentColor">\n <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="opacity-75" fill="currentColor"\n d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z">\n </path>\n </svg>\n </div>\n </div>\n </div>\n\n <!-- QR Code-->\n <div v-if="qrcode">\n <div class="bg-black bg-opacity-50 fixed top-0 right-0 left-0 bottom-0 flex items-center justify-center z-20">\n <div class="bg-white rounded-md shadow-lg relative p-8">\n <button @click="qrcode = null"\n class="absolute right-4 top-4 text-gray-600 dark:text-neutral-500 hover:text-gray-800 dark:hover:text-neutral-700">\n <svg class="w-8" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"\n stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />\n </svg>\n </button>\n <img :src="qrcode" />\n </div>\n </div>\n </div>\n\n <!-- Create Dialog -->\n <div v-if="clientCreate" class="fixed z-10 inset-0 overflow-y-auto">\n <div class="flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">\n <!--\n Background overlay, show/hide based on modal state.\n\n Entering: "ease-out duration-300"\n From: "opacity-0"\n To: "opacity-100"\n Leaving: "ease-in duration-200"\n From: "opacity-100"\n To: "opacity-0"\n -->\n <div class="fixed inset-0 transition-opacity" aria-hidden="true">\n <div class="absolute inset-0 bg-gray-500 dark:bg-black opacity-75 dark:opacity-50"></div>\n </div>\n\n <!-- This element is to trick the browser into centering the modal contents. -->\n <span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>\n <!--\n Modal panel, show/hide based on modal state.\n\n Entering: "ease-out duration-300"\n From: "opacity-0 tranneutral-y-4 sm:tranneutral-y-0 sm:scale-95"\n To: "opacity-100 tranneutral-y-0 sm:scale-100"\n Leaving: "ease-in duration-200"\n From: "opacity-100 tranneutral-y-0 sm:scale-100"\n To: "opacity-0 tranneutral-y-4 sm:tranneutral-y-0 sm:scale-95"\n -->\n <div\n class="inline-block align-bottom bg-white dark:bg-neutral-700 rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg w-full"\n role="dialog" aria-modal="true" aria-labelledby="modal-headline">\n <div class="bg-white dark:bg-neutral-700 px-4 pt-5 pb-4 sm:p-6 sm:pb-4">\n <div class="sm:flex sm:items-start">\n <div\n class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-800 sm:mx-0 sm:h-10 sm:w-10">\n <svg class="h-6 w-6 text-white" inline xmlns="http://www.w3.org/2000/svg"\n fill="none" viewBox="0 0 24 24" stroke="currentColor">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="M12 6v6m0 0v6m0-6h6m-6 0H6" />\n </svg>\n </div>\n <div class="flex-grow mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">\n <h3 class="text-lg leading-6 font-medium text-gray-900 dark:text-neutral-200" id="modal-headline">\n {{$t("newClient")}}\n </h3>\n <div class="mt-2">\n <p class="text-sm text-gray-500">\n <input\n class="rounded p-2 border-2 dark:bg-neutral-700 dark:text-neutral-200 border-gray-100 dark:border-neutral-600 focus:border-gray-200 focus:dark:border-neutral-500 dark:placeholder:text-neutral-400 outline-none w-full"\n type="text" v-model.trim="clientCreateName" :placeholder="$t('name')" />\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class="bg-gray-50 dark:bg-neutral-700 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">\n <button v-if="clientCreateName.length" type="button" @click="createClient(); clientCreate = null"\n class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-800 text-base font-medium text-white hover:bg-red-700 focus:outline-none sm:ml-3 sm:w-auto sm:text-sm">\n {{$t("create")}}\n </button>\n <button v-else type="button"\n class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-gray-200 dark:bg-neutral-400 text-base font-medium text-white dark:text-neutral-300 sm:ml-3 sm:w-auto sm:text-sm cursor-not-allowed">\n {{$t("create")}}\n </button>\n <button type="button" @click="clientCreate = null"\n class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 dark:border-neutral-500 shadow-sm px-4 py-2 bg-white dark:bg-neutral-500 text-base font-medium text-gray-700 dark:text-neutral-50 hover:bg-gray-50 dark:hover:bg-neutral-600 dark:hover:border-neutral-600 focus:outline-none sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">\n {{$t("cancel")}}\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Delete Dialog -->\n <div v-if="clientDelete" class="fixed z-10 inset-0 overflow-y-auto">\n <div class="flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">\n <!--\n Background overlay, show/hide based on modal state.\n\n Entering: "ease-out duration-300"\n From: "opacity-0"\n To: "opacity-100"\n Leaving: "ease-in duration-200"\n From: "opacity-100"\n To: "opacity-0"\n -->\n <div class="fixed inset-0 transition-opacity" aria-hidden="true">\n <div class="absolute inset-0 bg-gray-500 dark:bg-black opacity-75 dark:opacity-50"></div>\n </div>\n\n <!-- This element is to trick the browser into centering the modal contents. -->\n <span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>\n <!--\n Modal panel, show/hide based on modal state.\n\n Entering: "ease-out duration-300"\n From: "opacity-0 tranneutral-y-4 sm:tranneutral-y-0 sm:scale-95"\n To: "opacity-100 tranneutral-y-0 sm:scale-100"\n Leaving: "ease-in duration-200"\n From: "opacity-100 tranneutral-y-0 sm:scale-100"\n To: "opacity-0 tranneutral-y-4 sm:tranneutral-y-0 sm:scale-95"\n -->\n <div\n class="inline-block align-bottom bg-white dark:bg-neutral-700 rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg w-full"\n role="dialog" aria-modal="true" aria-labelledby="modal-headline">\n <div class="bg-white dark:bg-neutral-700 px-4 pt-5 pb-4 sm:p-6 sm:pb-4">\n <div class="sm:flex sm:items-start">\n <div\n class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10">\n <!-- Heroicon name: outline/exclamation -->\n <svg class="h-6 w-6 text-red-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"\n stroke="currentColor" aria-hidden="true">\n <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"\n d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />\n </svg>\n </div>\n <div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">\n <h3 class="text-lg leading-6 font-medium text-gray-900 dark:text-neutral-200" id="modal-headline">\n {{$t("deleteClient")}}\n </h3>\n <div class="mt-2">\n <p class="text-sm text-gray-500 dark:text-neutral-300">\n {{$t("deleteDialog1")}} <strong>{{clientDelete.name}}</strong>? {{$t("deleteDialog2")}}\n </p>\n </div>\n </div>\n </div>\n </div>\n <div class="bg-gray-50 dark:bg-neutral-600 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">\n <button type="button" @click="deleteClient(clientDelete); clientDelete = null"\n class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 dark:bg-red-600 text-base font-medium text-white dark:text-white hover:bg-red-700 dark:hover:bg-red-700 focus:outline-none sm:ml-3 sm:w-auto sm:text-sm">\n {{$t("deleteClient")}}\n </button>\n <button type="button" @click="clientDelete = null"\n class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 dark:border-neutral-500 shadow-sm px-4 py-2 bg-white dark:bg-neutral-500 text-base font-medium text-gray-700 dark:text-neutral-50 hover:bg-gray-50 dark:hover:bg-neutral-600 dark:hover:border-neutral-600 focus:outline-none sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">\n {{$t("cancel")}}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div v-if="authenticated === false">\n <h1 class="text-4xl font-medium my-16 text-gray-700 dark:text-neutral-200 text-center">\n <img src="./img/logo.png" width="32" class="inline align-middle dark:bg" />\n <span class="align-middle">WireGuard</span>\n </h1>\n\n <form @submit="login"\n class="shadow rounded-md bg-white dark:bg-neutral-700 mx-auto w-64 p-5 overflow-hidden mt-10">\n <!-- Avatar -->\n <div class="h-20 w-20 mb-10 mt-5 mx-auto rounded-full bg-red-800 dark:bg-red-800 relative overflow-hidden">\n <svg class="w-10 h-10 m-5 text-white dark:text-white" xmlns="http://www.w3.org/2000/svg"\n viewBox="0 0 20 20" fill="currentColor">\n <path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd" />\n </svg>\n </div>\n\n <input type="password" name="password" :placeholder="$t('password')" v-model="password" autocomplete="current-password"\n class="px-3 py-2 text-sm dark:bg-neutral-700 text-gray-500 dark:text-gray-500 mb-5 border-2 border-gray-100 dark:border-neutral-800 rounded-lg w-full focus:border-red-800 dark:focus:border-red-800 dark:placeholder:text-neutral-400 outline-none" />\n\n <button v-if="authenticating"\n class="bg-red-800 dark:bg-red-800 w-full rounded shadow py-2 text-sm text-white dark:text-white cursor-not-allowed">\n <svg class="w-5 animate-spin mx-auto" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"\n fill="currentColor">\n <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="opacity-75" fill="currentColor"\n d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z">\n </path>\n </svg>\n </button>\n <input v-if="!authenticating && password" type="submit"\n class="bg-red-800 dark:bg-red-800 w-full rounded shadow py-2 text-sm text-white dark:text-white hover:bg-red-700 dark:hover:bg-red-700 transition cursor-pointer"\n :value="$t('signIn')">\n <input v-if="!authenticating && !password" type="submit"\n class="bg-gray-200 dark:bg-neutral-800 w-full rounded shadow py-2 text-sm text-white dark:text-white cursor-not-allowed"\n :value="$t('signIn')">\n </form>\n </div>\n\n <div v-if="authenticated === null" class="text-gray-300 dark:text-red-300 pt-24 pb-12">\n\n <svg class="w-5 animate-spin mx-auto" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"\n fill="currentColor">\n <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>\n <path class="opacity-75" fill="currentColor"\n d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z">\n </path>\n </svg>\n\n </div>\n\n </div>\n\n <p v-cloak class="text-center m-10 text-gray-300 dark:text-neutral-600 text-xs"> <a class="hover:underline" target="_blank"\n href="https://github.com/wg-easy/wg-easy">WireGuard Easy</a> © 2021-2024 by <a class="hover:underline" target="_blank"\n href="https://emilenijssen.nl/?ref=wg-easy">Emile Nijssen</a> is licensed under <a class="hover:underline" target="_blank"\n href="http://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a> · <a class="hover:underline"\n href="https://github.com/sponsors/WeeJeWel" target="_blank">{{$t("donate")}}</a></p>\n\n </div>\n\n <script src="./js/vendor/vue.min.js"></script>\n <script src="./js/vendor/vue-i18n.min.js"></script>\n <script src="./js/vendor/apexcharts.min.js"></script>\n <script src="./js/vendor/vue-apexcharts.min.js"></script>\n <script src="./js/vendor/sha256.min.js"></script>\n <script src="./js/vendor/timeago.full.min.js"></script>\n <script src="./js/api.js"></script>\n <script src="./js/i18n.js"></script>\n <script src="./js/app.js"></script>\n</body>\n\n</html>\n
services.http.response.favicons.size 2948
services.http.response.favicons.name http://45.81.243.122:51821/./img/favicon.png
services.http.response.favicons.md5_hash 79827837fd1b23c63965c3d1d8440d66
services.http.response.favicons.hashes md5:79827837fd1b23c63965c3d1d8440d66
services.http.response.favicons.hashes sha256:cfa2854755529b5dec5804512e537f3f20bac0503ba910ff9f7f40a9563a4b13
services.http.response.favicons.shodan_hash -1677277545
services.http.response.favicons.size 70851
services.http.response.favicons.name http://45.81.243.122:51821/./img/apple-touch-icon.png
services.http.response.favicons.md5_hash 3785eb62cc38ff0d2f04b6c70786cd2d
services.http.response.favicons.hashes md5:3785eb62cc38ff0d2f04b6c70786cd2d
services.http.response.favicons.hashes sha256:f7658d117536fea227db3b1bb8889c5c2842d5a0d18e6163e75d968ed84b739c
services.http.response.favicons.shodan_hash -1389878023
services.http.response.body_hashes sha256:72efd863433c3e301512e2fb3a1f6c9b413ddf7b7a3d9bc1c48cc4b6c77de927
services.http.response.body_hashes sha1:85f9f198572144584af6f7a6d0d2020999b49758
services.http.response.body_hashes tlsh:4503b76843f40cfd000b8277fae9fe5a2a7dd253da5b5098f26c45681f86c47ca0b5b8
services.http.response.body_hash sha1:85f9f198572144584af6f7a6d0d2020999b49758
services.http.response.html_title WireGuard
services.http.supports_http2 false
services.labels login-page
services.labels vue.js
services.observed_at 2025-05-12T12:54:46.332718512Z
services.perspective_id PERSPECTIVE_UNKNOWN
services.port 51821
services.service_name HTTP
services.software.uniform_resource_identifier cpe:2.3:a:wg-easy:wg-easy:*:*:*:*:*:*:*:*
services.software.part a
services.software.vendor WireGuard Easy
services.software.product WireGuard Easy
services.software.other.device VPN
services.software.source OSI_APPLICATION_LAYER
services.source_ip 167.94.138.170
services.transport_protocol TCP
services.truncated false