Sfoglia il codice sorgente

404 기능 변경

https://github.com/openNAMU/openNAMU/issues/2181
잉여개발기 (SPDV) 2 anni fa
parent
commit
4c7903df9d

+ 3 - 0
app.py

@@ -744,6 +744,8 @@ app.route('/api/v2/doc_star_doc/<int:num>/<everything:name>', defaults = { 'db_s
 app.route('/api/v2/doc_watch_list/<int:num>/<everything:name>', defaults = { 'db_set' : db_set_str })(api_w_watch_list)
 app.route('/api/v2/set_reset/<everything:name>', defaults = { 'db_set' : db_set_str })(api_w_set_reset)
 
+app.route('/api/v2/setting/<name>', methods = ['GET', 'PUT'], defaults = { 'db_set' : db_set_str })(api_setting)
+
 app.route('/api/v2/user/setting/editor', methods = ['GET', 'POST', 'DELETE'], defaults = { 'db_set' : db_set_str })(api_user_setting_editor)
 
 # Func-main
@@ -778,6 +780,7 @@ app.route('/setting/acl', methods = ['POST', 'GET'])(main_setting_acl)
 app.route('/setting/sitemap', methods = ['POST', 'GET'])(main_setting_sitemap)
 app.route('/setting/sitemap_set', methods = ['POST', 'GET'])(main_setting_sitemap_set)
 app.route('/setting/skin_set', methods = ['POST', 'GET'])(main_setting_skin_set)
+app.route('/setting/404_page', methods = ['POST', 'GET'])(setting_404_page)
 
 app.route('/easter_egg')(main_func_easter_egg)
 

+ 2 - 0
lang/en-US.json

@@ -272,6 +272,7 @@
         "html_or_link" : "HTML or link",
         "template_document_list" : "Template document(s) list",
         "no_link_document_list" : "List of document(s) without link",
+        "new_page" : "List of new document(s)",
         "_comment_" : "BBS",
             "bbs" : "BBS",
             "bbs_main" : "BBS main",
@@ -621,6 +622,7 @@
             "email_error" : "No one has this email.",
             "regex_error" : "There is an error in the regular expression.",
             "decument_404_error" : "This document does not exist.",
+            "func_404_error" : "This URL does not have the correct function.",
             "fast_edit_error" : "You can edit another document after this period (Second(s)) : ",
             "too_many_dec_error" : "This feature is not supported because there are too many documents.",
             "application_not_found" : "Application not found",

+ 3 - 1
lang/ko-KR.json

@@ -620,5 +620,7 @@
     "table" : "표",
     "table_transparent" : "표 투명화",
     "recaptcha_pass_acl" : "캡차 통과 ACL",
-    "recaptcha_one_check_five_pass_acl" : "캡차 1회 통과시 5회 미시행 ACL"
+    "recaptcha_one_check_five_pass_acl" : "캡차 1회 통과시 5회 미시행 ACL",
+    "func_404_error" : "이 URL에 맞는 기능이 없습니다.",
+    "new_page" : "새로운 문서 목록"
 }

+ 4 - 0
route/__init__.py

@@ -172,6 +172,8 @@ from route.n_w_watch_list import w_watch_list
 
 from route.n_topic_list import topic_list
 
+from route.n_setting_404_page import setting_404_page
+
 from route.n_bbs_main import bbs_main
 
 from route.go_api_func_llm import api_func_llm
@@ -193,6 +195,8 @@ from route.go_api_bbs import api_bbs
 from route.go_api_bbs_list import api_bbs_list
 from route.go_api_bbs_w_comment import api_bbs_w_comment_n
 
+from route.go_api_setting import api_setting
+
 from route.go_api_topic import api_topic
 from route.go_api_topic_list import api_topic_list
 

+ 28 - 0
route/go_api_setting.py

@@ -0,0 +1,28 @@
+from .tool.func import *
+
+def api_setting(db_set, name = 'Test'):
+    other_set = {}
+    other_set["set_name"] = name
+    other_set["ip"] = ip_check()
+
+    func_name = sys._getframe().f_code.co_name
+    if flask.request.method == 'PUT':
+        func_name += '_edit'
+        other_set['data'] = flask.request.form.get('data', 'Test')
+    
+    other_set = json.dumps(other_set)
+
+    if platform.system() == 'Linux':
+        if platform.machine() in ["AMD64", "x86_64"]:
+            data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.amd64.bin"), func_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
+        else:
+            data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.arm64.bin"), func_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
+    else:
+        if platform.machine() in ["AMD64", "x86_64"]:
+            data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.amd64.exe"), func_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
+        else:
+            data = subprocess.Popen([os.path.join(".", "route_go", "bin", "main.arm64.exe"), func_name, db_set, other_set], stdout = subprocess.PIPE).communicate()[0]
+
+    data = data.decode('utf8')
+
+    return flask.Response(response = data, status = 200, mimetype = 'application/json')

+ 23 - 5
route/main_func_error_404.py

@@ -3,12 +3,30 @@ from .tool.func import *
 def main_func_error_404(e = ''):
     with get_db_connect() as conn:
         curs = conn.cursor()
-        
-        if os.path.exists('404.html') and flask.request.path != '/':
-            return open('404.html', encoding = 'utf8').read(), 404
-        else:
+
+        if flask.request.path == '/':
             curs.execute(db_change('select data from other where name = "frontpage"'))
             db_data = curs.fetchall()
             db_data = db_data[0][0] if db_data and db_data[0][0] != '' else 'FrontPage'
             
-            return redirect(conn, '/w/' + url_pas(db_data))
+            return redirect(conn, '/w/' + url_pas(db_data))
+        else:
+            curs.execute(db_change('select data from other where name = "manage_404_page"'))
+            db_data = curs.fetchall()
+            db_data = db_data[0][0] if db_data else ''
+
+            if os.path.exists('404.html') and db_data == '404_file':
+                return open('404.html', encoding = 'utf8').read(), 404
+            else:
+                curs.execute(db_change('select data from other where name = "manage_404_page_content"'))
+                db_data = curs.fetchall()
+                db_data = db_data[0][0] if db_data and db_data[0][0] != '' else ''
+
+                if db_data != '':
+                    return easy_minify(conn, flask.render_template(skin_check(conn),
+                        imp = ['404', wiki_set(conn), wiki_custom(conn), wiki_css([0, 0])],
+                        data = db_data,
+                        menu = 0
+                    )), 404
+                else:
+                    return re_error(conn, '/error/46')

+ 2 - 1
route/main_setting.py

@@ -13,7 +13,8 @@ def main_setting():
             ['sitemap_set', get_lang(conn, 'sitemap_management')],
             ['top_menu', get_lang(conn, 'top_menu_setting')],
             ['skin_set', get_lang(conn, 'main_skin_set_default')],
-            ['acl', get_lang(conn, 'main_acl_setting')]
+            ['acl', get_lang(conn, 'main_acl_setting')],
+            ['404_page', get_lang(conn, '404_page_setting')]
         ]
 
         li_data = ''.join(['<li><a href="/setting/' + str(li[0]) + '">' + li[1] + '</a></li>' for li in li_list])

