iron.git

commit d5f416292a3ca7fb8e726487f34ac1f13d29e4a4

Author: Paolo Lulli <paolo@lulli.net>

certsign: webserver for remote SRC signing

 certsign/build.sh | 6 +++
 certsign/certsign.groovy | 66 ++++++++++++++++++++++++++++++++++++++++
 certsign/certsign.sh | 10 ++++++
 certsign/getcertificate.sh | 13 +++++++


diff --git a/certsign/build.sh b/certsign/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a547bde1d45059112355638cdbbe71ca8a28999d
--- /dev/null
+++ b/certsign/build.sh
@@ -0,0 +1,6 @@
+#! /bin/bash
+
+cd $(dirname $0);
+currdir=$(pwd)
+
+spring jar ${currdir}/certsign.jar ${currdir}/certsign.groovy




diff --git a/certsign/certsign.groovy b/certsign/certsign.groovy
new file mode 100644
index 0000000000000000000000000000000000000000..517eed5ae8541e32c6355efcbc1aeb55bc2d486e
--- /dev/null
+++ b/certsign/certsign.groovy
@@ -0,0 +1,66 @@
+import javax.annotation.security.RunAs
+import javax.servlet.http.*
+import org.springframework.web.multipart.*
+import java.nio.file.*
+import java.nio.charset.*
+
+@Controller
+class CertSigner {
+
+    public static final String DATADIR = "/tmp/data/";
+    public static final String IRON_HOME = System.getProperty("user.home") + "/.iron";
+
+    @RequestMapping("/certsign/{name}")
+    @ResponseBody
+    String home(@PathVariable String name) {
+        return "Hello "+name;
+    }
+
+    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
+    @ResponseBody
+    public String submit(@RequestParam("file") MultipartFile file, ModelMap modelMap) {
+        modelMap.addAttribute("file", file);
+        convert(file);
+        return "fileUploadView";
+    }
+
+    @RequestMapping(value = "/upload/{servicename}/{clientname}", method = RequestMethod.POST)
+    @ResponseBody
+    public String submitWithParam(
+        @RequestParam("file") MultipartFile file,
+        @PathVariable("servicename") String servicename,
+        @PathVariable("clientname") String clientname,
+        HttpServletRequest request,
+        ModelMap modelMap)
+    {
+        modelMap.addAttribute("file", file);
+        convert(file, clientname+".csr");
+        String ip = request.getRemoteAddr();
+	//ip --> client mapping possible here
+
+        String cmd =  "iron certificate sign "+servicename+" "+DATADIR+clientname+".csr";
+        cmd.execute();
+        String certPath = IRON_HOME + "/"+ servicename + "/certs/" + clientname + "/" + clientname + ".crt";
+
+        File certFile = new File(certPath);
+        byte[] encoded = Files.readAllBytes(Paths.get(certPath));
+        String certContent = new String(encoded, StandardCharsets.UTF_8);
+        return certContent;
+    }
+
+    public static File convert(MultipartFile file)
+    {
+        String savedName = file.getOriginalFilename();
+        return convert(file, savedName);
+    }
+
+    public static File convert(MultipartFile file, String savedName)
+    {
+        File convFile = new File(DATADIR + savedName);
+        convFile.createNewFile();
+        FileOutputStream fos = new FileOutputStream(convFile);
+        fos.write(file.getBytes());
+        fos.close();
+        return convFile;
+    }
+}




diff --git a/certsign/certsign.sh b/certsign/certsign.sh
new file mode 100755
index 0000000000000000000000000000000000000000..45bfdf59e96aecc9a83da896c66684007db95f28
--- /dev/null
+++ b/certsign/certsign.sh
@@ -0,0 +1,10 @@
+#! /bin/bash -x
+
+#-DmaxPostSize=1048576
+server_port=8081
+
+cd $(dirname $0); currdir=/tmp
+
+java -Dserver.port=${server_port}\
+	-DmaxPostSize=10485760\
+	 -jar certsign.jar




diff --git a/certsign/getcertificate.sh b/certsign/getcertificate.sh
new file mode 100755
index 0000000000000000000000000000000000000000..cd6fbcc0506453a42449eb92a94ba52a0a1ccc72
--- /dev/null
+++ b/certsign/getcertificate.sh
@@ -0,0 +1,13 @@
+#! /bin/bash
+
+cd $(dirname $0);
+currdir=$(pwd)
+
+REMOTE_CA_HOST=127.0.0.1
+REMOTE_CA_PORT=8081
+
+caricandum=$1
+sname=$2
+cname=$3
+
+curl -F "file=@$caricandum" http://$REMOTE_CA_HOST:$REMOTE_CA_PORT/upload/$sname/$cname