Privilege setting code
[hcoop/domtool2.git] / src / main.sml
index 2aa3da7..e0e85ba 100644 (file)
@@ -125,24 +125,33 @@ fun eval fname =
 val dispatcher =
     Config.dispatcher ^ ":" ^ Int.toString Config.dispatcherPort
 
-fun request fname =
+fun requestContext f =
     let
        val uid = Posix.ProcEnv.getuid ()
        val user = Posix.SysDB.Passwd.name (Posix.SysDB.getpwuid uid)
-
+                  
        val () = Acl.read Config.aclFile
        val () = Domain.setUser user
-
-       val _ = check fname
-
-       val uid = Posix.ProcEnv.getuid ()
-       val user = Posix.SysDB.Passwd.name (Posix.SysDB.getpwuid uid)
+                
+       val () = f ()
 
        val context = OpenSSL.context (Config.certDir ^ "/" ^ user ^ ".pem",
                                       Config.keyDir ^ "/" ^ user ^ "/key.pem",
                                       Config.trustStore)
+    in
+       (user, context)
+    end
 
-       val bio = OpenSSL.connect (context, dispatcher)
+fun requestBio f =
+    let
+       val (user, context) = requestContext f
+    in
+       (user, OpenSSL.connect (context, dispatcher))
+    end
+
+fun request fname =
+    let
+       val (user, bio) = requestBio (fn () => ignore (check fname))
 
        val inf = TextIO.openIn fname
 
@@ -166,6 +175,21 @@ fun request fname =
     end
     handle ErrorMsg.Error => ()
 
+fun requestGrant acl =
+    let
+       val (user, bio) = requestBio (fn () => ())
+    in
+       Msg.send (bio, MsgGrant acl);
+       case Msg.recv bio of
+           NONE => print "Server closed connection unexpectedly.\n"
+         | SOME m =>
+           case m of
+               MsgOk => print "Grant succeeded.\n"
+             | MsgError s => print ("Grant failed: " ^ s ^ "\n")
+             | _ => print "Unexpected server reply.\n";
+       OpenSSL.close bio
+    end
+
 fun service () =
     let
        val () = Acl.read Config.aclFile
@@ -216,12 +240,35 @@ fun service () =
                                                      MsgError
                                                          ("Error during configuration evaluation: "
                                                           ^ s)));
-                                          OS.FileSys.remove outname;
-                                          (ignore (OpenSSL.readChar bio);
-                                           OpenSSL.close bio)
-                                          handle OpenSSL.OpenSSL _ => ();
-                                          loop ()
+                                   OS.FileSys.remove outname;
+                                   (ignore (OpenSSL.readChar bio);
+                                    OpenSSL.close bio)
+                                   handle OpenSSL.OpenSSL _ => ();
+                                   loop ()
                                end
+
+                             | MsgGrant acl =>
+                               if Acl.query {user = user, class = "group", value = "root"} then
+                                   ((Acl.grant acl;
+                                     Acl.write Config.aclFile;
+                                     Msg.send (bio, MsgOk))
+                                    handle OpenSSL.OpenSSL s =>
+                                           (print "OpenSSL error\n";
+                                            Msg.send (bio,
+                                                      MsgError
+                                                          ("Error during granting: "
+                                                           ^ s)));
+                                   (ignore (OpenSSL.readChar bio);
+                                    OpenSSL.close bio)
+                                   handle OpenSSL.OpenSSL _ => ();
+                                   loop ())
+                               else
+                                   ((Msg.send (bio, MsgError "Not authorized to grant privileges");
+                                     ignore (OpenSSL.readChar bio);
+                                     OpenSSL.close bio)
+                                    handle OpenSSL.OpenSSL _ => ();
+                                    loop ())
+
                              | _ =>
                                (Msg.send (bio, MsgError "Unexpected command")
                                 handle OpenSSL.OpenSSL _ => ();