X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/64e85bae9da8de223cef4e12a7e659f6d7938638..5ee41dd039e304ae374a5f1265e32839204f14ff:/src/main.sml diff --git a/src/main.sml b/src/main.sml index 2aa3da7..e0e85ba 100644 --- a/src/main.sml +++ b/src/main.sml @@ -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 _ => ();