+ 13 - 0
route/n_setting_404_page.py

@@ -0,0 +1,13 @@
+from .tool.func import *
+
+def setting_404_page():
+    with get_db_connect() as conn:
+        return easy_minify(conn, flask.render_template(skin_check(conn),
+            imp = [get_lang(conn, '404_page_setting'), wiki_set(conn), wiki_custom(conn), wiki_css([0, 0])],
+            data = '' + \
+                '<div id="opennamu_setting_404_page"></div>' + \
+                '<script defer src="/views/main_css/js/route/setting_404_page.js' + cache_v() + '"></script>' + \
+                '<script>window.addEventListener("DOMContentLoaded", function() { opennamu_setting_404_page(); });</script>' + \
+            '',
+            menu = [['setting', get_lang(conn, 'return')]]
+        ))

+ 6 - 1
route/tool/func.py

@@ -2604,6 +2604,7 @@ def re_error(conn, data):
     else:
         title = get_lang(conn, 'error')
         sub_title = title
+        return_code = 400
 
         num = int(number_check(data.replace('/error/', '')))
         if num == 1:
@@ -2718,6 +2719,10 @@ def re_error(conn, data):
             data = get_lang(conn, 'error_content_length_too_long') + db_data
         elif num == 45:
             data = get_lang(conn, 'cidr_error')
