2
0

code.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. from flask import Flask, session, request
  2. from urllib import parse
  3. import json
  4. import pymysql
  5. import time
  6. import re
  7. import json
  8. json_data = open('set.json').read()
  9. data = json.loads(json_data)
  10. conn = pymysql.connect(host = data['host'], user = data['user'], password = data['pw'], charset = 'utf8mb4')
  11. curs = conn.cursor(pymysql.cursors.DictCursor)
  12. def DB_갱신():
  13. conn.commit()
  14. def URL_인코딩(데이터):
  15. return parse.quote(데이터).replace('/','%2F')
  16. def DB_가져오기():
  17. return curs.fetchall()
  18. DB_실행 = curs.execute
  19. DB_인코딩 = pymysql.escape_string
  20. DB_실행("use " + data['db'])
  21. def 비교(seqm):
  22. output= []
  23. for opcode, a0, a1, b0, b1 in seqm.get_opcodes():
  24. if(opcode == 'equal'):
  25. output.append(seqm.a[a0:a1])
  26. elif(opcode == 'insert'):
  27. output.append("<span style='background:#CFC;'>" + seqm.b[b0:b1] + "</span>")
  28. elif(opcode == 'delete'):
  29. output.append("<span style='background:#FDD;'>" + seqm.a[a0:a1] + "</span>")
  30. elif(opcode == 'replace'):
  31. output.append("<span style='background:#CFC;'>" + seqm.b[b0:b1] + "</span><span style='background:#FDD;'>" + seqm.a[a0:a1] + "</span>")
  32. else:
  33. output.append(seqm.a[a0:a1])
  34. return ''.join(output)
  35. def 관리자_확인():
  36. if(session.get('Now') == True):
  37. 아이피 = 아이피_확인()
  38. DB_실행("select * from user where id = '" + DB_인코딩(아이피) + "'")
  39. 사용자_자료 = DB_가져오기()
  40. if(사용자_자료):
  41. if(사용자_자료[0]['acl'] == 'owner' or 사용자_자료[0]['acl'] == 'admin'):
  42. return 1
  43. def 소유자_확인():
  44. if(session.get('Now') == True):
  45. 아이피 = 아이피_확인()
  46. DB_실행("select * from user where id = '" + DB_인코딩(아이피) + "'")
  47. 사용자_자료 = DB_가져오기()
  48. if(사용자_자료):
  49. if(사용자_자료[0]['acl'] == 'owner'):
  50. return 1
  51. def 틀_확인(이름, 데이터):
  52. if(re.search('^틀:', 이름)):
  53. DB_실행("select * from back where title = '" + DB_인코딩(이름) + "' and type = 'include'")
  54. 틀_역링크 = DB_가져오기()
  55. if(틀_역링크):
  56. 숫자 = 0
  57. while(True):
  58. try:
  59. 나무마크(틀_역링크[숫자]['link'], 데이터)
  60. except:
  61. break
  62. 숫자 += 1
  63. def 로그인_확인():
  64. if(session.get('Now') == True):
  65. return 1
  66. else:
  67. return 0
  68. def 아이디_파싱(원래_아이디):
  69. 있나 = re.search("([^-]*)\s\-\s(Close|Reopen|Stop|Restart|Admin|Agreement|Settlement)$", 원래_아이디)
  70. if(있나):
  71. 분리 = 있나.groups()
  72. DB_실행("select * from data where title = '사용자:" + DB_인코딩(분리[0]) + "'")
  73. row = DB_가져오기()
  74. if(row):
  75. ip = '<a href="/w/' + URL_인코딩('사용자:' + 분리[0]) + '">' + 분리[0] + '</a> - ' + 분리[1] + ' <a href="/record/' + URL_인코딩(분리[0]) + '/n/1">(기록)</a>'
  76. else:
  77. ip = '<a class="not_thing" href="/w/' + URL_인코딩('사용자:' + 분리[0]) + '">' + 분리[0] + '</a> - ' + 분리[1] + ' <a href="/record/' + URL_인코딩(분리[0]) + '/n/1">(기록)</a>'
  78. elif(re.search("\.", 원래_아이디)):
  79. ip = 원래_아이디 + ' <a href="/record/' + URL_인코딩(원래_아이디) + '/n/1">(기록)</a>'
  80. else:
  81. DB_실행("select * from data where title = '사용자:" + DB_인코딩(원래_아이디) + "'")
  82. row = DB_가져오기()
  83. if(row):
  84. ip = '<a href="/w/' + URL_인코딩('사용자:' + 원래_아이디) + '">' + 원래_아이디 + '</a> <a href="/record/' + URL_인코딩(원래_아이디) + '/n/1">(기록)</a>'
  85. else:
  86. ip = '<a class="not_thing" href="/w/' + URL_인코딩('사용자:' + 원래_아이디) + '">' + 원래_아이디 + '</a> <a href="/record/' + URL_인코딩(원래_아이디) + '/n/1">(기록)</a>'
  87. return ip
  88. def 아이피_확인():
  89. if(session.get('Now') == True):
  90. 아이피 = format(session['DREAMER'])
  91. else:
  92. if(request.headers.getlist("X-Forwarded-For")):
  93. 아이피 = request.headers.getlist("X-Forwarded-For")[0]
  94. else:
  95. 아이피 = request.remote_addr
  96. return 아이피
  97. def ACL_체크(ip, name):
  98. m = re.search("^사용자:(.*)", name)
  99. n = re.search("^파일:(.*)", name)
  100. if(m):
  101. g = m.groups()
  102. if(ip == g[0]):
  103. if(re.search("\.", g[0])):
  104. return 1
  105. else:
  106. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  107. rows = DB_가져오기()
  108. if(rows):
  109. return 1
  110. else:
  111. return 0
  112. else:
  113. return 1
  114. elif(n):
  115. if(not 소유자_확인() == 1):
  116. return 1
  117. else:
  118. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))", ip)
  119. if(b):
  120. results = b.groups()
  121. DB_실행("select * from ban where block = '" + DB_인코딩(results[0]) + "' and band = 'O'")
  122. rowss = DB_가져오기()
  123. if(rowss):
  124. return 1
  125. else:
  126. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  127. rows = DB_가져오기()
  128. if(rows):
  129. return 1
  130. else:
  131. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  132. row = DB_가져오기()
  133. if(row):
  134. DB_실행("select * from user where id = '" + DB_인코딩(ip) + "'")
  135. rows = DB_가져오기()
  136. if(row[0]['acl'] == 'user'):
  137. if(rows):
  138. return 0
  139. else:
  140. return 1
  141. elif(row[0]['acl'] == 'admin'):
  142. if(rows):
  143. if(rows[0]['acl'] == 'admin' or rows[0]['acl'] == 'owner'):
  144. return 0
  145. else:
  146. return 1
  147. else:
  148. return 1
  149. else:
  150. return 0
  151. else:
  152. return 0
  153. else:
  154. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  155. rows = DB_가져오기()
  156. if(rows):
  157. return 1
  158. else:
  159. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  160. row = DB_가져오기()
  161. if(row):
  162. DB_실행("select * from user where id = '" + DB_인코딩(ip) + "'")
  163. rows = DB_가져오기()
  164. if(row[0]['acl'] == 'user'):
  165. if(rows):
  166. return 0
  167. else:
  168. return 1
  169. elif(row[0]['acl'] == 'admin'):
  170. if(rows):
  171. if(rows[0]['acl'] == 'admin' or rows[0]['acl'] == 'owner'):
  172. return 0
  173. else:
  174. return 1
  175. else:
  176. return 1
  177. else:
  178. return 0
  179. else:
  180. return 0
  181. def 차단_체크(ip):
  182. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))", ip)
  183. if(b):
  184. results = b.groups()
  185. DB_실행("select * from ban where block = '" + DB_인코딩(results[0]) + "' and band = 'O'")
  186. rowss = DB_가져오기()
  187. if(rowss):
  188. return 1
  189. else:
  190. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  191. rows = DB_가져오기()
  192. if(rows):
  193. return 1
  194. else:
  195. return 0
  196. else:
  197. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  198. rows = DB_가져오기()
  199. if(rows):
  200. return 1
  201. else:
  202. return 0
  203. def 토론자_체크(ip, name, sub):
  204. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))", ip)
  205. if(b):
  206. results = b.groups()
  207. DB_실행("select * from ban where block = '" + DB_인코딩(results[0]) + "' and band = 'O'")
  208. rowss = DB_가져오기()
  209. if(rowss):
  210. return 1
  211. else:
  212. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  213. rows = DB_가져오기()
  214. if(rows):
  215. return 1
  216. else:
  217. DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'")
  218. rows = DB_가져오기()
  219. if(rows):
  220. return 1
  221. else:
  222. return 0
  223. else:
  224. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  225. rows = DB_가져오기()
  226. if(rows):
  227. return 1
  228. else:
  229. DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'")
  230. rows = DB_가져오기()
  231. if(rows):
  232. return 1
  233. else:
  234. return 0
  235. def 시간():
  236. now = time.localtime()
  237. s = "%04d-%02d-%02d %02d:%02d:%02d" % (now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec)
  238. return s
  239. def 최근_토론_추가(title, sub, date):
  240. DB_실행("select * from rd where title = '" + DB_인코딩(title) + "' and sub = '" + DB_인코딩(sub) + "'")
  241. 최근_토론 = DB_가져오기()
  242. if(최근_토론):
  243. DB_실행("update rd set date = '" + DB_인코딩(date) + "' where title = '" + DB_인코딩(title) + "' and sub = '" + DB_인코딩(sub) + "'")
  244. else:
  245. DB_실행("insert into rd (title, sub, date) value ('" + DB_인코딩(title) + "', '" + DB_인코딩(sub) + "', '" + DB_인코딩(date) + "')")
  246. DB_갱신()
  247. def 최근_차단_추가(block, end, today, blocker, why):
  248. DB_실행("insert into rb (block, end, today, blocker, why) value ('" + DB_인코딩(block) + "', '" + DB_인코딩(end) + "', '" + today + "', '" + DB_인코딩(blocker) + "', '" + DB_인코딩(why) + "')")
  249. DB_갱신()
  250. def 역사_추가(title, data, date, ip, send, leng):
  251. DB_실행("select * from history where title = '" + DB_인코딩(title) + "' order by id+0 desc limit 1")
  252. rows = DB_가져오기()
  253. if(rows):
  254. number = int(rows[0]['id']) + 1
  255. DB_실행("insert into history (id, title, data, date, ip, send, leng) value ('" + str(number) + "', '" + DB_인코딩(title) + "', '" + DB_인코딩(data) + "', '" + date + "', '" + DB_인코딩(ip) + "', '" + DB_인코딩(send) + "', '" + leng + "')")
  256. DB_갱신()
  257. else:
  258. DB_실행("insert into history (id, title, data, date, ip, send, leng) value ('1', '" + DB_인코딩(title) + "', '" + DB_인코딩(data) + "', '" + date + "', '" + DB_인코딩(ip) + "', '" + DB_인코딩(send + ' (새 문서)') + "', '" + leng + "')")
  259. DB_갱신()
  260. def 길이_확인(기존, 바뀜):
  261. if(기존 < 바뀜):
  262. 길이 = 바뀜 - 기존
  263. 길이 = '+' + str(길이)
  264. elif(바뀜 < 기존):
  265. 길이 = 기존 - 바뀜
  266. 길이 = '-' + str(길이)
  267. else:
  268. 길이 = '0'
  269. return 길이