Explorar o código

Merge pull request #1847 from openNAMU/dev

기능 수정
잉여개발기 (SPDV) %!s(int64=2) %!d(string=hai) anos
pai
achega
823a25c710

+ 9 - 3
route/edit.py

@@ -94,9 +94,15 @@ def edit(name = 'Test', section = 0, do_type = ''):
             else:
                 leng = '+' + str(len(content))
 
-            
+            curs.execute(db_change("select data from other where name = 'edit_timeout'"))
+            db_data_2 = curs.fetchall()
+            db_data_2 = '' if not db_data_2 else number_check(db_data_2[0][0])
+
             try:
-                timeout = edit_timeout(edit_render_set, (name, content), timeout = 5)
+                if db_data_2 != '':
+                    timeout = edit_timeout(edit_render_set, (name, content), timeout = int(db_data_2))
+                else:
+                    timeout = 0
             except Exception as e:
                 print('multiprocessing error : ')
                 print(e)
@@ -105,7 +111,7 @@ def edit(name = 'Test', section = 0, do_type = ''):
 
             if timeout == 1:
                 return re_error('/error/41')
-                
+            
             if db_data:
                 curs.execute(db_change("update data set data = ? where title = ?"), [content, name])
             else:    

+ 1 - 0
route/main_setting.py

@@ -13,6 +13,7 @@ def main_setting():
             ['sitemap', load_lang('sitemap_management')],
             ['top_menu', load_lang('top_menu_setting')],
             ['skin_set', load_lang('main_skin_set_default')],
+            ['acl', load_lang('main_acl_setting')]
         ]
 
         li_data = ''.join(['<li><a href="/setting/' + str(li[0]) + '">' + li[1] + '</a></li>' for li in li_list])

+ 7 - 4
route/main_setting_main.py

@@ -39,7 +39,8 @@ def main_setting_main(db_set):
             35 : ['user_name_view', ''],
             36 : ['link_case_insensitive', ''],
             37 : ['move_with_redirect', ''],
-            38 : ['slow_thread', '']
+            38 : ['slow_thread', ''],
+            39 : ['edit_timeout', '5'],
         }
 
         if flask.request.method == 'POST':
@@ -225,9 +226,6 @@ def main_setting_main(db_set):
                         </span>
 
                         <h2>''' + load_lang('edit_set') + '''</h2>
-                        <span><a href="/setting/acl">(''' + load_lang('main_acl_setting') + ''')</a></span>
-                        <hr class="main_hr">
-
                         <span>''' + load_lang('slow_edit') + ''' (''' + load_lang('second') + ''') (''' + load_lang('off') + ''' : ''' + load_lang('empty') + ''')</span>
                         <hr class="main_hr">
                         <input name="slow_edit" value="''' + html.escape(d_list[19]) + '''">
@@ -262,6 +260,11 @@ def main_setting_main(db_set):
                         <input name="slow_thread" value="''' + html.escape(d_list[38]) + '''">
                         <hr class="main_hr">
 
