From 37dcdacc053ee7d2b8b6a2ae0b6b8bfb88400859 Mon Sep 17 00:00:00 2001 From: cloudfreexiao <996442717qqcom@gmail.com> Date: Sun, 29 Aug 2021 01:14:07 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=B3chore(=E5=BA=93):=E8=A3=81=E5=89=AA?= =?UTF-8?q?=20Lapis-chan=20=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- misc/website/backend/README.md | 2 + misc/website/backend/app/app.lua | 2 +- misc/website/backend/app/config.lua | 92 +- misc/website/backend/app/migrations.lua | 99 - misc/website/backend/app/nginx.conf | 4 +- misc/website/backend/app/spec/app_spec.lua | 19 +- misc/website/backend/app/src/apps/api.lua | 3 - .../app/src/apps/api/announcements.lua | 14 - .../apps/api/announcements/announcement.lua | 64 - .../apps/api/announcements/announcements.lua | 51 - .../app/src/apps/api/announcements/global.lua | 21 - .../website/backend/app/src/apps/api/bans.lua | 14 - .../backend/app/src/apps/api/bans/ban.lua | 94 +- .../backend/app/src/apps/api/bans/bans.lua | 80 +- .../backend/app/src/apps/api/bans/bans_ip.lua | 32 +- .../backend/app/src/apps/api/boards.lua | 23 - .../app/src/apps/api/boards/announcements.lua | 25 - .../app/src/apps/api/boards/archived.lua | 24 - .../backend/app/src/apps/api/boards/bans.lua | 29 - .../backend/app/src/apps/api/boards/board.lua | 114 - .../app/src/apps/api/boards/boards.lua | 79 - .../backend/app/src/apps/api/boards/post.lua | 92 - .../app/src/apps/api/boards/post_reports.lua | 21 - .../backend/app/src/apps/api/boards/posts.lua | 105 - .../app/src/apps/api/boards/reports.lua | 29 - .../app/src/apps/api/boards/thread.lua | 69 - .../src/apps/api/boards/thread_reports.lua | 21 - .../app/src/apps/api/boards/threads.lua | 35 - .../website/backend/app/src/apps/api/core.lua | 24 +- .../backend/app/src/apps/api/core/login.lua | 50 +- .../backend/app/src/apps/api/core/root.lua | 10 +- .../app/src/apps/api/internal/action_base.lua | 18 +- .../app/src/apps/api/internal/before_auth.lua | 72 +- .../src/apps/api/internal/before_locale.lua | 28 +- .../backend/app/src/apps/api/pages.lua | 13 - .../backend/app/src/apps/api/pages/page.lua | 60 - .../backend/app/src/apps/api/pages/pages.lua | 45 - .../backend/app/src/apps/api/users.lua | 24 +- .../backend/app/src/apps/api/users/user.lua | 180 +- .../backend/app/src/apps/api/users/users.lua | 90 +- misc/website/backend/app/src/apps/web.lua | 16 - .../backend/app/src/apps/web/admin.lua | 16 - .../app/src/apps/web/admin/announcement.lua | 128 -- .../backend/app/src/apps/web/admin/board.lua | 136 -- .../backend/app/src/apps/web/admin/index.lua | 138 -- .../backend/app/src/apps/web/admin/page.lua | 164 -- .../backend/app/src/apps/web/admin/report.lua | 64 - .../backend/app/src/apps/web/admin/user.lua | 190 -- .../backend/app/src/apps/web/boards.lua | 14 - .../app/src/apps/web/boards/archive.lua | 76 - .../backend/app/src/apps/web/boards/board.lua | 242 --- .../app/src/apps/web/boards/catalog.lua | 128 -- .../app/src/apps/web/boards/thread.lua | 242 --- .../app/src/apps/web/internal/check_auth.lua | 29 - .../app/src/apps/web/internal/check_ban.lua | 41 - .../app/src/apps/web/internal/code_404.lua | 14 - .../app/src/apps/web/internal/config_site.lua | 45 - .../app/src/apps/web/internal/install.lua | 333 --- .../backend/app/src/apps/web/pages.lua | 14 - .../backend/app/src/apps/web/pages/index.lua | 10 - .../backend/app/src/apps/web/pages/logout.lua | 9 - .../backend/app/src/apps/web/pages/page.lua | 28 - .../backend/app/src/apps/web/pages/rules.lua | 19 - misc/website/backend/app/src/locale/fr.lua | 234 -- .../website/backend/app/src/locale/phpceo.lua | 234 -- misc/website/backend/app/src/locale/pl.lua | 240 -- .../backend/app/src/models/announcements.lua | 96 - misc/website/backend/app/src/models/bans.lua | 174 +- .../website/backend/app/src/models/boards.lua | 226 -- misc/website/backend/app/src/models/pages.lua | 90 - misc/website/backend/app/src/models/posts.lua | 387 ---- .../backend/app/src/models/reports.lua | 76 - .../backend/app/src/models/threads.lua | 106 - misc/website/backend/app/src/models/users.lua | 242 ++- misc/website/backend/app/src/sass/posts.scss | 109 - misc/website/backend/app/src/sass/reset.scss | 141 -- misc/website/backend/app/src/sass/style.scss | 322 --- .../website/backend/app/src/sass/yotsuba.scss | 113 - .../backend/app/src/sass/yotsuba_b.scss | 109 - .../website/backend/app/src/utils/capture.lua | 48 +- misc/website/backend/app/src/utils/error.lua | 108 +- .../backend/app/src/utils/file_whitelist.lua | 36 +- .../backend/app/src/utils/generate.lua | 119 +- misc/website/backend/app/src/utils/json.lua | 42 + .../app/src/utils/request_processor.lua | 298 --- misc/website/backend/app/src/utils/role.lua | 18 +- .../backend/app/src/utils/text_formatter.lua | 239 +- .../backend/app/src/views/admin/admin.etlua | 247 --- .../app/src/views/admin/announcement.etlua | 30 - .../backend/app/src/views/admin/board.etlua | 189 -- .../backend/app/src/views/admin/login.etlua | 21 - .../backend/app/src/views/admin/page.etlua | 33 - .../backend/app/src/views/admin/success.etlua | 3 - .../backend/app/src/views/admin/user.etlua | 71 - .../backend/app/src/views/archive.etlua | 49 - .../backend/app/src/views/banned.etlua | 8 - .../website/backend/app/src/views/board.etlua | 36 - .../backend/app/src/views/catalog.etlua | 34 - .../backend/app/src/views/code_404.etlua | 2 - .../src/views/fragments/announcements.etlua | 6 - .../app/src/views/fragments/board_title.etlua | 6 - .../app/src/views/fragments/copyright.etlua | 9 - .../app/src/views/fragments/error.etlua | 6 - .../app/src/views/fragments/form_ban.etlua | 15 - .../app/src/views/fragments/form_delete.etlua | 9 - .../app/src/views/fragments/form_locale.etlua | 10 - .../app/src/views/fragments/form_lock.etlua | 9 - .../src/views/fragments/form_override.etlua | 9 - .../app/src/views/fragments/form_remix.etlua | 9 - .../app/src/views/fragments/form_report.etlua | 6 - .../app/src/views/fragments/form_save.etlua | 9 - .../app/src/views/fragments/form_sticky.etlua | 9 - .../app/src/views/fragments/form_submit.etlua | 144 -- .../app/src/views/fragments/list_boards.etlua | 16 - .../app/src/views/fragments/op_content.etlua | 71 - .../src/views/fragments/post_content.etlua | 39 - .../app/src/views/fragments/post_menu.etlua | 21 - .../src/views/fragments/return_board.etlua | 3 - .../src/views/fragments/return_thread.etlua | 3 - .../website/backend/app/src/views/index.etlua | 16 - .../backend/app/src/views/install.etlua | 132 -- .../backend/app/src/views/layout.etlua | 30 - misc/website/backend/app/src/views/page.etlua | 2 - .../website/backend/app/src/views/rules.etlua | 17 - .../backend/app/src/views/thread.etlua | 26 - misc/website/backend/app/static/banned.jpg | Bin 10148 -> 0 bytes misc/website/backend/app/static/css/posts.css | 63 - .../backend/app/static/css/posts.css.map | 7 - misc/website/backend/app/static/css/reset.css | 200 -- .../backend/app/static/css/reset.css.map | 7 - misc/website/backend/app/static/css/style.css | 478 ---- .../backend/app/static/css/style.css.map | 7 - .../website/backend/app/static/css/tegaki.css | 187 -- .../backend/app/static/css/yotsuba.css | 63 - .../backend/app/static/css/yotsuba.css.map | 7 - .../backend/app/static/css/yotsuba_b.css | 61 - .../backend/app/static/css/yotsuba_b.css.map | 7 - misc/website/backend/app/static/js/script.js | 249 --- .../backend/app/static/js/tegaki/LICENSE | 19 - .../backend/app/static/js/tegaki/README.md | 10 - .../backend/app/static/js/tegaki/Rakefile | 20 - .../backend/app/static/js/tegaki/tegaki.js | 1925 ----------------- misc/website/backend/app/static/op_audio.png | Bin 19745 -> 0 bytes .../website/backend/app/static/op_spoiler.png | Bin 35209 -> 0 bytes .../website/backend/app/static/post_audio.png | Bin 7635 -> 0 bytes .../backend/app/static/post_spoiler.png | Bin 18948 -> 0 bytes misc/website/backend/data/favicon.ico | Bin 954 -> 0 bytes misc/website/backend/data/files/.keep | 0 misc/website/backend/data/secrets/.keep | 0 .../data/{backup/.keep => static/.gitkeep} | 0 misc/website/backend/resources/op_spoiler.psd | Bin 255845 -> 0 bytes .../backend/resources/post_spoiler.psd | Bin 128434 -> 0 bytes misc/website/backend/sass.sh | 3 - misc/website/backend/ts.sh | 3 - misc/website/backend/tsconfig.json | 13 - misc/website/frontend/.browserslistrc | 0 misc/website/frontend/.editorconfig | 0 misc/website/frontend/.env | 2 +- misc/website/frontend/.eslintignore | 0 misc/website/frontend/.eslintrc.js | 0 misc/website/frontend/.gitignore | 0 misc/website/frontend/LICENSE | 0 misc/website/frontend/README-zh.md | 0 misc/website/frontend/README.md | 0 misc/website/frontend/babel.config.js | 0 misc/website/frontend/cypress.json | 0 misc/website/frontend/jest.config.js | 0 misc/website/frontend/package-lock.json | 0 misc/website/frontend/package.json | 0 misc/website/frontend/postcss.config.js | 0 misc/website/frontend/public/favicon.ico | Bin .../img/icons/android-chrome-192x192.png | Bin .../img/icons/android-chrome-512x512.png | Bin .../img/icons/apple-touch-icon-120x120.png | Bin .../img/icons/apple-touch-icon-152x152.png | Bin .../img/icons/apple-touch-icon-180x180.png | Bin .../img/icons/apple-touch-icon-60x60.png | Bin .../img/icons/apple-touch-icon-76x76.png | Bin .../public/img/icons/apple-touch-icon.png | Bin .../public/img/icons/favicon-16x16.png | Bin .../public/img/icons/favicon-32x32.png | Bin .../img/icons/msapplication-icon-144x144.png | Bin .../public/img/icons/mstile-150x150.png | Bin .../public/img/icons/safari-pinned-tab.svg | 0 misc/website/frontend/public/index.html | 0 misc/website/frontend/public/manifest.json | 4 +- misc/website/frontend/public/robots.txt | 0 misc/website/frontend/src/App.vue | 0 misc/website/frontend/src/api/articles.ts | 0 misc/website/frontend/src/api/node.ts | 0 misc/website/frontend/src/api/types.d.ts | 0 misc/website/frontend/src/api/users.ts | 0 .../src/assets/404-images/404-cloud.png | Bin .../frontend/src/assets/404-images/404.png | Bin .../src/components/Breadcrumb/index.vue | 0 .../src/components/Hamburger/index.vue | 0 misc/website/frontend/src/define.d.ts | 0 misc/website/frontend/src/icons/README.md | 0 .../src/icons/components/dashboard.ts | 0 .../frontend/src/icons/components/example.ts | 0 .../frontend/src/icons/components/eye-off.ts | 0 .../frontend/src/icons/components/eye-on.ts | 0 .../frontend/src/icons/components/form.ts | 0 .../src/icons/components/hamburger.ts | 0 .../frontend/src/icons/components/index.ts | 0 .../frontend/src/icons/components/link.ts | 0 .../frontend/src/icons/components/nested.ts | 0 .../frontend/src/icons/components/password.ts | 0 .../frontend/src/icons/components/table.ts | 0 .../frontend/src/icons/components/tree.ts | 0 .../frontend/src/icons/components/user.ts | 0 .../frontend/src/icons/svg/dashboard.svg | 0 .../frontend/src/icons/svg/example.svg | 0 .../frontend/src/icons/svg/eye-off.svg | 0 .../website/frontend/src/icons/svg/eye-on.svg | 0 misc/website/frontend/src/icons/svg/form.svg | 0 .../frontend/src/icons/svg/hamburger.svg | 0 misc/website/frontend/src/icons/svg/link.svg | 0 .../website/frontend/src/icons/svg/nested.svg | 0 .../frontend/src/icons/svg/password.svg | 0 misc/website/frontend/src/icons/svg/table.svg | 0 misc/website/frontend/src/icons/svg/tree.svg | 0 misc/website/frontend/src/icons/svg/user.svg | 0 .../src/layout/components/AppMain.vue | 0 .../src/layout/components/Navbar/index.vue | 0 .../layout/components/Sidebar/SidebarItem.vue | 0 .../components/Sidebar/SidebarItemLink.vue | 0 .../src/layout/components/Sidebar/index.vue | 0 .../frontend/src/layout/components/index.ts | 0 misc/website/frontend/src/layout/index.vue | 0 .../frontend/src/layout/mixin/resize.ts | 0 misc/website/frontend/src/main.ts | 0 misc/website/frontend/src/permission.ts | 0 .../frontend/src/registerServiceWorker.ts | 0 misc/website/frontend/src/router.ts | 0 misc/website/frontend/src/shims-vue.d.ts | 0 misc/website/frontend/src/store/index.ts | 0 .../website/frontend/src/store/modules/app.ts | 0 .../frontend/src/store/modules/user.ts | 0 misc/website/frontend/src/styles/_mixins.scss | 0 .../website/frontend/src/styles/_svgicon.scss | 0 .../frontend/src/styles/_transition.scss | 0 .../frontend/src/styles/_variables.scss | 0 .../frontend/src/styles/_variables.scss.d.ts | 0 .../src/styles/element-variables.scss | 0 misc/website/frontend/src/styles/index.scss | 0 misc/website/frontend/src/utils/cookies.ts | 0 misc/website/frontend/src/utils/request.ts | 0 misc/website/frontend/src/utils/validate.ts | 0 misc/website/frontend/src/views/404.vue | 0 .../frontend/src/views/dashboard/index.vue | 0 .../frontend/src/views/debug/index.vue | 0 .../src/views/flamegraph/flamegraph.js | 2 +- .../src/views/flamegraph/flamegraph.vue | 0 .../website/frontend/src/views/form/index.vue | 0 .../frontend/src/views/login/index.vue | 0 .../frontend/src/views/nested/menu1/index.vue | 0 .../src/views/nested/menu1/menu1-1/index.vue | 0 .../src/views/nested/menu1/menu1-2/index.vue | 0 .../nested/menu1/menu1-2/menu1-2-1/index.vue | 0 .../nested/menu1/menu1-2/menu1-2-2/index.vue | 0 .../src/views/nested/menu1/menu1-3/index.vue | 0 .../frontend/src/views/nested/menu2/index.vue | 0 .../website/frontend/src/views/nodeFilter.vue | 0 .../frontend/src/views/profiler/index.vue | 0 .../frontend/src/views/table/index.vue | 0 .../website/frontend/src/views/tree/index.vue | 0 misc/website/frontend/tests/unit/.eslintrc.js | 5 - .../tests/unit/components/Breadcrumb.spec.ts | 97 - .../tests/unit/utils/validate.spec.ts | 15 - misc/website/frontend/tsconfig.json | 0 misc/website/frontend/vue.config.js | 13 +- misc/website/frontend/yarn.lock | 178 +- 273 files changed, 1095 insertions(+), 11679 deletions(-) delete mode 100755 misc/website/backend/app/src/apps/api/announcements.lua delete mode 100755 misc/website/backend/app/src/apps/api/announcements/announcement.lua delete mode 100755 misc/website/backend/app/src/apps/api/announcements/announcements.lua delete mode 100755 misc/website/backend/app/src/apps/api/announcements/global.lua delete mode 100755 misc/website/backend/app/src/apps/api/bans.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/announcements.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/archived.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/bans.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/board.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/boards.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/post.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/post_reports.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/posts.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/reports.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/thread.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/thread_reports.lua delete mode 100755 misc/website/backend/app/src/apps/api/boards/threads.lua delete mode 100755 misc/website/backend/app/src/apps/api/pages.lua delete mode 100755 misc/website/backend/app/src/apps/api/pages/page.lua delete mode 100755 misc/website/backend/app/src/apps/api/pages/pages.lua delete mode 100755 misc/website/backend/app/src/apps/web.lua delete mode 100755 misc/website/backend/app/src/apps/web/admin.lua delete mode 100755 misc/website/backend/app/src/apps/web/admin/announcement.lua delete mode 100755 misc/website/backend/app/src/apps/web/admin/board.lua delete mode 100755 misc/website/backend/app/src/apps/web/admin/index.lua delete mode 100755 misc/website/backend/app/src/apps/web/admin/page.lua delete mode 100755 misc/website/backend/app/src/apps/web/admin/report.lua delete mode 100755 misc/website/backend/app/src/apps/web/admin/user.lua delete mode 100755 misc/website/backend/app/src/apps/web/boards.lua delete mode 100755 misc/website/backend/app/src/apps/web/boards/archive.lua delete mode 100755 misc/website/backend/app/src/apps/web/boards/board.lua delete mode 100755 misc/website/backend/app/src/apps/web/boards/catalog.lua delete mode 100755 misc/website/backend/app/src/apps/web/boards/thread.lua delete mode 100755 misc/website/backend/app/src/apps/web/internal/check_auth.lua delete mode 100755 misc/website/backend/app/src/apps/web/internal/check_ban.lua delete mode 100755 misc/website/backend/app/src/apps/web/internal/code_404.lua delete mode 100755 misc/website/backend/app/src/apps/web/internal/config_site.lua delete mode 100755 misc/website/backend/app/src/apps/web/internal/install.lua delete mode 100755 misc/website/backend/app/src/apps/web/pages.lua delete mode 100755 misc/website/backend/app/src/apps/web/pages/index.lua delete mode 100755 misc/website/backend/app/src/apps/web/pages/logout.lua delete mode 100755 misc/website/backend/app/src/apps/web/pages/page.lua delete mode 100755 misc/website/backend/app/src/apps/web/pages/rules.lua delete mode 100755 misc/website/backend/app/src/locale/fr.lua delete mode 100755 misc/website/backend/app/src/locale/phpceo.lua delete mode 100755 misc/website/backend/app/src/locale/pl.lua delete mode 100755 misc/website/backend/app/src/models/announcements.lua delete mode 100755 misc/website/backend/app/src/models/boards.lua delete mode 100755 misc/website/backend/app/src/models/pages.lua delete mode 100755 misc/website/backend/app/src/models/posts.lua delete mode 100755 misc/website/backend/app/src/models/reports.lua delete mode 100755 misc/website/backend/app/src/models/threads.lua delete mode 100755 misc/website/backend/app/src/sass/posts.scss delete mode 100755 misc/website/backend/app/src/sass/reset.scss delete mode 100755 misc/website/backend/app/src/sass/style.scss delete mode 100755 misc/website/backend/app/src/sass/yotsuba.scss delete mode 100755 misc/website/backend/app/src/sass/yotsuba_b.scss create mode 100644 misc/website/backend/app/src/utils/json.lua delete mode 100755 misc/website/backend/app/src/utils/request_processor.lua delete mode 100755 misc/website/backend/app/src/views/admin/admin.etlua delete mode 100755 misc/website/backend/app/src/views/admin/announcement.etlua delete mode 100755 misc/website/backend/app/src/views/admin/board.etlua delete mode 100755 misc/website/backend/app/src/views/admin/login.etlua delete mode 100755 misc/website/backend/app/src/views/admin/page.etlua delete mode 100755 misc/website/backend/app/src/views/admin/success.etlua delete mode 100755 misc/website/backend/app/src/views/admin/user.etlua delete mode 100755 misc/website/backend/app/src/views/archive.etlua delete mode 100755 misc/website/backend/app/src/views/banned.etlua delete mode 100755 misc/website/backend/app/src/views/board.etlua delete mode 100755 misc/website/backend/app/src/views/catalog.etlua delete mode 100755 misc/website/backend/app/src/views/code_404.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/announcements.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/board_title.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/copyright.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/error.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/form_ban.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/form_delete.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/form_locale.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/form_lock.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/form_override.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/form_remix.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/form_report.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/form_save.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/form_sticky.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/form_submit.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/list_boards.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/op_content.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/post_content.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/post_menu.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/return_board.etlua delete mode 100755 misc/website/backend/app/src/views/fragments/return_thread.etlua delete mode 100755 misc/website/backend/app/src/views/index.etlua delete mode 100755 misc/website/backend/app/src/views/install.etlua delete mode 100755 misc/website/backend/app/src/views/layout.etlua delete mode 100755 misc/website/backend/app/src/views/page.etlua delete mode 100755 misc/website/backend/app/src/views/rules.etlua delete mode 100755 misc/website/backend/app/src/views/thread.etlua delete mode 100755 misc/website/backend/app/static/banned.jpg delete mode 100755 misc/website/backend/app/static/css/posts.css delete mode 100755 misc/website/backend/app/static/css/posts.css.map delete mode 100755 misc/website/backend/app/static/css/reset.css delete mode 100755 misc/website/backend/app/static/css/reset.css.map delete mode 100755 misc/website/backend/app/static/css/style.css delete mode 100755 misc/website/backend/app/static/css/style.css.map delete mode 100755 misc/website/backend/app/static/css/tegaki.css delete mode 100755 misc/website/backend/app/static/css/yotsuba.css delete mode 100755 misc/website/backend/app/static/css/yotsuba.css.map delete mode 100755 misc/website/backend/app/static/css/yotsuba_b.css delete mode 100755 misc/website/backend/app/static/css/yotsuba_b.css.map delete mode 100755 misc/website/backend/app/static/js/script.js delete mode 100755 misc/website/backend/app/static/js/tegaki/LICENSE delete mode 100755 misc/website/backend/app/static/js/tegaki/README.md delete mode 100755 misc/website/backend/app/static/js/tegaki/Rakefile delete mode 100755 misc/website/backend/app/static/js/tegaki/tegaki.js delete mode 100755 misc/website/backend/app/static/op_audio.png delete mode 100755 misc/website/backend/app/static/op_spoiler.png delete mode 100755 misc/website/backend/app/static/post_audio.png delete mode 100755 misc/website/backend/app/static/post_spoiler.png delete mode 100755 misc/website/backend/data/favicon.ico delete mode 100755 misc/website/backend/data/files/.keep delete mode 100755 misc/website/backend/data/secrets/.keep rename misc/website/backend/data/{backup/.keep => static/.gitkeep} (100%) mode change 100755 => 100644 delete mode 100755 misc/website/backend/resources/op_spoiler.psd delete mode 100755 misc/website/backend/resources/post_spoiler.psd delete mode 100755 misc/website/backend/sass.sh delete mode 100755 misc/website/backend/ts.sh delete mode 100755 misc/website/backend/tsconfig.json mode change 100644 => 100755 misc/website/frontend/.browserslistrc mode change 100644 => 100755 misc/website/frontend/.editorconfig mode change 100644 => 100755 misc/website/frontend/.env mode change 100644 => 100755 misc/website/frontend/.eslintignore mode change 100644 => 100755 misc/website/frontend/.eslintrc.js mode change 100644 => 100755 misc/website/frontend/.gitignore mode change 100644 => 100755 misc/website/frontend/LICENSE mode change 100644 => 100755 misc/website/frontend/README-zh.md mode change 100644 => 100755 misc/website/frontend/README.md mode change 100644 => 100755 misc/website/frontend/babel.config.js mode change 100644 => 100755 misc/website/frontend/cypress.json mode change 100644 => 100755 misc/website/frontend/jest.config.js mode change 100644 => 100755 misc/website/frontend/package-lock.json mode change 100644 => 100755 misc/website/frontend/package.json mode change 100644 => 100755 misc/website/frontend/postcss.config.js mode change 100644 => 100755 misc/website/frontend/public/favicon.ico mode change 100644 => 100755 misc/website/frontend/public/img/icons/android-chrome-192x192.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/android-chrome-512x512.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/apple-touch-icon-120x120.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/apple-touch-icon-152x152.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/apple-touch-icon-180x180.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/apple-touch-icon-60x60.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/apple-touch-icon-76x76.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/apple-touch-icon.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/favicon-16x16.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/favicon-32x32.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/msapplication-icon-144x144.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/mstile-150x150.png mode change 100644 => 100755 misc/website/frontend/public/img/icons/safari-pinned-tab.svg mode change 100644 => 100755 misc/website/frontend/public/index.html mode change 100644 => 100755 misc/website/frontend/public/manifest.json mode change 100644 => 100755 misc/website/frontend/public/robots.txt mode change 100644 => 100755 misc/website/frontend/src/App.vue mode change 100644 => 100755 misc/website/frontend/src/api/articles.ts mode change 100644 => 100755 misc/website/frontend/src/api/node.ts mode change 100644 => 100755 misc/website/frontend/src/api/types.d.ts mode change 100644 => 100755 misc/website/frontend/src/api/users.ts mode change 100644 => 100755 misc/website/frontend/src/assets/404-images/404-cloud.png mode change 100644 => 100755 misc/website/frontend/src/assets/404-images/404.png mode change 100644 => 100755 misc/website/frontend/src/components/Breadcrumb/index.vue mode change 100644 => 100755 misc/website/frontend/src/components/Hamburger/index.vue mode change 100644 => 100755 misc/website/frontend/src/define.d.ts mode change 100644 => 100755 misc/website/frontend/src/icons/README.md mode change 100644 => 100755 misc/website/frontend/src/icons/components/dashboard.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/example.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/eye-off.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/eye-on.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/form.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/hamburger.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/index.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/link.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/nested.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/password.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/table.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/tree.ts mode change 100644 => 100755 misc/website/frontend/src/icons/components/user.ts mode change 100644 => 100755 misc/website/frontend/src/icons/svg/dashboard.svg mode change 100644 => 100755 misc/website/frontend/src/icons/svg/example.svg mode change 100644 => 100755 misc/website/frontend/src/icons/svg/eye-off.svg mode change 100644 => 100755 misc/website/frontend/src/icons/svg/eye-on.svg mode change 100644 => 100755 misc/website/frontend/src/icons/svg/form.svg mode change 100644 => 100755 misc/website/frontend/src/icons/svg/hamburger.svg mode change 100644 => 100755 misc/website/frontend/src/icons/svg/link.svg mode change 100644 => 100755 misc/website/frontend/src/icons/svg/nested.svg mode change 100644 => 100755 misc/website/frontend/src/icons/svg/password.svg mode change 100644 => 100755 misc/website/frontend/src/icons/svg/table.svg mode change 100644 => 100755 misc/website/frontend/src/icons/svg/tree.svg mode change 100644 => 100755 misc/website/frontend/src/icons/svg/user.svg mode change 100644 => 100755 misc/website/frontend/src/layout/components/AppMain.vue mode change 100644 => 100755 misc/website/frontend/src/layout/components/Navbar/index.vue mode change 100644 => 100755 misc/website/frontend/src/layout/components/Sidebar/SidebarItem.vue mode change 100644 => 100755 misc/website/frontend/src/layout/components/Sidebar/SidebarItemLink.vue mode change 100644 => 100755 misc/website/frontend/src/layout/components/Sidebar/index.vue mode change 100644 => 100755 misc/website/frontend/src/layout/components/index.ts mode change 100644 => 100755 misc/website/frontend/src/layout/index.vue mode change 100644 => 100755 misc/website/frontend/src/layout/mixin/resize.ts mode change 100644 => 100755 misc/website/frontend/src/main.ts mode change 100644 => 100755 misc/website/frontend/src/permission.ts mode change 100644 => 100755 misc/website/frontend/src/registerServiceWorker.ts mode change 100644 => 100755 misc/website/frontend/src/router.ts mode change 100644 => 100755 misc/website/frontend/src/shims-vue.d.ts mode change 100644 => 100755 misc/website/frontend/src/store/index.ts mode change 100644 => 100755 misc/website/frontend/src/store/modules/app.ts mode change 100644 => 100755 misc/website/frontend/src/store/modules/user.ts mode change 100644 => 100755 misc/website/frontend/src/styles/_mixins.scss mode change 100644 => 100755 misc/website/frontend/src/styles/_svgicon.scss mode change 100644 => 100755 misc/website/frontend/src/styles/_transition.scss mode change 100644 => 100755 misc/website/frontend/src/styles/_variables.scss mode change 100644 => 100755 misc/website/frontend/src/styles/_variables.scss.d.ts mode change 100644 => 100755 misc/website/frontend/src/styles/element-variables.scss mode change 100644 => 100755 misc/website/frontend/src/styles/index.scss mode change 100644 => 100755 misc/website/frontend/src/utils/cookies.ts mode change 100644 => 100755 misc/website/frontend/src/utils/request.ts mode change 100644 => 100755 misc/website/frontend/src/utils/validate.ts mode change 100644 => 100755 misc/website/frontend/src/views/404.vue mode change 100644 => 100755 misc/website/frontend/src/views/dashboard/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/debug/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/flamegraph/flamegraph.js mode change 100644 => 100755 misc/website/frontend/src/views/flamegraph/flamegraph.vue mode change 100644 => 100755 misc/website/frontend/src/views/form/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/login/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/nested/menu1/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/nested/menu1/menu1-1/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/nested/menu1/menu1-2/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/nested/menu1/menu1-3/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/nested/menu2/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/nodeFilter.vue mode change 100644 => 100755 misc/website/frontend/src/views/profiler/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/table/index.vue mode change 100644 => 100755 misc/website/frontend/src/views/tree/index.vue delete mode 100644 misc/website/frontend/tests/unit/.eslintrc.js delete mode 100644 misc/website/frontend/tests/unit/components/Breadcrumb.spec.ts delete mode 100644 misc/website/frontend/tests/unit/utils/validate.spec.ts mode change 100644 => 100755 misc/website/frontend/tsconfig.json mode change 100644 => 100755 misc/website/frontend/vue.config.js mode change 100644 => 100755 misc/website/frontend/yarn.lock diff --git a/misc/website/backend/README.md b/misc/website/backend/README.md index a45fea5..cd99f79 100755 --- a/misc/website/backend/README.md +++ b/misc/website/backend/README.md @@ -1,5 +1,7 @@ # Lapis-chan +https://github.com/karai17/lapis-chan + Lapis-chan is a text and image board written in Lua using the Lapis web framework. # Features diff --git a/misc/website/backend/app/app.lua b/misc/website/backend/app/app.lua index aadc808..ab4bb88 100755 --- a/misc/website/backend/app/app.lua +++ b/misc/website/backend/app/app.lua @@ -41,6 +41,6 @@ end --]] app:include("apps.api") -app:include("apps.web") +-- app:include("apps.web") return app diff --git a/misc/website/backend/app/config.lua b/misc/website/backend/app/config.lua index ec66c20..0ba6567 100755 --- a/misc/website/backend/app/config.lua +++ b/misc/website/backend/app/config.lua @@ -6,63 +6,63 @@ local secret = assert(loadfile("../data/secrets/token.lua"))() local subdomains = false -- Maximum file size (update this in scripts.js too!) -local body_size = "15m" +local body_size = "15m" -- Maximum comment size (update this in scripts.js too!) -local text_size = 10000 +local text_size = 10000 -- Path to your lua libraries (LuaRocks and OpenResty) -local lua_path = "./src/?.lua;./src/?/init.lua" +local lua_path = "./src/?.lua;./src/?/init.lua" local lua_cpath = "" config("development", { - site_name = "[DEVEL] Lapis-chan", - port = 80, - secret = secret, - subdomains = subdomains, - body_size = body_size, - text_size = text_size, - lua_path = lua_path, - lua_cpath = lua_cpath, - postgres = { - host = "psql", - user = "postgres", - password = "", - database = "lapischan" - }, + site_name = "[DEVEL] Lapis-chan", + port = 80, + secret = secret, + subdomains = subdomains, + body_size = body_size, + text_size = text_size, + lua_path = lua_path, + lua_cpath = lua_cpath, + postgres = { + host = "psql", + user = "postgres", + password = "", + database = "lapischan", + }, }) config("production", { - code_cache = "on", - site_name = "Lapis-chan", - port = 80, - secret = secret, - subdomains = subdomains, - body_size = body_size, - text_size = text_size, - lua_path = lua_path, - lua_cpath = lua_cpath, - postgres = { - host = "psql", - user = "postgres", - password = "", - database = "lapischan" - }, + code_cache = "on", + site_name = "Lapis-chan", + port = 80, + secret = secret, + subdomains = subdomains, + body_size = body_size, + text_size = text_size, + lua_path = lua_path, + lua_cpath = lua_cpath, + postgres = { + host = "psql", + user = "postgres", + password = "", + database = "lapischan", + }, }) config("test", { - site_name = "[DEVEL] Lapis-chan", - port = 80, - secret = secret, - subdomains = subdomains, - body_size = body_size, - text_size = text_size, - lua_path = lua_path, - lua_cpath = lua_cpath, - postgres = { - host = "psql", - user = "postgres", - password = "", - database = "lapischan_test" - }, + site_name = "[DEVEL] Lapis-chan", + port = 80, + secret = secret, + subdomains = subdomains, + body_size = body_size, + text_size = text_size, + lua_path = lua_path, + lua_cpath = lua_cpath, + postgres = { + host = "psql", + user = "postgres", + password = "", + database = "lapischan_test", + }, }) diff --git a/misc/website/backend/app/migrations.lua b/misc/website/backend/app/migrations.lua index ec856a7..a5d43e5 100755 --- a/misc/website/backend/app/migrations.lua +++ b/misc/website/backend/app/migrations.lua @@ -21,106 +21,11 @@ return { { "time", types.integer }, { "duration", types.integer { default=259200 }}, -- 3 days }) - - schema.create_table("boards", { - { "id", types.serial { unique=true, primary_key=true }}, - { "short_name", types.varchar { unique=true }}, - { "name", types.varchar { unique=true }}, - { "subtext", types.varchar { null=true }}, - { "rules", types.text { null=true }}, - { "ban_message", types.varchar { default="USER WAS BANNED FOR THIS POST" }}, - { "anon_name", types.varchar { default="Anonymous" }}, - { "theme", types.varchar { default="yotsuba_b" }}, - { "posts", types.integer { default=0 }}, - { "pages", types.integer { default=10 }}, - { "threads_per_page", types.integer { default=10 }}, - { "text_only", types.boolean { default=false }}, - { "draw", types.boolean { default=false }}, - { "thread_file", types.boolean { default=true }}, - { "thread_comment", types.boolean { default=false }}, - { "thread_file_limit", types.integer { default=100 }}, - { "post_file", types.boolean { default=false }}, - { "post_comment", types.boolean { default=false }}, - { "post_limit", types.integer { default=250 }}, - { "archive", types.boolean { default=true }}, - { "archive_time", types.integer { default=2592000 }}, -- 30 days - { "group", types.integer { default=1 }} - }) - - schema.create_table("threads", { - { "id", types.serial { unique=true, primary_key=true }}, - { "board_id", types.integer }, - { "last_active", types.integer }, - { "sticky", types.boolean { default=false }}, - { "lock", types.boolean { default=false }}, - { "archive", types.boolean { default=false }}, - { "size_override", types.boolean { default=false }}, - { "save", types.boolean { default=false }} - }) - - schema.create_table("posts", { - { "id", types.serial { unique=true, primary_key=true }}, - { "post_id", types.integer }, - { "thread_id", types.integer }, - { "board_id", types.integer }, - { "timestamp", types.integer }, - { "ip", types.varchar }, - { "comment", types.text { null=true }}, - { "name", types.varchar { null=true }}, - { "trip", types.varchar { null=true }}, - { "subject", types.varchar { null=true }}, - { "password", types.varchar { null=true }}, - { "file_name", types.varchar { null=true }}, - { "file_path", types.varchar { null=true }}, - { "file_md5", types.varchar { null=true }}, - { "file_size", types.integer { null=true }}, - { "file_width", types.integer { null=true }}, - { "file_height", types.integer { null=true }}, - { "file_spoiler", types.boolean { null=true }}, - { "banned", types.boolean { default=false }} - }) - - schema.create_table("announcements", { - { "id", types.serial { unique=true, primary_key=true }}, - { "board_id", types.integer { null=true }}, - { "text", types.varchar } - }) - - schema.create_table("reports", { - { "id", types.serial { unique=true, primary_key=true }}, - { "board_id", types.integer }, - { "thread_id", types.integer }, - { "post_id", types.integer }, - { "timestamp", types.integer }, - { "num_reports", types.integer } - }) - - schema.create_table("pages", { - { "id", types.serial { unique=true, primary_key=true }}, - { "url", types.varchar { unique=true }}, - { "name", types.varchar }, - { "content", types.text } - }) end, [120] = function() - schema.add_column("boards", "filetype_image", types.boolean { default=true }) - schema.add_column("boards", "filetype_audio", types.boolean { default=false }) - schema.add_column("posts", "file_type", types.varchar { default="image" }) - schema.add_column("posts", "file_duration", types.varchar { null=true }) end, [200] = function() - schema.rename_column("boards", "posts", "total_posts") - schema.rename_column("boards", "name", "title") - schema.rename_column("boards", "short_name", "name") - schema.rename_column("pages", "url", "slug") - schema.rename_column("pages", "name", "title") - schema.rename_column("posts", "post_id", "post_number") - - db.query("ALTER TABLE posts ALTER COLUMN file_type DROP DEFAULT") - db.query("ALTER TABLE posts ALTER COLUMN file_type DROP NOT NULL") - schema.add_column("boards", "anon_only", types.boolean { default=false }) - local Users = require "src.models.users" local uuid = require "resty.jit-uuid" uuid.seed() @@ -140,9 +45,5 @@ return { schema.drop_column("users", "janitor") schema.drop_column("users", "mod") schema.drop_column("users", "admin") - - schema.add_column("posts", "reports", types.integer) - db.query("UPDATE posts SET reports=reports.num_reports FROM reports WHERE posts.id=reports.post_id") - schema.drop_table("reports") end } diff --git a/misc/website/backend/app/nginx.conf b/misc/website/backend/app/nginx.conf index 18767cb..2a3a88e 100755 --- a/misc/website/backend/app/nginx.conf +++ b/misc/website/backend/app/nginx.conf @@ -30,7 +30,7 @@ http { require "socket" } - resolver 127.0.0.11; + resolver 114.114.114.114; #域名解析地址 server { listen ${{PORT}}; @@ -42,7 +42,7 @@ http { } location /static/ { - alias static/; + alias ../data/static/; } location /files/ { diff --git a/misc/website/backend/app/spec/app_spec.lua b/misc/website/backend/app/spec/app_spec.lua index fdcf2c5..7acfec0 100755 --- a/misc/website/backend/app/spec/app_spec.lua +++ b/misc/website/backend/app/spec/app_spec.lua @@ -1,17 +1,16 @@ - local mock_request = require("lapis.spec.request").mock_request local app = require("app") describe("lapischan", function() - require("lapis.spec").use_test_env() + require("lapis.spec").use_test_env() - setup(function() - require("lapis.db.migrations").run_migrations(require("migrations")) - end) + setup(function() + require("lapis.db.migrations").run_migrations(require("migrations")) + end) - it("loads install page", function() - local status, body = mock_request(app, "/") - assert.same(200, status) - assert.truthy(body:find("Install Lapis-chan", 1, true)) - end) + it("loads install page", function() + local status, body = mock_request(app, "/") + assert.same(200, status) + assert.truthy(body:find("Install Lapis-chan", 1, true)) + end) end) diff --git a/misc/website/backend/app/src/apps/api.lua b/misc/website/backend/app/src/apps/api.lua index e989e68..3c31058 100755 --- a/misc/website/backend/app/src/apps/api.lua +++ b/misc/website/backend/app/src/apps/api.lua @@ -12,10 +12,7 @@ app:before_filter(capture({ on_error=handle, require "apps.api.internal.before_a app:before_filter(capture({ on_error=handle, require "apps.api.internal.before_locale" })) app:include("apps.api.core") -app:include("apps.api.announcements") app:include("apps.api.bans") -app:include("apps.api.boards") -app:include("apps.api.pages") app:include("apps.api.users") return app diff --git a/misc/website/backend/app/src/apps/api/announcements.lua b/misc/website/backend/app/src/apps/api/announcements.lua deleted file mode 100755 index 369532c..0000000 --- a/misc/website/backend/app/src/apps/api/announcements.lua +++ /dev/null @@ -1,14 +0,0 @@ -local lapis = require "lapis" -local capture = require("lapis.application").capture_errors_json -local r2 = require("lapis.application").respond_to -local handle = require("utils.error").handle -local app = lapis.Application() -app.__base = app -app.name = "api.announcements." -app.path = "/api/announcements" - -app:match("announcements", "", capture({ on_error=handle, r2(require "apps.api.announcements.announcements") })) -app:match("announcement", "/:uri_announcement[%d]", capture({ on_error=handle, r2(require "apps.api.announcements.announcement") })) -app:match("global", "/global", capture({ on_error=handle, r2(require "apps.api.announcements.global") })) - -return app diff --git a/misc/website/backend/app/src/apps/api/announcements/announcement.lua b/misc/website/backend/app/src/apps/api/announcements/announcement.lua deleted file mode 100755 index 8d2a35a..0000000 --- a/misc/website/backend/app/src/apps/api/announcements/announcement.lua +++ /dev/null @@ -1,64 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local role = require "utils.role" -local models = require "models" -local Announcements = models.announcements - -function action:GET() - - -- Get Announcement - local announcement = assert_error(Announcements:get(self.params.uri_announcement)) - Announcements:format_from_db(announcement) - - return { - status = ngx.HTTP_OK, - json = announcement - } -end - -function action:PUT() - - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) - - -- Validate parameters - local params = { - id = self.params.uri_announcement, - board_id = tonumber(self.params.board_id), - text = self.params.text, - } - trim_filter(params) - Announcements:format_to_db(params) - assert_valid(params, Announcements.valid_record) - - -- Modify Announcement - local announcement = assert_error(Announcements:modify(params)) - Announcements:format_from_db(announcement) - - return { - status = ngx.HTTP_OK, - json = announcement - } -end - -function action:DELETE() - - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) - - -- Delete Announcement - local announcement = assert_error(Announcements:delete(self.params.uri_announcement)) - - return { - status = ngx.HTTP_OK, - json = { - id = announcement.id, - text = announcement.text - } - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/announcements/announcements.lua b/misc/website/backend/app/src/apps/api/announcements/announcements.lua deleted file mode 100755 index 1b6c686..0000000 --- a/misc/website/backend/app/src/apps/api/announcements/announcements.lua +++ /dev/null @@ -1,51 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local role = require "utils.role" -local models = require "models" -local Announcements = models.announcements - -function action:GET() - - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) - - -- Get all Announcements - local announcements = assert_error(Announcements:get_all()) - for _, announcement in ipairs(announcements) do - Announcements:format_from_db(announcement) - end - - return { - status = ngx.HTTP_OK, - json = announcements - } -end - -function action:POST() - - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) - - -- Validate parameters - local params = { - board_id = tonumber(self.params.board_id), - text = self.params.text, - } - trim_filter(params) - Announcements:format_to_db(params) - assert_valid(params, Announcements.valid_record) - - -- Create Announcement - local announcement = assert_error(Announcements:new(params)) - Announcements:format_from_db(announcement) - - return { - status = ngx.HTTP_OK, - json = announcement - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/announcements/global.lua b/misc/website/backend/app/src/apps/api/announcements/global.lua deleted file mode 100755 index dde5dc6..0000000 --- a/misc/website/backend/app/src/apps/api/announcements/global.lua +++ /dev/null @@ -1,21 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local models = require "models" -local Announcements = models.announcements - -function action.GET() - - -- Get global Announcements - local announcements = assert_error(Announcements:get_global()) - for _, announcement in ipairs(announcements) do - Announcements:format_from_db(announcement) - end - - return { - status = ngx.HTTP_OK, - json = announcements - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/bans.lua b/misc/website/backend/app/src/apps/api/bans.lua deleted file mode 100755 index 082adc8..0000000 --- a/misc/website/backend/app/src/apps/api/bans.lua +++ /dev/null @@ -1,14 +0,0 @@ -local lapis = require "lapis" -local capture = require("lapis.application").capture_errors_json -local r2 = require("lapis.application").respond_to -local handle = require("utils.error").handle -local app = lapis.Application() -app.__base = app -app.name = "api.bans." -app.path = "/api/bans" - -app:match("bans", "", capture({ on_error=handle, r2(require "apps.api.bans.bans") })) -app:match("ban", "/:uri_ban[%d]", capture({ on_error=handle, r2(require "apps.api.bans.ban") })) -app:match("bans_ip", "/ip/:uri_ip", capture({ on_error=handle, r2(require "apps.api.bans.bans_ip") })) - -return app diff --git a/misc/website/backend/app/src/apps/api/bans/ban.lua b/misc/website/backend/app/src/apps/api/bans/ban.lua index fadc512..1e2272f 100755 --- a/misc/website/backend/app/src/apps/api/bans/ban.lua +++ b/misc/website/backend/app/src/apps/api/bans/ban.lua @@ -1,70 +1,70 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") +local ngx = _G.ngx +local action = setmetatable({}, require "apps.api.internal.action_base") local assert_error = require("lapis.application").assert_error local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local role = require "utils.role" -local models = require "models" -local Bans = models.bans +local trim_filter = require("lapis.util").trim_filter +local role = require "utils.role" +local models = require "models" +local Bans = models.bans function action:GET() - -- Verify the User's permissions - assert_error(role.mod(self.api_user)) + -- Verify the User's permissions + assert_error(role.mod(self.api_user)) - -- Get Ban - local ban = assert_error(Bans:get(self.params.uri_ban)) - Bans:format_from_db(ban) + -- Get Ban + local ban = assert_error(Bans:get(self.params.uri_ban)) + Bans:format_from_db(ban) - return { - status = ngx.HTTP_OK, - json = ban - } + return { + status = ngx.HTTP_OK, + json = ban, + } end function action:PUT() - -- Verify the User's permissions - assert_error(role.mod(self.api_user)) + -- Verify the User's permissions + assert_error(role.mod(self.api_user)) - -- Validate parameters - local params = { - id = self.params.uri_ban, - board_id = tonumber(self.params.board_id), - ip = self.params.ip, - reason = self.params.reason, - time = os.time(), - duration = tonumber(self.params.duration) - } - trim_filter(params) - Bans:format_to_db(params) - assert_valid(params, Bans.valid_record) + -- Validate parameters + local params = { + id = self.params.uri_ban, + board_id = tonumber(self.params.board_id), + ip = self.params.ip, + reason = self.params.reason, + time = os.time(), + duration = tonumber(self.params.duration), + } + trim_filter(params) + Bans:format_to_db(params) + assert_valid(params, Bans.valid_record) - -- Modify Ban - local ban = assert_error(Bans:modify(params)) - Bans:format_from_db(ban) + -- Modify Ban + local ban = assert_error(Bans:modify(params)) + Bans:format_from_db(ban) - return { - status = ngx.HTTP_OK, - json = ban - } + return { + status = ngx.HTTP_OK, + json = ban, + } end function action:DELETE() - -- Verify the User's permissions - assert_error(role.mod(self.api_user)) + -- Verify the User's permissions + assert_error(role.mod(self.api_user)) - -- Delete Ban - local ban = assert_error(Bans:delete(self.params.uri_ban)) + -- Delete Ban + local ban = assert_error(Bans:delete(self.params.uri_ban)) - return { - status = ngx.HTTP_OK, - json = { - id = ban.id, - ip = ban.ip, - } - } + return { + status = ngx.HTTP_OK, + json = { + id = ban.id, + ip = ban.ip, + }, + } end return action diff --git a/misc/website/backend/app/src/apps/api/bans/bans.lua b/misc/website/backend/app/src/apps/api/bans/bans.lua index e2bfe82..f9cc39d 100755 --- a/misc/website/backend/app/src/apps/api/bans/bans.lua +++ b/misc/website/backend/app/src/apps/api/bans/bans.lua @@ -1,54 +1,54 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") +local ngx = _G.ngx +local action = setmetatable({}, require "apps.api.internal.action_base") local assert_error = require("lapis.application").assert_error local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local role = require "utils.role" -local models = require "models" -local Bans = models.bans +local trim_filter = require("lapis.util").trim_filter +local role = require "utils.role" +local models = require "models" +local Bans = models.bans function action:GET() - -- Verify the User's permissions - assert_error(role.mod(self.api_user)) + -- Verify the User's permissions + assert_error(role.mod(self.api_user)) - -- Get all Bans - local bans = assert_error(Bans:get_all()) - for _, ban in ipairs(bans) do - Bans:format_from_db(ban) - end + -- Get all Bans + local bans = assert_error(Bans:get_all()) + for _, ban in ipairs(bans) do + Bans:format_from_db(ban) + end - return { - status = ngx.HTTP_OK, - json = bans - } + return { + status = ngx.HTTP_OK, + json = bans, + } end function action:POST() - -- Verify the User's permissions - assert_error(role.mod(self.api_user)) - - -- Validate parameters - local params = { - board_id = tonumber(self.params.board_id), - ip = self.params.ip, - reason = self.params.reason, - time = os.time(), - duration = tonumber(self.params.duration) - } - trim_filter(params) - Bans:format_to_db(params) - assert_valid(params, Bans.valid_record) - - -- Create Ban - local ban = assert_error(Bans:new(params)) - Bans:format_from_db(ban) - - return { - status = ngx.HTTP_OK, - json = ban - } + -- Verify the User's permissions + assert_error(role.mod(self.api_user)) + + -- Validate parameters + local params = { + board_id = tonumber(self.params.board_id), + ip = self.params.ip, + reason = self.params.reason, + time = os.time(), + duration = tonumber(self.params.duration), + } + trim_filter(params) + Bans:format_to_db(params) + assert_valid(params, Bans.valid_record) + + -- Create Ban + local ban = assert_error(Bans:new(params)) + Bans:format_from_db(ban) + + return { + status = ngx.HTTP_OK, + json = ban, + } end return action diff --git a/misc/website/backend/app/src/apps/api/bans/bans_ip.lua b/misc/website/backend/app/src/apps/api/bans/bans_ip.lua index f4ce35f..d6832c3 100755 --- a/misc/website/backend/app/src/apps/api/bans/bans_ip.lua +++ b/misc/website/backend/app/src/apps/api/bans/bans_ip.lua @@ -1,25 +1,25 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") +local ngx = _G.ngx +local action = setmetatable({}, require "apps.api.internal.action_base") local assert_error = require("lapis.application").assert_error -local role = require "utils.role" -local models = require "models" -local Bans = models.bans +local role = require "utils.role" +local models = require "models" +local Bans = models.bans function action:GET() - -- Verify the User's permissions - assert_error(role.mod(self.api_user)) + -- Verify the User's permissions + assert_error(role.mod(self.api_user)) - -- Get Bans - local bans = assert_error(Bans:get_ip(self.params.uri_ip)) - for _, ban in ipairs(bans) do - Bans:format_from_db(ban) - end + -- Get Bans + local bans = assert_error(Bans:get_ip(self.params.uri_ip)) + for _, ban in ipairs(bans) do + Bans:format_from_db(ban) + end - return { - status = ngx.HTTP_OK, - json = bans - } + return { + status = ngx.HTTP_OK, + json = bans, + } end return action diff --git a/misc/website/backend/app/src/apps/api/boards.lua b/misc/website/backend/app/src/apps/api/boards.lua deleted file mode 100755 index 3e493f0..0000000 --- a/misc/website/backend/app/src/apps/api/boards.lua +++ /dev/null @@ -1,23 +0,0 @@ -local lapis = require "lapis" -local capture = require("lapis.application").capture_errors_json -local r2 = require("lapis.application").respond_to -local handle = require("utils.error").handle -local app = lapis.Application() -app.__base = app -app.name = "api.boards." -app.path = "/api/boards" - -app:match("boards", "", capture({ on_error=handle, r2(require "apps.api.boards.boards") })) -app:match("board", "/:uri_board", capture({ on_error=handle, r2(require "apps.api.boards.board") })) -app:match("announcements", "/:uri_board/announcements", capture({ on_error=handle, r2(require "apps.api.boards.announcements") })) -app:match("bans", "/:uri_board/bans", capture({ on_error=handle, r2(require "apps.api.boards.bans") })) -app:match("reports", "/:uri_board/reports", capture({ on_error=handle, r2(require "apps.api.boards.reports") })) -app:match("threads", "/:uri_board/threads(/pages/:uri_page[%d])", capture({ on_error=handle, r2(require "apps.api.boards.threads") })) -app:match("archived", "/:uri_board/threads/archived", capture({ on_error=handle, r2(require "apps.api.boards.archived") })) -app:match("thread", "/:uri_board/threads/:uri_thread[%d]", capture({ on_error=handle, r2(require "apps.api.boards.thread") })) -app:match("thread.reports", "/:uri_board/threads/:uri_thread[%d]/reports", capture({ on_error=handle, r2(require "apps.api.boards.thread_reports") })) -app:match("posts", "/:uri_board(/threads/:uri_thread[%d])/posts", capture({ on_error=handle, r2(require "apps.api.boards.posts") })) -app:match("post", "/:uri_board/threads/:uri_thread[%d]/posts/:uri_post[%d]", capture({ on_error=handle, r2(require "apps.api.boards.post") })) -app:match("post.reports", "/:uri_board/threads/:uri_thread[%d]/posts/:uri_post[%d]/reports", capture({ on_error=handle, r2(require "apps.api.boards.post_reports") })) - -return app diff --git a/misc/website/backend/app/src/apps/api/boards/announcements.lua b/misc/website/backend/app/src/apps/api/boards/announcements.lua deleted file mode 100755 index ebeb3a3..0000000 --- a/misc/website/backend/app/src/apps/api/boards/announcements.lua +++ /dev/null @@ -1,25 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local models = require "models" -local Announcements = models.announcements -local Boards = models.boards - -function action:GET() - - -- Get Board - local board = assert_error(Boards:get(self.params.uri_board)) - - -- Get Announcements - local announcements = Announcements:get_board(board.id) - for _, announcement in ipairs(announcements) do - Announcements:format_from_db(announcement) - end - - return { - status = ngx.HTTP_OK, - json = announcements - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/boards/archived.lua b/misc/website/backend/app/src/apps/api/boards/archived.lua deleted file mode 100755 index 965984e..0000000 --- a/misc/website/backend/app/src/apps/api/boards/archived.lua +++ /dev/null @@ -1,24 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local models = require "models" -local Boards = models.boards -local Threads = models.threads - -function action:GET() - - local board = assert_error(Boards:get(self.params.uri_name)) - - -- Get Threads - local threads = board:get_archived() - for _, thread in ipairs(threads) do - --Threads:format_from_db(thread) - end - - return { - status = ngx.HTTP_OK, - json = threads - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/boards/bans.lua b/misc/website/backend/app/src/apps/api/boards/bans.lua deleted file mode 100755 index cd2dc92..0000000 --- a/misc/website/backend/app/src/apps/api/boards/bans.lua +++ /dev/null @@ -1,29 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local role = require "utils.role" -local models = require "models" -local Bans = models.bans -local Boards = models.boards - -function action:GET() - - -- Verify the User's permissions - assert_error(role.mod(self.api_user)) - - -- Get Board - local board = assert_error(Boards:get(self.params.uri_board)) - - -- Get Bans - local bans = Bans:get_board(board.id) - for _, ban in ipairs(bans) do - Bans:format_from_db(ban) - end - - return { - status = ngx.HTTP_OK, - json = bans - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/boards/board.lua b/misc/website/backend/app/src/apps/api/boards/board.lua deleted file mode 100755 index 8d43c49..0000000 --- a/misc/website/backend/app/src/apps/api/boards/board.lua +++ /dev/null @@ -1,114 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local yield_error = require("lapis.application").yield_error -local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local role = require "utils.role" -local models = require "models" -local Boards = models.boards - -function action:GET() - - -- Get Board - local board = assert_error(Boards:get(self.params.uri_board)) - Boards:format_from_db(board) - - return { - status = ngx.HTTP_OK, - json = board - } -end - -function action:PUT() - - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) - - -- Validate parameters - local params = { - name = self.params.name, - title = self.params.title, - subtext = self.params.subtext, - rules = self.params.rules, - ban_message = self.params.ban_message, - anon_name = self.params.anon_name, - theme = self.params.theme, - total_posts = tonumber(self.params.total_posts), - pages = tonumber(self.params.pages), - threads_per_page = tonumber(self.params.threads_per_page), - anon_only = self.params.anon_only, - text_only = self.params.text_only, - draw = self.params.draw, - thread_file = self.params.thread_file, - thread_comment = self.params.thread_comment, - thread_file_limit = self.params.thread_file_limit, - post_file = self.params.post_file, - post_comment = self.params.post_comment, - post_limit = tonumber(self.params.post_limit), - archive = self.params.archive, - archive_time = tonumber(self.params.archive_time), - group = self.params.group, - filetype_image = self.params.filetype_image, - filetype_audio = self.params.filetype_audio - } - trim_filter(params) - Boards:format_to_db(params) - assert_valid(params, Boards.valid_record) - - -- Check if board being modified is reusing name and title - local reuse_name = false - local reuse_title = false - - if params.name or params.title then - local board = Boards:get(self.params.uri_board) - reuse_name = board.name == params.name - reuse_title = board.title == params.title - end - - -- Verify unique or current name and title - if not (reuse_name and reuse_title) then - local boards = Boards:get_all() - for _, board in ipairs(boards) do - if not reuse_name and board.name == params.name then - yield_error("FIXME") - end - - if not reuse_title and board.title == params.title then - yield_error("FIXME") - end - end - end - - -- Modify board - local board = assert_error(Boards:modify(params, self.params.uri_board)) - Boards:format_from_db(board) - - return { - status = ngx.HTTP_OK, - json = board - } -end - -function action:DELETE() - - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) - - -- Delete board - local board = assert_error(Boards:delete(self.params.uri_board)) - - -- TODO: delete adjacent data (announcements, bans, threads, posts, files) - -- probably best done by adding actual FK constraints with "ON DELETE CASCADE" - - return { - status = ngx.HTTP_OK, - json = { - id = board.id, - name = board.name, - title = board.title - } - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/boards/boards.lua b/misc/website/backend/app/src/apps/api/boards/boards.lua deleted file mode 100755 index 146de1d..0000000 --- a/misc/website/backend/app/src/apps/api/boards/boards.lua +++ /dev/null @@ -1,79 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local yield_error = require("lapis.application").yield_error -local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local role = require "utils.role" -local models = require "models" -local Boards = models.boards - -function action.GET() - - -- Get Boards - local boards = assert_error(Boards:get_all()) - for _, board in ipairs(boards) do - Boards:format_from_db(board) - end - - return { - status = ngx.HTTP_OK, - json = boards - } -end - -function action:POST() - - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) - - -- Validate parameters - local params = { - name = self.params.name, - title = self.params.title, - subtext = self.params.subtext, - rules = self.params.rules, - ban_message = self.params.ban_message, - anon_name = self.params.anon_name, - theme = self.params.theme, - total_posts = tonumber(self.params.total_posts), - pages = tonumber(self.params.pages), - threads_per_page = tonumber(self.params.threads_per_page), - anon_only = self.params.anon_only, - text_only = self.params.text_only, - draw = self.params.draw, - thread_file = self.params.thread_file, - thread_comment = self.params.thread_comment, - thread_file_limit = self.params.thread_file_limit, - post_file = self.params.post_file, - post_comment = self.params.post_comment, - post_limit = tonumber(self.params.post_limit), - archive = self.params.archive, - archive_time = tonumber(self.params.archive_time), - group = self.params.group, - filetype_image = self.params.filetype_image, - filetype_audio = self.params.filetype_audio - } - trim_filter(params) - Boards:format_to_db(params) - assert_valid(params, Boards.valid_record) - - -- Verify unique name and title - local boards = Boards:get_all() - for _, board in ipairs(boards) do - if board.name == params.name or board.title == params.title then - yield_error("FIXME") - end - end - - -- Create board - local board = assert_error(Boards:new(params)) - Boards:format_from_db(board) - - return { - status = ngx.HTTP_OK, - json = board - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/boards/post.lua b/misc/website/backend/app/src/apps/api/boards/post.lua deleted file mode 100755 index bc4967c..0000000 --- a/misc/website/backend/app/src/apps/api/boards/post.lua +++ /dev/null @@ -1,92 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local models = require "models" -local Boards = models.boards -local Threads = models.threads -local Posts = models.posts - -function action:GET() - - local board = assert_error(Boards:get(self.params.uri_name)) - - -- Get Post - local post = assert_error(Posts:get(board.id, self.params.uri_id)) - --Posts:format_from_db(post) - - return { - status = ngx.HTTP_OK, - json = post - } -end - -function action:PUT() - - -- Validate parameters - local params = { - comment = self.params.comment, - subject = self.params.subject, - file_spoiler = self.params.file_spoiler - } - Posts:format_to_db(params) - trim_filter(params) - assert_valid(params, Posts.valid_record) - - -- Modify post - local post = assert_error(Posts:modify(params)) - Posts:format_from_db(post) - - return { - status = ngx.HTTP_OK, - json = post - } -end - -function action:DELETE() - - --[[ FIXME: needs proper auth! - -- MODS = FAGS - if type(session) == "table" and - (session.admin or session.mod or session.janitor) then - rm_post(board.name) - success = true - -- Override password - elseif type(session) == "string" and - session == "override" then - rm_post(board.name) - success = true - -- Password has to match! - elseif post and session.password and - post.password == session.password then - rm_post(board.name) - success = true - end - --]] - - -- Delete post - local post = assert_error(Posts:get_post_by_id(self.params.uri_id)) - local thread = post:get_thread() - local op = thread:get_op() - - if post.id == op.id then - assert_error(Threads:delete(thread.id)) - - local posts = thread:get_posts() - for _, p in ipairs(posts) do - assert_error(Posts:delete(p.id)) - end - else - assert_error(Posts:delete(post.id)) - end - - return { - status = ngx.HTTP_OK, - json = { - id = post.id - } - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/boards/post_reports.lua b/misc/website/backend/app/src/apps/api/boards/post_reports.lua deleted file mode 100755 index 8213a3f..0000000 --- a/misc/website/backend/app/src/apps/api/boards/post_reports.lua +++ /dev/null @@ -1,21 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local models = require "models" -local Boards = models.boards - -function action:GET() - - -- Get Board - local board = assert_error(Boards:get(self.params.uri_name)) - - -- Get Reports - local reports = board:get_reports() - - return { - status = ngx.HTTP_OK, - json = reports - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/boards/posts.lua b/misc/website/backend/app/src/apps/api/boards/posts.lua deleted file mode 100755 index 6e7e375..0000000 --- a/misc/website/backend/app/src/apps/api/boards/posts.lua +++ /dev/null @@ -1,105 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local models = require "models" -local Boards = models.boards -local Threads = models.threads -local Posts = models.posts - -function action:GET() - - local posts - - if self.params.uri_thread then - local thread = assert_error(Threads:get(self.params.uri_thread)) - posts = thread:get_posts() - else - local board = assert_error(Boards:get(self.params.uri_board)) - posts = board:get_posts() - end - - return { - status = ngx.HTTP_OK, - json = posts - } -end - -function action:POST() - local now = os.time() - local board = assert_error(Boards:get(self.params.uri_name)) - local thread = Threads:get(self.params.uri_id) - local op = thread and false or true - - -- Create a new thread if no thread exists - if not thread then - -- Validate parameters - local params = { - board_id = board.id, - last_active = now, - sticky = self.params.sticky, - lock = self.params.lock, - size_override = self.params.size_override, - save = self.params.save - } - - -- Only admins and mods can flag threads - -- FIXME: API has no session, need proper auth! - if not self.session.admin or self.session.mod then - params.sticky = nil - params.lock = nil - params.size_override = nil - params.save = nil - end - - --Threads:format_to_db(params) - trim_filter(params) - assert_valid(params, Threads.valid_record) - - -- Create thread - thread = assert_error(Threads:new(params)) - --Threads:format_from_db(thread) - end - - -- FIXME: there needs to be a better way to do this to avoid race conditions... - board.total_posts = board.total_posts + 1 - - -- Validate parameters - local params = { - post_id = board.total_posts, - thread_id = thread.id, - board_id = board.id, - timestamp = now, - ip = self.params.ip, - comment = self.params.comment, - name = self.params.name, - trip = self.params.trip, - subject = self.params.subject, - password = self.params.password, - file_name = self.params.file_name, - file_path = self.params.file_path, - file_type = self.params.file_type, - file_md5 = self.params.file_md5, - file_size = self.params.file_size, - file_width = self.params.file_width, - file_height = self.params.file_height, - file_duration = self.params.file_duration, - file_spoiler = self.params.file_spoiler, - file_content = self.params.file_content -- FIXME: we probably want to base64 decode this in format_to_db - } - Posts:format_to_db(params) - trim_filter(params) - assert_valid(params, Posts.valid_record) - - -- Create post - local post = assert_error(Posts:new(params, board, op)) - Posts:format_from_db(post) - - return { - status = ngx.HTTP_OK, - json = post - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/boards/reports.lua b/misc/website/backend/app/src/apps/api/boards/reports.lua deleted file mode 100755 index 0ccfc08..0000000 --- a/misc/website/backend/app/src/apps/api/boards/reports.lua +++ /dev/null @@ -1,29 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local role = require "utils.role" -local models = require "models" -local Boards = models.boards -local Posts = models.posts - -function action:GET() - - -- Verify the User's permissions - assert_error(role.mod(self.api_user)) - - -- Get Board - local board = assert_error(Boards:get(self.params.uri_board)) - - -- Get Reported posts - local posts = Posts:get_board_reports(board.id) - for _, post in ipairs(posts) do - Posts:format_from_db(post) - end - - return { - status = ngx.HTTP_OK, - json = posts - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/boards/thread.lua b/misc/website/backend/app/src/apps/api/boards/thread.lua deleted file mode 100755 index ddbedc8..0000000 --- a/misc/website/backend/app/src/apps/api/boards/thread.lua +++ /dev/null @@ -1,69 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local models = require "models" -local Threads = models.threads - -function action:GET() - - -- Get Thread - local thread = assert_error(Threads:get(self.params.uri_id)) - --Threads:format_from_db(thread) - - return { - status = ngx.HTTP_OK, - json = thread - } -end - -function action:PUT() - - local params = { id=self.params.uri_id } - - -- Extract flag from URI - if self.params.uri_value:lower() == "true" or - self.params.uri_value:lower() == "t" or - tonumber(self.params.uri_value) == 1 then - self.params.uri_value = true - elseif self.params.uri_value:lower() == "false" or - self.params.uri_value:lower() == "f" or - tonumber(self.params.uri_value) == 0 then - self.params.uri_value = false - else - return { - status = ngx.HTTP_BAD_REQUEST, - json = {} - } - end - - -- Extract variable from URI - if self.params.uri_action == "sticky" then - params.sticky = self.params.uri_value - elseif self.params.uri_action == "lock" then - params.lock = self.params.uri_value - elseif self.params.uri_action == "save" then - params.save = self.params.uri_value - elseif self.params.uri_action == "size_override" then - params.size_override = self.params.uri_value - else - return { - status = ngx.HTTP_BAD_REQUEST, - json = {} - } - end - - -- Modify thread - local thread = assert_error(Threads:modify(params)) - --Threads:format_from_db(thread) - - return { - status = ngx.HTTP_OK, - json = thread - } -end - -function action:DELETE() - -end - -return action diff --git a/misc/website/backend/app/src/apps/api/boards/thread_reports.lua b/misc/website/backend/app/src/apps/api/boards/thread_reports.lua deleted file mode 100755 index 8213a3f..0000000 --- a/misc/website/backend/app/src/apps/api/boards/thread_reports.lua +++ /dev/null @@ -1,21 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local models = require "models" -local Boards = models.boards - -function action:GET() - - -- Get Board - local board = assert_error(Boards:get(self.params.uri_name)) - - -- Get Reports - local reports = board:get_reports() - - return { - status = ngx.HTTP_OK, - json = reports - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/boards/threads.lua b/misc/website/backend/app/src/apps/api/boards/threads.lua deleted file mode 100755 index 6ed4530..0000000 --- a/misc/website/backend/app/src/apps/api/boards/threads.lua +++ /dev/null @@ -1,35 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local models = require "models" -local Boards = models.boards -local Threads = models.threads - -function action:GET() - - local threads, pages - local board = assert_error(Boards:get(self.params.uri_name)) - - -- Get Threads - if self.params.uri_page then - local paginator = board:get_threads_paginated({ per_page=board.threads_per_page }) - threads = paginator:get_page(self.params.uri_page) - pages = paginator:num_pages() - else - threads = board:get_threads() - end - - for _, thread in ipairs(threads) do - --Threads:format_from_db(thread) - end - - return { - status = ngx.HTTP_OK, - json = { - threads = threads, - pages = pages - } - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/core.lua b/misc/website/backend/app/src/apps/api/core.lua index f005582..6a1d112 100755 --- a/misc/website/backend/app/src/apps/api/core.lua +++ b/misc/website/backend/app/src/apps/api/core.lua @@ -1,13 +1,19 @@ -local lapis = require "lapis" +local lapis = require "lapis" local capture = require("lapis.application").capture_errors_json -local r2 = require("lapis.application").respond_to -local handle = require("utils.error").handle -local app = lapis.Application() -app.__base = app -app.name = "api.core." -app.path = "/api" +local r2 = require("lapis.application").respond_to +local handle = require("utils.error").handle +local app = lapis.Application() +app.__base = app +app.name = "api.core." +app.path = "/api" -app:match("root", "", capture({ on_error=handle, r2(require "apps.api.core.root") })) -app:match("login", "/login", capture({ on_error=handle, r2(require "apps.api.core.login") })) +app:match("root", "", capture({ + on_error = handle, + r2(require "apps.api.core.root"), +})) +app:match("login", "/login", capture({ + on_error = handle, + r2(require "apps.api.core.login"), +})) return app diff --git a/misc/website/backend/app/src/apps/api/core/login.lua b/misc/website/backend/app/src/apps/api/core/login.lua index f39238d..4c3403b 100755 --- a/misc/website/backend/app/src/apps/api/core/login.lua +++ b/misc/website/backend/app/src/apps/api/core/login.lua @@ -1,35 +1,35 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") +local ngx = _G.ngx +local action = setmetatable({}, require "apps.api.internal.action_base") local assert_error = require("lapis.application").assert_error -local yield_error = require("lapis.application").yield_error -local models = require "models" -local Users = models.users +local yield_error = require("lapis.application").yield_error +local models = require "models" +local Users = models.users function action:POST() - -- Normally we'd process these inputs a bit but in the case of - -- authentication credentials, we want to use the raw user inputs. - local params = { - username = self.params.username, - password = self.params.password - } + -- Normally we'd process these inputs a bit but in the case of + -- authentication credentials, we want to use the raw user inputs. + local params = { + username = self.params.username, + password = self.params.password, + } - -- Early exit if credentials not sent - if not params.username or not params.password then - yield_error("FIXME") - end + -- Early exit if credentials not sent + if not params.username or not params.password then + yield_error("FIXME") + end - local user = assert_error(Users:login(params)) + local user = assert_error(Users:login(params)) - return { - status = ngx.HTTP_OK, - json = { - id = user.id, - username = user.username, - role = user.role, - api_key = user.api_key - } - } + return { + status = ngx.HTTP_OK, + json = { + id = user.id, + username = user.username, + role = user.role, + api_key = user.api_key, + }, + } end return action diff --git a/misc/website/backend/app/src/apps/api/core/root.lua b/misc/website/backend/app/src/apps/api/core/root.lua index aabefc0..6b35b2b 100755 --- a/misc/website/backend/app/src/apps/api/core/root.lua +++ b/misc/website/backend/app/src/apps/api/core/root.lua @@ -1,11 +1,11 @@ -local ngx = _G.ngx +local ngx = _G.ngx local action = setmetatable({}, require "apps.api.internal.action_base") function action.GET() - return { - status = ngx.HTTP_OK, - json = {} - } + return { + status = ngx.HTTP_OK, + json = {}, + } end return action diff --git a/misc/website/backend/app/src/apps/api/internal/action_base.lua b/misc/website/backend/app/src/apps/api/internal/action_base.lua index 06adb3c..1e03649 100755 --- a/misc/website/backend/app/src/apps/api/internal/action_base.lua +++ b/misc/website/backend/app/src/apps/api/internal/action_base.lua @@ -1,17 +1,17 @@ -local ngx = _G.ngx +local ngx = _G.ngx local action = {} local function errors() - return { - status = ngx.HTTP_NOT_ALLOWED, - json = {} - } + return { + status = ngx.HTTP_NOT_ALLOWED, + json = {}, + } end action.__index = action -action.GET = errors -action.POST = errors -action.PUT = errors -action.DELETE = errors +action.GET = errors +action.POST = errors +action.PUT = errors +action.DELETE = errors return action diff --git a/misc/website/backend/app/src/apps/api/internal/before_auth.lua b/misc/website/backend/app/src/apps/api/internal/before_auth.lua index 0aaee28..ac591b3 100755 --- a/misc/website/backend/app/src/apps/api/internal/before_auth.lua +++ b/misc/website/backend/app/src/apps/api/internal/before_auth.lua @@ -1,41 +1,41 @@ local assert_error = require("lapis.application").assert_error -local yield_error = require("lapis.application").yield_error -local mime = require "mime" -local models = require "models" -local Users = models.users +local yield_error = require("lapis.application").yield_error +local mime = require "mime" +local models = require "models" +local Users = models.users return function(self) - if self.req.headers["Authorization"] then - - -- Decode auth info - local auth = mime.unb64(self.req.headers["Authorization"]:sub(7)) - local username, api_key = auth:match("^(.+)%:(.+)$") - - -- DENY if Authorization is malformed - if not username or not api_key then - yield_error("FIXME: Corrupt auth!") - end - - -- DENY if a user's key isn't properly set - if api_key == Users.default_key then - yield_error("FIXME: Bad auth!") - end - - local params = { - username = username, - api_key = api_key - } - - -- Get User - self.api_user = assert_error(Users:get_api(params)) - Users:format_from_db(self.api_user) - return - end - - -- Set basic User - self.api_user = { - id = -1, - role = -1 - } + if self.req.headers["Authorization"] then + + -- Decode auth info + local auth = mime.unb64(self.req.headers["Authorization"]:sub(7)) + local username, api_key = auth:match("^(.+)%:(.+)$") + + -- DENY if Authorization is malformed + if not username or not api_key then + yield_error("FIXME: Corrupt auth!") + end + + -- DENY if a user's key isn't properly set + if api_key == Users.default_key then + yield_error("FIXME: Bad auth!") + end + + local params = { + username = username, + api_key = api_key, + } + + -- Get User + self.api_user = assert_error(Users:get_api(params)) + Users:format_from_db(self.api_user) + return + end + + -- Set basic User + self.api_user = { + id = -1, + role = -1, + } end diff --git a/misc/website/backend/app/src/apps/api/internal/before_locale.lua b/misc/website/backend/app/src/apps/api/internal/before_locale.lua index 8a14fb3..d7641dd 100755 --- a/misc/website/backend/app/src/apps/api/internal/before_locale.lua +++ b/misc/website/backend/app/src/apps/api/internal/before_locale.lua @@ -1,20 +1,20 @@ local i18n = require "i18n" -local lfs = require "lfs" +local lfs = require "lfs" return function(self) - -- Set locale - self.i18n = i18n - local locale = self.req.headers["Content-Language"] or "en" - i18n.setLocale(locale) - i18n.loadFile("src/locale/en.lua") + -- Set locale + self.i18n = i18n + local locale = self.req.headers["Content-Language"] or "en" + i18n.setLocale(locale) + i18n.loadFile("src/locale/en.lua") - -- Get locale file - local path = "src/locale" - for file in lfs.dir(path) do - local name, ext = string.match(file, "^(.+)%.(.+)$") - if name == locale and ext == "lua" then - i18n.loadFile(string.format("%s/%s.lua", path, name)) - end - end + -- Get locale file + local path = "src/locale" + for file in lfs.dir(path) do + local name, ext = string.match(file, "^(.+)%.(.+)$") + if name == locale and ext == "lua" then + i18n.loadFile(string.format("%s/%s.lua", path, name)) + end + end end diff --git a/misc/website/backend/app/src/apps/api/pages.lua b/misc/website/backend/app/src/apps/api/pages.lua deleted file mode 100755 index 86a02f4..0000000 --- a/misc/website/backend/app/src/apps/api/pages.lua +++ /dev/null @@ -1,13 +0,0 @@ -local lapis = require "lapis" -local capture = require("lapis.application").capture_errors_json -local r2 = require("lapis.application").respond_to -local handle = require("utils.error").handle -local app = lapis.Application() -app.__base = app -app.name = "api.pages." -app.path = "/api/pages" - -app:match("pages", "", capture({ on_error=handle, r2(require "apps.api.pages.pages") })) -app:match("page", "/:uri_page", capture({ on_error=handle, r2(require "apps.api.pages.page") })) - -return app diff --git a/misc/website/backend/app/src/apps/api/pages/page.lua b/misc/website/backend/app/src/apps/api/pages/page.lua deleted file mode 100755 index 694f7bc..0000000 --- a/misc/website/backend/app/src/apps/api/pages/page.lua +++ /dev/null @@ -1,60 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local role = require "utils.role" -local models = require "models" -local Pages = models.pages - -function action:GET() - local page = assert_error(Pages:get(self.params.uri_page)) - - return { - status = ngx.HTTP_OK, - json = page - } -end - -function action:PUT() - - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) - - -- Validate parameters - local params = { - slug = self.params.slug, - title = self.params.title, - content = self.params.content - } - trim_filter(params) - Pages:format_to_db(params) - assert_valid(params, Pages.valid_record) - - -- Modify page - local page = assert_error(Pages:modify(params, self.params.uri_page)) - - return { - status = ngx.HTTP_OK, - json = page - } -end - -function action:DELETE() - - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) - - -- Delete Page - local page = assert_error(Pages:delete(self.params.uri_page)) - - return { - status = ngx.HTTP_OK, - json = { - slug = page.slug, - title = page.title - } - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/pages/pages.lua b/misc/website/backend/app/src/apps/api/pages/pages.lua deleted file mode 100755 index 92d968b..0000000 --- a/misc/website/backend/app/src/apps/api/pages/pages.lua +++ /dev/null @@ -1,45 +0,0 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local role = require "utils.role" -local models = require "models" -local Pages = models.pages - -function action.GET() - - -- Get all Pages - local pages = assert_error(Pages:get_all()) - - return { - status = ngx.HTTP_OK, - json = pages - } -end - -function action:POST() - - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) - - -- Validate parameters - local params = { - slug = self.params.slug, - title = self.params.title, - content = self.params.content, - } - trim_filter(params) - Pages:format_to_db(params) - assert_valid(params, Pages.valid_record) - - -- Create Page - local page = assert_error(Pages:new(params)) - - return { - status = ngx.HTTP_OK, - json = page - } -end - -return action diff --git a/misc/website/backend/app/src/apps/api/users.lua b/misc/website/backend/app/src/apps/api/users.lua index cf5c86d..22285d0 100755 --- a/misc/website/backend/app/src/apps/api/users.lua +++ b/misc/website/backend/app/src/apps/api/users.lua @@ -1,13 +1,19 @@ -local lapis = require "lapis" +local lapis = require "lapis" local capture = require("lapis.application").capture_errors_json -local r2 = require("lapis.application").respond_to -local handle = require("utils.error").handle -local app = lapis.Application() -app.__base = app -app.name = "api.users." -app.path = "/api/users" +local r2 = require("lapis.application").respond_to +local handle = require("utils.error").handle +local app = lapis.Application() +app.__base = app +app.name = "api.users." +app.path = "/api/users" -app:match("users", "", capture({ on_error=handle, r2(require "apps.api.users.users") })) -app:match("user", "/:uri_user", capture({ on_error=handle, r2(require "apps.api.users.user") })) +app:match("users", "", capture({ + on_error = handle, + r2(require "apps.api.users.users"), +})) +app:match("user", "/:uri_user", capture({ + on_error = handle, + r2(require "apps.api.users.user"), +})) return app diff --git a/misc/website/backend/app/src/apps/api/users/user.lua b/misc/website/backend/app/src/apps/api/users/user.lua index fd31fba..abbfe4b 100755 --- a/misc/website/backend/app/src/apps/api/users/user.lua +++ b/misc/website/backend/app/src/apps/api/users/user.lua @@ -1,108 +1,108 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") +local ngx = _G.ngx +local action = setmetatable({}, require "apps.api.internal.action_base") local assert_error = require("lapis.application").assert_error -local yield_error = require("lapis.application").yield_error +local yield_error = require("lapis.application").yield_error local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local role = require "utils.role" -local models = require "models" -local Users = models.users +local trim_filter = require("lapis.util").trim_filter +local role = require "utils.role" +local models = require "models" +local Users = models.users function action:GET() - local user = assert_error(Users:get(self.params.uri_user)) - Users:format_from_db(user) + local user = assert_error(Users:get(self.params.uri_user)) + Users:format_from_db(user) - -- Verify the User's permissions - local is_admin = role.admin(self.api_user) - local is_user = self.api_user.id == user.id - if not is_admin and not is_user then - yield_error("FIXME") - end + -- Verify the User's permissions + local is_admin = role.admin(self.api_user) + local is_user = self.api_user.id == user.id + if not is_admin and not is_user then + yield_error("FIXME") + end - return { - status = ngx.HTTP_OK, - json = user - } + return { + status = ngx.HTTP_OK, + json = user, + } end function action:PUT() - local user = assert_error(Users:get(self.params.uri_user)) - - -- Verify the User's permissions - local is_admin = role.admin(self.api_user) - local is_user = self.api_user.id == user.id - local is_auth = self.api_user.role > user.role - if (not is_admin and not is_user) or not is_auth then - yield_error("FIXME") - end - - -- Validate parameters - local params = { - username = self.params.username, - password = self.params.password, - confirm = self.params.confirm, - role = tonumber(self.params.role), - api_key = self.params.api_key - } - trim_filter(params) - Users:format_to_db(params) - assert_valid(params, Users.valid_record) - - -- If no role was sent, don't update it - -- This is kind of dumb since we're just setting it from nil to -1 and back - -- to nil, but I want to keep the format_to_db in case of future formatting - -- concerns. - if params.role == Users.role.INVALID then - params.role = nil - end - - if params.role then - - -- Only admins can change a role - if not is_admin then - yield_error("FIXME") - end - - -- Cannot elevate to or above own role - if self.api_user.role <= params.role then - yield_error("FIXME") - end - end - - -- Modify User - user = assert_error(Users:modify(params, self.params.uri_user, self.params.password)) - Users:format_from_db(user) - - return { - status = ngx.HTTP_OK, - json = user - } + local user = assert_error(Users:get(self.params.uri_user)) + + -- Verify the User's permissions + local is_admin = role.admin(self.api_user) + local is_user = self.api_user.id == user.id + local is_auth = self.api_user.role > user.role + if (not is_admin and not is_user) or not is_auth then + yield_error("FIXME") + end + + -- Validate parameters + local params = { + username = self.params.username, + password = self.params.password, + confirm = self.params.confirm, + role = tonumber(self.params.role), + api_key = self.params.api_key, + } + trim_filter(params) + Users:format_to_db(params) + assert_valid(params, Users.valid_record) + + -- If no role was sent, don't update it + -- This is kind of dumb since we're just setting it from nil to -1 and back + -- to nil, but I want to keep the format_to_db in case of future formatting + -- concerns. + if params.role == Users.role.INVALID then + params.role = nil + end + + if params.role then + + -- Only admins can change a role + if not is_admin then + yield_error("FIXME") + end + + -- Cannot elevate to or above own role + if self.api_user.role <= params.role then + yield_error("FIXME") + end + end + + -- Modify User + user = assert_error(Users:modify(params, self.params.uri_user, self.params.password)) + Users:format_from_db(user) + + return { + status = ngx.HTTP_OK, + json = user, + } end function action:DELETE() - local user = assert_error(Users:get(self.params.uri_user)) - - -- Verify the User's permissions - local is_admin = role.admin(self.api_user) - local is_user = self.api_user.id == user.id - local is_auth = self.api_user.role > user.role - if not is_admin and not is_user and not is_auth then - yield_error("FIXME") - end - - -- Delete User - user = assert_error(Users:delete(self.params.uri_user)) - - return { - status = ngx.HTTP_OK, - json = { - id = user.id, - username = user.username - } - } + local user = assert_error(Users:get(self.params.uri_user)) + + -- Verify the User's permissions + local is_admin = role.admin(self.api_user) + local is_user = self.api_user.id == user.id + local is_auth = self.api_user.role > user.role + if not is_admin and not is_user and not is_auth then + yield_error("FIXME") + end + + -- Delete User + user = assert_error(Users:delete(self.params.uri_user)) + + return { + status = ngx.HTTP_OK, + json = { + id = user.id, + username = user.username, + }, + } end return action diff --git a/misc/website/backend/app/src/apps/api/users/users.lua b/misc/website/backend/app/src/apps/api/users/users.lua index fbb663e..51cf240 100755 --- a/misc/website/backend/app/src/apps/api/users/users.lua +++ b/misc/website/backend/app/src/apps/api/users/users.lua @@ -1,64 +1,64 @@ -local ngx = _G.ngx -local action = setmetatable({}, require "apps.api.internal.action_base") +local ngx = _G.ngx +local action = setmetatable({}, require "apps.api.internal.action_base") local assert_error = require("lapis.application").assert_error -local yield_error = require("lapis.application").yield_error +local yield_error = require("lapis.application").yield_error local assert_valid = require("lapis.validate").assert_valid -local trim_filter = require("lapis.util").trim_filter -local role = require "utils.role" -local models = require "models" -local Users = models.users +local trim_filter = require("lapis.util").trim_filter +local role = require "utils.role" +local models = require "models" +local Users = models.users function action:GET() - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) + -- Verify the User's permissions + assert_error(role.admin(self.api_user)) - -- Get all Users - local users = assert_error(Users:get_all()) - for _, user in ipairs(users) do - Users:format_from_db(user) - end + -- Get all Users + local users = assert_error(Users:get_all()) + for _, user in ipairs(users) do + Users:format_from_db(user) + end - return { - status = ngx.HTTP_OK, - json = users - } + return { + status = ngx.HTTP_OK, + json = users, + } end function action:POST() - -- Verify the User's permissions - assert_error(role.admin(self.api_user)) + -- Verify the User's permissions + assert_error(role.admin(self.api_user)) - -- Validate parameters - local params = { - username = self.params.username, - password = self.params.password, - confirm = self.params.confirm, - role = tonumber(self.params.role) - } - trim_filter(params) - Users:format_to_db(params) - assert_valid(params, Users.valid_record) + -- Validate parameters + local params = { + username = self.params.username, + password = self.params.password, + confirm = self.params.confirm, + role = tonumber(self.params.role), + } + trim_filter(params) + Users:format_to_db(params) + assert_valid(params, Users.valid_record) - -- DENY if no role was sent - if params.role == Users.role.INVALID then - yield_error("FIXME") - end + -- DENY if no role was sent + if params.role == Users.role.INVALID then + yield_error("FIXME") + end - -- Cannot elevate to or above own role - if self.api_user.role <= params.role then - yield_error("FIXME") - end + -- Cannot elevate to or above own role + if self.api_user.role <= params.role then + yield_error("FIXME") + end - -- Create user - local user = assert_error(Users:new(params, self.params.password)) - Users:format_from_db(user) + -- Create user + local user = assert_error(Users:new(params, self.params.password)) + Users:format_from_db(user) - return { - status = ngx.HTTP_OK, - json = user - } + return { + status = ngx.HTTP_OK, + json = user, + } end return action diff --git a/misc/website/backend/app/src/apps/web.lua b/misc/website/backend/app/src/apps/web.lua deleted file mode 100755 index 6acb1ef..0000000 --- a/misc/website/backend/app/src/apps/web.lua +++ /dev/null @@ -1,16 +0,0 @@ -local lapis = require "lapis" -local app = lapis.Application() -app.__base = app -app.include = function(self, a) - self.__class.include(self, a, nil, self) -end - -app:before_filter(require "apps.web.internal.config_site") -app:before_filter(require "apps.web.internal.check_auth") -app:before_filter(require "apps.web.internal.check_ban") - -app:include("apps.web.admin") -app:include("apps.web.pages") -app:include("apps.web.boards") - -return app diff --git a/misc/website/backend/app/src/apps/web/admin.lua b/misc/website/backend/app/src/apps/web/admin.lua deleted file mode 100755 index f37e73b..0000000 --- a/misc/website/backend/app/src/apps/web/admin.lua +++ /dev/null @@ -1,16 +0,0 @@ -local lapis = require "lapis" -local r2 = require("lapis.application").respond_to -local app = lapis.Application() -app.__base = app -app.name = "web.admin." -app.path = "/admin" -app.handle_404 = require "apps.web.internal.code_404" - -app:match("index", "", r2(require "apps.web.admin.index")) -app:match("users", "/:action/user(/:user)", r2(require "apps.web.admin.user")) -app:match("boards", "/:action/board(/:uri_name)", r2(require "apps.web.admin.board")) -app:match("announcements", "/:action/announcement(/:ann)", r2(require "apps.web.admin.announcement")) -app:match("pages", "/:action/page(/:page)", r2(require "apps.web.admin.page")) -app:match("reports", "/:action/report(/:report)", r2(require "apps.web.admin.report")) - -return app diff --git a/misc/website/backend/app/src/apps/web/admin/announcement.lua b/misc/website/backend/app/src/apps/web/admin/announcement.lua deleted file mode 100755 index 7c3bb25..0000000 --- a/misc/website/backend/app/src/apps/web/admin/announcement.lua +++ /dev/null @@ -1,128 +0,0 @@ -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local csrf = require "lapis.csrf" -local capture = require "utils.capture" -local generate = require "utils.generate" - -return { - before = function(self) - -- Get announcements - self.announcements = assert_error(capture.get(self:url_for("api.announcements.announcements"))) - - -- Display a theme - self.board = { theme = "yotsuba_b" } - - -- Generate CSRF token - self.csrf_token = csrf.generate_token(self) - - -- Page title - self.page_title = self.i18n("admin_panel") - - -- Verify Authorization - if self.session.name then - if not self.session.admin then - assert_error(false, "err_not_admin") - end - else - return - end - - -- Display creation form - if self.params.action == "create" then - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("create_ann") - ) - self.announcement = self.params - return - end - - -- Display modification form - if self.params.action == "modify" then - self.announcement = assert_error(capture.get(self:url_for("api.announcements.announcement", { uri_id=self.params.uri_id }))) - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("modify_ann") - ) - return - end - - -- Delete announcement - if self.params.action == "delete" then - self.announcement = assert_error(capture.delete(self:url_for("api.announcements.announcement", { uri_id=self.params.uri_id }))) - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("deleted_ann", { self.announcement.text }) - return - end - end, - - on_error = function(self) - self.errors = generate.errors(self.i18n, self.errors) - - if not self.session.name then - return { render = "admin.login" } - elseif self.params.action == "create" then - return { render = "admin.announcement" } - elseif self.params.action == "modify" then - return { render = "admin.announcement" } - elseif self.params.action == "delete" then - return { render = "admin.admin" } - end - end, - - GET = function(self) - if not self.session.name then - return { render = "admin.login" } - elseif self.params.action == "create" then - return { render = "admin.announcement" } - elseif self.params.action == "modify" then - return { render = "admin.announcement" } - elseif self.params.action == "delete" then - return { render = "admin.success" } - end - end, - - POST = function(self) - -- Validate CSRF token - csrf.assert_token(self) - - -- Validate user input - assert_valid(self.params, { - { "text", max_length=255, exists=true } - }) - - -- Create announcement - if self.params.create_announcement then - self.announcement = assert_error(capture.post(self:url_for("api.announcements.announcements"), self.params)) - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("created_ann", { self.announcement.text }) - - return { render = "admin.success" } - end - - -- Modify announcement - if self.params.modify_announcement then - self.announcement = assert_error(capture.put(self:url_for("api.announcements.announcement", { uri_id=self.params.uri_id }), self.params)) - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("modified_ann", { self.announcement.text }) - - return { render = "admin.success" } - end - - return { redirect_to = self:url_for("web.admin.index") } - end -} diff --git a/misc/website/backend/app/src/apps/web/admin/board.lua b/misc/website/backend/app/src/apps/web/admin/board.lua deleted file mode 100755 index fe05b61..0000000 --- a/misc/website/backend/app/src/apps/web/admin/board.lua +++ /dev/null @@ -1,136 +0,0 @@ -local assert_error = require("lapis.application").assert_error -local csrf = require "lapis.csrf" -local lfs = require "lfs" -local capture = require "utils.capture" -local generate = require "utils.generate" - -return { - before = function(self) - - -- Display a theme - self.board = { theme = "yotsuba_b" } - - -- Generate CSRF token - self.csrf_token = csrf.generate_token(self) - - -- Page title - self.page_title = self.i18n("admin_panel") - - -- Verify Authorization - if not self.session.name then return end - if not self.session.admin then - assert_error(false, "err_not_admin") - end - - -- Get list of themes - self.themes = {} - for file in lfs.dir("./static/css") do - local name, ext = string.match(file, "^(.+)%.(.+)$") - if name ~= "reset" and - name ~= "posts" and - name ~= "style" and - name ~= "tegaki" and - ext == "css" then - table.insert(self.themes, name) - end - end - - -- Display creation form - if self.params.action == "create" then - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("create_board") - ) - self.board = self.params - - if not self.board.theme then - self.board.theme = "yotsuba_b" - end - - return - end - - -- Display modification form - if self.params.action == "modify" then - self.board = assert_error(capture.get(self:url_for("api.boards.board", { uri_name=self.params.uri_name }))) - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("modify_board") - ) - return - end - - -- Delete board - if self.params.action == "delete" then - local board = assert_error(capture.delete(self:url_for("api.boards.board", { uri_name=self.params.uri_name }))) - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("deleted_board", { board.name, board.title }) - return - end - end, - - on_error = function(self) - self.errors = generate.errors(self.i18n, self.errors) - - if not self.session.name then - return { render = "admin.login" } - elseif self.params.action == "create" then - return { render = "admin.board" } - elseif self.params.action == "modify" then - return { render = "admin.board" } - elseif self.params.action == "delete" then - return { render = "admin.admin" } - end - end, - - GET = function(self) - if not self.session.name then - return { render = "admin.login" } - elseif self.params.action == "create" then - return { render = "admin.board" } - elseif self.params.action == "modify" then - return { render = "admin.board" } - elseif self.params.action == "delete" then - return { render = "admin.success" } - end - end, - - POST = function(self) - -- Validate CSRF token - csrf.assert_token(self) - - -- Create new board - if self.params.create_board then - local board = assert_error(capture.post(self:url_for("api.boards.boards"), self.params)) - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("created_board", { board.name, board.title }) - - return { render = "admin.success" } - end - - -- Modify board - if self.params.modify_board then - local board = assert_error(capture.put(self:url_for("api.boards.board", { uri_name=self.params.uri_name }), self.params)) - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("modified_board", { board.name, board.title }) - - return { render = "admin.success" } - end - - return { redirect_to = self:url_for("web.admin.index") } - end -} diff --git a/misc/website/backend/app/src/apps/web/admin/index.lua b/misc/website/backend/app/src/apps/web/admin/index.lua deleted file mode 100755 index df2b31d..0000000 --- a/misc/website/backend/app/src/apps/web/admin/index.lua +++ /dev/null @@ -1,138 +0,0 @@ -local assert_error = require("lapis.application").assert_error -local csrf = require "lapis.csrf" -local capture = require "utils.capture" -local generate = require "utils.generate" -local Boards = require "models.boards" -local Pages = require "models.pages" -local Posts = require "models.posts" -local Reports = require "models.reports" -local Users = require "models.users" - -return { - before = function(self) - -- Get data - self.announcements = assert_error(capture.get(self:url_for("api.announcements.announcements"))) - self.pages = Pages:get_pages() - self.reports = Reports:get_reports() - self.users = Users:get_users() - - -- Display a theme - self.board = { theme = "yotsuba_b" } - - -- Page title - self.page_title = self.i18n("admin_panel") - - -- Generate CSRF token - self.csrf_token = csrf.generate_token(self) - - -- Verify Authorization - if self.session.name then - if not self.session.admin then - assert_error(false, "err_not_admin") - end - else - return - end - end, - - on_error = function(self) - self.errors = generate.errors(self.i18n, self.errors) - - if not self.session.name then - return { render = "admin.login" } - end - - return { render = "admin.admin" } - end, - - GET = function(self) - if not self.session.name then - return { render = "admin.login" } - end - - return { render = "admin.admin" } - end, - - POST = function(self) - -- Validate CSRF token - csrf.assert_token(self) - - -- Verify user credentials - if self.params.login then - -- Verify user - local user = assert_error(Users:verify_user(self.params)) - - -- Set username - self.session.name = user.username - - return { redirect_to = self.admin_url } - end - - -- Must be logged in as an admin! - if self.session.admin then - -- Redirect to modify user page - if self.params.modify_user then - return { redirect_to = self:url_for("web.admin.users", { action="modify", user=self.params.user }) } - end - - -- Redirect to delete user page - if self.params.delete_user then - return { redirect_to = self:url_for("web.admin.users", { action="delete", user=self.params.user }) } - end - - -- Redirect to modify board page - if self.params.modify_board then - return { redirect_to = self:url_for("web.admin.boards", { action="modify", uri_name=self.params.board }) } - end - - -- Redirect to delete board page - if self.params.delete_board then - return { redirect_to = self:url_for("web.admin.boards", { action="delete", uri_name=self.params.board }) } - end - - -- Redirect to modify announcement page - if self.params.modify_announcement then - return { redirect_to = self:url_for("web.admin.announcements", { action="modify", ann=self.params.ann }) } - end - - -- Redirect to delete announcement page - if self.params.delete_announcement then - return { redirect_to = self:url_for("web.admin.announcements", { action="delete", ann=self.params.ann }) } - end - - -- Redirect to modify page page - if self.params.modify_page then - return { redirect_to = self:url_for("web.admin.pages", { action="modify", page=self.params.page }) } - end - - -- Redirect to delete page page - if self.params.delete_page then - return { redirect_to = self:url_for("web.admin.pages", { action="delete", page=self.params.page }) } - end - - -- Redirect to reported post - if self.params.view_report then - local report = Reports:get_report_by_id(self.params.report) - local board = Boards:get_board(report.board_id) - local post = Posts:get_post(board.id, report.post_id) - local op = Posts:get_thread_op(report.thread_id) - - return { redirect_to = self:url_for("web.boards.thread", { board=board.name, thread=op.post_id, anchor="p", id=post.post_id }) } - end - - -- Redirect to delete report page - if self.params.delete_report then - return { redirect_to = self:url_for("web.admin.reports", { action="delete", report=self.params.report }) } - end - - -- Regenerate thumbnails - if self.params.regen_thumbs then - Boards:regen_thumbs() - end - - return { render = "admin.admin" } - end - - return { render = "admin.login" } - end -} diff --git a/misc/website/backend/app/src/apps/web/admin/page.lua b/misc/website/backend/app/src/apps/web/admin/page.lua deleted file mode 100755 index fce2138..0000000 --- a/misc/website/backend/app/src/apps/web/admin/page.lua +++ /dev/null @@ -1,164 +0,0 @@ -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local csrf = require "lapis.csrf" -local generate = require "utils.generate" -local Boards = require "models.boards" -local Pages = require "models.pages" - -return { - before = function(self) - -- Get all board data - self.boards = Boards:get_boards() - - -- Get all page data - self.pages = Pages:get_pages() - - -- Display a theme - self.board = { theme = "yotsuba_b" } - - -- Generate CSRF token - self.csrf_token = csrf.generate_token(self) - - -- Page title - self.page_title = self.i18n("admin_panel") - - -- Verify Authorization - if self.session.name then - if not self.session.admin then - assert_error(false, "err_not_admin") - end - else - return - end - - -- Display creation form - if self.params.action == "create" then - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("create_page") - ) - self.page = self.params - return - end - - -- Display modification form - if self.params.action == "modify" then - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("modify_page") - ) - self.page = Pages:get_page(self.params.page) - return - end - - -- Delete page - if self.params.action == "delete" then - local page = Pages:get_page(self.params.page) - assert_error(Pages:delete_page(page)) - - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("deleted_page", { page.slug, page.title }) - return - end - end, - on_error = function(self) - self.errors = generate.errors(self.i18n, self.errors) - - if not self.session.name then - return { render = "admin.login" } - elseif self.params.action == "create" then - return { render = "admin.page" } - elseif self.params.action == "modify" then - return { render = "admin.page" } - elseif self.params.action == "delete" then - return { render = "admin.admin" } - end - end, - GET = function(self) - if not self.session.name then - return { render = "admin.login" } - elseif self.params.action == "create" then - return { render = "admin.page" } - elseif self.params.action == "modify" then - return { render = "admin.page" } - elseif self.params.action == "delete" then - return { render = "admin.success" } - end - end, - POST = function(self) - -- Validate CSRF token - csrf.assert_token(self) - - -- Validate user input - assert_valid(self.params, { - { "slug", max_length=255, exists=true }, - { "title", max_length=255, exists=true } - }) - - -- Create new page - if self.params.create_page then - local sl = string.lower - -- Verify unique names - for _, page in ipairs(self.pages) do - if sl(page.slug) == sl(self.params.slug) then - assert_error(false, "err_slug_used") - end - end - - -- Create page - local page = assert_error(Pages:create_page(self.params)) - - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("created_page", { page.slug, page.title }) - - return { render = "admin.success" } - end - - -- Modify page - if self.params.modify_page then - local discard = { - "page", - "modify_page", - "ip", - "action", - "csrf_token", - "old" - } - - local page = Pages:get_page(self.params.old) - - -- Fill in board with new data - for k, param in pairs(self.params) do - page[k] = param - end - - -- Get rid of form trash - for _, param in ipairs(discard) do - page[param] = nil - end - - assert_error(Pages:modify_page(page)) - - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("modified_page", { page.slug, page.title }) - - return { render = "admin.success" } - end - - return { redirect_to = self:url_for("web.admin.index") } - end -} diff --git a/misc/website/backend/app/src/apps/web/admin/report.lua b/misc/website/backend/app/src/apps/web/admin/report.lua deleted file mode 100755 index 0ab4b87..0000000 --- a/misc/website/backend/app/src/apps/web/admin/report.lua +++ /dev/null @@ -1,64 +0,0 @@ -local assert_error = require("lapis.application").assert_error -local csrf = require "lapis.csrf" -local generate = require "utils.generate" -local Boards = require "models.boards" -local Reports = require "models.reports" - -return { - before = function(self) - -- Get data - self.boards = Boards:get_boards() - self.reports = Reports:get_reports() - - -- Display a theme - self.board = { theme = "yotsuba_b" } - - -- Generate CSRF token - self.csrf_token = csrf.generate_token(self) - - -- Page title - self.page_title = self.i18n("admin_panel") - - -- Verify Authorization - if self.session.name then - if not self.session.admin then - assert_error(false, "err_not_admin") - end - else - return - end - - -- Delete report - if self.params.action == "delete" then - local report = Reports:get_report_by_id(self.params.report) - assert_error(Reports:delete_report(report)) - - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("deleted_report", { report.id }) - return - end - end, - on_error = function(self) - self.errors = generate.errors(self.i18n, self.errors) - - if not self.session.name then - return { render = "admin.login" } - elseif self.params.action == "delete" then - return { render = "admin.admin" } - end - end, - GET = function(self) - if not self.session.name then - return { render = "admin.login" } - elseif self.params.action == "delete" then - return { render = "admin.success" } - end - end, - POST = function(self) - return { redirect_to = self:url_for("web.admin.index") } - end -} diff --git a/misc/website/backend/app/src/apps/web/admin/user.lua b/misc/website/backend/app/src/apps/web/admin/user.lua deleted file mode 100755 index b6ae735..0000000 --- a/misc/website/backend/app/src/apps/web/admin/user.lua +++ /dev/null @@ -1,190 +0,0 @@ -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local csrf = require "lapis.csrf" -local generate = require "utils.generate" -local Boards = require "models.boards" -local Users = require "models.users" - -return { - before = function(self) - -- Get all board data - self.boards = Boards:get_boards() - - -- Get all user data - self.users = Users:get_users() - - -- Display a theme - self.board = { theme = "yotsuba_b" } - - -- Generate CSRF token - self.csrf_token = csrf.generate_token(self) - - -- Page title - self.page_title = self.i18n("admin_panel") - - -- Verify Authorization - if self.session.name then - if not self.session.admin then - assert_error(false, "err_not_admin") - end - else - return - end - - -- Display creation form - if self.params.action == "create" then - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("create_user") - ) - self.user = self.params - return - end - - -- Display modification form - if self.params.action == "modify" then - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("modify_user") - ) - self.user = Users:get_user_by_id(self.params.user) - return - end - - -- Delete user - if self.params.action == "delete" then - local user = Users:get_user_by_id(self.params.user) - assert_error(Users:delete_user(user)) - - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("deleted_user", { user.username }) - return - end - end, - on_error = function(self) - self.errors = generate.errors(self.i18n, self.errors) - - if not self.session.name then - return { render = "admin.login" } - elseif self.params.action == "create" then - return { render = "admin.user" } - elseif self.params.action == "modify" then - return { render = "admin.user" } - elseif self.params.action == "delete" then - return { render = "admin.admin" } - end - end, - GET = function(self) - if not self.session.name then - return { render = "admin.login" } - elseif self.params.action == "create" then - return { render = "admin.user" } - elseif self.params.action == "modify" then - return { render = "admin.user" } - elseif self.params.action == "delete" then - return { render = "admin.success" } - end - end, - POST = function(self) - -- Validate CSRF token - csrf.assert_token(self) - - -- Create new user - if self.params.create_user then - local sl = string.lower - - -- Validate user input - assert_valid(self.params, { - { "username", exists=true, max_length=255 }, - { "new_password", exists=true, equals=self.params.retype_password }, - { "retype_password", exists=true } - }) - - self.params.password = self.params.new_password - - -- Verify unique name - for _, user in ipairs(self.users) do - if sl(user.username) == sl(self.params.username) then - assert_error(false, "err_user_used") - end - end - - -- Create user - local user = assert_error(Users:create_user(self.params)) - - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("created_user", { user.username }) - - return { render = "admin.success" } - end - - -- Modify user - if self.params.modify_user then - -- Validate user input - assert_valid(self.params, { - { "username", exists=true, max_length=255 }, - { "new_password", equals=self.params.retype_password }, - { "retype_password", } - }) - - local discard = { - "user", - "modify_user", - "ip", - "action", - "csrf_token", - "old_password", - "new_password", - "retype_password", - } - - local user = Users:get_user(self.params.username) - - -- Validate user - if #self.params.old_password > 0 then - -- Validate user input - assert_valid(self.params, { - { "new_password", exists=true }, - { "retype_password", exists=true } - }) - - -- TODO: verify user's old password in non-admin setting - - self.params.password = self.params.new_password - end - - -- Fill in board with new data - for k, param in pairs(self.params) do - user[k] = param - end - - -- Get rid of form trash - for _, param in ipairs(discard) do - user[param] = nil - end - - assert_error(Users:modify_user(user)) - - self.page_title = string.format( - "%s - %s", - self.i18n("admin_panel"), - self.i18n("success") - ) - self.action = self.i18n("modified_user", { user.username }) - - return { render = "admin.success" } - end - - return { redirect_to = self:url_for("web.admin.index") } - end -} diff --git a/misc/website/backend/app/src/apps/web/boards.lua b/misc/website/backend/app/src/apps/web/boards.lua deleted file mode 100755 index fe8aad7..0000000 --- a/misc/website/backend/app/src/apps/web/boards.lua +++ /dev/null @@ -1,14 +0,0 @@ -local lapis = require "lapis" -local r2 = require("lapis.application").respond_to -local app = lapis.Application() -app.__base = app -app.name = "web.boards." -app.path = "/board" -app.handle_404 = require "apps.web.internal.code_404" - -app:match("board", "/:uri_name(/page/:page)", r2(require "apps.web.boards.board")) -app:match("catalog", "/:uri_name/catalog", r2(require "apps.web.boards.catalog")) -app:match("archive", "/:uri_name/archive", require "apps.web.boards.archive") -app:match("thread", "/:uri_name/thread/:thread(#:anchor:id)", r2(require "apps.web.boards.thread")) - -return app diff --git a/misc/website/backend/app/src/apps/web/boards/archive.lua b/misc/website/backend/app/src/apps/web/boards/archive.lua deleted file mode 100755 index ea86912..0000000 --- a/misc/website/backend/app/src/apps/web/boards/archive.lua +++ /dev/null @@ -1,76 +0,0 @@ -local assert_error = require("lapis.application").assert_error -local capture = require "utils.capture" -local format = require "utils.text_formatter" -local Posts = require "models.posts" -local Threads = require "models.threads" - -return function(self) - - -- Get board - for _, board in ipairs(self.boards) do - if board.name == self.params.uri_name then - self.board = board - break - end - end - - -- Board not found - if not self.board then - return self:write({ redirect_to = self:url_for("web.pages.index") }) - end - - -- Get announcements - -- TODO: Consolidate these into a single call - self.announcements = assert_error(capture.get(self:url_for("api.announcements.announcement", { uri_id="global" }))) - local board_announcements = assert_error(capture.get(self:url_for("api.boards.announcements", { uri_name=self.params.uri_name }))) - for _, announcement in ipairs(board_announcements) do - table.insert(self.announcements, announcement) - end - - -- Page title - self.page_title = string.format( - "/%s/ - %s", - self.board.name, - self.board.title - ) - - -- Nav links link to sub page if available - self.sub_page = "archive" - - -- Get threads - self.threads = assert_error(capture.get(self:url_for("api.boards.archived", { uri_name=self.params.uri_name }))) - - -- Get time - self.days = math.floor(self.board.archive_time / 24 / 60 / 60) - - -- Get stats - for _, thread in ipairs(self.threads) do - thread.op = Posts:get_thread_op(thread.id) - thread.replies = Posts:count_posts(thread.id) - 1 - thread.url = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=thread.op.post_id }) - - -- Process name - thread.op.name = thread.op.name or self.board.anon_name - - -- Process tripcode - thread.op.trip = thread.op.trip or "" - - -- Process comment - if thread.op.comment then - local comment = thread.op.comment - comment = format.sanitize(comment) - comment = format.spoiler(comment) - - if #comment > 110 then - comment = comment:sub(1,100) - comment = comment .. "..." - end - - thread.op.comment = comment - else - thread.op.comment = "" - end - end - - return { render = "archive" } -end diff --git a/misc/website/backend/app/src/apps/web/boards/board.lua b/misc/website/backend/app/src/apps/web/boards/board.lua deleted file mode 100755 index e7d4afe..0000000 --- a/misc/website/backend/app/src/apps/web/boards/board.lua +++ /dev/null @@ -1,242 +0,0 @@ -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local csrf = require "lapis.csrf" -local capture = require "utils.capture" -local format = require "utils.text_formatter" -local generate = require "utils.generate" -local process = require "utils.request_processor" -local Posts = require "models.posts" - -return { - before = function(self) - - -- Get board - for _, board in ipairs(self.boards) do - if board.name == self.params.uri_name then - self.board = board - break - end - end - - -- Board not found - if not self.board or self.params.page and not tonumber(self.params.page) then - return self:write({ redirect_to = self:url_for("web.pages.index") }) - end - - -- Get announcements - -- TODO: Consolidate these into a single call - self.announcements = assert_error(capture.get(self:url_for("api.announcements.announcement", { uri_id="global" }))) - local board_announcements = assert_error(capture.get(self:url_for("api.boards.announcements", { uri_name=self.params.uri_name }))) - for _, announcement in ipairs(board_announcements) do - table.insert(self.announcements, announcement) - end - - -- Page title - self.page_title = string.format( - "/%s/ - %s", - self.board.name, - self.board.title - ) - - -- Flag comments as required or not - self.comment_flag = self.board.thread_comment - - -- Generate CSRF token - self.csrf_token = csrf.generate_token(self) - - -- Current page - self.params.page = self.params.page or 1 - - -- Get threads - local response = assert_error(capture.get(self:url_for("api.boards.threads", { uri_name=self.params.uri_name, uri_page=self.params.page }))) - self.threads = response.threads - self.pages = response.pages - - -- Get posts - for _, thread in ipairs(self.threads) do - -- Get posts visible on the board index - thread.posts = Posts:get_index_posts(thread.id) - - -- Get hidden posts - thread.hidden = Posts:count_hidden_posts(thread.id) - - -- Get op - local op = thread.posts[#thread.posts] - if not op then - assert_error(false, { "err_orphaned", { thread.id } }) - end - - thread.url = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=op.post_id }) - - -- Format comments - for _, post in ipairs(thread.posts) do - -- OP gets a thread tag - if post.post_id == op.post_id then - post.thread = post.post_id - end - - post.name = post.name or self.board.anon_name - post.reply = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=op.post_id, anchor="q", id=post.post_id }) - post.link = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=op.post_id, anchor="p", id=post.post_id }) - post.remix = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=op.post_id, anchor="r", id=post.post_id }) - post.timestamp = os.date("%Y-%m-%d (%a) %H:%M:%S", post.timestamp) - post.file_size = math.floor(post.file_size / 1024) - post.file_dimensions = "" - - if post.file_width > 0 and post.file_height > 0 then - post.file_dimensions = string.format(", %dx%d", post.file_width, post.file_height) - end - - if not post.file_duration or post.file_duration == "0" then - post.file_duration = "" - else - post.file_duration = string.format(", %s", post.file_duration) - end - - if post.file_path then - local name, ext = post.file_path:match("^(.+)(%..+)$") - ext = string.lower(ext) - - -- Get thumbnail URL - if post.file_type == "audio" then - if post == thread.posts[#thread.posts] then - post.thumb = self:format_url(self.static_url, "op_audio.png") - else - post.thumb = self:format_url(self.static_url, "post_audio.png") - end - elseif post.file_type == "image" then - if post.file_spoiler then - if post == thread.posts[#thread.posts] then - post.thumb = self:format_url(self.static_url, "op_spoiler.png") - else - post.thumb = self:format_url(self.static_url, "post_spoiler.png") - end - else - if ext == ".webm" or ext == ".svg" then - post.thumb = self:format_url(self.files_url, self.board.name, 's' .. name .. '.png') - else - post.thumb = self:format_url(self.files_url, self.board.name, 's' .. post.file_path) - end - end - end - - post.file_path = self:format_url(self.files_url, self.board.name, post.file_path) - end - - -- Process comment - if post.comment then - local comment = post.comment - comment = format.sanitize(comment) - comment = format.quote(comment, self, self.board, post) - comment = format.green_text(comment) - comment = format.blue_text(comment) - comment = format.spoiler(comment) - comment = format.new_lines(comment) - post.comment = comment - else - post.comment = "" - end - end - end - end, - on_error = function(self) - self.errors = generate.errors(self.i18n, self.errors) - return { render = "board"} - end, - GET = function() - return { render = "board" } - end, - POST = function(self) - -- Validate CSRF token - csrf.assert_token(self) - - local board_url = self:url_for("web.boards.board", { uri_name=self.board.name }) - - -- Submit new thread - if self.params.submit then - -- Validate user input - assert_valid(self.params, { - { "name", max_length=255 }, - { "subject", max_length=255 }, - { "options", max_length=255 }, - { "comment", max_length=self.text_size } - }) - - -- Validate post - local post = assert_error(process.create_thread(self.params, self.session, self.board)) - return { redirect_to = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=post.post_id, anchor="p", id=post.post_id }) } - end - - -- Delete thread - if self.params.delete and self.params.thread_id then - -- Validate user input - assert_valid(self.params, { - { "post_id", exists=true } - }) - - -- Validate deletion - assert_error(process.delete_thread(self.params, self.session, self.board)) - return { redirect_to = board_url } - end - - -- Delete post - if self.params.delete and not self.params.thread_id then - -- Validate user input - assert_valid(self.params, { - { "post_id", exists=true } - }) - - -- Validate deletion - assert_error(process.delete_post(self.params, self.session, self.board)) - return { redirect_to = board_url } - end - - -- Report post - if self.params.report then - -- Validate user input - assert_valid(self.params, { - { "board", exists=true }, - { "post_id", exists=true } - }) - - -- Validate report - assert_error(process.report_post(self.params, self.board)) - return { redirect_to = board_url } - end - - -- Admin commands - if self.session.admin or self.session.mod then - -- Sticky thread - if self.params.sticky then - assert_error(process.sticky_thread(self.params, self.board)) - return { redirect_to = board_url } - end - - -- Lock thread - if self.params.lock then - assert_error(process.lock_thread(self.params, self.board)) - return { redirect_to = board_url } - end - - -- Save thread - if self.params.save then - assert_error(process.save_thread(self.params, self.board)) - return { redirect_to = board_url } - end - - -- Override thread - if self.params.override then - assert_error(process.override_thread(self.params, self.board)) - return { redirect_to = board_url } - end - - -- Ban user - if self.params.ban then - assert_error(process.ban_user(self.params, self.board)) - return { redirect_to = board_url } - end - end - - return { redirect_to = board_url } - end -} diff --git a/misc/website/backend/app/src/apps/web/boards/catalog.lua b/misc/website/backend/app/src/apps/web/boards/catalog.lua deleted file mode 100755 index 1e2eee8..0000000 --- a/misc/website/backend/app/src/apps/web/boards/catalog.lua +++ /dev/null @@ -1,128 +0,0 @@ -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local process = require "utils.request_processor" -local capture = require "utils.capture" -local csrf = require "lapis.csrf" -local format = require "utils.text_formatter" -local generate = require "utils.generate" -local Posts = require "models.posts" - -return { - before = function(self) - - -- Get board - for _, board in ipairs(self.boards) do - if board.name == self.params.uri_name then - self.board = board - break - end - end - - -- Board not found - if not self.board then - return self:write({ redirect_to = self:url_for("web.pages.index") }) - end - - -- Get announcements - -- TODO: Consolidate these into a single call - self.announcements = assert_error(capture.get(self:url_for("api.announcements.announcement", { uri_id="global" }))) - local board_announcements = assert_error(capture.get(self:url_for("api.boards.announcements", { uri_name=self.params.uri_name }))) - for _, announcement in ipairs(board_announcements) do - table.insert(self.announcements, announcement) - end - - -- Page title - self.page_title = string.format( - "/%s/ - %s", - self.board.name, - self.board.title - ) - - -- Nav links link to sub page if available - self.sub_page = "catalog" - - -- Flag comments as required or not - self.comment_flag = self.board.thread_comment - - -- Generate CSRF token - self.csrf_token = csrf.generate_token(self) - - -- Get threads - local response = assert_error(capture.get(self:url_for("api.boards.threads", { uri_name=self.params.uri_name }))) - self.threads = response.threads - - -- Get stats - for _, thread in ipairs(self.threads) do - thread.op = Posts:get_thread_op(thread.id) - thread.replies = Posts:count_posts(thread.id) - 1 - thread.files = Posts:count_files(thread.id) - thread.url = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=thread.op.post_id }) - - if thread.op.file_path then - local name, ext = thread.op.file_path:match("^(.+)(%..+)$") - ext = string.lower(ext) - - -- Get thumbnail URL - if thread.op.file_type == "audio" then - thread.op.thumb = self:format_url(self.static_url, "post_audio.png") - elseif thread.op.file_type == "image" then - if thread.op.file_spoiler then - thread.op.thumb = self:format_url(self.static_url, "post_spoiler.png") - else - if ext == ".webm" or ext == ".svg" then - thread.op.thumb = self:format_url(self.files_url, self.board.name, 's' .. name .. '.png') - else - thread.op.thumb = self:format_url(self.files_url, self.board.name, 's' .. thread.op.file_path) - end - end - end - - thread.op.file_path = self:format_url(self.files_url, self.board.name, thread.op.file_path) - end - - -- Process comment - if thread.op.comment then - local comment = thread.op.comment - comment = format.sanitize(comment) - comment = format.spoiler(comment) - comment = format.new_lines(comment) - - if #comment > 260 then - comment = comment:sub(1, 250) .. "..." - end - - thread.op.comment = comment - else - thread.op.comment = "" - end - end - end, - on_error = function(self) - self.errors = generate.errors(self.i18n, self.errors) - return { render = "catalog"} - end, - GET = function() - return { render = "catalog" } - end, - POST = function(self) - -- Validate CSRF token - csrf.assert_token(self) - - -- Submit new thread - if self.params.submit and not self.thread then - -- Validate user input - assert_valid(self.params, { - { "name", max_length=255 }, - { "subject", max_length=255 }, - { "options", max_length=255 }, - { "comment", max_length=self.text_size } - }) - - -- Validate post - local post = assert_error(process.create_thread(self.params, self.session, self.board)) - return { redirect_to = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=post.post_id, anchor="p", id=post.post_id }) } - end - - return { redirect_to = self:url_for("web.boards.catalog", { uri_name=self.board.name }) } - end -} diff --git a/misc/website/backend/app/src/apps/web/boards/thread.lua b/misc/website/backend/app/src/apps/web/boards/thread.lua deleted file mode 100755 index 395df43..0000000 --- a/misc/website/backend/app/src/apps/web/boards/thread.lua +++ /dev/null @@ -1,242 +0,0 @@ -local assert_error = require("lapis.application").assert_error -local assert_valid = require("lapis.validate").assert_valid -local csrf = require "lapis.csrf" -local capture = require "utils.capture" -local format = require "utils.text_formatter" -local generate = require "utils.generate" -local process = require "utils.request_processor" -local Posts = require "models.posts" - -return { - before = function(self) - - -- Get board - for _, board in ipairs(self.boards) do - if board.name == self.params.uri_name then - self.board = board - break - end - end - - -- Board not found - if not self.board then - return self:write({ redirect_to = self:url_for("web.pages.index") }) - end - - -- Get current thread data - local post = Posts:get(self.board.id, self.params.thread) - if not post then - return self:write({ redirect_to = self:url_for("web.boards.board", { uri_name=self.board.name }) }) - end - - self.thread = post:get_thread() - if not self.thread then - return self:write({ redirect_to = self:url_for("web.boards.board", { uri_name=self.board.name }) }) - end - - local op = self.thread:get_op() - if post.post_id ~= op.post_id then - return self:write({ redirect_to = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=op.post_id, anchor="p", id=post.post_id }) }) - end - - -- Get announcements - -- TODO: Consolidate these into a single call - self.announcements = assert_error(capture.get(self:url_for("api.announcements.announcement", { uri_id="global" }))) - local board_announcements = assert_error(capture.get(self:url_for("api.boards.announcements", { uri_name=self.params.uri_name }))) - for _, announcement in ipairs(board_announcements) do - table.insert(self.announcements, announcement) - end - - -- Page title - self.page_title = string.format( - "/%s/ - %s", - self.board.name, - self.board.title - ) - - -- Flag comments as required or not - self.comment_flag = self.board.thread_comment - - -- Generate CSRF token - self.csrf_token = csrf.generate_token(self) - - -- Determine if we allow a user to upload a file - self.num_files = Posts:count_files(self.thread.id) - - -- Get posts - self.posts = self.thread:get_posts() - - -- Format comments - for i, post in ipairs(self.posts) do - -- OP gets a thread tag - if i == 1 then - post.thread = post.post_id - end - - post.name = post.name or self.board.anon_name - post.reply = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=self.posts[1].post_id, anchor="q", id=post.post_id }) - post.link = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=self.posts[1].post_id, anchor="p", id=post.post_id }) - post.timestamp = os.date("%Y-%m-%d (%a) %H:%M:%S", post.timestamp) - post.file_size = math.floor(post.file_size / 1024) - post.file_dimensions = "" - - if post.file_width > 0 and post.file_height > 0 then - post.file_dimensions = string.format(", %dx%d", post.file_width, post.file_height) - end - - if not post.file_duration or post.file_duration == "0" then - post.file_duration = "" - else - post.file_duration = string.format(", %s", post.file_duration) - end - - if post.file_path then - local name, ext = post.file_path:match("^(.+)(%..+)$") - ext = string.lower(ext) - - -- Get thumbnail URL - if post.file_type == "audio" then - if post == self.posts[1] then - post.thumb = self:format_url(self.static_url, "op_audio.png") - else - post.thumb = self:format_url(self.static_url, "post_audio.png") - end - elseif post.file_type == "image" then - if post.file_spoiler then - if post == self.posts[1] then - post.thumb = self:format_url(self.static_url, "op_spoiler.png") - else - post.thumb = self:format_url(self.static_url, "post_spoiler.png") - end - else - if ext == ".webm" or ext == ".svg" then - post.thumb = self:format_url(self.files_url, self.board.name, 's' .. name .. '.png') - else - post.thumb = self:format_url(self.files_url, self.board.name, 's' .. post.file_path) - end - end - end - - post.file_path = self:format_url(self.files_url, self.board.name, post.file_path) - end - - -- Process comment - if post.comment then - local comment = post.comment - comment = format.sanitize(comment) - comment = format.quote(comment, self, self.board, post) - comment = format.green_text(comment) - comment = format.blue_text(comment) - comment = format.spoiler(comment) - comment = format.new_lines(comment) - post.comment = comment - else - post.comment = "" - end - end - end, - on_error = function(self) - self.errors = generate.errors(self.i18n, self.errors) - return { render = "thread"} - end, - GET = function() - return { render = "thread" } - end, - POST = function(self) - -- Validate CSRF token - csrf.assert_token(self) - - local board_url = self:url_for("web.boards.board", { uri_name=self.board.name }) - local thread_url = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=self.posts[1].post_id }) - - -- Submit new post - if self.params.submit and self.thread then - -- Validate user input - assert_valid(self.params, { - { "thread", exists=true }, - { "name", max_length=255 }, - { "subject", max_length=255 }, - { "options", max_length=255 }, - { "comment", max_length=self.text_size } - }) - - -- Validate post - local post = assert_error(process.create_post(self.params, self.session, self.board, self.thread)) - return { redirect_to = self:url_for("web.boards.thread", { uri_name=self.board.name, thread=self.posts[1].post_id, anchor="p", id=post.post_id }) } - end - - -- Delete thread - if self.params.delete and self.params.thread_id then - -- Validate user input - assert_valid(self.params, { - { "post_id", exists=true } - }) - - -- Validate deletion - assert_error(process.delete_thread(self.params, self.session, self.board)) - return { redirect_to = board_url } - end - - -- Delete post - if self.params.delete and not self.params.thread_id then - -- Validate user input - assert_valid(self.params, { - { "post_id", exists=true } - }) - - -- Validate deletion - assert_error(process.delete_post(self.params, self.session, self.board)) - return { redirect_to = thread_url } - end - - -- Report post - if self.params.report then - -- Validate user input - assert_valid(self.params, { - { "board", exists=true }, - { "post_id", exists=true } - }) - - -- Validate report - assert_error(process.report_post(self.params, self.board)) - return { redirect_to = thread_url } - end - - -- Admin commands - if self.session.admin or self.session.mod then - -- Sticky thread - if self.params.sticky then - assert_error(process.sticky_thread(self.params, self.board)) - return { redirect_to = thread_url } - end - - -- Lock thread - if self.params.lock then - assert_error(process.lock_thread(self.params, self.board)) - return { redirect_to = thread_url } - end - - -- Save thread - if self.params.save then - assert_error(process.save_thread(self.params, self.board)) - return { redirect_to = thread_url } - end - - -- Override thread - if self.params.override then - assert_error(process.override_thread(self.params, self.board)) - return { redirect_to = thread_url } - end - - -- Ban user - if self.params.ban then - assert_error(process.ban_user(self.params, self.board)) - return { redirect_to = thread_url } - end - - return { redirect_to = thread_url } - end - - return { redirect_to = thread_url } - end -} diff --git a/misc/website/backend/app/src/apps/web/internal/check_auth.lua b/misc/website/backend/app/src/apps/web/internal/check_auth.lua deleted file mode 100755 index 8711f4b..0000000 --- a/misc/website/backend/app/src/apps/web/internal/check_auth.lua +++ /dev/null @@ -1,29 +0,0 @@ -local Users = require "models.users" - -return function(self) - -- Prepare session names - self.session.names = self.session.names or {} - - -- Verify Authorization - if self.session.name then - local user = Users:get_user(self.session.name) - - if user then - user.password = nil - self.session.admin = user.admin - self.session.mod = user.mod - self.session.janitor = user.janitor - else - self.session.admin = nil - self.session.mod = nil - self.session.janitor = nil - end - else - self.session.admin = nil - self.session.mod = nil - self.session.janitor = nil - end - - -- Get IP from ngx - self.params.ip = self.req.headers["X-Real-IP"] or self.req.remote_addr -end diff --git a/misc/website/backend/app/src/apps/web/internal/check_ban.lua b/misc/website/backend/app/src/apps/web/internal/check_ban.lua deleted file mode 100755 index bf69b7d..0000000 --- a/misc/website/backend/app/src/apps/web/internal/check_ban.lua +++ /dev/null @@ -1,41 +0,0 @@ -local assert_error = require("lapis.application").assert_error -local capture = require "utils.capture" - -return function(self) - -- MODS = FAGS - if self.session.admin or - self.session.mod or - self.session.janitor or - self.route_name == "admin" then - return - end - - -- Get list of bans by ip - local bans = assert_error(capture.get(self:url_for("api.bans.bans_ip", { uri_ip=self.params.ip }))) - - -- Get current board - local board = {} - if self.params.uri_name then - board = assert_error(capture.get(self:url_for("api.boards.board", { uri_name=self.params.uri_name }))) - end - - -- If you are banned, gtfo - for _, ban in ipairs(bans) do - if ban.board_id == 0 or - ban.board_id == board.id then - - -- Ban data - self.ip = ban.ip - self.reason = ban.reason or self.i18n("err_ban_reason") - self.expire = os.date("%Y-%m-%d (%a) %H:%M:%S", ban.time + ban.duration) - - -- Page title - self.page_title = self.i18n("ban_title") - - -- Display a theme - self.board = { theme = "yotsuba_b" } - - return self:write({ render = "banned" }) - end - end -end diff --git a/misc/website/backend/app/src/apps/web/internal/code_404.lua b/misc/website/backend/app/src/apps/web/internal/code_404.lua deleted file mode 100755 index 5b545ad..0000000 --- a/misc/website/backend/app/src/apps/web/internal/code_404.lua +++ /dev/null @@ -1,14 +0,0 @@ -local Boards = require "models.boards" - -return function(self) - -- Get all board data - self.boards = Boards:get_boards() - - -- Page title - self.page_title = self.i18n("404") - - -- Display a theme - self.board = { theme = "yotsuba_b" } - - return { render = "code_404", status = "404" } -end diff --git a/misc/website/backend/app/src/apps/web/internal/config_site.lua b/misc/website/backend/app/src/apps/web/internal/config_site.lua deleted file mode 100755 index 1e42595..0000000 --- a/misc/website/backend/app/src/apps/web/internal/config_site.lua +++ /dev/null @@ -1,45 +0,0 @@ -local config = require("lapis.config").get() -local assert_error = require("lapis.application").assert_error -local i18n = require "i18n" -local lfs = require "lfs" -local capture = require "utils.capture" - -return function(self) - -- Set basic information - self.software = "Lapis-chan" - self.version = "1.2.5" - self.site_name = config.site_name - self.text_size = _G.text_size - - -- Get localization files - self.locales = {} - for file in lfs.dir("src/locale") do - local name, ext = string.match(file, "^(.+)%.(.+)$") - if ext == "lua" then - table.insert(self.locales, name) - end - end - - -- Set localization - if self.params.locale then - self.session.locale = self.params.locale - end - - i18n.setLocale(self.session.locale or "en") - i18n.loadFile("src/locale/en.lua") - if i18n.getLocale() ~= "en" then - i18n.loadFile("locale/" .. i18n.getLocale() .. ".lua") - end - self.i18n = i18n - - -- Get all boards - self.boards = assert_error(capture.get(self:url_for("api.boards.boards"))) - - -- Static - self.static_url = "/static/%s" - self.files_url = "/files/%s/%s" - - function self.format_url(_, pattern, ...) - return self:build_url(string.format(pattern, ...)) - end -end diff --git a/misc/website/backend/app/src/apps/web/internal/install.lua b/misc/website/backend/app/src/apps/web/internal/install.lua deleted file mode 100755 index 002786e..0000000 --- a/misc/website/backend/app/src/apps/web/internal/install.lua +++ /dev/null @@ -1,333 +0,0 @@ -local Users = require "models.users" -local Boards = require "models.boards" -local Pages = require "models.pages" -local lfs = require "lfs" -local validate = require("lapis.validate").validate -local faq = [[ -
- Lapis-chan is an open source imageboard web application written in Lua - using the Lapis web framework. -
-- Lapchan is a website that runs the latest version of Lapis-chan. It is - both used as a small community and a testing platform for new and - experimental features. -
-- Before posting, you should read the rules for whichever board you want to - post in. If you break the rules, your post may be deleted and you may - also earn yourself a temporary or permanent ban from the board or entire - website. Please read the rules! -
-- In general, "blue" boards are considered safe for work (SFW) and "red" - boards are considered not safe for work (NSFW). The definition of - work-safety is often loose, but in general it means there shouldn't be - any direct pornographic material on a blue board. This may differ from - site to site, but Lapis-chan by default offers blue and red themes that - are nearly identical to 4chan's themes. New themes are expected in later - releases. -
-- It is also worth noting that chan culture can be both friendly and - abrasive. More often than not, users will be posting anonymously and are - able to speak freely because if this. Be prepared for the best and worst - of society when interacting with others in an anonymous forum. -
-- By default, all users are anonymous to each other. By leaving the "Name" - field empty in a post, your name will simply be fille din with the - board's default name. Identifiable information such as your IP address is - recorded to the Lapis-chan database when you post for legal reasons, but - all posts are permanently purged after some time unless otherwise noted, - including your IP address and any other information attached to your - post. -
-- Some boards require you to post an image or a comment, others do not. By - default, Lapis-chan will place "(Required)" in or near a field that - requires data. Currently, Lapis-chan's only optionally required data - include a comment and an image. -
-- To quote (and link to) another post, simply type ">>" followed by - the post number (e.g. >>2808). To quote a post that is on a - different board, You must type ">>>" follow by a slash, the - name of the board, another slash, and then the post number - (e.g. >>>/a/2808). -
-- A tripcode is a uniquely identifiable hash attached to the end of your - name, or in lieu of a name. It is a completely optional feature that - allows users to de-anonymize if they so choose. Some boards benefit from - de-anonymization such as content-creation boards where being named can - help get your content seen and recognized. -
-- Tripcodes come in two sizes: insecure and secure. Insecure tripcodes use - a weak hashing method that allows users to game the algorithm to generate - a hash that reads out something similar to what they want. A secure - tripcode uses a very secure hashing algorithm and a server-specific - secret token that is not gameable, but also significantly more difficult - to impersonate. -
-- To use an insecure tripcode, place a hash ("#") sign at the end of your - name (or leave a name out entirely) and type your password after the - hash. To use a secure tripcode, simply use two hashes instead of one - (e.g. lapchan#insecure, lapchan##secure, #nameless, ##nameless). -
-- Yes. When you upload an image, there should be a check box beside the - file input field. Checking that box will replace the thumbnail of your - image with a spoiler image. -
-- You can also tag text within your post as a spoiler by writing your text - with [spoiler]a spoiler tag[/spoiler]. -
-- Post options are optional features you can use to modify how your post - affects the thread or board you are posting in. To apply an options, - simply type the option code into the options field in your post. - Currently, the options available include: -
-- Lapis-chan has several different types of boards with more planned in the - future. Currently, Lapis-chan supports the following boards: -
-<%= action %>
-[<%= i18n("return") %>] diff --git a/misc/website/backend/app/src/views/admin/user.etlua b/misc/website/backend/app/src/views/admin/user.etlua deleted file mode 100755 index dd0a932..0000000 --- a/misc/website/backend/app/src/views/admin/user.etlua +++ /dev/null @@ -1,71 +0,0 @@ -- - <%= i18n('arc_display', { - n_thread = #threads, - p_thread = i18n('threads', { count=#threads }), - n_day = days, - p_day = i18n('days', { count=days }) - }) %> - -
-| <%= i18n('arc_number') %> | -<%= i18n('arc_name') %> | -<%= i18n('arc_excerpt') %> | -<%= i18n('arc_replies') %> | -- |
| <%= thread.op.post_id %> | -<%= thread.op.name %> <%= thread.op.trip %> | -- <% if thread.op.subject then %> - <%= thread.op.subject %>: - <% end %> - <%- thread.op.comment %> - | -<%= thread.replies %> | -[<%= i18n('arc_view') %>] | -
<%= i18n('ban_reason') %>
-<%= reason %>
-<%- i18n('ban_expire', { expire=''..expire..'' }) %>
-<%- i18n('ban_ip', { ip=''..ip..'' }) %>
-
<%= announcement.text %>
-<% end %> -<% end %> diff --git a/misc/website/backend/app/src/views/fragments/board_title.etlua b/misc/website/backend/app/src/views/fragments/board_title.etlua deleted file mode 100755 index 0c6358b..0000000 --- a/misc/website/backend/app/src/views/fragments/board_title.etlua +++ /dev/null @@ -1,6 +0,0 @@ -<%- i18n('copy_software', { - software = ''..software..'', - version = 'v'..version - }) %>
-<%- i18n('copy_download', { - github = 'GitHub' - }) %>
-<%= err %>
-<% end %> -- * - <%= i18n("form_required") %> -
-- <%- - i18n("form_readme", { -- FIXME - rules = 'Rules', - faq = 'FAQ' - }) - %> -
-(<%= board.ban_message %>)
- <% end %> -| <%= i18n("board") %> | -<%= i18n("rules") %> | -
| <%= board.title %> | -<%- board.rules %> | -
(<%= board.ban_message %>)
- <% end %> -