document_manager.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. package tool
  2. import (
  3. "database/sql"
  4. "strconv"
  5. "strings"
  6. "time"
  7. "github.com/dlclark/regexp2"
  8. )
  9. func Do_edit_filter(db *sql.DB, config Config, doc_name string, data string) bool {
  10. if !Check_acl(db, "", "", "edit_filter_pass", config.IP) {
  11. rows := Query_DB(
  12. db,
  13. `select plus, plus_t from html_filter where kind = 'regex_filter' and plus != ''`,
  14. )
  15. defer rows.Close()
  16. for rows.Next() {
  17. var plus string
  18. var plus_t string
  19. err := rows.Scan(&plus, &plus_t)
  20. if err != nil {
  21. panic(err)
  22. }
  23. r, err := regexp2.Compile(plus, 0)
  24. if err != nil {
  25. continue
  26. }
  27. m, err := r.MatchString(data)
  28. if err == nil && m {
  29. return false
  30. }
  31. }
  32. }
  33. return true
  34. }
  35. func Do_edit_send_require_check(db *sql.DB, config Config, data string) bool {
  36. if !Check_acl(db, "", "", "edit_bottom_compulsion", config.IP) {
  37. var check string
  38. QueryRow_DB(
  39. db,
  40. `select data from other where name = "edit_bottom_compulsion"`,
  41. []any{ &check },
  42. )
  43. if check != "" && data == "" {
  44. return false
  45. }
  46. }
  47. return true
  48. }
  49. func Do_edit_text_checkbox_check(db *sql.DB, config Config, data string) bool {
  50. var check string
  51. QueryRow_DB(
  52. db,
  53. `select data from other where name = "copyright_checkbox_text"`,
  54. []any{ &check },
  55. )
  56. if check != "" && data != "yes" {
  57. return false
  58. }
  59. return true
  60. }
  61. func Do_edit_slow_check(db *sql.DB, config Config, do_type string) bool {
  62. if !Check_acl(db, "", "", "slow_edit", config.IP) {
  63. var check string
  64. if do_type == "edit" {
  65. QueryRow_DB(
  66. db,
  67. `select data from other where name = 'slow_edit'`,
  68. []any{ &check },
  69. )
  70. } else {
  71. // do_type == "thread"
  72. QueryRow_DB(
  73. db,
  74. `select data from other where name = 'slow_thread'`,
  75. []any{ &check },
  76. )
  77. }
  78. if check != "" {
  79. slow_edit := Str_to_int(check)
  80. var last_edit string
  81. if do_type == "edit" {
  82. QueryRow_DB(
  83. db,
  84. `select date from history where ip = ? order by date desc limit 1`,
  85. []any{ &last_edit },
  86. config.IP,
  87. )
  88. } else {
  89. QueryRow_DB(
  90. db,
  91. `select date from topic where ip = ? order by date desc limit 1`,
  92. []any{ &last_edit },
  93. config.IP,
  94. )
  95. }
  96. if last_edit != "" {
  97. last_edit_compact := strings.NewReplacer(
  98. " ", "",
  99. ":", "",
  100. "-", "",
  101. ).Replace(last_edit)
  102. last_edit_num := Str_to_int(last_edit_compact)
  103. now_edit_num := Str_to_int(
  104. time.Now().Add(-time.Duration(slow_edit) * time.Second).Format("20060102150405"),
  105. )
  106. if last_edit_num > now_edit_num {
  107. return false
  108. }
  109. }
  110. }
  111. }
  112. return true
  113. }
  114. // Do_edit_max_length_check : over is false, under is true
  115. func Do_edit_max_length_check(db *sql.DB, config Config, data string) bool {
  116. var check string
  117. exist := QueryRow_DB(
  118. db,
  119. "select data from other where name = 'document_content_max_length'",
  120. []any{ &check },
  121. )
  122. if !exist || check == "" {
  123. return true
  124. }
  125. return len(data) <= Str_to_int(check)
  126. }
  127. func Get_edit_length_diff(A string, B string) string {
  128. A_len := len(A)
  129. B_len := len(B)
  130. if A_len > B_len {
  131. diff_len := A_len - B_len
  132. diff_len_str := strconv.Itoa(diff_len)
  133. return "-" + diff_len_str
  134. } else if B_len > A_len {
  135. diff_len := B_len - A_len
  136. diff_len_str := strconv.Itoa(diff_len)
  137. return "+" + diff_len_str
  138. } else {
  139. return "0"
  140. }
  141. }
  142. func Do_watchlist_alarm_send(db *sql.DB, config Config, doc_name string) {
  143. rows := Query_DB(
  144. db,
  145. `select id from user_set where name = 'watchlist' and data = ?`,
  146. doc_name,
  147. )
  148. defer rows.Close()
  149. for rows.Next() {
  150. var id string
  151. err := rows.Scan(&id)
  152. if err != nil {
  153. panic(err)
  154. }
  155. Send_alarm(
  156. db,
  157. id,
  158. config.IP,
  159. `<a href="/w/` + Url_parser(doc_name) + `">` + HTML_escape(doc_name) + `</a>`,
  160. )
  161. }
  162. }
  163. func Do_add_history(db *sql.DB, doc_name string, data string, date string, ip string, send string, length string, mode string, type_check string) {
  164. var history_recording_off_check string
  165. QueryRow_DB(
  166. db,
  167. `select data from other where name = "history_recording_off"`,
  168. []any{ &history_recording_off_check },
  169. )
  170. if history_recording_off_check != "" {
  171. return
  172. }
  173. var id_data string
  174. if mode == "add" || mode == "setting" {
  175. old_id_data := "1"
  176. QueryRow_DB(
  177. db,
  178. `select id from history where title = ? order by id + 0 asc limit 1`,
  179. []any{ &old_id_data },
  180. doc_name,
  181. )
  182. old_id_data_int := Str_to_int(old_id_data)
  183. old_id_data_int -= 1
  184. id_data = strconv.Itoa(old_id_data_int)
  185. } else {
  186. old_id_data := "0"
  187. QueryRow_DB(
  188. db,
  189. `select id from history where title = ? order by id + 0 desc limit 1`,
  190. []any{ &old_id_data },
  191. doc_name,
  192. )
  193. old_id_data_int := Str_to_int(old_id_data)
  194. old_id_data_int += 1
  195. id_data = strconv.Itoa(old_id_data_int)
  196. if id_data == "1" {
  197. mode = "r1"
  198. }
  199. if strings.HasPrefix(doc_name, "user:") {
  200. mode = "user"
  201. } else if strings.HasPrefix(doc_name, "category:") {
  202. mode = "category"
  203. } else if strings.HasPrefix(doc_name, "file:") {
  204. mode = "file"
  205. }
  206. }
  207. send = strings.ReplaceAll(send, "<", "")
  208. send = strings.ReplaceAll(send, ">", "")
  209. if len(send) > 512 {
  210. send = send[:512]
  211. }
  212. if type_check != "" {
  213. send = send + " (" + type_check + ")"
  214. }
  215. if mode != "add" && mode != "setting" && mode != "user" {
  216. Do_add_recent_history(db, "normal", id_data, doc_name, date)
  217. }
  218. if mode != "add" && mode != "setting" {
  219. Do_add_recent_history(db, mode, id_data, doc_name, date)
  220. var document_count int
  221. QueryRow_DB(
  222. db,
  223. `select count(*) from data`,
  224. []any{ &document_count },
  225. )
  226. document_count_str := strconv.Itoa(document_count)
  227. Exec_DB(
  228. db,
  229. `delete from other where name = "count_all_title"`,
  230. )
  231. Exec_DB(
  232. db,
  233. `insert into other (name, data, coverage) values ("count_all_title", ?, "")`,
  234. document_count_str,
  235. )
  236. data_set_exist := ""
  237. if mode == "delete" {
  238. data_set_exist = "not_exist"
  239. }
  240. Exec_DB(
  241. db,
  242. `delete from data_set where doc_name = ? and set_name = "edit_request_doing"`,
  243. doc_name,
  244. )
  245. Exec_DB(
  246. db,
  247. `delete from data_set where doc_name = ? and set_name = "last_edit"`,
  248. doc_name,
  249. )
  250. Exec_DB(
  251. db,
  252. `insert into data_set (doc_name, doc_rev, set_name, set_data) values (?, '', 'last_edit', ?)`,
  253. doc_name,
  254. date,
  255. )
  256. Exec_DB(
  257. db,
  258. `delete from data_set where doc_name = ? and set_name = "length"`,
  259. doc_name,
  260. )
  261. Exec_DB(
  262. db,
  263. `insert into data_set (doc_name, doc_rev, set_name, set_data) values (?, '', 'length', ?)`,
  264. doc_name,
  265. len(data),
  266. )
  267. Exec_DB(
  268. db,
  269. `update data_set set doc_rev = ? where doc_name = ? and (doc_rev = '' or doc_rev = 'not_exist')`,
  270. data_set_exist,
  271. doc_name,
  272. )
  273. }
  274. Exec_DB(
  275. db,
  276. `insert into history (id, title, data, date, ip, send, leng, hide, type) values (?, ?, ?, ?, ?, ?, ?, '', ?)`,
  277. id_data,
  278. doc_name,
  279. data,
  280. date,
  281. ip,
  282. send,
  283. length,
  284. mode,
  285. )
  286. }
  287. func Do_add_recent_history(db *sql.DB, mode string, id string, title string, date string) {
  288. var length int
  289. QueryRow_DB(
  290. db,
  291. `select count(*) from rc where type = ?`,
  292. []any{ &length },
  293. mode,
  294. )
  295. if length >= 200 {
  296. var id string
  297. var title string
  298. exist := QueryRow_DB(
  299. db,
  300. `select id, title from rc where type = ? order by date asc limit 1`,
  301. []any{ &id, &title },
  302. mode,
  303. )
  304. if exist {
  305. Exec_DB(
  306. db,
  307. `delete from rc where id = ? and title = ? and type = ?`,
  308. id,
  309. title,
  310. mode,
  311. )
  312. }
  313. }
  314. Exec_DB(
  315. db,
  316. `insert into rc (id, title, date, type) values (?, ?, ?, ?)`,
  317. id,
  318. title,
  319. date,
  320. mode,
  321. )
  322. }
  323. func Get_document_markup(db *sql.DB, doc_name string, do_type string) string {
  324. markup := ""
  325. if do_type == "document" {
  326. QueryRow_DB(
  327. db,
  328. "select set_data from data_set where doc_name = ? and set_name = 'document_markup'",
  329. []any{ &markup },
  330. doc_name,
  331. )
  332. if markup == "" {
  333. QueryRow_DB(
  334. db,
  335. "select data from other where name = 'markup'",
  336. []any{ &markup },
  337. )
  338. }
  339. }
  340. if markup == "" || markup == "namumark_beta" {
  341. markup = "namumark"
  342. }
  343. return markup
  344. }
  345. func Get_document_is_redirect(db *sql.DB, doc_name string) bool {
  346. var is_redirect string
  347. exist := QueryRow_DB(
  348. db,
  349. "select distinct type from back where link = ? and type = 'redirect'",
  350. []any{ &is_redirect },
  351. doc_name,
  352. )
  353. return exist
  354. }