Viewing:
use crypto::sha256;
use encoding::hex;
use fmt;
use hash;
use io;
use os;
use strconv;
use strings;
use time::date;
fn usage() never = {
fmt::println("USAGE: awlfilecli <file path> [<access policy>]")!;
fmt::println(" <access policy> is either a postive integer (number of times a file can be read)")!;
fmt::println(" or a timestamp time after which file will no longer be accessible")!;
os::exit(1);
};
export fn main() void = {
let numArgs = len(os::args);
if (numArgs != 2 && numArgs != 3) {
usage();
};
let pepper: str = match(os::getenv("AWLFILE_PEPPER")) {
case let p: str => yield p;
case => usage();
};
const file = os::args[1];
const file = os::open(file)!;
const hash = sha256::sha256();
io::copy(&hash, file)!;
hash::write(&hash, strings::toutf8(pepper));
if (numArgs == 3) {
const strAccessPolicy = os::args[2];
const conv = strconv::stoi64(strAccessPolicy);
match (conv) {
case let theNum: i64 =>
if (theNum < 1) {
usage();
};
hash::write(&hash, strings::toutf8(strAccessPolicy));
case strconv::overflow =>
fmt::println("overflow")!;
usage();
case =>
const dateConv = date::from_str(date::RFC3339, strAccessPolicy);
match (dateConv) {
case let d: date::date =>
hash::write(&hash, strings::toutf8(strAccessPolicy));
case => fmt::println("bad date string")!; usage();
};
};
};
let sum: [sha256::SZ]u8 = [0...];
hash::sum(&hash, sum);
hex::encode(os::stdout, sum)!;
fmt::println()!;
};