]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/ident/AclIdent.cc
2 * Copyright (C) 1996-2014 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 "ident/AclIdent.h"
22 #include "ident/Ident.h"
29 ACLIdent::ACLIdent(ACLData
<char const *> *newData
, char const *newType
) : data (newData
), type_ (newType
) {}
31 ACLIdent::ACLIdent (ACLIdent
const &old
) : data (old
.data
->clone()), type_ (old
.type_
)
35 ACLIdent::operator= (ACLIdent
const &rhs
)
37 data
= rhs
.data
->clone();
43 ACLIdent::typeString() const
52 debugs(28, 3, HERE
<< "current is null. Creating");
53 data
= new ACLUserData
;
60 ACLIdent::match(ACLChecklist
*cl
)
62 ACLFilledChecklist
*checklist
= Filled(cl
);
63 if (checklist
->rfc931
[0]) {
64 return data
->match(checklist
->rfc931
);
65 } else if (checklist
->conn() != NULL
&& checklist
->conn()->clientConnection
!= NULL
&& checklist
->conn()->clientConnection
->rfc931
[0]) {
66 return data
->match(checklist
->conn()->clientConnection
->rfc931
);
67 } else if (checklist
->conn() != NULL
&& Comm::IsConnOpen(checklist
->conn()->clientConnection
)) {
68 if (checklist
->goAsync(IdentLookup::Instance())) {
69 debugs(28, 3, "switching to ident lookup state");
72 // else fall through to ACCESS_DUNNO failure below
74 debugs(28, DBG_IMPORTANT
, HERE
<< "Can't start ident lookup. No client connection" );
75 // fall through to ACCESS_DUNNO failure below
78 checklist
->markFinished(ACCESS_DUNNO
, "cannot start ident lookup");
83 ACLIdent::dump() const
89 ACLIdent::empty () const
95 ACLIdent::clone() const
97 return new ACLIdent(*this);
100 IdentLookup
IdentLookup::instance_
;
103 IdentLookup::Instance()
109 IdentLookup::checkForAsync(ACLChecklist
*cl
)const
111 ACLFilledChecklist
*checklist
= Filled(cl
);
112 const ConnStateData
*conn
= checklist
->conn();
113 // check that ACLIdent::match() tested this lookup precondition
114 assert(conn
&& Comm::IsConnOpen(conn
->clientConnection
));
115 debugs(28, 3, HERE
<< "Doing ident lookup" );
116 Ident::Start(checklist
->conn()->clientConnection
, LookupDone
, checklist
);
120 IdentLookup::LookupDone(const char *ident
, void *data
)
122 ACLFilledChecklist
*checklist
= Filled(static_cast<ACLChecklist
*>(data
));
125 xstrncpy(checklist
->rfc931
, ident
, USER_IDENT_SZ
);
127 xstrncpy(checklist
->rfc931
, dash_str
, USER_IDENT_SZ
);
131 * Cache the ident result in the connection, to avoid redoing ident lookup
132 * over and over on persistent connections
134 if (checklist
->conn() != NULL
&& checklist
->conn()->clientConnection
!= NULL
&& !checklist
->conn()->clientConnection
->rfc931
[0])
135 xstrncpy(checklist
->conn()->clientConnection
->rfc931
, checklist
->rfc931
, USER_IDENT_SZ
);
137 checklist
->resumeNonBlockingCheck(IdentLookup::Instance());
140 #endif /* USE_IDENT */