2
0
Эх сурвалжийг харах

Merge pull request #2194 from openNAMU/dont_use

404 기능 변경과 이미지 복사 붙여넣기 상시 활성화
잉여개발기 2 жил өмнө
parent
commit
a5f9f290ce

+ 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/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/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)
 app.route('/api/v2/user/setting/editor', methods = ['GET', 'POST', 'DELETE'], defaults = { 'db_set' : db_set_str })(api_user_setting_editor)
 
 
 # Func-main
 # 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', methods = ['POST', 'GET'])(main_setting_sitemap)
 app.route('/setting/sitemap_set', methods = ['POST', 'GET'])(main_setting_sitemap_set)
 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/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)
 app.route('/easter_egg')(main_func_easter_egg)
 
 

+ 2 - 0
lang/en-US.json

@@ -272,6 +272,7 @@
         "html_or_link" : "HTML or link",
         "html_or_link" : "HTML or link",
         "template_document_list" : "Template document(s) list",
         "template_document_list" : "Template document(s) list",
         "no_link_document_list" : "List of document(s) without link",
         "no_link_document_list" : "List of document(s) without link",
+        "new_page" : "List of new document(s)",
         "_comment_" : "BBS",
         "_comment_" : "BBS",
             "bbs" : "BBS",
             "bbs" : "BBS",
             "bbs_main" : "BBS main",
             "bbs_main" : "BBS main",
@@ -621,6 +622,7 @@
             "email_error" : "No one has this email.",
             "email_error" : "No one has this email.",
             "regex_error" : "There is an error in the regular expression.",
             "regex_error" : "There is an error in the regular expression.",
             "decument_404_error" : "This document does not exist.",
             "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)) : ",
             "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.",
             "too_many_dec_error" : "This feature is not supported because there are too many documents.",
             "application_not_found" : "Application not found",
             "application_not_found" : "Application not found",

+ 3 - 1
lang/ko-KR.json

@@ -620,5 +620,7 @@
     "table" : "표",
     "table" : "표",
     "table_transparent" : "표 투명화",
     "table_transparent" : "표 투명화",
     "recaptcha_pass_acl" : "캡차 통과 ACL",
     "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_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.n_bbs_main import bbs_main
 
 
 from route.go_api_func_llm import api_func_llm
 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_list import api_bbs_list
 from route.go_api_bbs_w_comment import api_bbs_w_comment_n
 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 import api_topic
 from route.go_api_topic_list import api_topic_list
 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 = ''):
 def main_func_error_404(e = ''):
     with get_db_connect() as conn:
     with get_db_connect() as conn:
         curs = conn.cursor()
         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"'))
             curs.execute(db_change('select data from other where name = "frontpage"'))
             db_data = curs.fetchall()
             db_data = curs.fetchall()
             db_data = db_data[0][0] if db_data and db_data[0][0] != '' else 'FrontPage'
             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')],
             ['sitemap_set', get_lang(conn, 'sitemap_management')],
             ['top_menu', get_lang(conn, 'top_menu_setting')],
             ['top_menu', get_lang(conn, 'top_menu_setting')],
             ['skin_set', get_lang(conn, 'main_skin_set_default')],
             ['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])
         li_data = ''.join(['<li><a href="/setting/' + str(li[0]) + '">' + li[1] + '</a></li>' for li in li_list])

+ 0 - 7
route/main_setting_skin_set.py

@@ -148,13 +148,6 @@ def main_setting_skin_set():
                             ''' + set_data["main_css_font_size"] + '''
                             ''' + set_data["main_css_font_size"] + '''
                         </select>
                         </select>
                         <h2>''' + get_lang(conn, "edit") + '''</h2>
                         <h2>''' + get_lang(conn, "edit") + '''</h2>
-                        <h3>''' + get_lang(conn, "image_paste") + '''</h3>
-                        <sup>''' + get_lang(conn, 'only_korean') + '''</sup> <sup>''' + get_lang(conn, 'unavailable_in_monaco') + '''</sup>
-                        <hr class="main_hr">
-                        ''' + set_data_main["main_css_image_paste"] + '''
-                        <select name="main_css_image_paste">
-                            ''' + set_data["main_css_image_paste"] + '''
-                        </select>
                         <h3>''' + get_lang(conn, "monaco_editor") + '''</h3>
                         <h3>''' + get_lang(conn, "monaco_editor") + '''</h3>
                         ''' + set_data_main["main_css_monaco"] + '''
                         ''' + set_data_main["main_css_monaco"] + '''
                         <select name="main_css_monaco">
                         <select name="main_css_monaco">

+ 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')]]
+        ))

