]> git.ipfire.org Git - thirdparty/squid.git/blob - src/auth/digest/User.cc
Merge SBufList
[thirdparty/squid.git] / src / auth / digest / User.cc
1 #include "squid.h"
2 #include "auth/digest/auth_digest.h"
3 #include "auth/digest/User.h"
4 #include "Debug.h"
5 #include "dlink.h"
6 #include "SquidConfig.h"
7 #include "SquidTime.h"
8
9 Auth::Digest::User::User(Auth::Config *aConfig, const char *aRequestRealm) :
10 Auth::User(aConfig, aRequestRealm),
11 HA1created(0)
12 {
13 memset(HA1, 0, sizeof(HA1));
14 }
15
16 Auth::Digest::User::~User()
17 {
18 dlink_node *link, *tmplink;
19 link = nonces.head;
20
21 while (link) {
22 tmplink = link;
23 link = link->next;
24 dlinkDelete(tmplink, &nonces);
25 authDigestNoncePurge(static_cast < digest_nonce_h * >(tmplink->data));
26 authDigestNonceUnlink(static_cast < digest_nonce_h * >(tmplink->data));
27 dlinkNodeDelete(tmplink);
28 }
29 }
30
31 int32_t
32 Auth::Digest::User::ttl() const
33 {
34 int32_t global_ttl = static_cast<int32_t>(expiretime - squid_curtime + ::Config.authenticateTTL);
35
36 /* find the longest lasting nonce. */
37 int32_t latest_nonce = -1;
38 dlink_node *link = nonces.head;
39 while (link) {
40 digest_nonce_h *nonce = static_cast<digest_nonce_h *>(link->data);
41 if (nonce->flags.valid && nonce->noncedata.creationtime > latest_nonce)
42 latest_nonce = nonce->noncedata.creationtime;
43
44 link = link->next;
45 }
46 if (latest_nonce == -1)
47 return min(-1, global_ttl);
48
49 int32_t nonce_ttl = latest_nonce - current_time.tv_sec + static_cast<Config*>(Auth::Config::Find("digest"))->noncemaxduration;
50
51 return min(nonce_ttl, global_ttl);
52 }