]> git.ipfire.org Git - thirdparty/squid.git/blame - src/ACLIdent.cc
Import IPv6 support from squid3-ipv6 branch to 3-HEAD.
[thirdparty/squid.git] / src / ACLIdent.cc
CommitLineData
8000a965 1/*
2 * $Id$
3 *
4 * DEBUG: section 28 Access Control
5 * AUTHOR: Duane Wessels
6 *
7 * SQUID Web Proxy Cache http://www.squid-cache.org/
8 * ----------------------------------------------------------
9 *
10 * Squid is the result of efforts by numerous individuals from
11 * the Internet community; see the CONTRIBUTORS file for full
12 * details. Many organizations have provided support for Squid's
13 * development; see the SPONSORS file for full details. Squid is
14 * Copyrighted (C) 2001 by the Regents of the University of
15 * California; see the COPYRIGHT file for full details. Squid
16 * incorporates software developed and/or copyrighted by other
17 * sources; see the CREDITS file for full details.
18 *
19 * This program is free software; you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License as published by
21 * the Free Software Foundation; either version 2 of the License, or
22 * (at your option) any later version.
23 *
24 * This program is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
28 *
29 * You should have received a copy of the GNU General Public License
30 * along with this program; if not, write to the Free Software
31 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
32 *
33 *
34 * Copyright (c) 2003, Robert Collins <robertc@squid-cache.org>
35 */
36
37#include "squid.h"
38#include "ACLIdent.h"
39#include "authenticate.h"
40#include "ACLChecklist.h"
3841dd46 41#include "ACLRegexData.h"
42#include "ACLUserData.h"
a46d2c0e 43#include "client_side.h"
8000a965 44
8000a965 45ACLIdent::~ACLIdent()
46{
00d77d6b 47 delete data;
3841dd46 48}
49
5dee515e 50ACLIdent::ACLIdent(ACLData<char const *> *newData, char const *newType) : data (newData), type_ (newType) {}
62e76326 51
3841dd46 52ACLIdent::ACLIdent (ACLIdent const &old) : data (old.data->clone()), type_ (old.type_)
62e76326 53{}
54
3841dd46 55ACLIdent &
56ACLIdent::operator= (ACLIdent const &rhs)
57{
58 data = rhs.data->clone();
59 type_ = rhs.type_;
60 return *this;
8000a965 61}
62
63char const *
64ACLIdent::typeString() const
65{
3841dd46 66 return type_;
8000a965 67}
68
69void
70ACLIdent::parse()
71{
1b0e74e5 72 if (!data) {
bf8fe701 73 debugs(28, 3, "aclParseUserList: current is null. Creating");
1b0e74e5 74 data = new ACLUserData;
75 }
76
8000a965 77 data->parse();
78}
79
80int
81ACLIdent::match(ACLChecklist *checklist)
82{
83 if (checklist->rfc931[0]) {
62e76326 84 return data->match(checklist->rfc931);
4d3a24ca 85 } else if (checklist->conn() != NULL && checklist->conn()->rfc931[0]) {
1b0e74e5 86 return data->match(checklist->conn()->rfc931);
8000a965 87 } else {
bf8fe701 88 debugs(28, 3, "ACLIdent::match() - switching to ident lookup state");
62e76326 89 checklist->changeState(IdentLookup::Instance());
90 return 0;
8000a965 91 }
92}
93
94wordlist *
95ACLIdent::dump() const
96{
97 return data->dump();
98}
99
100bool
4b0f5de8 101ACLIdent::empty () const
8000a965 102{
1bebfd93 103 return data->empty();
8000a965 104}
3841dd46 105
106ACL *
107ACLIdent::clone() const
108{
109 return new ACLIdent(*this);
110}
111
112ACL::Prototype ACLIdent::UserRegistryProtoype(&ACLIdent::UserRegistryEntry_, "ident");
113ACLIdent ACLIdent::UserRegistryEntry_(new ACLUserData, "ident");
114ACL::Prototype ACLIdent::RegexRegistryProtoype(&ACLIdent::RegexRegistryEntry_, "ident_regex" );
115ACLIdent ACLIdent::RegexRegistryEntry_(new ACLRegexData, "ident_regex");
116
117IdentLookup IdentLookup::instance_;
118
119IdentLookup *
120IdentLookup::Instance()
121{
122 return &instance_;
123}
124
125void
126IdentLookup::checkForAsync(ACLChecklist *checklist)const
127{
4d3a24ca 128 if (checklist->conn() != NULL) {
bf8fe701 129 debugs(28, 3, "IdentLookup::checkForAsync: Doing ident lookup" );
bfe31cd2 130 checklist->asyncInProgress(true);
cc192b50 131 identStart(checklist->conn()->me, checklist->conn()->peer,
62e76326 132 LookupDone, checklist);
3841dd46 133 } else {
bf8fe701 134 debugs(28, 1, "IdentLookup::checkForAsync: Can't start ident lookup. No client connection" );
62e76326 135 checklist->currentAnswer(ACCESS_DENIED);
136 checklist->markFinished();
3841dd46 137 }
138}
139
140void
141IdentLookup::LookupDone(const char *ident, void *data)
142{
143 ACLChecklist *checklist = (ACLChecklist *)data;
144 assert (checklist->asyncState() == IdentLookup::Instance());
145
146 if (ident) {
62e76326 147 xstrncpy(checklist->rfc931, ident, USER_IDENT_SZ);
3841dd46 148 } else {
62e76326 149 xstrncpy(checklist->rfc931, dash_str, USER_IDENT_SZ);
3841dd46 150 }
62e76326 151
3841dd46 152 /*
153 * Cache the ident result in the connection, to avoid redoing ident lookup
154 * over and over on persistent connections
155 */
4d3a24ca 156 if (checklist->conn() != NULL && !checklist->conn()->rfc931[0])
62e76326 157 xstrncpy(checklist->conn()->rfc931, checklist->rfc931, USER_IDENT_SZ);
158
3841dd46 159 checklist->asyncInProgress(false);
62e76326 160
3841dd46 161 checklist->changeState (ACLChecklist::NullState::Instance());
62e76326 162
3841dd46 163 checklist->check();
164}