Remove debugging output (compiled user-register file)
[metaproxy-moved-to-github.git] / src / filter_auth_simple.cpp
index c87cd65..40b3a21 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: filter_auth_simple.cpp,v 1.4 2006-01-17 17:13:31 mike Exp $
+/* $Id: filter_auth_simple.cpp,v 1.7 2006-01-17 17:58:46 mike Exp $
    Copyright (c) 2005, Index Data.
 
 %LICENSE%
@@ -102,7 +102,7 @@ void yp2::filter::AuthSimple::configure(const xmlNode * ptr)
         boost::split(tmp.dbs, databasesp, boost::is_any_of(","));
         m_p->userRegister[buf] = tmp;
 
-        if (1) {                // debugging
+        if (0) {                // debugging
             printf("Added user '%s' -> password '%s'\n", buf, passwdp);
             std::list<std::string>::const_iterator i;
             for (i = tmp.dbs.begin(); i != tmp.dbs.end(); i++) {
@@ -127,6 +127,16 @@ void yf::AuthSimple::process(yp2::Package &package) const
     switch (gdu->u.z3950->which) {
     case Z_APDU_initRequest: return process_init(package);
     case Z_APDU_searchRequest: return process_search(package);
+    case Z_APDU_scanRequest: return process_scan(package);
+        // In theory, we should check database authorisation for
+        // extended services, too (A) the proxy currently does not
+        // implement XS and turns off its negotiation bit; (B) it
+        // would be insanely complex to do as the top-level XS request
+        // structure does not carry a database name, but it is buried
+        // down in some of the possible EXTERNALs used as
+        // taskSpecificParameters; and (C) since many extended
+        // services modify the database, we'd need to more exotic
+        // authorisation database than we want to support.
     default: break;
     }   
 
@@ -210,6 +220,37 @@ void yf::AuthSimple::process_search(yp2::Package &package) const
 }
 
 
+void yf::AuthSimple::process_scan(yp2::Package &package) const
+{
+    Z_ScanRequest *req =
+        package.request().get()->u.z3950->u.scanRequest;
+
+    if (m_p->userBySession.count(package.session()) == 0) {
+        // It's a non-authenticated session, so just accept the operation
+        return package.move();
+    }
+
+    std::string user = m_p->userBySession[package.session()];
+    yf::AuthSimple::Rep::PasswordAndDBs pdb = m_p->userRegister[user];
+    for (int i = 0; i < req->num_databaseNames; i++) {
+        if (!contains(pdb.dbs, req->databaseNames[i])) {
+            // Make an Scan rejection APDU
+            yp2::odr odr;
+            Z_APDU *apdu = odr.create_scanResponse(
+                package.request().get()->u.z3950, 
+                YAZ_BIB1_ACCESS_TO_SPECIFIED_DATABASE_DENIED,
+                req->databaseNames[i]);
+            package.response() = apdu;
+            package.session().close();
+            return;
+        }
+    }
+
+    // All the requested databases are acceptable
+    return package.move();
+}
+
+
 static void reject_init(yp2::Package &package, const char *addinfo) { 
     // Make an Init rejection APDU
     Z_GDU *gdu = package.request().get();