+                        <span>''' + load_lang('edit_timeout') + ''' (''' + load_lang('second') + ''') (''' + load_lang('off') + ''' : ''' + load_lang('empty') + ''')</span>
+                        <hr class="main_hr">
+                        <input name="edit_timeout" value="''' + html.escape(d_list[39]) + '''">
+                        <hr class="main_hr">
+
                         <button id="opennamu_save_button" type="submit">''' + load_lang('save') + '''</button>
                     </form>
                 '''),

+ 21 - 8
route/tool/func.py

@@ -103,12 +103,10 @@ conn = ''
 # Func-main
 def load_conn(data):
     global conn
-
     conn = data
     
 def do_db_set(db_set):
     global global_db_set
-    
     global_db_set = db_set
     
 # Func-init
@@ -2262,18 +2260,25 @@ def do_edit_send_check(data):
     
     return 0
 
-def do_edit_slow_check():
+def do_edit_slow_check(do_type = 'edit'):
     curs = conn.cursor()
 
-    curs.execute(db_change("select data from other where name = 'slow_edit'"))
+    if do_type == 'edit':
+        curs.execute(db_change("select data from other where name = 'slow_edit'"))
+    else:
+        # do_type == 'thread'
+        curs.execute(db_change("select data from other where name = 'slow_thread'"))
+    
     slow_edit = curs.fetchall()
     if slow_edit and slow_edit[0][0] != '':
         if acl_check(None, 'slow_edit') == 1:
             slow_edit = int(number_check(slow_edit[0][0]))
 
-            curs.execute(db_change(
-                "select date from history where ip = ? order by date desc limit 1"
-            ), [ip_check()])
+            if do_type == 'edit':
+                curs.execute(db_change("select date from history where ip = ? order by date desc limit 1"), [ip_check()])
+            else:
+                curs.execute(db_change("select date from topic where ip = ? order by date desc limit 1"), [ip_check()])
+            
             last_edit_data = curs.fetchall()
             if last_edit_data:
                 last_edit_data = int(re.sub(' |:|-', '', last_edit_data[0][0]))
@@ -2709,7 +2714,15 @@ def re_error(data):
                 
             data = load_lang('error_password_length_too_short') + password_min_length
         elif num == 41:
-            data = load_lang('timeout_error') + '5'
+            curs.execute(db_change("select data from other where name = 'edit_timeout'"))
+            db_data = curs.fetchall()
+            db_data = '' if not db_data else db_data[0][0]
+            data = load_lang('timeout_error') + db_data
+        elif num == 42:
+            curs.execute(db_change("select data from other where name = 'slow_thread'"))
+            db_data = curs.fetchall()
+            db_data = '' if not db_data else db_data[0][0]
+            data = load_lang('fast_edit_error') + db_data
         else:
             data = '???'
 

+ 2 - 2
route/tool/func_render.py

@@ -63,12 +63,12 @@ class class_do_render:
         if data_type == 'thread' or data_type == 'api_thread':
             data_end[0] = re.sub(
                 r'&lt;topic_a&gt;(?P<in>(?:(?!&lt;\/topic_a&gt;).)+)&lt;\/topic_a&gt;',
-                '<a href="\g<in>">\g<in></a>',
+                '<a href="\\g<in>">\\g<in></a>',
                 data_end[0]
             )
             data_end[0] = re.sub(
                 r'&lt;topic_call&gt;@(?P<in>(?:(?!&lt;\/topic_call&gt;).)+)&lt;\/topic_call&gt;',
-                '<a href="/w/user:\g<in>">@\g<in></a>',
+                '<a href="/w/user:\\g<in>">@\\g<in></a>',
                 data_end[0]
             )
 

+ 15 - 15
route/tool/func_render_namumark.py

@@ -314,14 +314,14 @@ class class_do_render_namumark:
         while 1:
             heading_count += 1
 
-            if not re.search(heading_regex, self.render_data):
+            heading_data = re.search(heading_regex, self.render_data)
+            if not heading_data:
                 break
             elif heading_count_all < 0:
                 print('Error : render heading count overflow')
 
                 break
             else:
-                heading_data = re.search(heading_regex, self.render_data)
                 heading_data_org = heading_data.group(0)
                 heading_data = heading_data.groups()
 
@@ -707,8 +707,8 @@ class class_do_render_namumark:
 
             return '<' + data_name + '></' + data_name + '>'
 
-        math_regex = re.compile('\[math\(((?:(?!\[math\(|\)\]).|\n)+)\)\]', re.I)
-        math_regex_2 = re.compile('&lt;math&gt;((?:(?!&lt;math&gt;|&lt;\/math&gt;).)+)&lt;\/math&gt;', re.I)
+        math_regex = re.compile(r'\[math\(((?:(?!\[math\(|\)\]).|\n)+)\)\]', re.I)
+        math_regex_2 = re.compile(r'&lt;math&gt;((?:(?!&lt;math&gt;|&lt;\/math&gt;).)+)&lt;\/math&gt;', re.I)
 
         self.render_data = re.sub(math_regex_2, do_render_math_sub, self.render_data)
         self.render_data = re.sub(math_regex, do_render_math_sub, self.render_data)
@@ -718,7 +718,8 @@ class class_do_render_namumark:
         image_count = 0
         link_count_all = len(re.findall(link_regex, self.render_data)) * 4
         while 1:
-            if not re.search(link_regex, self.render_data):
+            link_data = re.search(link_regex, self.render_data)
+            if not link_data:
                 break
             elif link_count_all < 0:
                 print('Error : render link count overflow')
@@ -726,7 +727,6 @@ class class_do_render_namumark:
                 break
             else:
                 # link split
-                link_data = re.search(link_regex, self.render_data)
                 link_data_full = link_data.group(0)
                 link_data = link_data.groups()
 
@@ -1115,7 +1115,7 @@ class class_do_render_namumark:
 
         include_num = 0
         include_set_data = get_main_skin_set(self.curs, self.flask_session, 'main_css_include_link', self.ip)
-        include_regex = re.compile('\[include\(((?:(?!\[include\(|\)\]|<\/div>).)+)\)\]', re.I)
+        include_regex = re.compile(r'\[include\(((?:(?!\[include\(|\)\]|<\/div>).)+)\)\]', re.I)
         include_count_max = len(re.findall(include_regex, self.render_data)) * 2
         include_change_list = {}
         while 1:
@@ -1149,8 +1149,8 @@ class class_do_render_namumark:
                             data_sub_data = self.get_tool_data_restore(data_sub[1], do_type = 'slash')
                             data_sub_data = html.unescape(data_sub_data)
                             
-                            data_sub_data = re.sub(r'^(?P<in>분류|category):', ':\g<in>:', data_sub_data)
-                            data_sub_data = re.sub(r'^(?P<in>파일|file):', ':\g<in>:', data_sub_data)
+                            data_sub_data = re.sub(r'^(?P<in>분류|category):', ':\\g<in>:', data_sub_data)
+                            data_sub_data = re.sub(r'^(?P<in>파일|file):', ':\\g<in>:', data_sub_data)
 
                             include_change_list[data_sub_name] = data_sub_data
                         else:
@@ -1204,7 +1204,7 @@ class class_do_render_namumark:
         footnote_number_set = get_main_skin_set(self.curs, self.flask_session, 'main_css_footnote_number', self.ip)
         footnote_number_view_set = get_main_skin_set(self.curs, self.flask_session, 'main_css_view_real_footnote_num', self.ip)
 
-        footnote_regex = re.compile('(?:\[\*((?:(?!\[\*|\]| ).)+)?(?: ((?:(?!\[\*|\]).)+))?\]|\[(각주|footnote)\])', re.I)
+        footnote_regex = re.compile(r'(?:\[\*((?:(?!\[\*|\]| ).)+)?(?: ((?:(?!\[\*|\]).)+))?\]|\[(각주|footnote)\])', re.I)
         footnote_count_all = len(re.findall(footnote_regex, self.render_data)) * 4
         while 1:
             footnote_num += 1
@@ -1465,7 +1465,7 @@ class class_do_render_namumark:
 
             return table_parameter_all
 
-        table_regex = re.compile('\n((?:(?:(?:(?:\|\|)+)|(?:\|[^|]+\|(?:\|\|)*))\n?(?:(?:(?!\|\|).)+))(?:(?:\|\||\|\|\n|(?:\|\|)+(?!\n)(?:(?:(?!\|\|).)+)\n*)*)\|\|)\n', re.DOTALL)
+        table_regex = re.compile(r'\n((?:(?:(?:(?:\|\|)+)|(?:\|[^|]+\|(?:\|\|)*))\n?(?:(?:(?!\|\|).)+))(?:(?:\|\||\|\|\n|(?:\|\|)+(?!\n)(?:(?:(?!\|\|).)+)\n*)*)\|\|)\n', re.DOTALL)
         table_sub_regex = r'(\n?)((?:\|\|)+)((?:&lt;(?:(?:(?!&lt;|&gt;).)+)&gt;)*)((?:\n*(?:(?:(?:(?!\|\|).)+)\n*)+)|(?:(?:(?!\|\|).)*))'
         table_caption_regex = r'^\|([^|]+)\|'
         table_count_all = len(re.findall(table_regex, self.render_data)) * 2
@@ -1801,7 +1801,7 @@ class class_do_render_namumark:
 
             middle_count_all -= 1
 
-        self.render_data = re.sub(r'<temp_(?P<in>(?:slash)_(?:[0-9]+))>', '<\g<in>>', self.render_data)
+        self.render_data = re.sub(r'<temp_(?P<in>(?:slash)_(?:[0-9]+))>', '<\\g<in>>', self.render_data)
 
     def do_render_hr(self):
         hr_regex = r'\n-{4,9}\n'
@@ -1832,7 +1832,7 @@ class class_do_render_namumark:
                 quote_data_org = quote_data.group(0)
                 
                 quote_data = quote_data.group(1)
-                quote_data = re.sub(r'\n&gt; *(?P<in>[^\n]*)', '\g<in>\n', quote_data)
+                quote_data = re.sub(r'\n&gt; *(?P<in>[^\n]*)', '\\g<in>\n', quote_data)
                 quote_data = re.sub(r'\n$', '', quote_data)
                 quote_data = self.get_tool_data_revert(quote_data)
                 quote_data = html.unescape(quote_data)
@@ -2154,7 +2154,7 @@ class class_do_render_namumark:
                 toc_data_on == 1:
                 self.render_data = re.sub(r'<toc_no_auto>', '', self.render_data)
             else:
-                self.render_data = re.sub(r'(?P<in><h[1-6] id="[^"]*">)', '<br>' + self.data_toc + '\g<in>', self.render_data, 1)
+                self.render_data = re.sub(r'(?P<in><h[1-6] id="[^"]*">)', '<br>' + self.data_toc + '\\g<in>', self.render_data, 1)
         else:
             self.render_data = re.sub(r'<toc_need_part>', '', self.render_data)
             self.render_data = re.sub(r'<toc_no_auto>', '', self.render_data)
@@ -2162,7 +2162,7 @@ class class_do_render_namumark:
         def do_render_last_footnote(match):
             match = match.group(1)
 
-            find_regex = re.compile('<footnote_title id="' + match + '_title">((?:(?!<footnote_title|<\/footnote_title>).)*)<\/footnote_title>')
+            find_regex = re.compile(r'<footnote_title id="' + match + r'_title">((?:(?!<footnote_title|<\/footnote_title>).)*)<\/footnote_title>')
             find_data = re.search(find_regex, self.render_data)
             if find_data:
                 find_data = find_data.group(1)

+ 3 - 0
route/topic.py

@@ -13,6 +13,9 @@ def topic(topic_num = 0, do_type = '', doc_name = 'Test'):
             return re_error('/ban')
 
         if flask.request.method == 'POST' and do_type == '':
+            if do_edit_slow_check('thread') == 1:
+                return re_error('/error/42')
+
             name = flask.request.form.get('topic', 'Test')
             sub = flask.request.form.get('title', 'Test')
             

+ 1 - 1
route/vote_add.py

@@ -64,7 +64,7 @@ def vote_add():
                         '<hr class="main_hr">' + \
                         '<input type="checkbox" value="Y" name="open_select"> ' + load_lang('open_vote') + \
                         '<h2>' + load_lang('period') + '</h2>'
-                        '<input type="date" name="date" pattern="\d{4}-\d{2}-\d{2}">' + \
+                        '<input type="date" name="date" pattern="\\d{4}-\\d{2}-\\d{2}">' + \
                         '<hr class="main_hr">' + \
                         '<input type="checkbox" value="Y" name="limitless"> ' + load_lang('limitless') + \
                         '<h2>' + load_lang('acl') + '</h2>' + \

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
     "beta" : {
-        "r_ver" : "v3.4.6-RC3-dev198",
+        "r_ver" : "v3.4.6-RC3-dev201",
         "c_ver" : "3500361",
         "s_ver" : "3500111"
     }