# File wfo/auth.rb, line 81
  def self.typekey_login(webclient, typekey_uri)
    typekey_login_form = nil
    HTree(typekey_uri).traverse_element('{http://www.w3.org/1999/xhtml}form') {|form|
      form = WFO::Form.make(form, typekey_uri)
      if form.has?('username') && form.has?('password')
        typekey_login_form = form
        break
      end
    }
    return nil if !typekey_login_form
    resp = nil
    KeyRing.with_authinfo(KeyRing.typekey_protection_domain) {|username, password|
      typekey_login_form.set('username', username)
      typekey_login_form.set('password', password)
      typekey_login_form.make_request {|req|
        resp = webclient.do_request_state(req)
      }
    }
    # The password vanishing is not perfect, unfortunately.
    # arr = []; ObjectSpace.each_object(String) {|s| arr << s }; arr.each {|v| p v }

    if resp.code == '200' # send email address or not?
      email_form = nil
      HTree(resp.body).traverse_element('{http://www.w3.org/1999/xhtml}form') {|form|
        email_form = WFO::Form.make(form, typekey_login_form.action_uri)
        break
      }
      req = email_form.make_request
      resp = webclient.do_request_state(req)
    end

    return nil if resp.code != '302'
    return_uri = URI(resp['Location'])

    webclient.do_request_state(WFO::ReqHTTP.get(return_uri))
  end