>From 767332770f02c5a6f15141440824f2f6f61388e7 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek@redhat.com>
Date: Thu, 13 Aug 2009 13:02:28 +0200
Subject: [PATCH] Make "files" a reserved word for legacy local domain

This patch introduces provider=files as a valid provider.
Upon loading the backend, its properties in confdb are overwritten to
those that represent legacy local domain.

Also document this in sssd.conf(5) and example config
---
 server/examples/sssd.conf           |    3 +-
 server/man/sssd.conf.5.xml          |   12 +++++++++-
 server/providers/data_provider_be.c |   43 +++++++++++++++++++++++++++++++++++
 server/tools/tools_util.c           |    3 +-
 4 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/server/examples/sssd.conf b/server/examples/sssd.conf
index ab8007a..d57bed7 100644
--- a/server/examples/sssd.conf
+++ b/server/examples/sssd.conf
@@ -45,8 +45,7 @@ description = Domains served by SSSD
 ; magicPrivateGroups = FALSE
 ; legacy = TRUE
 ;
-; provider = proxy
-; libName = files
+; provider = files
 
 # optionally a file named sssdproxylocal can be place in pam.d configured to
 # check pam_unix only and pam_sss can be used in the normal pam stack
diff --git a/server/man/sssd.conf.5.xml b/server/man/sssd.conf.5.xml
index 833bd71..6c5ce87 100644
--- a/server/man/sssd.conf.5.xml
+++ b/server/man/sssd.conf.5.xml
@@ -493,6 +493,9 @@
                             Supported backends:
                         </para>
                         <para>
+                            files: traditional UNIX files (<filename>/etc/passwd</filename>)
+                        </para>
+                        <para>
                             proxy: Support a legacy NSS provider
                         </para>
                         <para>
@@ -598,7 +601,7 @@ description = Service Monitor Configuration
 
 [domains]
 description = Domains served by SSSD
-domains = LOCAL
+domains = LOCAL,FILES
 
 [domains/LOCAL]
 description = LOCAL Users domain
@@ -608,6 +611,13 @@ maxId = 30000
 legacy = FALSE
 magicPrivateGroups = TRUE
 provider = local
+
+[domains/FILES]
+description = Users stored in UNIX files
+enumerate = 3
+minId = 500
+maxId = 4999
+provider = files
 </programlisting>
         </para>
     </refsect1>
diff --git a/server/providers/data_provider_be.c b/server/providers/data_provider_be.c
index c92289b..24d9105 100644
--- a/server/providers/data_provider_be.c
+++ b/server/providers/data_provider_be.c
@@ -874,6 +874,43 @@ done:
     return ret;
 }
 
+/* Some providers are just aliases for more complicated settings,
+ * rewrite the alias into the actual settings */
+static int be_rewrite(struct be_ctx *ctx)
+{
+    int ret;
+    const char *val[2];
+    val[1] = NULL;
+
+    /* "files" is a special case that means:
+     *  provider = proxy
+     *  libName  = files
+     */
+    if (strcasecmp(ctx->name, "files") == 0) {
+        DEBUG(5, ("Rewriting provider %s\n", ctx->name));
+
+        val[0] = "proxy";
+        ret = confdb_add_param(ctx->cdb, true,
+                               ctx->conf_path,
+                               "provider",
+                               val);
+        if (ret) {
+            return ret;
+        }
+
+        val[0] = "files";
+        ret = confdb_add_param(ctx->cdb, true,
+                               ctx->conf_path,
+                               "libName",
+                               val);
+        if (ret) {
+            return ret;
+        }
+    }
+
+    return EOK;
+}
+
 int be_process_init(TALLOC_CTX *mem_ctx,
                     const char *be_name,
                     const char *be_domain,
@@ -922,6 +959,12 @@ int be_process_init(TALLOC_CTX *mem_ctx,
         return ret;
     }
 
+    ret = be_rewrite(ctx);
+    if (ret != EOK) {
+        DEBUG(0, ("error rewriting provider types\n"));
+        return ret;
+    }
+
     ret = load_backend_module(ctx, BET_ID,
                               &ctx->bet_info[BET_ID].bet_ops,
                               &ctx->bet_info[BET_ID].pvt_bet_data);
diff --git a/server/tools/tools_util.c b/server/tools/tools_util.c
index 79f73ac..6201399 100644
--- a/server/tools/tools_util.c
+++ b/server/tools/tools_util.c
@@ -78,7 +78,8 @@ enum id_domain get_domain_type(struct tools_ctx *ctx,
 
     if (strcasecmp(dom->provider, "local") == 0) {
         return ID_IN_LOCAL;
-    } else if (is_domain_local_legacy(ctx, dom) == 0) {
+    } else if (strcasecmp(dom->provider, "files") == 0 ||
+               is_domain_local_legacy(ctx, dom) == 0) {
         return ID_IN_LEGACY_LOCAL;
     }
 
-- 
1.6.2.5