+        elif num == 46:
+            data = get_lang(conn, 'func_404_error')
+            title = '404'
+            return_code = 404
         else:
             data = '???'
 
@@ -2747,4 +2752,4 @@ def re_error(conn, data):
                     '</ul>' + \
                 '',
                 menu = 0
-            )), 400
+            )), return_code

BIN
route_go/bin/main.amd64.bin


BIN
route_go/bin/main.amd64.exe


BIN
route_go/bin/main.arm64.bin


BIN
route_go/bin/main.arm64.exe


+ 4 - 0
route_go/main.go

@@ -71,6 +71,10 @@ func main() {
 		route_data = route.Api_user_setting_editor_delete(call_arg[1:])
 	} else if call_arg[0] == "api_user_setting_editor" {
 		route_data = route.Api_user_setting_editor(call_arg[1:])
+	} else if call_arg[0] == "api_setting" {
+		route_data = route.Api_setting(call_arg[1:])
+	} else if call_arg[0] == "api_setting_edit" {
+		route_data = route.Api_setting_edit(call_arg[1:])
 	} else {
 		log.Fatal(call_arg[0] + " is 404")
 	}

+ 69 - 0
route_go/route/api_setting.go

@@ -0,0 +1,69 @@
+package route
+
+import (
+	"database/sql"
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+)
+
+func Api_setting(call_arg []string) string {
+	db_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &db_set)
+
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[1]), &other_set)
+
+	db := tool.DB_connect(db_set)
+	defer db.Close()
+
+	setting_acl := map[string]string{}
+
+	setting_acl["manage_404_page"] = ""
+	setting_acl["manage_404_page_content"] = ""
+
+	if val, ok := setting_acl[other_set["set_name"]]; ok {
+		if val != "" {
+			auth_name := tool.Get_user_auth(db, db_set, other_set["ip"])
+			auth_info := tool.Get_auth_group_info(db, db_set, auth_name)
+
+			if _, ok := auth_info["owner"]; !ok {
+				return_data := make(map[string]interface{})
+				return_data["response"] = "require auth"
+
+				json_data, _ := json.Marshal(return_data)
+				return string(json_data)
+			}
+		}
+
+		stmt, err := db.Prepare(tool.DB_change(db_set, "select data from other where name = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		var set_data string
+
+		err = stmt.QueryRow(other_set["set_name"]).Scan(&set_data)
+		if err != nil {
+			if err == sql.ErrNoRows {
+				set_data = ""
+			} else {
+				log.Fatal(err)
+			}
+		}
+
+		return_data := make(map[string]interface{})
+		return_data["response"] = "ok"
+		return_data["data"] = set_data
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	} else {
+		return_data := make(map[string]interface{})
+		return_data["response"] = "not exist"
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	}
+}

+ 57 - 0
route_go/route/api_setting_edit.go

@@ -0,0 +1,57 @@
+package route
+
+import (
+	"encoding/json"
+	"log"
+	"opennamu/route/tool"
+)
+
+func Api_setting_edit(call_arg []string) string {
+	db_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[0]), &db_set)
+
+	other_set := map[string]string{}
+	json.Unmarshal([]byte(call_arg[1]), &other_set)
+
+	db := tool.DB_connect(db_set)
+	defer db.Close()
+
+	auth_name := tool.Get_user_auth(db, db_set, other_set["ip"])
+	auth_info := tool.Get_auth_group_info(db, db_set, auth_name)
+
+	if _, ok := auth_info["owner"]; ok {
+		stmt, err := db.Prepare(tool.DB_change(db_set, "delete from other where name = ?"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(other_set["set_name"])
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		stmt, err = db.Prepare(tool.DB_change(db_set, "insert into other (name, data, coverage) values (?, ?, '')"))
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer stmt.Close()
+
+		_, err = stmt.Exec(other_set["set_name"], other_set["data"])
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		return_data := make(map[string]interface{})
+		return_data["response"] = "ok"
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	} else {
+		return_data := make(map[string]interface{})
+		return_data["response"] = "require auth"
+
+		json_data, _ := json.Marshal(return_data)
+		return string(json_data)
+	}
+}

+ 91 - 0
views/main_css/js/route/setting_404_page.js

@@ -0,0 +1,91 @@
+"use strict";
+
+function opennamu_setting_404_page_post() {
+    let select = document.getElementById("opennamu_setting_404_page_select").value;
+
+    let put_data_select = new FormData();
+    put_data_select.append('data', select);
+    
+    fetch('/api/v2/setting/manage_404_page', {
+        method : 'put',
+        body : put_data_select,
+    }).then(function(data) {
+        let content = document.getElementById('opennamu_setting_404_page_textarea').value;
+
+        let put_data_content = new FormData();
+        put_data_content.append('data', content);
+    
+        fetch('/api/v2/setting/manage_404_page_content', {
+            method : 'put',
+            body : put_data_content,
+        });
+    
+        console.log(select, content);
+
+        history.go(0);
+    });
+}
+
+function opennamu_setting_404_page_preview() {
+    let content = document.getElementById('opennamu_setting_404_page_textarea').value;
+    document.getElementById('opennamu_setting_404_page_preview').innerHTML = content;
+}
+
+function opennamu_setting_404_page() {
+    let data = [];
+
+    let lang_data = new FormData();
+    lang_data.append('data', 'save 404_file 404_page preview');
+
+    fetch('/api/lang', {
+        method : 'post',
+        body : lang_data,
+    }).then(function(res) {
+        return res.json();
+    }).then(function(ajax_data) {
+        data.push(ajax_data);
+        return fetch('/api/v2/setting/manage_404_page');
+    }).then(function(res) {
+        return res.json();
+    }).then(function(ajax_data) {
+        data.push(ajax_data);
+        return fetch('/api/v2/setting/manage_404_page_content');
+    }).then(function(res) {
+        return res.json();
+    }).then(function(ajax_data) {
+        data.push(ajax_data);
+
+        let data_html = '';
+        let select_list = [
+            ['404_page', data[0]['data'][1]],
+            ['404_file', data[0]['data'][2]],
+        ];
+
+        data_html += '<select id="opennamu_setting_404_page_select">';
+        for(let for_a = 0; for_a < select_list.length; for_a++) {
+            let selected = '';
+            if(data[1]['data'] === select_list[for_a][0]) {
+                selected = 'selected';
+            }
+
+            data_html += '<option value="' + select_list[for_a][0] + '" ' + selected + '>' + select_list[for_a][1] + '</option>';
+        }
+        data_html += '</select>';
+        data_html += '<hr class="main_hr">';
+
+        data_html += '<textarea class="opennamu_textarea_500" id="opennamu_setting_404_page_textarea">' + data[2]['data'] + '</textarea>';
+        data_html += '<hr class="main_hr">';
+
+        data_html += '<button id="opennamu_save_button" onclick="opennamu_setting_404_page_post();">' + data[0]['data'][0] + '</button> ';
+        data_html += '<button onclick="opennamu_setting_404_page_preview();">' + data[0]['data'][3] + '</button>';
+        data_html += '<hr class="main_hr">';
+
+        data_html += '<div id="opennamu_setting_404_page_preview"></div>';
+
+        console.log();
+
+        return data_html;
+    }).then(function(end_data) {
+        document.getElementById('opennamu_setting_404_page').innerHTML = end_data;
+    });
+}