module WEBrick
  module HTTPAuth
    class DigestAuth
      @config: Hash[Symbol, untyped]

      @domain: Array[String]?

      @use_opaque: bool

      @use_next_nonce: bool

      @check_nc: bool

      @use_auth_info_header: bool

      @nonce_expire_period: Integer

      @nonce_expire_delta: Integer

      @internet_explorer_hack: bool

      @h: singleton(Digest::Base)

      @instance_key: String

      @opaques: Hash[String, OpaqueInfo]

      @last_nonce_expire: Time

      @mutex: Thread::Mutex

      include Authenticator

      AuthScheme: String

      class OpaqueInfo < Struct[untyped]
        attr_accessor time(): Time
        attr_accessor nonce(): String?
        attr_accessor nc(): String
      end

      attr_reader algorithm: String?

      attr_reader qop: Array[String]

      def self.make_passwd: (String realm, String user, String pass) -> untyped

      def initialize: (Hash[Symbol, untyped] config, ?Hash[Symbol, untyped] default) -> void

      def authenticate: (HTTPRequest req, HTTPResponse res) -> void

      def challenge: (HTTPRequest req, HTTPResponse res, ?bool stale) -> bot

      private

      MustParams: Array[String]

      MustParamsAuth: Array[String]

      def _authenticate: (HTTPRequest req, HTTPResponse res) -> (:nonce_is_stale | bool)

      def split_param_value: (String string) -> Hash[String, String]

      def generate_next_nonce: (HTTPRequest req) -> String

      def check_nonce: (HTTPRequest req, Hash[String, String] auth_req) -> bool

      def generate_opaque: (HTTPRequest req) -> String

      def check_opaque: (OpaqueInfo opaque_struct, untyped req, Hash[String, String] auth_req) -> bool

      def check_uri: (HTTPRequest req, Hash[String, String] auth_req) -> bool

      def hexdigest: (*_ToS? args) -> String
    end

    class ProxyDigestAuth < DigestAuth
      include ProxyAuthenticator

      private

      def check_uri: (HTTPRequest req, Hash[String, String] auth_req) -> true
    end
  end
end