+ 8 - 3
route/tool/func.py

@@ -1072,7 +1072,7 @@ def skin_check(conn, set_n = 0):
         return skin
         return skin
     
     
 def cache_v():
 def cache_v():
-    return '.cache_v250'
+    return '.cache_v252'
 
 
 def wiki_css(data):
 def wiki_css(data):
     global global_wiki_set
     global global_wiki_set
@@ -1094,7 +1094,7 @@ def wiki_css(data):
         data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.js" integrity="sha512-LQNxIMR5rXv7o+b1l8+N1EZMfhG7iFZ9HhnbJkTp4zjNr5Wvst75AqUeFDxeRUa7l5vEDyUiAip//r+EFLLCyA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
         data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.js" integrity="sha512-LQNxIMR5rXv7o+b1l8+N1EZMfhG7iFZ9HhnbJkTp4zjNr5Wvst75AqUeFDxeRUa7l5vEDyUiAip//r+EFLLCyA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
         data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js" integrity="sha512-rdhY3cbXURo13l/WU9VlaRyaIYeJ/KBakckXIvJNAQde8DgpOmE+eZf7ha4vdqVjTtwQt69bD2wH2LXob/LB7Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
         data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js" integrity="sha512-rdhY3cbXURo13l/WU9VlaRyaIYeJ/KBakckXIvJNAQde8DgpOmE+eZf7ha4vdqVjTtwQt69bD2wH2LXob/LB7Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
         data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/x86asm.min.js" integrity="sha512-HeAchnWb+wLjUb2njWKqEXNTDlcd1QcyOVxb+Mc9X0bWY0U5yNHiY5hTRUt/0twG8NEZn60P3jttqBvla/i2gA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
         data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/x86asm.min.js" integrity="sha512-HeAchnWb+wLjUb2njWKqEXNTDlcd1QcyOVxb+Mc9X0bWY0U5yNHiY5hTRUt/0twG8NEZn60P3jttqBvla/i2gA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
-        data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.41.0/min/vs/loader.min.js" integrity="sha512-A+6SvPGkIN9Rf0mUXmW4xh7rDvALXf/f0VtOUiHlDUSPknu2kcfz1KzLpOJyL2pO+nZS13hhIjLqVgiQExLJrw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
+        data_css += '<script defer src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.48.0/min/vs/loader.min.js" integrity="sha512-ZG31AN9z/CQD1YDDAK4RUAvogwbJHv6bHrumrnMLzdCrVu4HeAqrUX7Jsal/cbUwXGfaMUNmQU04tQ8XXl5Znw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>'
 
 
         # Func JS
         # Func JS
         data_css += '<script defer src="/views/main_css/js/func/func.js' + data_css_ver + '"></script>'
         data_css += '<script defer src="/views/main_css/js/func/func.js' + data_css_ver + '"></script>'
@@ -2604,6 +2604,7 @@ def re_error(conn, data):
     else:
     else:
         title = get_lang(conn, 'error')
         title = get_lang(conn, 'error')
         sub_title = title
         sub_title = title
+        return_code = 400
 
 
         num = int(number_check(data.replace('/error/', '')))
         num = int(number_check(data.replace('/error/', '')))
         if num == 1:
         if num == 1:
@@ -2718,6 +2719,10 @@ def re_error(conn, data):
             data = get_lang(conn, 'error_content_length_too_long') + db_data
             data = get_lang(conn, 'error_content_length_too_long') + db_data
         elif num == 45:
         elif num == 45:
             data = get_lang(conn, 'cidr_error')
             data = get_lang(conn, 'cidr_error')
+        elif num == 46:
+            data = get_lang(conn, 'func_404_error')
+            title = '404'
+            return_code = 404
         else:
         else:
             data = '???'
             data = '???'
 
 
@@ -2747,4 +2752,4 @@ def re_error(conn, data):
                     '</ul>' + \
                     '</ul>' + \
                 '',
                 '',
                 menu = 0
                 menu = 0
-            )), 400
+            )), return_code

+ 1 - 12
route/user_setting_skin_set_main.py

@@ -16,10 +16,6 @@ def user_setting_skin_set_main_set_list(conn):
             ['default', get_lang(conn, 'default')],
             ['default', get_lang(conn, 'default')],
             ['normal', get_lang(conn, 'off')],
             ['normal', get_lang(conn, 'off')],
             ['use', get_lang(conn, 'use')]
             ['use', get_lang(conn, 'use')]
