main_func_upload.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. from .tool.func import *
  2. def main_func_upload():
  3. with get_db_connect() as conn:
  4. curs = conn.cursor()
  5. if acl_check(None, 'upload') == 1:
  6. return re_error('/ban')
  7. if flask.request.method == 'POST':
  8. if captcha_post(flask.request.form.get('g-recaptcha-response', flask.request.form.get('g-recaptcha', ''))) == 1:
  9. return re_error('/error/13')
  10. else:
  11. captcha_post('', 0)
  12. file_data = flask.request.files.getlist("f_data[]", None)
  13. if not file_data:
  14. return re_error('/error/9')
  15. file_len = len(file_data)
  16. if (int(wiki_set(3)) * 1000 * 1000 * file_len) < flask.request.content_length:
  17. return re_error('/error/17')
  18. if file_len == 1:
  19. file_num = None
  20. else:
  21. if acl_check(None, 'many_upload') == 1:
  22. return re_error('/ban')
  23. file_num = 1
  24. for data in file_data:
  25. value = os.path.splitext(data.filename)[1]
  26. curs.execute(db_change("select html from html_filter where kind = 'extension'"))
  27. extension = [i[0].lower() for i in curs.fetchall()]
  28. if not re.sub(r'^\.', '', value).lower() in extension:
  29. return re_error('/error/14')
  30. if flask.request.form.get('f_name', None):
  31. name = flask.request.form.get('f_name', None) + (' ' + str(file_num) if file_num else '') + value
  32. else:
  33. name = data.filename
  34. piece = os.path.splitext(name)
  35. if re.search(r'[^ㄱ-힣0-9a-zA-Z_\- ]', piece[0]):
  36. return re_error('/error/22')
  37. e_data = sha224_replace(piece[0]) + piece[1]
  38. curs.execute(db_change("select title from data where title = ?"), ['file:' + name])
  39. if curs.fetchall():
  40. return re_error('/error/16')
  41. curs.execute(db_change("select html from html_filter where kind = 'file'"))
  42. db_data = curs.fetchall()
  43. for i in db_data:
  44. t_re = re.compile(i[0])
  45. if t_re.search(name):
  46. return redirect('/file_filter')
  47. data_url_image = load_image_url()
  48. if os.path.exists(os.path.join(data_url_image, e_data)):
  49. return re_error('/error/16')
  50. else:
  51. data.save(os.path.join(data_url_image, e_data))
  52. ip = ip_check()
  53. g_lice = flask.request.form.get('f_lice', '')
  54. file_size = os.stat(os.path.join(data_url_image, e_data)).st_size
  55. file_size = str(round(file_size / 1000, 1))
  56. curs.execute(db_change("select data from other where name = 'markup'"))
  57. db_data = curs.fetchall()
  58. if db_data and db_data[0][0] == 'namumark':
  59. file_d = '' + \
  60. flask.request.form.get('f_lice_sel', 'direct_input') + '\n' + \
  61. '[[category:' + re.sub(r'\]', '_', flask.request.form.get('f_lice_sel', '')) + ']]\n' + \
  62. (g_lice if g_lice != '' else '') + \
  63. ''
  64. else:
  65. file_d = '' + \
  66. flask.request.form.get('f_lice_sel', 'direct_input') + '\n' + \
  67. (g_lice if g_lice != '' else '') + \
  68. ''
  69. curs.execute(db_change("insert into data (title, data) values (?, ?)"), ['file:' + name, file_d])
  70. curs.execute(db_change("insert into acl (title, data, type) values (?, 'admin', 'decu')"), ['file:' + name])
  71. render_set(
  72. doc_name = 'file:' + name,
  73. doc_data = file_d,
  74. data_type = 'backlink'
  75. )
  76. history_plus(
  77. 'file:' + name,
  78. file_d,
  79. get_time(),
  80. ip,
  81. '',
  82. '0',
  83. t_check = 'upload',
  84. mode = 'upload'
  85. )
  86. if file_num:
  87. file_num += 1
  88. conn.commit()
  89. return redirect('/w/file:' + name)
  90. else:
  91. license_list = '<option value="direct_input">' + load_lang('direct_input') + '</option>'
  92. file_name = html.escape(flask.request.args.get('name', ''))
  93. curs.execute(db_change("select html from html_filter where kind = 'image_license'"))
  94. db_data = curs.fetchall()
  95. license_list += ''.join(['<option value="' + i[0] + '">' + i[0] + '</option>' for i in db_data])
  96. curs.execute(db_change("select data from other where name = 'upload_help'"))
  97. db_data = curs.fetchall()
  98. upload_help = ('<hr class="main_hr">' + db_data[0][0]) if db_data and db_data[0][0] != '' else ''
  99. curs.execute(db_change("select data from other where name = 'upload_default'"))
  100. db_data = curs.fetchall()
  101. upload_default = html.escape(db_data[0][0]) if db_data and db_data[0][0] != '' else ''
  102. return easy_minify(flask.render_template(skin_check(),
  103. imp = [load_lang('upload'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
  104. data = '''
  105. <a href="/file_filter">(''' + load_lang('file_filter_list') + ''')</a> <a href="/extension_filter">(''' + load_lang('extension_filter_list') + ''')</a>
  106. ''' + upload_help + '''
  107. <hr class="main_hr">
  108. ''' + load_lang('max_file_size') + ''' : ''' + wiki_set(3) + '''MB
  109. <hr class="main_hr">
  110. <form method="post" enctype="multipart/form-data" accept-charset="utf8">
  111. <input multiple="multiple" type="file" name="f_data[]">
  112. <hr class="main_hr">
  113. <input placeholder="''' + load_lang('file_name') + '''" name="f_name" value="''' + file_name + '''">
  114. <hr class="main_hr">
  115. <select name="f_lice_sel">
  116. ''' + license_list + '''
  117. </select>
  118. <hr class="main_hr">
  119. <textarea rows="10" placeholder="''' + load_lang('other') + '''" name="f_lice">''' + upload_default + '''</textarea>
  120. <hr class="main_hr">
  121. ''' + captcha_get() + '''
  122. <button id="save" type="submit">''' + load_lang('save') + '''</button>
  123. </form>
  124. ''',
  125. menu = [['other', load_lang('return')]]
  126. ))