Skip to content

Commit

Permalink
Fixed error handling
Browse files Browse the repository at this point in the history
* Reformatted how errors are handled
* Improved linting of much of the code (still not perfect)
karai17 committed Nov 29, 2016
1 parent 1a2285f commit e24a96c
Showing 21 changed files with 111 additions and 130 deletions.
6 changes: 2 additions & 4 deletions controllers/admin.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
local assert_error = require("lapis.application").assert_error
local csrf = require "lapis.csrf"
local generate = require "utils.generate"
local Announcements = require "models.announcements"
local Boards = require "models.boards"
local Pages = require "models.pages"
@@ -35,10 +36,7 @@ return {
end
end,
on_error = function(self)
local err = self.i18n(unpack(self.errors))
if err then
self.errors = { err }
end
self.errors = generate.errors(self.i18n, self.errors)

if not self.session.name then
return { render = "admin.login" }
6 changes: 2 additions & 4 deletions controllers/admin_announcement.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
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 Announcements = require "models.announcements"
local Boards = require "models.boards"

@@ -67,10 +68,7 @@ return {
end
end,
on_error = function(self)
local err = self.i18n(unpack(self.errors))
if err then
self.errors = { err }
end
self.errors = generate.errors(self.i18n, self.errors)

if not self.session.name then
return { render = "admin.login" }
6 changes: 2 additions & 4 deletions controllers/admin_board.lua
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@ local assert_error = require("lapis.application").assert_error
local assert_valid = require("lapis.validate").assert_valid
local csrf = require "lapis.csrf"
local lfs = require "lfs"
local generate = require "utils.generate"
local Boards = require "models.boards"
local Posts = require "models.posts"
local Threads = require "models.threads"
@@ -88,10 +89,7 @@ return {
end
end,
on_error = function(self)
local err = self.i18n(unpack(self.errors))
if err then
self.errors = { err }
end
self.errors = generate.errors(self.i18n, self.errors)

if not self.session.name then
return { render = "admin.login" }
6 changes: 2 additions & 4 deletions controllers/admin_page.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
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"

@@ -67,10 +68,7 @@ return {
end
end,
on_error = function(self)
local err = self.i18n(unpack(self.errors))
if err then
self.errors = { err }
end
self.errors = generate.errors(self.i18n, self.errors)

if not self.session.name then
return { render = "admin.login" }
7 changes: 2 additions & 5 deletions controllers/admin_report.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
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 Reports = require "models.reports"

@@ -43,10 +43,7 @@ return {
end
end,
on_error = function(self)
local err = self.i18n(unpack(self.errors))
if err then
self.errors = { err }
end
self.errors = generate.errors(self.i18n, self.errors)

if not self.session.name then
return { render = "admin.login" }
6 changes: 2 additions & 4 deletions controllers/admin_user.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
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"

@@ -67,10 +68,7 @@ return {
end
end,
on_error = function(self)
local err = self.i18n(unpack(self.errors))
if err then
self.errors = { err }
end
self.errors = generate.errors(self.i18n, self.errors)

if not self.session.name then
return { render = "admin.login" }
14 changes: 3 additions & 11 deletions controllers/board.lua
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@ local assert_error = require("lapis.application").assert_error
local assert_valid = require("lapis.validate").assert_valid
local csrf = require "lapis.csrf"
local format = require "utils.text_formatter"
local generate = require "utils.generate"
local process = require "utils.request_processor"
local Announcements = require "models.announcements"
local Boards = require "models.boards"
@@ -139,19 +140,10 @@ return {
end
end,
on_error = function(self)
print("WWWWWWWWWWWWWWWW::")
for k,v in pairs(self.errors) do
print(k..":"..v.."::")
end

local err = self.i18n(unpack(self.errors))
if err then
self.errors = { err }
end

self.errors = generate.errors(self.i18n, self.errors)
return { render = "board"}
end,
GET = function(self)
GET = function()
return { render = "board" }
end,
POST = function(self)
9 changes: 3 additions & 6 deletions controllers/catalog.lua
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@ local assert_valid = require("lapis.validate").assert_valid
local process = require "utils.request_processor"
local csrf = require "lapis.csrf"
local format = require "utils.text_formatter"
local generate = require "utils.generate"
local Announcements = require "models.announcements"
local Boards = require "models.boards"
local Posts = require "models.posts"
@@ -93,14 +94,10 @@ return {
end
end,
on_error = function(self)
local err = self.i18n(unpack(self.errors))
if err then
self.errors = { err }
end

self.errors = generate.errors(self.i18n, self.errors)
return { render = "catalog"}
end,
GET = function(self)
GET = function()
return { render = "catalog" }
end,
POST = function(self)
2 changes: 1 addition & 1 deletion controllers/config_site.lua
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@ local lfs = require "lfs"
return function(self)
-- Set basic information
self.software = "Lapis-chan"
self.version = "1.2.0"
self.version = "1.2.1"
self.site_name = config.site_name
self.text_size = _G.text_size

9 changes: 3 additions & 6 deletions controllers/thread.lua
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@ local assert_error = require("lapis.application").assert_error
local assert_valid = require("lapis.validate").assert_valid
local csrf = require "lapis.csrf"
local format = require "utils.text_formatter"
local generate = require "utils.generate"
local process = require "utils.request_processor"
local Announcements = require "models.announcements"
local Boards = require "models.boards"
@@ -140,14 +141,10 @@ return {
end
end,
on_error = function(self)
local err = self.i18n(unpack(self.errors))
if err then
self.errors = { err }
end

self.errors = generate.errors(self.i18n, self.errors)
return { render = "thread"}
end,
GET = function(self)
GET = function()
return { render = "thread" }
end,
POST = function(self)
8 changes: 4 additions & 4 deletions models/announcements.lua
Original file line number Diff line number Diff line change
@@ -12,16 +12,16 @@ function Announcements:create_announcement(ann)
"board_id", "text"
}, nil)

local ann = self:create {
local a = self:create {
board_id = ann.board_id,
text = ann.text
}

if ann then
return ann
if a then
return a
end

return false, "err_create_ann", { ann.text }
return false, { "err_create_ann", { ann.text } }
end

--- Modify an announcement
10 changes: 5 additions & 5 deletions models/bans.lua
Original file line number Diff line number Diff line change
@@ -13,19 +13,19 @@ function Bans:create_ban(ban)
"ip", "board_id", "reason", "duration",
}, nil)

local ban = self:create {
local b = self:create {
ip = ban.ip,
board_id = ban.board_id,
reason = ban.reason,
time = os.time(),
duration = (ban.duration and ban.duration or 3) * 24 * 60 * 60
}

if ban then
return ban
else
return false, "err_create_ban", { ban.ip }
if b then
return b
end

return false, { "err_create_ban", { ban.ip } }
end

--- Delete ban
12 changes: 6 additions & 6 deletions models/boards.lua
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ function Boards:create_board(board)
"archive", "archive_time", "group"
}, nil)

local board = self:create {
local b = self:create {
short_name = board.short_name,
name = board.name,
subtext = board.subtext,
@@ -46,12 +46,12 @@ function Boards:create_board(board)
group = board.group
}

if board then
lfs.mkdir(string.format("./static/%s/", board.short_name))
return board
if b then
lfs.mkdir(string.format("./static/%s/", b.short_name))
return b
end

return false, "err_create_board", { board.short_name, board.name }
return false, { "err_create_board", { board.short_name, board.name } }
end

--- Modify a board.
@@ -106,7 +106,7 @@ function Boards:delete_board(board, threads, posts)
return lfs.rmdir(dir)
end

return false, "err_delete_board", { board.short_name, board.name }
return false, { "err_delete_board", { board.short_name, board.name } }
end

--- Get all boards
11 changes: 6 additions & 5 deletions models/pages.lua
Original file line number Diff line number Diff line change
@@ -12,17 +12,18 @@ function Pages:create_page(page)
"name", "url", "content"
}, nil)

local page = self:create {
local p = self:create {
name = page.name,
url = page.url,
content = page.content
}

if page then
return page
else
return false, "err_create_page", { page.url, page.name }
if p then
return p
end

return false, { "err_create_page", { page.url, page.name } }

end

--- Modify a page
27 changes: 13 additions & 14 deletions models/posts.lua
Original file line number Diff line number Diff line change
@@ -2,7 +2,6 @@ local encoding = require "lapis.util.encoding"
local trim = require("lapis.util").trim_filter
local Model = require("lapis.db.model").Model
local giflib = require "giflib"
local lfs = require "lfs"
local magick = require "magick"
local md5 = require "md5"
local filetypes = require "utils.file_whitelist"
@@ -56,23 +55,23 @@ function Posts:prepare_post(params, session, board, thread, files)
-- Check board flags
if thread then
if thread.lock and not session.admin and not session.mod then
return false, "err_locked_thread", { thread.post_id }
return false, { "err_locked_thread", { thread.post_id } }
end

if board.post_comment and not params.comment then
return false, "err_comment_post"
return false, { "err_comment_post" }
end

if board.post_file and #params.file.content == 0 then
return false, "err_file_post"
return false, { "err_file_post" }
end
else
if board.thread_comment and not params.comment then
return false, "err_comment_thread"
return false, { "err_comment_thread" }
end

if board.thread_file and #params.file.content == 0 then
return false, "err_file_thread"
return false, { "err_file_thread" }
end
end

@@ -86,13 +85,13 @@ function Posts:prepare_post(params, session, board, thread, files)

-- Reject files in text-only boards
if board.text_only then
return false, "err_no_files"
return false, { "err_no_files" }
end

-- Thread limit is already met.
if thread then
if files >= board.thread_file_limit and not thread.size_override then
return false, "err_file_limit", { thread.post_id }
return false, { "err_file_limit", { thread.post_id } }
end
end

@@ -108,7 +107,7 @@ function Posts:prepare_post(params, session, board, thread, files)
local image = magick.load_image_from_blob(params.file.content)

if not image then
return false, "err_invalid_image"
return false, { "err_invalid_image" }
end

params.file_width = image:get_width()
@@ -117,7 +116,7 @@ function Posts:prepare_post(params, session, board, thread, files)
elseif filetypes.audio[ext] and board.filetype_audio then
params.file_type = "audio"
else
return false, "err_invalid_ext", { ext }
return false, { "err_invalid_ext", { ext } }
end

params.file_name = params.file.filename
@@ -134,15 +133,15 @@ function Posts:prepare_post(params, session, board, thread, files)
-- Check if file already exists
local file = self:find_file(board.id, params.file_md5)
if file then
return false, "err_file_exists"
return false, { "err_file_exists" }
end
else
params.file_spoiler = false
end

-- Check contributions
if not params.comment and not params.file_name then
return false, "err_contribute"
return false, { "err_contribute" }
end

return true
@@ -279,7 +278,7 @@ function Posts:create_post(params, session, board, thread, op)

return post
else
return false, "err_create_post"
return false, { "err_create_post" }
end
end

@@ -328,7 +327,7 @@ function Posts:delete_post(session, board, post)
if success then
return success
else
return false, "err_delete_post", { post.post_id }
return false, { "err_delete_post", { post.post_id } }
end
end

10 changes: 5 additions & 5 deletions models/reports.lua
Original file line number Diff line number Diff line change
@@ -13,19 +13,19 @@ function Reports:create_report(report)
"timestamp", "num_reports"
}, nil)

local report = self:create {
local r = self:create {
board_id = report.board_id,
thread_id = report.thread_id,
post_id = report.post_id,
timestamp = report.timestamp,
num_reports = report.num_reports
}

if report then
return report
else
return false, "err_create_report"
if r then
return r
end

return false, { "err_create_report" }
end

--- Modify a report
12 changes: 6 additions & 6 deletions models/threads.lua
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@ function Threads:create_thread(board_id, flags)
"size_override", "save"
}, false)

local thread = self:create {
local t = self:create {
board_id = board_id,
last_active = os.time(),
sticky = flags.sticky,
@@ -23,11 +23,11 @@ function Threads:create_thread(board_id, flags)
save = flags.save
}

if thread then
return thread
else
return false, "err_create_thread"
if t then
return t
end

return false, { "err_create_thread" }
end

--- Delete entire thread
@@ -59,7 +59,7 @@ function Threads:delete_thread(session, thread, op)
if success then
return success
else
return false, "err_delete_post", { op.post_id }
return false, { "err_delete_post", { op.post_id } }
end
end

16 changes: 8 additions & 8 deletions models/users.lua
Original file line number Diff line number Diff line change
@@ -20,19 +20,19 @@ function Users:create_user(user)
local hash = generate.hash(user.username .. user.password .. token)
user.password = nil

local user = self:create {
local u = self:create {
username = user.username,
password = hash,
admin = user.admin,
mod = user.mod,
janitor = user.janitor
}

if user then
return user
else
return false, "err_create_user", { user.username }
if u then
return u
end

return false, { "err_create_user", { user.username } }
end

--- Modify a user
@@ -70,7 +70,7 @@ function Users:verify_user(params)

-- No user found with that username
if not user then
return false, "err_invalid_user"
return false, { "err_invalid_user" }
end

-- Prepare password and remove raw password from memory
@@ -84,7 +84,7 @@ function Users:verify_user(params)
if verified then
return user
else
return false, "err_invalid_user"
return false, { "err_invalid_user" }
end
end

@@ -98,7 +98,7 @@ end
-- @tparam string username Username
-- @treturn table user
function Users:get_user(username)
local username = string.lower(username)
username = string.lower(username)
return unpack(self:select("where lower(username)=? limit 1", username))
end

13 changes: 13 additions & 0 deletions utils/generate.lua
Original file line number Diff line number Diff line change
@@ -77,4 +77,17 @@ function generate.hash(password)
return bcrypt.digest(password, 12)
end

function generate.errors(i18n, errors)
local err = {}

if #errors > 0 then
for _, error in ipairs(errors) do
local e = i18n(unpack(error))
table.insert(err, e)
end
end

return err
end

return generate
36 changes: 16 additions & 20 deletions utils/request_processor.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
local Bans = require "models.bans"
local Boards = require "models.boards"
local Threads = require "models.threads"
local Posts = require "models.posts"
local Reports = require "models.reports"
@@ -31,9 +30,6 @@ function process.create_thread(params, session, board)
return false, err
end

-- No need to query the db for this
local posts = 0

-- Archive old threads
local max_threads = board.threads_per_page * board.pages
Threads:archive_threads(board.id, max_threads)
@@ -116,13 +112,13 @@ function process.delete_thread(params, session, board)
-- Validate post
local post = Posts:get_post(board.id, params.thread_id)
if not post then
return false, "err_invalid_post", { params.thread_id }
return false, { "err_invalid_post", { params.thread_id } }
end

-- Validate thread
local thread = Threads:get_thread(post.thread_id)
if not thread then
return false, "err_invalid_thread"
return false, { "err_invalid_thread" }
end

local posts = Posts:get_posts_by_thread(thread.id)
@@ -151,13 +147,13 @@ function process.delete_post(params, session, board)
-- Validate post
local post = Posts:get_post(board.id, params.post_id)
if not post then
return false, "err_invalid_post", { params.post_id }
return false, { "err_invalid_post", { params.post_id } }
end

-- Validate thread
local thread = Threads:get_thread(post.thread_id)
if not thread then
return false, "err_invalid_thread"
return false, { "err_invalid_thread" }
end

-- Delete post
@@ -178,7 +174,7 @@ function process.report_post(params, board)
-- Validate post
local post = Posts:get_post(board.id, params.post_id)
if not post then
return false, "err_invalid_post", { params.thread }
return false, { "err_invalid_post", { params.thread } }
end

local report = Reports:get_report(board.id, post.post_id)
@@ -192,7 +188,7 @@ function process.report_post(params, board)
end
-- If report is new, create it
else
local report, err = Reports:create_report {
local _, err = Reports:create_report {
board_id = board.id,
thread_id = post.thread_id,
post_id = post.post_id,
@@ -212,13 +208,13 @@ function process.sticky_thread(params, board)
-- Validate post
local post = Posts:get_post(board.id, params.post_id)
if not post then
return false, "err_invalid_post", { params.post_id }
return false, { "err_invalid_post", { params.post_id } }
end

-- Validate thread
local thread = Threads:get_thread(post.thread_id)
if not thread then
return false, "err_invalid_thread"
return false, { "err_invalid_thread" }
end

thread.sticky = not thread.sticky
@@ -232,13 +228,13 @@ function process.lock_thread(params, board)
-- Validate post
local post = Posts:get_post(board.id, params.post_id)
if not post then
return false, "err_invalid_post", { params.post_id }
return false, { "err_invalid_post", { params.post_id } }
end

-- Validate thread
local thread = Threads:get_thread(post.thread_id)
if not thread then
return false, "err_invalid_thread"
return false, { "err_invalid_thread" }
end

thread.lock = not thread.lock
@@ -252,13 +248,13 @@ function process.save_thread(params, board)
-- Validate post
local post = Posts:get_post(board.id, params.post_id)
if not post then
return false, "err_invalid_post", { params.post_id }
return false, { "err_invalid_post", { params.post_id } }
end

-- Validate thread
local thread = Threads:get_thread(post.thread_id)
if not thread then
return false, "err_invalid_thread"
return false, { "err_invalid_thread" }
end

thread.save = not thread.save
@@ -272,13 +268,13 @@ function process.override_thread(params, board)
-- Validate post
local post = Posts:get_post(board.id, params.post_id)
if not post then
return false, "err_invalid_post", { params.post_id }
return false, { "err_invalid_post", { params.post_id } }
end

-- Validate thread
local thread = Threads:get_thread(post.thread_id)
if not thread then
return false, "err_invalid_thread"
return false, { "err_invalid_thread" }
end

thread.size_override = not thread.size_override
@@ -292,7 +288,7 @@ function process.ban_user(params, board)
-- Validate post
local post = Posts:get_post(board.id, params.post_id)
if not post then
return false, "err_invalid_post", { params.post_id }
return false, { "err_invalid_post", { params.post_id } }
end

params.ip = post.ip
@@ -303,7 +299,7 @@ function process.ban_user(params, board)
end

-- Ban user
local ban, err = Bans:create_ban(params)
local _, err = Bans:create_ban(params)
if err then
return false, err
end
15 changes: 7 additions & 8 deletions utils/text_formatter.lua
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
local Boards = require "models.boards"
local Threads = require "models.threads"
local Posts = require "models.posts"

local Boards = require "models.boards"
local Threads = require "models.threads"
local Posts = require "models.posts"
local escape = require("lapis.html").escape
local sf = string.format
local formatter = {}
@@ -79,11 +78,11 @@ function formatter.quote(text, request, board, post)

-- >>>/a/1234 check over here
-- >>>/(%w+)/(%d*)
local match_pattern = ">>>/(%w+)/(%d*)"
local sub_pattern = ">>>/%s/%s"
match_pattern = ">>>/(%w+)/(%d*)"
sub_pattern = ">>>/%s/%s"

-- Get all the matches and store them in an ordered list
local posts = {}
posts = {}
for b, post_id in text:gmatch(match_pattern) do
b = Boards:get_board(b) or b
table.insert(posts, { board=b, id=post_id })
@@ -106,7 +105,7 @@ function formatter.quote(text, request, board, post)
end

-- Substitute each match with the formatted match
local i = 0
i = 0
text = text:gsub(match_pattern, function()
i = i + 1
return posts[i]

0 comments on commit e24a96c

Please sign in to comment.