class Otpui::OtpList

Public Class Methods

new(builder) click to toggle source
# File lib/otpui/otp_list.rb, line 3
def initialize(builder)
  @otps = Settings.load.secrets
  @model = Gtk::ListStore.new(String, String)
  @progress_bar = builder["totp_timeout_progress_bar"]

  text_renderer = Gtk::CellRendererText.new

  column_name = Gtk::TreeViewColumn.new("Issuer", text_renderer, { text: 0 })
  column_secret = Gtk::TreeViewColumn.new("Secret", text_renderer, { text: 1 })
  treeview = Gtk::TreeView.new(@model)

  treeview.append_column(column_name)
  treeview.append_column(column_secret)
  treeview.selection.set_mode(:single)
  builder["scrolled_otps_win"].add_with_viewport(treeview)

  treeview.signal_connect("row_activated") do |_treeview, path, _column|
    iter = @model.get_iter(path)
    Clipboard.copy iter[1]
  end
end

Public Instance Methods

get_current_second(totp, otp) click to toggle source
# File lib/otpui/otp_list.rb, line 31
def get_current_second(totp, otp)
  future_seconds = 0.0
  while totp.verify(otp, Time.now + future_seconds)
    future_seconds += 1
  end
  future_seconds
end
get_fraction_progress(totp, otp) click to toggle source
# File lib/otpui/otp_list.rb, line 39
def get_fraction_progress(totp, otp)
  get_current_second(totp, otp) / 30
end
list_size() click to toggle source
# File lib/otpui/otp_list.rb, line 25
def list_size
  i = 0
  @model.each { i += 1 }
  i
end
refresh_all() click to toggle source
# File lib/otpui/otp_list.rb, line 57
def refresh_all
  @model.clear
  @otps.each do |issuer, secret|
    iter = @model.append
    update_row iter, secret, issuer
  end
end
refresh_progress_bar() click to toggle source
# File lib/otpui/otp_list.rb, line 65
def refresh_progress_bar
  totp = ROTP::TOTP.new("progress32secret3232")
  @progress_bar.fraction = get_fraction_progress(totp, totp.now.to_s)
end
refresh_values() click to toggle source
# File lib/otpui/otp_list.rb, line 51
def refresh_values
  @model.each do |_model, path, iter|
    update_row iter
  end
end
run() click to toggle source
# File lib/otpui/otp_list.rb, line 70
def run
  GLib::Timeout.add(1000) do
    refresh_progress_bar
    list_size == @otps.size ?
      refresh_values :
      refresh_all
    true
  end
end
update_row(iter, secret = nil, issuer = nil) click to toggle source
# File lib/otpui/otp_list.rb, line 43
def update_row(iter, secret = nil, issuer = nil)
  secret = @otps.fetch iter[0] unless secret
  iter[0] = issuer if issuer

  totp = ROTP::TOTP.new(secret)
  iter[1] = totp.now.to_s
end