-        ], 'main_css_image_paste' : [
-            ['default', get_lang(conn, 'default')],
-            ['normal', get_lang(conn, 'off')],
-            ['use', get_lang(conn, 'use')]
         ], 'main_css_category_set' : [
         ], 'main_css_category_set' : [
             ['default', get_lang(conn, 'default')],
             ['default', get_lang(conn, 'default')],
             ['bottom', get_lang(conn, 'bottom')],
             ['bottom', get_lang(conn, 'bottom')],
@@ -115,7 +111,7 @@ def user_setting_skin_set_main():
             return re_error(conn, '/ban')
             return re_error(conn, '/ban')
             
             
         set_list = user_setting_skin_set_main_set_list(conn)
         set_list = user_setting_skin_set_main_set_list(conn)
-        use_cookie = ['main_css_image_paste', 'main_css_darkmode']
+        use_cookie = ['main_css_darkmode']
 
 
         if flask.request.method == 'POST':
         if flask.request.method == 'POST':
             html_data = flask.make_response(redirect(conn, '/change/skin_set/main'))
             html_data = flask.make_response(redirect(conn, '/change/skin_set/main'))
@@ -276,13 +272,6 @@ def user_setting_skin_set_main():
                             ''' + set_data["main_css_font_size"] + '''
                             ''' + set_data["main_css_font_size"] + '''
                         </select>
                         </select>
                         <h2>''' + get_lang(conn, "edit") + '''</h2>
                         <h2>''' + get_lang(conn, "edit") + '''</h2>
-                        <h3>''' + get_lang(conn, "image_paste") + '''</h3>
-                        <sup>''' + get_lang(conn, 'only_korean') + '''</sup> <sup>''' + get_lang(conn, 'unavailable_in_monaco') + '''</sup>
-                        <hr class="main_hr">
-                        ''' + set_data_main["main_css_image_paste"] + '''
-                        <select name="main_css_image_paste">
-                            ''' + set_data["main_css_image_paste"] + '''
-                        </select>
                         <h3>''' + get_lang(conn, "monaco_editor") + '''</h3>
                         <h3>''' + get_lang(conn, "monaco_editor") + '''</h3>
                         ''' + set_data_main["main_css_monaco"] + '''
                         ''' + set_data_main["main_css_monaco"] + '''
                         <select name="main_css_monaco">
                         <select name="main_css_monaco">

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:])
 		route_data = route.Api_user_setting_editor_delete(call_arg[1:])
 	} else if call_arg[0] == "api_user_setting_editor" {
 	} else if call_arg[0] == "api_user_setting_editor" {
 		route_data = route.Api_user_setting_editor(call_arg[1:])
 		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 {
 	} else {
 		log.Fatal(call_arg[0] + " is 404")
 		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)
+	}
+}

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
 {
     "beta" : {
     "beta" : {
-        "r_ver" : "v3.5.0-v112",
+        "r_ver" : "v3.5.0-v113",
         "c_ver" : "20240513",
         "c_ver" : "20240513",
         "s_ver" : "20240426"
         "s_ver" : "20240426"
     }
     }

+ 47 - 45
views/main_css/js/func/editor.js

@@ -39,38 +39,24 @@ function do_insert_data(data) {
 
 
 // 아직 개편이 더 필요함
 // 아직 개편이 더 필요함
 function do_paste_image() {
 function do_paste_image() {
-    const name = 'opennamu_edit_textarea';
-
-    window.addEventListener('DOMContentLoaded', async function() {
-        let set = await opennamu_get_main_skin_set("main_css_image_paste");
-        if(set === 'use') {
-            document.getElementById(name).addEventListener("paste", pasteListener);
-        }
-    });
+    document.getElementById('opennamu_edit_textarea').addEventListener("paste", pasteListener);
 }
 }
 
 
 function pasteListener(e) {
 function pasteListener(e) {
-    // find file
+    let lang_data = new FormData();
+    lang_data.append('data', 'file_name empty save authority_error same_file_error error');
+
     if(e.clipboardData && e.clipboardData.items) {
     if(e.clipboardData && e.clipboardData.items) {
         const items = e.clipboardData.items;
         const items = e.clipboardData.items;
         const formData = new FormData();
         const formData = new FormData();
 
 
         let haveImageInClipboard = false;
         let haveImageInClipboard = false;
         let file_name = '';
         let file_name = '';
+        let file;
         
         
         for(let i = 0; i < items.length; i++) {
         for(let i = 0; i < items.length; i++) {
             if(items[i].type.indexOf("image") !== -1) {
             if(items[i].type.indexOf("image") !== -1) {
-                const file = items[i].getAsFile();
-                const customName = prompt("파일 이름 (확장자 제외)");
-                
-                if(!customName) {
-                    return alert("파일 이름 없음");
-                }
-                
-                file_name = customName + ".png";
-                
-                const customFile = new File([file], file_name, { type: file.type });
-                formData.append("f_data[]", customFile);
+                file = items[i].getAsFile();
                 
                 
                 haveImageInClipboard = true;
                 haveImageInClipboard = true;
                 e.preventDefault();
                 e.preventDefault();
@@ -83,32 +69,48 @@ function pasteListener(e) {
             return;
             return;
         }
         }
 
 
-        // send to server
-        fetch("/upload", {
-            method: "POST",
-            body: formData,
-        }).then((res) => {
-            if (res.status === 200 || res.status === 201) {
-                const url = res.url;
-                alert(
-                    '업로드 완료 : ' +
-                    '[[파일:' + file_name + ']]'
-                );
-
-                do_insert_data('[[file:' + file_name + ']]');
-            } else {
-                console.error("[ERROR] PasteUpload Fail :", res.statusText);
-                if(res.status === 400) {
-                    alert("파일 이름 중복");
-                } else if(res.status === 401) {
-                    alert("권한 부족");    
+        fetch('/api/lang', {
+            method : 'post',
+            body : lang_data,
+        }).then(function(res) {
+            return res.json();
+        }).then(function(ajax_data) {
+            const customName = prompt(ajax_data['data'][0]);
+                
+            if(!customName) {
+                return alert(ajax_data['data'][1]);
+            }
+            
+            file_name = customName + ".png";
+            
+            const customFile = new File([file], file_name, { type: file.type });
+            formData.append("f_data[]", customFile);
+
+            fetch("/upload", {
+                method: "POST",
+                body: formData,
+            }).then((res) => {
+                if (res.status === 200 || res.status === 201) {
+                    const url = res.url;
+                    alert(ajax_data['data'][2] + ' : [[file:' + file_name + ']]');
+
+                    do_insert_data('[[file:' + file_name + ']]');
                 } else {
                 } else {
-                    alert("업로드 실패");        
+                    console.error("[ERROR] PasteUpload Fail :", res.statusText);
+
+                    if(res.status === 400) {
+                        alert(ajax_data['data'][4]);
+                    } else if(res.status === 401) {
+                        alert(ajax_data['data'][3]);    
+                    } else {
+                        alert(ajax_data['data'][5]);        
+                    }
                 }
                 }
-            }
-        }).catch((err) => {
-            console.error("오류 내역 :", JSON.stringify(err), err);
-            alert("업로드 실패");
+            }).catch((err) => {
+                console.error("[ERROR] PasteUpload Fail :", JSON.stringify(err), err);
+
+                alert(ajax_data['data'][5]);
+            });
         });
         });
     }
     }
 }
 }
@@ -230,7 +232,7 @@ class PlaceholderContentWidget {
 }
 }
 
 
 function do_monaco_init(monaco_thema, markup = "") {
 function do_monaco_init(monaco_thema, markup = "") {
-    require.config({ paths: { 'vs' : 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.40.0/min/vs' }});
+    require.config({ paths: { 'vs' : 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.48.0/min/vs' }});
     require.config({ 'vs/nls' : { availableLanguages: { '*' : 'ko' } }});
     require.config({ 'vs/nls' : { availableLanguages: { '*' : 'ko' } }});
     require(["vs/editor/editor.main"], function () {
     require(["vs/editor/editor.main"], function () {
         monaco.languages.register({ id : "namumark" });
         monaco.languages.register({ id : "namumark" });

+ 0 - 14
views/main_css/js/func/func.js

@@ -68,20 +68,6 @@ function opennamu_cookie_split_regex(data) {
 function opennamu_get_main_skin_set(set_name) {
 function opennamu_get_main_skin_set(set_name) {
     return fetch("/api/setting/" + opennamu_do_url_encode(set_name)).then(function(res) {
     return fetch("/api/setting/" + opennamu_do_url_encode(set_name)).then(function(res) {
         return res.json();
         return res.json();
-    }).then(function(text) {
-        if(
-            document.cookie.match(opennamu_cookie_split_regex(set_name)) &&
-            document.cookie.match(opennamu_cookie_split_regex(set_name))[1] !== '' &&
-            document.cookie.match(opennamu_cookie_split_regex(set_name))[1] !== 'default'
-        ) {
-            return document.cookie.match(opennamu_cookie_split_regex(set_name))[1];
-        } else {
-            if(text[set_name]) {
-                return text[set_name][0][0];
-            } else {
-                return '';
-            }
-        }
     });
     });
 }
 }
 
 

+ 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;
+    });
+}