text: const basicAuth = require("express-basic-auth");
  const passwordHash = require("./password-hash");
  const { R } = require("redbean-node");
  const { setting } = require("./util-server");
  const { debug } = require("../src/util");
  const { loginRateLimiter } = require("./rate-limiter");
  
  /**
   *
   * @param username : string
   * @param password : string
   * @returns {Promise<Bean|null>}
   */
  exports.login = async function (username, password) {
      let user = await R.findOne("user", " username = ? AND active = 1 ", [
          username,
      ]);
  
      if (user && passwordHash.verify(password, user.password)) {
          // Upgrade the hash to bcrypt
          if (passwordHash.needRehash(user.password)) {
              await R.exec("UPDATE `user` SET password = ? WHERE id = ? ", [
                  passwordHash.generate(password),
                  user.id,
              ]);
          }
          return user;
      }
  
      return null;
  };
  
  function myAuthorizer(username, password, callback) {
      setting("disableAuth").then((result) => {
          if (result) {
              callback(null, true);
          } else {
              // Login Rate Limit
              loginRateLimiter.pass(null, 0).then((pass) => {
                  if (pass) {
                      exports.login(username, password).then((user) => {
                          callback(null, user != null);
  
                          if (user == null) {
                              loginRateLimiter.removeTokens(1);
                          }
                      });
                  } else {
                      callback(null, false);
                  }
              });
  
          }
      });
  }
  
  exports.basicAuth = basicAuth({
      authorizer: myAuthorizer,
      authorizeAsync: true,
      challenge: true,
  });
  