mirror of https://github.com/Calamitous/iris.git
Gracefully handle unparsable files and bad name data
This commit is contained in:
parent
c51cfb6def
commit
4a3871007b
48
iris.rb
48
iris.rb
|
@ -1,11 +1,6 @@
|
||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
# MVP:
|
# MVP: Complete!
|
||||||
# -----
|
|
||||||
# TODO: Don't crash when user names are cattywumpus
|
|
||||||
# TODO: Gracefully handle non-json files when/before parsing
|
|
||||||
# TODO: Gracefully validate message hashes on load
|
|
||||||
# TODO: Fix topic display of poster names to set width
|
|
||||||
#
|
#
|
||||||
# Reading/Status:
|
# Reading/Status:
|
||||||
# TODO: Add "read" list
|
# TODO: Add "read" list
|
||||||
|
@ -25,7 +20,7 @@
|
||||||
# TODO: Let Message initialization accept params as a hash
|
# TODO: Let Message initialization accept params as a hash
|
||||||
#
|
#
|
||||||
# Fancify interface:
|
# Fancify interface:
|
||||||
# TODO: Use ENV for rows and cols of display?
|
# TODO: Use ENV for rows and cols of display? (No)
|
||||||
# TODO: Pagination?
|
# TODO: Pagination?
|
||||||
# TODO: Make nicer topic display
|
# TODO: Make nicer topic display
|
||||||
# TODO: Add optional title for topics
|
# TODO: Add optional title for topics
|
||||||
|
@ -72,8 +67,36 @@ class IrisFile
|
||||||
return [] unless File.exists?(filepath)
|
return [] unless File.exists?(filepath)
|
||||||
|
|
||||||
# For logger: puts "Found, parsing #{filepath}..."
|
# For logger: puts "Found, parsing #{filepath}..."
|
||||||
payload = JSON.parse(File.read(filepath))
|
begin
|
||||||
raise 'Invalid File!' unless payload.is_a?(Array)
|
payload = JSON.parse(File.read(filepath))
|
||||||
|
rescue JSON::ParserError => e
|
||||||
|
if filepath == Config::MESSAGE_FILE
|
||||||
|
puts '*' * 80
|
||||||
|
puts 'Your message file appears to be corrupt.'
|
||||||
|
puts "Could not parse valid JSON from #{filepath}"
|
||||||
|
puts 'Please fix or delete this message file to use Iris.'
|
||||||
|
puts '*' * 80
|
||||||
|
exit(0)
|
||||||
|
else
|
||||||
|
puts " * Unable to parse #{filepath}, skipping..."
|
||||||
|
return []
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
unless payload.is_a?(Array)
|
||||||
|
if filepath == Config::MESSAGE_FILE
|
||||||
|
puts '*' * 80
|
||||||
|
puts 'Your message file appears to be corrupt.'
|
||||||
|
puts "Could not interpret data from #{filepath}"
|
||||||
|
puts '(It\'s not a JSON array of messages, as far as I can tell)'
|
||||||
|
puts 'Please fix or delete this message file to use Iris.'
|
||||||
|
puts '*' * 80
|
||||||
|
exit(0)
|
||||||
|
else
|
||||||
|
puts " * Unable to interpret data from #{filepath}, skipping..."
|
||||||
|
return []
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
uid = File.stat(filepath).uid
|
uid = File.stat(filepath).uid
|
||||||
username = Etc.getpwuid(uid).name
|
username = Etc.getpwuid(uid).name
|
||||||
|
@ -177,8 +200,11 @@ class Message
|
||||||
@errors << 'Unvalidatable; username is empty' if username.empty?
|
@errors << 'Unvalidatable; username is empty' if username.empty?
|
||||||
|
|
||||||
user_regex = Regexp.new("(.*)@#{Config::HOSTNAME}$")
|
user_regex = Regexp.new("(.*)@#{Config::HOSTNAME}$")
|
||||||
author_name = user_regex.match(author)[1]
|
author_match = user_regex.match(author)
|
||||||
@errors << "Bad username: got #{author}'s message from #{username}'s message file." unless author_name == username
|
|
||||||
|
unless author_match && author_match[1] == username
|
||||||
|
@errors << "Bad username: got #{author}'s message from #{username}'s message file."
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_hash(test_hash)
|
def validate_hash(test_hash)
|
||||||
|
|
Loading…
Reference in New Issue