]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/ident/AclIdent.cc
79833226326e52c53fb0b28ac1223cd45d8f7374
2 * Copyright (C) 1996-2016 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 28 Access Control */
15 #include "acl/FilledChecklist.h"
16 #include "acl/RegexData.h"
17 #include "acl/UserData.h"
18 #include "client_side.h"
19 #include "comm/Connection.h"
21 #include "http/Stream.h"
22 #include "ident/AclIdent.h"
23 #include "ident/Ident.h"
30 ACLIdent::ACLIdent(ACLData
<char const *> *newData
, char const *newType
) : data (newData
), type_ (newType
) {}
32 ACLIdent::ACLIdent (ACLIdent
const &old
) : data (old
.data
->clone()), type_ (old
.type_
)
36 ACLIdent::operator= (ACLIdent
const &rhs
)
38 data
= rhs
.data
->clone();
44 ACLIdent::typeString() const
53 debugs(28, 3, HERE
<< "current is null. Creating");
54 data
= new ACLUserData
;
61 ACLIdent::match(ACLChecklist
*cl
)
63 ACLFilledChecklist
*checklist
= Filled(cl
);
64 if (checklist
->rfc931
[0]) {
65 return data
->match(checklist
->rfc931
);
66 } else if (checklist
->conn() != NULL
&& checklist
->conn()->clientConnection
!= NULL
&& checklist
->conn()->clientConnection
->rfc931
[0]) {
67 return data
->match(checklist
->conn()->clientConnection
->rfc931
);
68 } else if (checklist
->conn() != NULL
&& Comm::IsConnOpen(checklist
->conn()->clientConnection
)) {
69 if (checklist
->goAsync(IdentLookup::Instance())) {
70 debugs(28, 3, "switching to ident lookup state");
73 // else fall through to ACCESS_DUNNO failure below
75 debugs(28, DBG_IMPORTANT
, HERE
<< "Can't start ident lookup. No client connection" );
76 // fall through to ACCESS_DUNNO failure below
79 checklist
->markFinished(ACCESS_DUNNO
, "cannot start ident lookup");
84 ACLIdent::dump() const
90 ACLIdent::empty () const
96 ACLIdent::clone() const
98 return new ACLIdent(*this);
101 IdentLookup
IdentLookup::instance_
;
104 IdentLookup::Instance()
110 IdentLookup::checkForAsync(ACLChecklist
*cl
)const
112 ACLFilledChecklist
*checklist
= Filled(cl
);
113 const ConnStateData
*conn
= checklist
->conn();
114 // check that ACLIdent::match() tested this lookup precondition
115 assert(conn
&& Comm::IsConnOpen(conn
->clientConnection
));
116 debugs(28, 3, HERE
<< "Doing ident lookup" );
117 Ident::Start(checklist
->conn()->clientConnection
, LookupDone
, checklist
);
121 IdentLookup::LookupDone(const char *ident
, void *data
)
123 ACLFilledChecklist
*checklist
= Filled(static_cast<ACLChecklist
*>(data
));
126 xstrncpy(checklist
->rfc931
, ident
, USER_IDENT_SZ
);
128 xstrncpy(checklist
->rfc931
, dash_str
, USER_IDENT_SZ
);
132 * Cache the ident result in the connection, to avoid redoing ident lookup
133 * over and over on persistent connections
135 if (checklist
->conn() != NULL
&& checklist
->conn()->clientConnection
!= NULL
&& !checklist
->conn()->clientConnection
->rfc931
[0])
136 xstrncpy(checklist
->conn()->clientConnection
->rfc931
, checklist
->rfc931
, USER_IDENT_SZ
);
138 checklist
->resumeNonBlockingCheck(IdentLookup::Instance());
141 #endif /* USE_IDENT */