Resolve grouped-nick authzid in SASL EXTERNAL and saturate the Lamport clock
All checks were successful
CI / check (push) Successful in 4m10s
All checks were successful
CI / check (push) Successful in 4m10s
This commit is contained in:
parent
8f41fc9903
commit
7894de4217
2 changed files with 11 additions and 4 deletions
|
|
@ -839,7 +839,7 @@ impl EventLog {
|
||||||
}
|
}
|
||||||
let global = event.scope() == Scope::Global;
|
let global = event.scope() == Scope::Global;
|
||||||
let entry = if global {
|
let entry = if global {
|
||||||
self.lamport += 1;
|
self.lamport = self.lamport.saturating_add(1);
|
||||||
LogEntry { origin: self.origin.clone(), seq: self.next_seq(), lamport: self.lamport, event }
|
LogEntry { origin: self.origin.clone(), seq: self.next_seq(), lamport: self.lamport, event }
|
||||||
} else {
|
} else {
|
||||||
LogEntry { origin: self.origin.clone(), seq: 0, lamport: 0, event }
|
LogEntry { origin: self.origin.clone(), seq: 0, lamport: 0, event }
|
||||||
|
|
@ -876,7 +876,7 @@ impl EventLog {
|
||||||
return Ok(None); // already have it
|
return Ok(None); // already have it
|
||||||
}
|
}
|
||||||
self.persist(&entry)?;
|
self.persist(&entry)?;
|
||||||
self.lamport = self.lamport.max(entry.lamport) + 1; // Lamport receive rule
|
self.lamport = self.lamport.max(entry.lamport).saturating_add(1); // Lamport receive rule
|
||||||
self.versions.insert(entry.origin.clone(), entry.seq);
|
self.versions.insert(entry.origin.clone(), entry.seq);
|
||||||
let event = entry.event.clone();
|
let event = entry.event.clone();
|
||||||
self.notify(&entry);
|
self.notify(&entry);
|
||||||
|
|
@ -958,7 +958,7 @@ impl EventLog {
|
||||||
let mut snapshot = Vec::with_capacity(events.len());
|
let mut snapshot = Vec::with_capacity(events.len());
|
||||||
for event in events {
|
for event in events {
|
||||||
let entry = if event.scope() == Scope::Global {
|
let entry = if event.scope() == Scope::Global {
|
||||||
self.lamport += 1;
|
self.lamport = self.lamport.saturating_add(1);
|
||||||
let e = LogEntry { origin: self.origin.clone(), seq, lamport: self.lamport, event };
|
let e = LogEntry { origin: self.origin.clone(), seq, lamport: self.lamport, event };
|
||||||
last_global = Some(seq);
|
last_global = Some(seq);
|
||||||
seq += 1;
|
seq += 1;
|
||||||
|
|
|
||||||
|
|
@ -189,7 +189,14 @@ impl Engine {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
match fingerprints.iter().find_map(|fp| self.db.certfp_owner(fp)) {
|
match fingerprints.iter().find_map(|fp| self.db.certfp_owner(fp)) {
|
||||||
Some(account) if authzid.is_empty() || authzid.eq_ignore_ascii_case(account) => {
|
// Accept an authzid that is empty, matches the cert's account, OR resolves
|
||||||
|
// to it via a grouped nick — mirroring the PLAIN/SCRAM paths, which resolve
|
||||||
|
// aliases (else naming your own grouped nick is wrongly refused).
|
||||||
|
Some(account)
|
||||||
|
if authzid.is_empty()
|
||||||
|
|| authzid.eq_ignore_ascii_case(account)
|
||||||
|
|| self.db.resolve_account(&authzid).is_some_and(|a| a.eq_ignore_ascii_case(account)) =>
|
||||||
|
{
|
||||||
let account = account.to_string();
|
let account = account.to_string();
|
||||||
self.sasl_login("SASL EXTERNAL", agent, client, account)
|
self.sasl_login("SASL EXTERNAL", agent, client, account)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue