Hi,

I am trying to implement a dict lookup for disabled accounts, where both the passdb lookup and the disabled lookup is done in the same passdb. I was hoping that this configuration would work:

passdb {
  name = redis
  driver = dict
  args = /etc/dovecot/dovecot-redis.conf.ext
}

---

uri = redis:host=127.0.0.1

key disabled {
  key = users/%u/disabled/%s
  format = value
  default_value =
}

key user {
  key = users/%u
  format = json
}

passdb_objects = user

passdb_fields {
  fail = %{dict:disabled}
}

Unfortunately, this will always set the fail passdb_field regardless of whether the disabled key returns its empty default_value. Removing the default_value setting will cause the passdb lookup to fail if key lookup fails, as mentioned in the documentation.

Is there a way to have the dict driver handle redis nil values similarly to how the sql driver handles NULL values?

A working alternative I found is to set an invalid password if the disabled key is set:

passdb_fields {
  password = %{if;%{dict:disabled};eq;;%{dict:user.password};}
}

However, this feels hacky. It also makes the auth-worker to log the following error (despite it being functional):

dovecot: auth-worker(16229): Error: redis(test,127.0.0.1,<Kd3zJDOdfs1/AAAB>): Multiple password values not supported

Any other suggestions, or should I simply fall back to using a separate passdb with deny=yes?

Best regards,
Eirik

Reply via email to