malp/bin/setpasswd

30 lines
679 B
Ruby
Executable File

#!/usr/bin/env ruby
require "digest"
require "fileutils"
require "io/console"
require "securerandom"
DATA_DIR = File.join(__dir__, "../data")
USER_FILE = File.join(DATA_DIR, "user.txt")
print "User name: "
username = $stdin.gets.chomp
unless username =~ /^[a-zA-Z0-9_]+$/
$stderr.puts "Invalid characters in user name"
exit(1)
end
print "Password: "
password = $stdin.noecho(&:gets).chomp
salt = SecureRandom.hex(8)
input = salt + password
hash = Digest::SHA256.hexdigest(input)
hashhex = hash.chars.map {|c| sprintf("%02X", c.ord)}.join
user_file_contents = "#{username}:#{salt}:#{hashhex}\n"
File.binwrite(USER_FILE, user_file_contents)
puts "User and password set"