keyring.iced 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. log = require './log'
  2. {env} = require './env'
  3. {E,GE} = require './err'
  4. {keyring} = require 'gpg-wrapper'
  5. ##=======================================================================
  6. class GpgKey extends keyring.GpgKey
  7. #-------------
  8. # Find the key in the keyring based on fingerprint
  9. find : (cb) ->
  10. await super defer err
  11. err = if not err? then null
  12. else if (err instanceof GE.NotFoundError)
  13. new E.NoLocalKeyError (
  14. if @_is_self then "You don't have a local #{if @_secret then 'secret' else 'public'} key!"
  15. else "the user #{@username()} doesn't have a local key"
  16. )
  17. else if (err instanceof GE.NoFingerprintError)
  18. new E.NoRemoteKeyError (
  19. if @_is_self then "You don't have a registered remote key! Try `keybase push`"
  20. else "the user #{@username()} doesn't have a remote key"
  21. )
  22. else err
  23. cb err
  24. #-------------
  25. has_canonical_username : () ->
  26. em = env().keybase_email()
  27. all_uids = @all_uids()
  28. return (em in (e for uid in all_uids when (e = uid?.email)))
  29. #-------------
  30. get_ekid : () ->
  31. return @_ekid
  32. #-------------
  33. # Make a single GpgKey object from a User object. Looks through the given gpg
  34. # keyring for secret keys belonging to the user and picks the first available
  35. # one.
  36. @make_secret_from_user : ({user, keyring}, cb) ->
  37. for key_manager in user.sibkeys
  38. # Skip NaCl keys.
  39. if key_manager.get_type() != 'pgp'
  40. continue
  41. secret_key_candidate = @_make_from_user_and_material {
  42. user
  43. secret: true
  44. keyring
  45. bundle: key_manager.armored_pgp_public
  46. fingerprint : key_manager.get_pgp_fingerprint().toString('hex')
  47. ekid: key_manager.get_ekid()
  48. }
  49. # Check whether key material is available.
  50. await secret_key_candidate.find defer err
  51. # If we found the key, return it.
  52. if not err?
  53. cb null, secret_key_candidate
  54. return
  55. # If not, loop and try the next key.
  56. # Loop exited without finding a key.
  57. cb new E.NoLocalKeyError "No GPG secret key available for user #{user.username()}"
  58. #-------------
  59. # Makes a public (secret=false) GpgKey object for every key a user has.
  60. @make_all_public_from_user : ({user, keyring}) ->
  61. keys = []
  62. for key_manager in user.sibkeys
  63. # Skip NaCl keys.
  64. if key_manager.get_type() != 'pgp'
  65. continue
  66. keys.push @_make_from_user_and_material {
  67. user
  68. secret: false
  69. keyring
  70. bundle: key_manager.armored_pgp_public
  71. fingerprint : key_manager.get_pgp_fingerprint().toString('hex')
  72. ekid: key_manager.get_ekid()
  73. }
  74. return keys
  75. #-------------
  76. # Make a key object from a User object, the supplied PGP bundle, and the
  77. # supplied PGP fingerprint.
  78. @_make_from_user_and_material : ({user, secret, keyring, bundle, fingerprint, ekid}) ->
  79. ret = new GpgKey {
  80. user : user ,
  81. secret : secret,
  82. username : user.username(),
  83. is_self : user.is_self(),
  84. uid : user.id,
  85. key_data : bundle,
  86. keyring : keyring,
  87. fingerprint : fingerprint,
  88. }
  89. ret._ekid = ekid
  90. return ret
  91. ##=======================================================================
  92. for k,v of keyring
  93. exports[k] = v
  94. #--------
  95. exports.BaseKeyRing.prototype.make_all_public_gpg_keys_from_user = ({user}) ->
  96. return GpgKey.make_all_public_from_user { user, keyring : @ }
  97. exports.BaseKeyRing.prototype.make_secret_gpg_key_from_user = ({user}, cb) ->
  98. return GpgKey.make_secret_from_user { user, keyring : @ }, cb
  99. #--------
  100. # Overwrite init() as follows
  101. exports.init = () ->
  102. keyring.init {
  103. get_preserve_tmp_keyring : () -> env().get_preserve_tmp_keyring()
  104. get_debug : () -> env().get_debug()
  105. get_tmp_keyring_dir : () -> env().get_tmp_keyring_dir()
  106. get_key_klass : () -> GpgKey
  107. get_home_dir : () -> env().get_home_gnupg_dir(true)
  108. get_gpg_cmd : () -> env().get_gpg_cmd()
  109. get_no_options : () -> env().get_no_gpg_options()
  110. log : log
  111. }
  112. ##=======================================================================