13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/ftp/ftp_auth_cache.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "googleurl/src/gurl.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst size_t FtpAuthCache::kMaxEntries = 10;
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickFtpAuthCache::Entry::Entry(const GURL& origin,
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                           const string16& username,
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                           const string16& password)
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : origin(origin),
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      username(username),
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      password(password) {
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
23731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickFtpAuthCache::Entry::~Entry() {}
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
25731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickFtpAuthCache::FtpAuthCache() {}
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
27731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickFtpAuthCache::~FtpAuthCache() {}
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottFtpAuthCache::Entry* FtpAuthCache::Lookup(const GURL& origin) {
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (EntryList::iterator it = entries_.begin(); it != entries_.end(); ++it) {
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (it->origin == origin)
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      return &(*it);
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return NULL;
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid FtpAuthCache::Add(const GURL& origin, const string16& username,
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       const string16& password) {
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(origin.SchemeIs("ftp"));
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK_EQ(origin.GetOrigin(), origin);
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Entry* entry = Lookup(origin);
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (entry) {
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->username = username;
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entry->password = password;
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } else {
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    entries_.push_front(Entry(origin, username, password));
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Prevent unbound memory growth of the cache.
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (entries_.size() > kMaxEntries)
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      entries_.pop_back();
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid FtpAuthCache::Remove(const GURL& origin, const string16& username,
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                          const string16& password) {
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (EntryList::iterator it = entries_.begin(); it != entries_.end(); ++it) {
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (it->origin == origin && it->username == username &&
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        it->password == password) {
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      entries_.erase(it);
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      DCHECK(!Lookup(origin));
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      return;
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace net
68