announce.iced 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. {Base} = require './base'
  2. log = require '../log'
  3. {ArgumentParser} = require 'argparse'
  4. {add_option_dict} = require './argparse'
  5. C = require('../constants').constants
  6. ST = C.signature_types
  7. ACCTYPES = C.allowed_cryptocurrency_types
  8. {PackageJson} = require '../package'
  9. {E} = require '../err'
  10. {make_esc} = require 'iced-error'
  11. {prompt_yn,prompt_remote_name} = require '../prompter'
  12. {User} = require '../user'
  13. {req} = require '../req'
  14. assert = require 'assert'
  15. session = require '../session'
  16. S = require '../services'
  17. {dict_union} = require '../util'
  18. iutils = require 'iced-utils'
  19. {drain} = iutils.drain
  20. {a_json_parse} = iutils.util
  21. util = require 'util'
  22. fs = require 'fs'
  23. proofs = require 'keybase-proofs'
  24. bitcoyne = require 'bitcoyne'
  25. {AnnouncementSigGen} = require '../sigs'
  26. ##=======================================================================
  27. stream_open = (f, cb) ->
  28. ret = fs.createReadStream f
  29. ret.on 'error', (err) ->
  30. err = new E.NotFoundError "Could not open file '#{f}': #{err.code}"
  31. cb err, null
  32. ret.on 'open', () -> cb null, ret
  33. ##=======================================================================
  34. exports.Command = class Command extends Base
  35. #----------
  36. OPTS :
  37. j :
  38. alias : 'json'
  39. action : 'storeTrue'
  40. help : 'interpret the announcement as JSON object'
  41. e :
  42. alias : 'encode'
  43. action : 'storeTrue'
  44. help : 'encode the announcement with base64-encoding'
  45. f :
  46. alias : 'file'
  47. help : 'Specify a file as the announcment'
  48. m:
  49. alias : 'message'
  50. help : 'Specify a message as the announcement"'
  51. #----------
  52. use_session : () -> true
  53. needs_configuration : () -> true
  54. #----------
  55. add_subcommand_parser : (scp) ->
  56. opts =
  57. aliases : [ ]
  58. help : "make an announcement, stored to your signature chain"
  59. name = "announce"
  60. sub = scp.addParser name, opts
  61. add_option_dict sub, @OPTS
  62. return opts.aliases.concat [ name ]
  63. #----------
  64. parse_args : (cb) ->
  65. err = null
  66. if @argv.encode and @argv.json
  67. err = new E.ArgsError "can't specify both -j/--json and -e/--encode"
  68. else if @argv.file and @argv.message
  69. err = new E.ArgsError "can't specify both -f/--file and -m/--message"
  70. cb err
  71. #----------
  72. allocate_proof_gen : (cb) ->
  73. klass = AnnouncementSigGen
  74. arg = { @announcement }
  75. await @me.gen_sig_base { klass, arg }, defer err, @gen
  76. cb err
  77. #----------
  78. load_announcement : (cb) ->
  79. stream = null
  80. esc = make_esc cb, "Command::load_announcement"
  81. if (m = @argv.message)? then @raw = new Buffer m, 'utf8'
  82. else if (f = @argv.file)?
  83. await stream_open f, esc defer stream
  84. else
  85. stream = process.stdin
  86. if stream?
  87. await drain stream, esc defer @raw
  88. cb null
  89. #----------
  90. encode_ennouncement : (cb) ->
  91. esc = make_esc cb, "Command::encode_announcement"
  92. if @argv.json
  93. await a_json_parse @raw.toString('utf8'), esc defer data
  94. encoding = "json"
  95. else if @argv.encode
  96. data = @raw.toString('base64')
  97. encoding = "base64"
  98. else
  99. encoding = "utf8"
  100. data = @raw.toString('utf8')
  101. @announcement = { data, encoding }
  102. cb null
  103. #----------
  104. run : (cb) ->
  105. esc = make_esc cb, "Command::run"
  106. await @parse_args esc defer()
  107. await session.login esc defer()
  108. await User.load_me { secret : true }, esc defer @me
  109. await @load_announcement esc defer()
  110. await @encode_ennouncement esc defer()
  111. await @allocate_proof_gen esc defer()
  112. await @gen.run esc defer()
  113. log.info "Success!"
  114. cb null
  115. ##=======================================================================