duse-io/duse.rb

View on GitHub
lib/duse/cli/account_update_keypair.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'duse/cli'
require 'duse/cli/key_helper'
require 'duse/cli/password_helper'

module Duse
  module CLI
    class AccountUpdateKeypair < ApiCommand
      include KeyHelper
      include PasswordHelper

      description 'Change your keypair (The old private key is not removed in case it is needed for recovery)'

      def run
        user = Duse::User.current
        old_private_key = Duse::CLIConfig.new.private_key_for(user)
        new_private_key = choose_key
        password = ask_for_current_password
        Duse::User.update(user.id, {
          public_key: new_private_key.public_key.to_s,
          current_password: password,
        })

        user.reload
        shares = Duse::Share.all
        shares = shares.map do |share|
          plaintext = share.decrypt(old_private_key)
          content, signature = Encryption::Asymmetric.encrypt(new_private_key, user.public_key, plaintext)

          {
            id: share.id,
            content: content,
            signature: signature,
          }
        end

        Duse::Share.update_all(shares)
        Duse::CLIConfig.new.save_private_key_for user, new_private_key.to_pem

        success 'Successfully updated your keypair account!'
      end
    end
  end
end