ip_parser.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. package tool
  2. import (
  3. "database/sql"
  4. "log"
  5. "regexp"
  6. "strconv"
  7. "strings"
  8. "github.com/3th1nk/cidr"
  9. "github.com/dlclark/regexp2"
  10. )
  11. func IP_or_user(ip string) bool {
  12. match, _ := regexp.MatchString("(\\.|:)", ip)
  13. if match {
  14. return true
  15. } else {
  16. return false
  17. }
  18. }
  19. func Get_level(db *sql.DB, db_set map[string]string, ip string) []string {
  20. var level string
  21. var exp string
  22. var max_exp string
  23. stmt, err := db.Prepare(DB_change(db_set, "select data from user_set where id = ? and name = 'level'"))
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27. defer stmt.Close()
  28. err = stmt.QueryRow(ip).Scan(&level)
  29. if err != nil {
  30. if err == sql.ErrNoRows {
  31. level = "0"
  32. } else {
  33. log.Fatal(err)
  34. }
  35. }
  36. stmt, err = db.Prepare(DB_change(db_set, "select data from user_set where id = ? and name = 'experience'"))
  37. if err != nil {
  38. log.Fatal(err)
  39. }
  40. defer stmt.Close()
  41. err = stmt.QueryRow(ip).Scan(&exp)
  42. if err != nil {
  43. if err == sql.ErrNoRows {
  44. exp = "0"
  45. } else {
  46. log.Fatal(err)
  47. }
  48. }
  49. level_int, _ := strconv.Atoi(level)
  50. max_exp = strconv.Itoa(level_int*50 + 500)
  51. return []string{level, exp, max_exp}
  52. }
  53. func Get_user_auth(db *sql.DB, db_set map[string]string, ip string) string {
  54. if !IP_or_user(ip) {
  55. var auth string
  56. stmt, err := db.Prepare(DB_change(db_set, "select data from user_set where id = ? and name = 'acl'"))
  57. if err != nil {
  58. log.Fatal(err)
  59. }
  60. defer stmt.Close()
  61. err = stmt.QueryRow(ip).Scan(&auth)
  62. if err != nil {
  63. if err == sql.ErrNoRows {
  64. auth = "user"
  65. } else {
  66. log.Fatal(err)
  67. }
  68. }
  69. if auth != "user" && auth != "ban" {
  70. return auth
  71. } else {
  72. return ""
  73. }
  74. }
  75. return ""
  76. }
  77. func Get_auth_group_info(db *sql.DB, db_set map[string]string, auth string) map[string]bool {
  78. stmt, err := db.Prepare(DB_change(db_set, "select name from alist where name = ?"))
  79. if err != nil {
  80. log.Fatal(err)
  81. }
  82. defer stmt.Close()
  83. rows, err := stmt.Query(auth)
  84. if err != nil {
  85. log.Fatal(err)
  86. }
  87. defer rows.Close()
  88. data_list := map[string]bool{}
  89. for rows.Next() {
  90. var name string
  91. err := rows.Scan(&name)
  92. if err != nil {
  93. log.Fatal(err)
  94. }
  95. data_list[name] = true
  96. }
  97. return data_list
  98. }
  99. func IP_preprocess(db *sql.DB, db_set map[string]string, ip string, my_ip string) []string {
  100. var ip_view string
  101. var user_name_view string
  102. ip_split := strings.Split(ip, ":")
  103. if len(ip_split) != 1 && ip_split[0] == "tool" {
  104. return []string{ip, ""}
  105. }
  106. err := db.QueryRow(DB_change(db_set, "select data from other where name = 'ip_view'")).Scan(&ip_view)
  107. if err != nil {
  108. if err == sql.ErrNoRows {
  109. ip_view = ""
  110. } else {
  111. log.Fatal(err)
  112. }
  113. }
  114. err = db.QueryRow(DB_change(db_set, "select data from other where name = 'user_name_view'")).Scan(&user_name_view)
  115. if err != nil {
  116. if err == sql.ErrNoRows {
  117. user_name_view = ""
  118. } else {
  119. log.Fatal(err)
  120. }
  121. }
  122. if Get_user_auth(db, db_set, my_ip) != "" {
  123. ip_view = ""
  124. user_name_view = ""
  125. }
  126. ip_change := ""
  127. if IP_or_user(ip) {
  128. if ip_view != "" && ip != my_ip {
  129. hash_ip := Sha224(ip)
  130. ip = hash_ip[:10]
  131. ip_change = "true"
  132. }
  133. } else {
  134. if user_name_view != "" {
  135. var sub_user_name string
  136. stmt, err := db.Prepare(DB_change(db_set, "select data from user_set where id = ? and name = 'sub_user_name'"))
  137. if err != nil {
  138. log.Fatal(err)
  139. }
  140. defer stmt.Close()
  141. err = stmt.QueryRow(ip).Scan(&sub_user_name)
  142. if err != nil {
  143. if err == sql.ErrNoRows {
  144. sub_user_name = Get_language(db, db_set, "member", false)
  145. } else {
  146. log.Fatal(err)
  147. }
  148. }
  149. if sub_user_name == "" {
  150. sub_user_name = Get_language(db, db_set, "member", false)
  151. }
  152. ip = sub_user_name
  153. ip_change = "true"
  154. } else {
  155. var user_name string
  156. stmt, err := db.Prepare(DB_change(db_set, "select data from user_set where name = 'user_name' and id = ?"))
  157. if err != nil {
  158. log.Fatal(err)
  159. }
  160. defer stmt.Close()
  161. err = stmt.QueryRow(ip).Scan(&user_name)
  162. if err != nil {
  163. if err == sql.ErrNoRows {
  164. user_name = ip
  165. } else {
  166. log.Fatal(err)
  167. }
  168. }
  169. if user_name == "" {
  170. user_name = ip
  171. }
  172. ip = user_name
  173. }
  174. }
  175. return []string{ip, ip_change}
  176. }
  177. func IP_menu(db *sql.DB, db_set map[string]string, ip string, my_ip string, option string) map[string][][]string {
  178. menu := map[string][][]string{}
  179. if ip == my_ip && option == "" {
  180. stmt, err := db.Prepare(DB_change(db_set, "select count(*) from user_notice where name = ? and readme = ''"))
  181. if err != nil {
  182. log.Fatal(err)
  183. }
  184. defer stmt.Close()
  185. var alarm_count string
  186. err = stmt.QueryRow(my_ip).Scan(&alarm_count)
  187. if err != nil {
  188. if err == sql.ErrNoRows {
  189. alarm_count = "0"
  190. } else {
  191. log.Fatal(err)
  192. }
  193. }
  194. if IP_or_user(my_ip) {
  195. menu[Get_language(db, db_set, "login", false)] = [][]string{
  196. {"/login", Get_language(db, db_set, "login", false)},
  197. {"/register", Get_language(db, db_set, "register", false)},
  198. {"/change", Get_language(db, db_set, "user_setting", false)},
  199. {"/login/find", Get_language(db, db_set, "password_search", false)},
  200. {"/alarm" + Url_parser(my_ip), Get_language(db, db_set, "alarm", false) + " (" + alarm_count + ")"},
  201. }
  202. } else {
  203. menu[Get_language(db, db_set, "login", false)] = [][]string{
  204. {"/logout", Get_language(db, db_set, "logout", false)},
  205. {"/change", Get_language(db, db_set, "user_setting", false)},
  206. }
  207. menu[Get_language(db, db_set, "tool", false)] = [][]string{
  208. {"/watch_list", Get_language(db, db_set, "watchlist", false)},
  209. {"/star_doc", Get_language(db, db_set, "star_doc", false)},
  210. {"/challenge", Get_language(db, db_set, "challenge_and_level_manage", false)},
  211. {"/acl/user:" + Url_parser(my_ip), Get_language(db, db_set, "user_document_acl", false)},
  212. {"/alarm" + Url_parser(my_ip), Get_language(db, db_set, "alarm", false) + " (" + alarm_count + ")"},
  213. }
  214. }
  215. }
  216. auth_name := Get_user_auth(db, db_set, my_ip)
  217. if auth_name != "" {
  218. menu[Get_language(db, db_set, "admin", false)] = [][]string{
  219. {"/auth/give/ban/" + Url_parser(ip), Get_language(db, db_set, "ban", false)},
  220. {"/list/user/check_submit/" + Url_parser(ip), Get_language(db, db_set, "check", false)},
  221. }
  222. }
  223. menu[Get_language(db, db_set, "other", false)] = [][]string{
  224. {"/record/" + Url_parser(ip), Get_language(db, db_set, "edit_record", false)},
  225. {"/record/topic/" + Url_parser(ip), Get_language(db, db_set, "discussion_record", false)},
  226. {"/record/bbs/" + Url_parser(ip), Get_language(db, db_set, "bbs_record", false)},
  227. {"/record/bbs_comment/" + Url_parser(ip), Get_language(db, db_set, "bbs_comment_record", false)},
  228. {"/topic/user:" + Url_parser(ip), Get_language(db, db_set, "user_discussion", false)},
  229. {"/count/" + Url_parser(ip), Get_language(db, db_set, "count", false)},
  230. }
  231. return menu
  232. }
  233. func Get_user_ban_type(ban_type string) string {
  234. if ban_type == "O" {
  235. return "1"
  236. } else if ban_type == "E" {
  237. return "2"
  238. } else {
  239. return ""
  240. }
  241. }
  242. func Get_user_ban(db *sql.DB, db_set map[string]string, ip string, tool string) []string {
  243. if Get_user_auth(db, db_set, ip) != "" {
  244. return []string{"", ""}
  245. }
  246. rows, err := db.Query(DB_change(db_set, "select login, block from rb where band = 'regex' and ongoing = '1'"))
  247. if err != nil {
  248. log.Fatal(err)
  249. }
  250. defer rows.Close()
  251. for rows.Next() {
  252. var login string
  253. var block string
  254. err := rows.Scan(&login, &block)
  255. if err != nil {
  256. log.Fatal(err)
  257. }
  258. ban_type := Get_user_ban_type(login)
  259. r := regexp2.MustCompile(block, 0)
  260. if m, _ := r.FindStringMatch(ip); m != nil {
  261. if tool == "login" {
  262. if ban_type != "1" {
  263. return []string{"true", "a" + ban_type}
  264. }
  265. } else if tool == "edit_request" {
  266. if ban_type != "2" {
  267. return []string{"true", "a" + ban_type}
  268. }
  269. } else {
  270. return []string{"true", "a" + ban_type}
  271. }
  272. }
  273. }
  274. if IP_or_user(ip) {
  275. rows, err = db.Query(DB_change(db_set, "select login, block from rb where band = 'cidr' and ongoing = '1'"))
  276. if err != nil {
  277. log.Fatal(err)
  278. }
  279. defer rows.Close()
  280. for rows.Next() {
  281. var login string
  282. var block string
  283. err := rows.Scan(&login, &block)
  284. if err != nil {
  285. log.Fatal(err)
  286. }
  287. ban_type := Get_user_ban_type(login)
  288. c, _ := cidr.Parse(block)
  289. if c.Contains(ip) {
  290. if tool == "login" {
  291. if ban_type != "1" {
  292. return []string{"true", "b" + ban_type}
  293. }
  294. } else if tool == "edit_request" {
  295. if ban_type != "2" {
  296. return []string{"true", "b" + ban_type}
  297. }
  298. } else {
  299. return []string{"true", "b" + ban_type}
  300. }
  301. }
  302. }
  303. }
  304. stmt, err := db.Prepare(DB_change(db_set, "select login from rb where block = ? and band = '' and ongoing = '1'"))
  305. if err != nil {
  306. log.Fatal(err)
  307. }
  308. defer stmt.Close()
  309. var login string
  310. err = stmt.QueryRow(ip).Scan(&login)
  311. if err != nil {
  312. if err == sql.ErrNoRows {
  313. } else {
  314. log.Fatal(err)
  315. }
  316. } else {
  317. ban_type := Get_user_ban_type(login)
  318. if tool == "login" {
  319. if ban_type != "1" {
  320. return []string{"true", ban_type}
  321. }
  322. } else if tool == "edit_request" {
  323. if ban_type != "2" {
  324. return []string{"true", ban_type}
  325. }
  326. } else {
  327. return []string{"true", ban_type}
  328. }
  329. }
  330. stmt, err = db.Prepare(DB_change(db_set, "select data from user_set where id = ? and name = 'acl'"))
  331. if err != nil {
  332. log.Fatal(err)
  333. }
  334. defer stmt.Close()
  335. var data string
  336. err = stmt.QueryRow(ip).Scan(&data)
  337. if err != nil {
  338. if err == sql.ErrNoRows {
  339. } else {
  340. log.Fatal(err)
  341. }
  342. } else {
  343. if data == "ban" {
  344. return []string{"true", "c"}
  345. }
  346. }
  347. return []string{"", ""}
  348. }
  349. func IP_parser(db *sql.DB, db_set map[string]string, ip string, my_ip string) string {
  350. ip_pre_data := IP_preprocess(db, db_set, ip, my_ip)
  351. if ip_pre_data[0] == "" {
  352. return ""
  353. }
  354. if ip_pre_data[1] != "" {
  355. return ip_pre_data[0]
  356. } else {
  357. raw_ip := ip
  358. ip = HTML_escape(ip_pre_data[0])
  359. if !IP_or_user(raw_ip) {
  360. var user_name_level string
  361. var user_title string
  362. err := db.QueryRow(DB_change(db_set, "select data from other where name = 'user_name_level'")).Scan(&user_name_level)
  363. if err != nil {
  364. if err == sql.ErrNoRows {
  365. user_name_level = ""
  366. } else {
  367. log.Fatal(err)
  368. }
  369. }
  370. if user_name_level != "" {
  371. level_data := Get_level(db, db_set, raw_ip)
  372. ip += "<sup>" + level_data[0] + "</sup>"
  373. }
  374. ip = "<a href=\"/w/" + Url_parser("user:"+raw_ip) + "\">" + ip + "</a>"
  375. stmt, err := db.Prepare(DB_change(db_set, "select data from user_set where name = 'user_title' and id = ?"))
  376. if err != nil {
  377. log.Fatal(err)
  378. }
  379. defer stmt.Close()
  380. err = stmt.QueryRow(raw_ip).Scan(&user_title)
  381. if err != nil {
  382. if err == sql.ErrNoRows {
  383. user_title = ""
  384. } else {
  385. log.Fatal(err)
  386. }
  387. }
  388. if Get_user_auth(db, db_set, raw_ip) != "" {
  389. ip = "<b>" + ip + "</b>"
  390. }
  391. ip = user_title + ip
  392. }
  393. ban := Get_user_ban(db, db_set, raw_ip, "")
  394. if ban[0] == "true" {
  395. ip = "<sup>" + ban[1] + "</sup><s>" + ip + "</s>"
  396. }
  397. ip += "<a href=\"javascript:void(0);\" name=\"" + Url_parser(raw_ip) + "\" onclick=\"opennamu_do_ip_click(this);\">⚒️</a>"
  398. return ip
  399. }
  400. }