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()!; };