2
0

some_tool.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. package tool
  2. import (
  3. "crypto/rand"
  4. "crypto/sha256"
  5. "database/sql"
  6. "encoding/hex"
  7. "html"
  8. "html/template"
  9. "math/big"
  10. "net/url"
  11. "os"
  12. "path/filepath"
  13. "strconv"
  14. "strings"
  15. "time"
  16. "unicode"
  17. "github.com/gin-gonic/gin"
  18. )
  19. var standalone_mode = true
  20. func Sha224(data string) string {
  21. hasher := sha256.New224()
  22. hasher.Write([]byte(data))
  23. hash_byte := hasher.Sum(nil)
  24. hash_str := hex.EncodeToString(hash_byte)
  25. return hash_str
  26. }
  27. func Url_parser(data string) string {
  28. return url.PathEscape(data)
  29. }
  30. func HTML_escape(data string) string {
  31. return template.HTMLEscapeString(data)
  32. }
  33. func HTML_unescape(data string) string {
  34. return html.UnescapeString(data)
  35. }
  36. func Arr_in_str(arr []string, data string) bool {
  37. for _, v := range arr {
  38. if v == data {
  39. return true
  40. }
  41. }
  42. return false
  43. }
  44. func Get_time() string {
  45. return time.Now().Format("2006-01-02 15:04:05")
  46. }
  47. func Get_date() string {
  48. return time.Now().Format("2006-01-02")
  49. }
  50. func Get_month() string {
  51. return time.Now().Format("2006-01")
  52. }
  53. func Get_IP(c *gin.Context) string {
  54. return c.ClientIP()
  55. }
  56. func Get_Cookies(c *gin.Context) string {
  57. return c.Request.Header.Get("Cookie")
  58. }
  59. func Get_session(c *gin.Context) string {
  60. return ""
  61. }
  62. func Get_document_setting(db *sql.DB, doc_name string, set_name string, doc_rev string) [][]string {
  63. var rows *sql.Rows
  64. if doc_rev != "" {
  65. rows = Query_DB(
  66. db,
  67. "select set_data, doc_rev from data_set where doc_name = ? and doc_rev = ? and set_name = ?",
  68. doc_name, doc_rev, set_name,
  69. )
  70. } else {
  71. rows = Query_DB(
  72. db,
  73. "select set_data, doc_rev from data_set where doc_name = ? and set_name = ?",
  74. doc_name, set_name,
  75. )
  76. }
  77. defer rows.Close()
  78. data_list := [][]string{}
  79. for rows.Next() {
  80. var set_data string
  81. var doc_rev string
  82. err := rows.Scan(&set_data, &doc_rev)
  83. if err != nil {
  84. panic(err)
  85. }
  86. data_list = append(data_list, []string{set_data, doc_rev})
  87. }
  88. return data_list
  89. }
  90. func Get_setting(db *sql.DB, set_name string, data_coverage string) [][]string {
  91. var rows *sql.Rows
  92. if data_coverage != "" {
  93. rows = Query_DB(
  94. db,
  95. "select data, coverage from other where name = ? and coverage = ?",
  96. set_name, data_coverage,
  97. )
  98. } else {
  99. rows = Query_DB(
  100. db,
  101. "select data, coverage from other where name = ?",
  102. set_name,
  103. )
  104. }
  105. defer rows.Close()
  106. data_list := [][]string{}
  107. for rows.Next() {
  108. var set_data string
  109. var set_coverage string
  110. err := rows.Scan(&set_data, &set_coverage)
  111. if err != nil {
  112. panic(err)
  113. }
  114. data_list = append(data_list, []string{set_data, set_coverage})
  115. }
  116. return data_list
  117. }
  118. func Get_skin_list(data string, default_flag bool) []string {
  119. entries, err := os.ReadDir(filepath.Join("..", "views"))
  120. if err != nil {
  121. return nil
  122. }
  123. var skin_list []string
  124. if default_flag {
  125. skin_list = append(skin_list, "default")
  126. }
  127. for _, entry := range entries {
  128. skin_list = append(skin_list, entry.Name())
  129. }
  130. var skin_return_data []string
  131. for _, skin_data := range skin_list {
  132. if skin_data != "main_css" {
  133. if skin_data == data {
  134. skin_return_data = append([]string{skin_data}, skin_return_data...)
  135. } else {
  136. skin_return_data = append(skin_return_data, skin_data)
  137. }
  138. }
  139. }
  140. return skin_return_data
  141. }
  142. func Get_domain(db *sql.DB, full_string bool) string {
  143. domain := ""
  144. sys_host := ""
  145. if full_string {
  146. http_select := ""
  147. QueryRow_DB(
  148. db,
  149. "select data from other where name = 'http_select'",
  150. []any{ &http_select },
  151. )
  152. if http_select == "" {
  153. http_select = "http"
  154. }
  155. domain = http_select + "://"
  156. db_domain := ""
  157. QueryRow_DB(
  158. db,
  159. "select data from other where name = 'domain'",
  160. []any{ &db_domain },
  161. )
  162. if db_domain != "" {
  163. domain += db_domain
  164. } else {
  165. domain += sys_host
  166. }
  167. } else {
  168. db_domain := ""
  169. QueryRow_DB(
  170. db,
  171. "select data from other where name = 'domain'",
  172. []any{ &db_domain },
  173. )
  174. if db_domain != "" {
  175. domain = db_domain
  176. } else {
  177. domain = sys_host
  178. }
  179. }
  180. return domain
  181. }
  182. func Get_wiki_custom(db *sql.DB, ip string, session_str string, cookies string) []any {
  183. session := map[string]string{}
  184. json.Unmarshal([]byte(session_str), &session)
  185. skin_name := "_" + Get_use_skin_name(db, ip)
  186. user_icon := 1
  187. user_name := ip
  188. user_head := ""
  189. user_email := ""
  190. user_admin := "0"
  191. user_acl_list := []string{}
  192. user_notice_count := "0"
  193. if !IP_or_user(ip) {
  194. user_head_main := ""
  195. QueryRow_DB(
  196. db,
  197. "select data from user_set where id = ? and name = 'custom_css'",
  198. []any{ &user_head_main },
  199. ip,
  200. )
  201. user_head_skin := ""
  202. QueryRow_DB(
  203. db,
  204. "select data from user_set where id = ? and name = ?",
  205. []any{ &user_head_main },
  206. ip,
  207. "custom_css" + skin_name,
  208. )
  209. user_head += user_head_main + user_head_skin
  210. QueryRow_DB(
  211. db,
  212. "select data from user_set where name = 'email' and id = ?",
  213. []any{ &user_email },
  214. ip,
  215. )
  216. if Check_acl(db, "", "", "all_admin_auth", ip) {
  217. user_admin = "1"
  218. acl_name := ""
  219. QueryRow_DB(
  220. db,
  221. "select data from user_set where id = ? and name = 'acl'",
  222. []any{ &acl_name },
  223. ip,
  224. )
  225. rows := Query_DB(
  226. db,
  227. "select acl from alist where name = ?",
  228. acl_name,
  229. )
  230. defer rows.Close()
  231. for rows.Next() {
  232. user_acl_name := ""
  233. err := rows.Scan(&user_acl_name)
  234. if err != nil {
  235. panic(err)
  236. }
  237. user_acl_list = append(user_acl_list, user_acl_name)
  238. }
  239. }
  240. var user_notice_count_int int
  241. QueryRow_DB(
  242. db,
  243. "select count(*) from user_notice where name = ? and readme = ''",
  244. []any{ &user_notice_count_int },
  245. ip,
  246. )
  247. user_notice_count = strconv.Itoa(user_notice_count_int)
  248. } else {
  249. user_icon = 0
  250. user_name = Get_language(db, "user", true)
  251. user_email = ""
  252. user_acl_list = []string{}
  253. user_notice_count = "0"
  254. user_head = ""
  255. }
  256. user_ban := "0"
  257. user_ban_check := Get_user_ban(db, ip, "")[0]
  258. if user_ban_check == "true" {
  259. user_ban = "1"
  260. }
  261. var title string
  262. user_topic := "0"
  263. user_topic_check := QueryRow_DB(
  264. db,
  265. "select title from rd where title = ? and stop = '' limit 1",
  266. []any{ &title },
  267. "user:" + ip,
  268. )
  269. if user_topic_check {
  270. user_topic = "1"
  271. }
  272. return []any{
  273. "",
  274. "",
  275. user_icon,
  276. user_head,
  277. user_email,
  278. user_name,
  279. user_admin,
  280. user_ban,
  281. user_notice_count,
  282. func(user_acl_list []string) any {
  283. if len(user_acl_list) == 0 {
  284. return "0"
  285. } else {
  286. return user_acl_list
  287. }
  288. }(user_acl_list),
  289. ip,
  290. user_topic,
  291. "",
  292. Get_level(db, ip),
  293. }
  294. }
  295. func Get_wiki_set(db *sql.DB, ip string, cookies string) []any {
  296. skin_name := Get_use_skin_name(db, ip)
  297. data_list := []any{}
  298. set_wiki_name := "Wiki"
  299. QueryRow_DB(
  300. db,
  301. "select data from other where name = 'name'",
  302. []any{ &set_wiki_name },
  303. )
  304. set_license := ""
  305. QueryRow_DB(
  306. db,
  307. "select data from other where name = 'license'",
  308. []any{ &set_license },
  309. )
  310. set_logo := ""
  311. QueryRow_DB(
  312. db,
  313. "select data from other where name = 'logo' and coverage = ?",
  314. []any{ &set_logo },
  315. skin_name,
  316. )
  317. if set_logo == "" {
  318. QueryRow_DB(
  319. db,
  320. "select data from other where name = 'logo' and coverage = ''",
  321. []any{ &set_logo },
  322. )
  323. }
  324. if set_logo == "" {
  325. set_logo = set_wiki_name
  326. }
  327. set_head := ""
  328. QueryRow_DB(
  329. db,
  330. "select data from other where name = 'head' and coverage = ''",
  331. []any{ &set_head },
  332. )
  333. set_head_skin := ""
  334. QueryRow_DB(
  335. db,
  336. "select data from other where name = 'head' and coverage = ?",
  337. []any{ &set_head_skin },
  338. skin_name,
  339. )
  340. set_head_dark := ""
  341. cookie_map := Get_cookie_header(cookies)
  342. if cookie_map["main_css_darkmode"] == "1" {
  343. QueryRow_DB(
  344. db,
  345. "select data from other where name = 'head' and coverage = ?",
  346. []any{ &set_head_dark },
  347. skin_name + "-cssdark",
  348. )
  349. }
  350. set_top_menu := ""
  351. QueryRow_DB(
  352. db,
  353. "select data from other where name = 'top_menu'",
  354. []any{ &set_top_menu },
  355. )
  356. set_top_menu_user := ""
  357. QueryRow_DB(
  358. db,
  359. "select data from user_set where name = 'top_menu' and id = ?",
  360. []any{ &set_top_menu_user },
  361. ip,
  362. )
  363. set_top_menu = strings.ReplaceAll(set_top_menu, "\r", "")
  364. set_top_menu_user = strings.ReplaceAll(set_top_menu_user, "\r", "")
  365. set_top_menu_mix := ""
  366. if set_top_menu != "" && set_top_menu_user != "" {
  367. set_top_menu_mix = set_top_menu + "\n" + set_top_menu_user
  368. } else {
  369. set_top_menu_mix = set_top_menu + set_top_menu_user
  370. }
  371. set_top_menu_result := [][]string{}
  372. if set_top_menu_mix != "" {
  373. lst := strings.Split(set_top_menu_mix, "\n")
  374. if len(lst) % 2 != 0 {
  375. lst = append(lst, "")
  376. }
  377. for i := 0; i < len(lst) - 1; i += 2 {
  378. set_top_menu_result = append(set_top_menu_result, []string{lst[i], lst[i+1]})
  379. }
  380. }
  381. template_var := []any{}
  382. for for_a := 1; for_a < 4; for_a++ {
  383. template_var_tmp := ""
  384. QueryRow_DB(
  385. db,
  386. "select data from other where name = ?",
  387. []any{ &template_var_tmp },
  388. "template_var_" + strconv.Itoa(for_a),
  389. )
  390. template_var = append(template_var, template_var_tmp)
  391. }
  392. data_list = append(data_list, set_wiki_name)
  393. data_list = append(data_list, set_license)
  394. data_list = append(data_list, "")
  395. data_list = append(data_list, "")
  396. data_list = append(data_list, set_logo)
  397. data_list = append(data_list, set_head + set_head_skin + set_head_dark)
  398. if len(set_top_menu_result) > 0 {
  399. data_list = append(data_list, set_top_menu_result)
  400. } else {
  401. data_list = append(data_list, "")
  402. }
  403. data_list = append(data_list, template_var...)
  404. return data_list
  405. }
  406. func Get_cookie_header(cookie_header string) map[string]string {
  407. cookies := make(map[string]string)
  408. parts := strings.Split(cookie_header, ";")
  409. for _, part := range parts {
  410. part = strings.TrimSpace(part)
  411. if len(part) == 0 {
  412. continue
  413. }
  414. kv := strings.SplitN(part, "=", 2)
  415. if len(kv) == 2 {
  416. key := strings.TrimSpace(kv[0])
  417. value := strings.TrimSpace(kv[1])
  418. cookies[key] = value
  419. }
  420. }
  421. return cookies
  422. }
  423. type Config struct {
  424. Other_set string
  425. IP string
  426. Cookies string
  427. Session string
  428. }
  429. func Deep_copy_config(src Config) Config {
  430. return Config{
  431. Other_set : strings.Clone(src.Other_set),
  432. IP : strings.Clone(src.IP),
  433. Cookies : strings.Clone(src.Cookies),
  434. Session : strings.Clone(src.Session),
  435. }
  436. }
  437. func Choose(v string, def string) string {
  438. if strings.TrimSpace(v) == "" {
  439. return def
  440. }
  441. return v
  442. }
  443. func File_exist_check(path string) bool {
  444. _, err := os.Stat(path)
  445. return err == nil
  446. }
  447. func File_text_read(path string) string {
  448. raw, err := os.ReadFile(path)
  449. if err != nil {
  450. return ""
  451. }
  452. return string(raw)
  453. }
  454. func IN_mod_OUT_mod(data bool) {
  455. standalone_mode = data
  456. }
  457. func Str_to_int(data string) int {
  458. num, _ := strconv.Atoi(data)
  459. return num
  460. }
  461. func Get_except_document_name_SQL(col_title string) string {
  462. return col_title + ` not like 'file:%' and ` + col_title + ` not like 'category:%' and ` + col_title + ` not like 'user:%'`
  463. }
  464. func Get_except_set_id_SQL() string {
  465. return `not set_id = "0"`
  466. }
  467. func Do_remove_spaces(s string) string {
  468. return strings.Map(func(r rune) rune {
  469. if unicode.IsSpace(r) {
  470. return -1
  471. }
  472. return r
  473. }, s)
  474. }
  475. func Get_init_set_list(need string) map[string]map[string]any {
  476. init_set_list := map[string]map[string]any{
  477. "host": {
  478. "display" : "Host",
  479. "require" : "conv",
  480. "default" : "0.0.0.0",
  481. },
  482. "port": {
  483. "display" : "Port",
  484. "require" : "conv",
  485. "default" : "3000",
  486. },
  487. "golang_port": {
  488. "display" : "Golang port",
  489. "require" : "conv",
  490. "default" : "3001",
  491. },
  492. "language": {
  493. "display" : "Language",
  494. "require" : "select",
  495. "default" : "ko-KR",
  496. "list" : []string{ "ko-KR", "en-US" },
  497. },
  498. "markup": {
  499. "display" : "Markup",
  500. "require" : "select",
  501. "default" : "namumark",
  502. "list" : []string{ "namumark", "namumark_beta", "macromark", "markdown", "custom", "raw" },
  503. },
  504. "encode": {
  505. "display" : "Encryption method",
  506. "require" : "select",
  507. "default" : "sha3",
  508. "list" : []string{ "sha3", "sha3-salt", "sha3-512", "sha3-512-salt" },
  509. },
  510. }
  511. if need == "" || need == "all" {
  512. return init_set_list
  513. }
  514. return map[string]map[string]any{
  515. need : init_set_list[need],
  516. }
  517. }
  518. func JS_escape(data string) string {
  519. data = strings.ReplaceAll(data, `\`, `\\`)
  520. data = strings.ReplaceAll(data, "\r", `\r`)
  521. data = strings.ReplaceAll(data, "\n", `\n`)
  522. data = strings.ReplaceAll(data, "\t", `\t`)
  523. data = strings.ReplaceAll(data, `'`, `\'`)
  524. data = strings.ReplaceAll(data, `"`, `\"`)
  525. data = strings.ReplaceAll(data, "\u2028", `\u2028`)
  526. data = strings.ReplaceAll(data, "\u2029", `\u2029`)
  527. return data
  528. }
  529. func Get_image_url(db *sql.DB) string {
  530. image_url := ""
  531. QueryRow_DB(
  532. db,
  533. `select data from other where name = "image_where"`,
  534. []any{ &image_url },
  535. )
  536. if image_url == "" {
  537. image_url = filepath.Join("..", "data", "images")
  538. }
  539. return image_url
  540. }
  541. func Get_random_key(long int) string {
  542. const letters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  543. result := make([]byte, long)
  544. lettersLen := big.NewInt(int64(len(letters)))
  545. for i := 0; i < long; i++ {
  546. num, err := rand.Int(rand.Reader, lettersLen)
  547. if err != nil {
  548. result[i] = letters[0]
  549. continue
  550. }
  551. result[i] = letters[num.Int64()]
  552. }
  553. return string(result)
  554. }