give_user_ban.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. from .tool.func import *
  2. async def give_user_ban(name = None, ban_type = ''):
  3. with get_db_connect() as conn:
  4. curs = conn.cursor()
  5. ip = ip_check()
  6. if (await ban_check(ip = ip, tool = 'login'))[0] == 1:
  7. if ip_or_user(ip) == 1 or await acl_check(tool = 'all_admin_auth', ip = ip) != 0:
  8. return await re_error(conn, 0)
  9. else:
  10. if await acl_check(tool = 'ban_auth', ip = ip) == 1:
  11. return await re_error(conn, 3)
  12. if flask.request.method == 'POST':
  13. end = '0'
  14. date_select = flask.request.form.get('date_type', 'days')
  15. if date_select == 'date':
  16. time_limit = flask.request.form.get('date', '')
  17. if re.search(r'^[0-9]{4}-[0-9]{2}-[0-9]{2}$', time_limit):
  18. end = time_limit + ' 00:00:00'
  19. else:
  20. time_limit = int(number_check(flask.request.form.get('date_days', '1')))
  21. time = datetime.datetime.now()
  22. plus = datetime.timedelta(days = time_limit)
  23. end = (time + plus).strftime("%Y-%m-%d %H:%M:%S")
  24. regex_get = flask.request.form.get('do_ban_type', '')
  25. why = flask.request.form.get('why', '')
  26. release = ''
  27. login = ''
  28. ban_option = flask.request.form.get('ban_option', '')
  29. if ban_option == 'login_able_and_regsiter_disable':
  30. login = 'O'
  31. elif ban_option == 'login_able':
  32. login = 'L'
  33. elif ban_option == 'edit_request_able':
  34. login = 'E'
  35. elif ban_option == 'completely_ban':
  36. login = 'A'
  37. elif ban_option == 'dont_come_this_site':
  38. login = 'D'
  39. elif ban_option == 'release':
  40. release = '1'
  41. if ban_type == 'multiple':
  42. all_user = re.findall(r'([^\n]+)\n', flask.request.form.get('name', 'test').replace('\r', '') + '\n')
  43. else:
  44. if name:
  45. all_user = [name]
  46. else:
  47. all_user = [flask.request.form.get('name', 'test')]
  48. for name in all_user:
  49. if regex_get == 'regex':
  50. type_d = 'regex'
  51. try:
  52. re.compile(name)
  53. except:
  54. return await re_error(conn, 23)
  55. elif regex_get == 'cidr':
  56. type_d = 'cidr'
  57. try:
  58. ipaddress.IPv4Network(name, False)
  59. except:
  60. try:
  61. ipaddress.IPv6Network(name, False)
  62. except:
  63. return await re_error(conn, 45)
  64. elif regex_get == 'private':
  65. type_d = 'private'
  66. if await acl_check(tool = 'owner_auth', ip = ip) == 1:
  67. return await re_error(conn, 0)
  68. else:
  69. type_d = None
  70. if regex_get != 'private':
  71. if name == ip:
  72. if await acl_check(tool = 'all_admin_auth', memo = 'ban (' + name + ')') == 1:
  73. return await re_error(conn, 3)
  74. else:
  75. if await acl_check(tool = 'ban_auth', memo = 'ban (' + name + ')') == 1:
  76. return await re_error(conn, 3)
  77. ban_insert(conn,
  78. name,
  79. end,
  80. why,
  81. login,
  82. ip_check(),
  83. type_d,
  84. 1 if release != '' else 0
  85. )
  86. return redirect(conn, '/recent_block')
  87. else:
  88. if ban_type == 'multiple':
  89. main_name = await get_lang('multiple_ban')
  90. n_name = '<textarea class="opennamu_textarea_500" placeholder="' + await get_lang('name_or_ip_or_regex_or_cidr_multiple') + '" name="name"></textarea><hr class="main_hr">'
  91. else:
  92. main_name = await get_lang('ban')
  93. n_name = '<input placeholder="' + await get_lang('name_or_ip_or_regex_or_cidr') + '" value="' + (name if name else '') + '" name="name"><hr class="main_hr">'
  94. now = 0
  95. if ban_type == 'multiple':
  96. action = 'action="/auth/ban/multiple"'
  97. else:
  98. action = 'action="/auth/ban"'
  99. date_value = ''
  100. info_data = ''
  101. if name:
  102. curs.execute(db_change("select end from rb where block = ? and ongoing = '1'"), [name])
  103. db_data = curs.fetchall()
  104. if db_data and db_data[0][0] != '':
  105. date_value = db_data[0][0].split()[0]
  106. if ban_type == '':
  107. info_data = '<div id="opennamu_get_user_info">' + html.escape(name) + '</div>'
  108. owner_option = ''
  109. if await acl_check(tool = 'owner_auth', ip = ip) != 1:
  110. owner_option = '<option value="private" ' + ('selected' if ban_type == 'private' else '') + '>' + await get_lang('private') + '</option>'
  111. return easy_minify(flask.render_template(await skin_check(conn),
  112. imp = [main_name, await wiki_set(), await wiki_custom(conn), wiki_css([now, 0])],
  113. data = info_data + '''
  114. <form method="post" ''' + action + '''>
  115. <h2>''' + await get_lang('method') + '''</h2>
  116. ''' + n_name + '''
  117. <select name="do_ban_type">
  118. <option value="normal">''' + await get_lang('normal') + '''</option>
  119. <option value="regex" ''' + ('selected' if ban_type == 'regex' else '') + '>' + await get_lang('regex') + '''</option>
  120. <option value="cidr" ''' + ('selected' if ban_type == 'cidr' else '') + '>' + await get_lang('cidr') + '''</option>
  121. ''' + owner_option + '''
  122. </select>
  123. <hr class="main_hr">
  124. <select name="ban_option">
  125. <option value="">''' + await get_lang('default') + '''</option>
  126. <option value="login_able">''' + await get_lang('login_able') + '''</option>
  127. <option value="login_able_and_regsiter_disable">''' + await get_lang('login_able_and_regsiter_disable') + '''</option>
  128. <option value="edit_request_able">''' + await get_lang('edit_request_able') + '''</option>
  129. <option value="completely_ban">''' + await get_lang('completely_ban') + '''</option>
  130. <option value="dont_come_this_site">''' + await get_lang('dont_come_this_site') + '''</option>
  131. <option value="release">''' + await get_lang('release') + '''</option>
  132. </select>
  133. <h2>''' + await get_lang('date') + '''</h2>
  134. <select name="date_type">
  135. <option value="date">''' + await get_lang('date') + '''</option>
  136. <option value="days">''' + await get_lang('day') + '''</option>
  137. </select>
  138. <hr class="main_hr">
  139. <span>''' + await get_lang('day') + '''</span>
  140. <hr class="main_hr">
  141. <input name="date_days">
  142. <hr class="main_hr">
  143. <span>''' + await get_lang('date') + '''</span>
  144. <hr class="main_hr">
  145. <input type="date" value="''' + date_value + '''" name="date" pattern="\\d{4}-\\d{2}-\\d{2}">
  146. <h2>''' + await get_lang('other') + '''</h2>
  147. <input placeholder="''' + await get_lang('why') + '''" name="why" type="text">
  148. <hr class="main_hr">
  149. <button type="submit">''' + await get_lang('save') + '''</button>
  150. </form>
  151. ''',
  152. menu = [['manager', await get_lang('return')]]
  153. ))