register.html 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8"/>
  5. <link rel="icon" href="/assets/logo.png">
  6. <link href="https://fonts.googleapis.com/css?family=Titillium+Web&display=swap" rel="stylesheet">
  7. <link type="text/css" href="/css/index.css" rel="stylesheet">
  8. <link type="text/css" href="/css/styles.css" rel="stylesheet">
  9. <link type="text/css" href="/css/controls.css" rel="stylesheet">
  10. <script src="/js/jquery-3.4.1.min.js"></script>
  11. <script>
  12. const emailRegex = /^[a-zA-Z]+[\w\d\._-]*$/
  13. const passwordRegex = /[A-Z0-6!"\#$%&'()*+,\-./:;<=>?@\[\\\]^_‘{|}~]/
  14. const fullnameRegex = /^[\w ]*$/
  15. var emailOk = false
  16. $(document).ready(function() {
  17. $('#showPasswordButton').mousedown(function() {
  18. $('#passwordField').attr('type', 'text')
  19. })
  20. $('#showPasswordButton').mouseup(function() {
  21. $('#passwordField').attr('type', 'password')
  22. })
  23. validateEmail($('#userField'))
  24. $('#fullnameField').on('input', validateFields)
  25. $('#userField').on('input', function(e) { validateEmail($(e.target)) })
  26. $('#passwordField').on('input', validateFields)
  27. })
  28. function submitChanges() {
  29. if (emailOk && validatePassword($('#passwordField')) && validateFullname($('#fullnameField'))) {
  30. $('#registerForm').submit()
  31. }
  32. }
  33. var emailInputTimer = null
  34. function validateEmail(element) {
  35. emailOk = false
  36. validateFields()
  37. var fieldDiv = element.parent()
  38. if (emailRegex.test(element.val())) {
  39. clearTimeout(emailInputTimer)
  40. emailInputTimer = setTimeout(emailCheck, 200)
  41. return
  42. } else {
  43. fieldDiv.addClass("bad")
  44. }
  45. }
  46. function emailCheck() {
  47. var element = $('#userField')
  48. var fieldDiv = element.parent()
  49. $.ajax({
  50. url: "/checkEmail",
  51. data: {
  52. user: element.val()
  53. },
  54. success: function(result) {
  55. emailOk = true
  56. validateFields()
  57. fieldDiv.removeClass("bad")
  58. },
  59. error: function(jqXHR, textStatus, errorThrown) {
  60. emailOk = false
  61. validateFields()
  62. fieldDiv.addClass("bad")
  63. }
  64. })
  65. }
  66. function validatePassword(element) {
  67. var fieldDiv = element.parent()
  68. if (validateField(element)) {
  69. if (element.val().length < 8 || !passwordRegex.test(element.val())) {
  70. fieldDiv.addClass("weak")
  71. } else {
  72. fieldDiv.removeClass("weak")
  73. }
  74. return true
  75. }
  76. return false
  77. }
  78. function validateFullname(element) {
  79. var fieldDiv = element.parent()
  80. if (fullnameRegex.test(element.val())) {
  81. fieldDiv.removeClass("bad")
  82. return true
  83. }
  84. fieldDiv.addClass("bad")
  85. return false
  86. }
  87. function validateField(element) {
  88. var fieldDiv = element.parent()
  89. if (element.val() != '') {
  90. fieldDiv.removeClass('bad')
  91. return true
  92. }
  93. fieldDiv.addClass('bad')
  94. return false
  95. }
  96. function validateFields() {
  97. var passwordOk = validatePassword($('#passwordField'))
  98. var fullnameOk = validateFullname($('#fullnameField'))
  99. if (emailOk && passwordOk && fullnameOk) {
  100. $('#registerButton').removeClass('disabled')
  101. } else {
  102. $('#registerButton').addClass('disabled')
  103. }
  104. }
  105. </script>
  106. <title>Gostfix mail {{.Version}}</title>
  107. </head>
  108. <body>
  109. <div id="main">
  110. <div class="horizontalPaddingBox">
  111. <div style="display: flex; flex-direction: column; width: 100%; height: 100%; justify-content: center;">
  112. <form id="registerForm" method="POST" action="/register" style="margin: 0 auto;">
  113. <div class="inpt bad">
  114. <input id="fullnameField" name="fullname" type="text" required maxlength="128" autocomplete="off">
  115. <span class="highlight"></span>
  116. <span class="bar"></span>
  117. <label>Full name</label>
  118. </div>
  119. <div class="inpt bad">
  120. <input id="userField" name="user" type="text" required maxlength="64" autocomplete="off">
  121. <span class="highlight"></span>
  122. <span class="bar"></span>
  123. <label>User @{{.Domain}}</label>
  124. </div>
  125. <div class="inpt bad">
  126. <input id="passwordField" name="password" type="password" required maxlength="128" autocomplete="off">
  127. <span class="highlight"></span>
  128. <span class="bar"></span>
  129. <label>Password</label>
  130. <img id="showPasswordButton" src="/assets/eye.svg"/>
  131. </div>
  132. <div id="registerButton" class="btn materialLevel1 disabled" style="margin-bottom: 15px;" onclick="submitChanges();">Register</div>
  133. </form>
  134. </div>
  135. </div>
  136. <div id="copyrightBox" class="elidedText"><img src="/assets/logo.svg" height="30px"/>gostfix {{.Version}} Web interface. Copyright (c) 2020 Alexey Edelev &lt;semlanik@gmail.com&gt;</div>
  137. </div>
  138. </body>
  139. </html>