Skip to content
Snippets Groups Projects
InstallHandler.java 8.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    package code;
    
    import java.net.HttpURLConnection;
    
    import java.net.InetSocketAddress;
    
    import com.sun.net.httpserver.HttpServer;
    
    A C's avatar
    A C committed
    import db.DBC;
    
    A C's avatar
    A C committed
    import db.Dominio;
    
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    import java.nio.file.Files;
    import java.nio.file.Path;
    
    A C's avatar
    A C committed
    import java.security.NoSuchAlgorithmException;
    
    A C's avatar
    A C committed
    import java.sql.SQLException;
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    
    import com.sun.net.httpserver.HttpExchange;
    import com.sun.net.httpserver.HttpHandler;
    import com.sun.net.httpserver.HttpContext;
    import com.sun.net.httpserver.Headers;
    import com.sun.net.httpserver.HttpPrincipal;
    
    import java.io.*;
    
    A C's avatar
    A C committed
    import java.lang.reflect.Array;
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    import java.util.*;
    
    A C's avatar
    A C committed
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    import java.net.URI;
    import java.net.URL;
    import java.net.URLDecoder;
    
    
    A C's avatar
    A C committed
    public class InstallHandler implements HttpHandler {
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    
    	@Override
    	public void handle(HttpExchange he) throws IOException {
    
    A C's avatar
    A C committed
    
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    		String requestMethod = he.getRequestMethod();
    
    A C's avatar
    A C committed
    
    
    		if (requestMethod.compareToIgnoreCase("options") == 0) {
    			System.out.println("OPTIONS");
    			he.getResponseHeaders().add("Access-Control-Allow-Origin", "*");// se non mettiamo *, viene errore CORS //http://localhost:3001/secured/domains
    			he.getResponseHeaders().add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
    			he.getResponseHeaders().add("Access-Control-Allow-Headers", "Content-Type,Authorization");
    			he.sendResponseHeaders(200, -1);
    			return;
    		}
    
    
    A C's avatar
    A C committed
    		String response = "";
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    		String body = readBody(he.getRequestBody());
    
    A C's avatar
    A C committed
    
    		 //he.getRequestHeaders().get("user").get(0);
    
    A C's avatar
    A C committed
    		String token=he.getRequestHeaders().get("Authorization").get(0).substring(7);
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    		String user;
    
    A C's avatar
    A C committed
    		try {
    			//JSONObject tok=new JSONObject(token);
    			//String accessToken=tok.getString("access_token");
    
    A C's avatar
    A C committed
    			if(tokSplit.length!=3)return;//controllo che il token abbia header,body e signature(abbia 2 punti :s)
    			//int scnddot=accessToken.lastIndexOf(".");//dopo questo indice è tutta signature
    			String signature=tokSplit[2];
    			user=TokenHandler.verificaToken(token,signature);
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			if(user == null){
    				he.sendResponseHeaders(401, -1);
    				he.getResponseHeaders().add("Access-Control-Allow-Origin", "*");//http://localhost:3001/secured/domains
    				he.getResponseHeaders().add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");//non c'era POST
    				he.getResponseHeaders().add("Access-Control-Allow-Headers", "Content-Type,Authorization");
    				// questa parte sopra serve anche qui, non solo quando si chiama con OPTIONS
    				return;
    			}
    
    A C's avatar
    A C committed
    		} catch (NoSuchAlgorithmException | IOException | JSONException e2) {
    			e2.printStackTrace();
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			return;
    
    A C's avatar
    A C committed
    		}
    
    A C's avatar
    A C committed
    		//verifica user
    
    		if (requestMethod.compareToIgnoreCase("POST") == 0) {// || requestMethod.compareTo("post") == 0) {
    
    A C's avatar
    A C committed
    			JSONObject j = null;
    
    A C's avatar
    A C committed
    			try {
    
    A C's avatar
    A C committed
    				j = new JSONObject(body);
    				String dm = j.getString("domain");
    
    				//try {
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    					Dominio d = DBC.getDom(dm);
    
    A C's avatar
    A C committed
    					if (d != null) {
    
    A C's avatar
    A C committed
    						System.out.println("DOMINIO GIA' IN USO");
    						response = "DOMINIO GIA' IN USO";
    						OutputStream os = he.getResponseBody();
    
    						he.getResponseHeaders().add("Access-Control-Allow-Origin", "*");//http://localhost:3001/secured/domains
    						he.getResponseHeaders().add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");//non c'era POST
    						he.getResponseHeaders().add("Access-Control-Allow-Headers", "Content-Type,Authorization");
    						// questa parte sopra serve anche qui, non solo quando si chiama con OPTIONS
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    						he.sendResponseHeaders(403, response.getBytes().length);
    
    A C's avatar
    A C committed
    						os.write(response.getBytes());
    						os.close();
    						return;
    					}
    
    A C's avatar
    A C committed
    
    
    
    A C's avatar
    A C committed
    			} catch (JSONException | SQLException e) {
    
    A C's avatar
    A C committed
    				// TODO Auto-generated catch block
    
    A C's avatar
    A C committed
    				e.printStackTrace();
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			}
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    			// effettuo chiamata a CloudAppManager
    			// preso da https://www.baeldung.com/java-http-request
    
    			// è una chiamata annidata nella risposta alla webapp
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			// -richiesta REST da webApp a /install
    
    A C's avatar
    A C committed
    			// -prendo da DB e poi chiamo CloudAppMng su /install
    			// -attendo risposta da CloudAppMng e chiudo
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			// -rispondo a webApp e chiudo
    			// EZ
    
    A C's avatar
    A C committed
    
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			//
    
    A C's avatar
    A C committed
    			// standard per chiamata in slide
    			// https://www.dir.uniupo.it/pluginfile.php/948883/mod_resource/content/1/FrameworkProgetto5.pdf
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			//
    
    A C's avatar
    A C committed
    			// http://127.0.0.1:8080/install
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    
    			// 3002/install da inserire
    			URL url = new URL("http://127.0.0.1:3002/install");// maybe, se CloudAppe è in localhost porta 8080
    			HttpURLConnection con = (HttpURLConnection) url.openConnection();
    
    
    
    			con.setRequestMethod("POST");
    			con.setRequestProperty("Content-Type", "application/json");
    			con.setRequestProperty("Accept", "application/json");
    			con.setDoOutput(true);
    			con.setConnectTimeout(5000);
    			con.setReadTimeout(5000);
    			DataOutputStream outForCloudApp = new DataOutputStream(con.getOutputStream());// inserimento param in call
    			outForCloudApp.writeBytes(j.toString());// ParameterStringBuilder.getParamsString(parameters));
    			outForCloudApp.flush();
    			// he.getResponseHeaders().add("Access-Control-Allow-Origin", "*");//http://localhost:3001/secured/domains
    			// he.getResponseHeaders().add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");//non c'era POST
    			// he.getResponseHeaders().add("Access-Control-Allow-Headers", "Content-Type,Authorization");
    			// questa parte sopra serve anche qui, non solo quando si chiama con OPTIONS
    			outForCloudApp.close();
    
    A C's avatar
    A C committed
    
    			// con.setRequestProperty("Content-Type", "application/json");
    			// String contentType = con.getHeaderField("Content-Type");
    			// leggo risposta
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			int status = con.getResponseCode();
    			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    			String inputLine;
    			StringBuffer content = new StringBuffer();
    			while ((inputLine = in.readLine()) != null) {
    				content.append(inputLine);
    
    A C's avatar
    A C committed
    			}
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			in.close();
    			con.disconnect();
    
    A C's avatar
    A C committed
    			// finita chiamata a CloudApp
    
    			// f.close();
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			OutputStream os = he.getResponseBody();
    
    A C's avatar
    A C committed
    			he.sendResponseHeaders(status, content.length());
    			os.write(content.toString().getBytes());
    
    			he.getResponseHeaders().add("Access-Control-Allow-Origin", "*");//http://localhost:3001/secured/domains
    			he.getResponseHeaders().add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");//non c'era POST
    	        he.getResponseHeaders().add("Access-Control-Allow-Headers", "Content-Type,Authorization");
    			// questa parte sopra serve anche qui, non solo quando si chiama con OPTIONS
    
    A C's avatar
    A C committed
    			// he.sendResponseHeaders(status, response.length());//status
    			// os.write(response.getBytes());
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			os.close();
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    			if (status==200) {
    				//String s = user + "-A";
    				try {
    
    A C's avatar
    A C committed
    					//qui leggo e parsifico i json nel body, inserisco tutti i campi nel db
    
    A C's avatar
    A C committed
    					String domain=j.getString("domain");
    					DBC.insertDom(domain);
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    					// DBC.insertAmministra(user, domain);
    
    A C's avatar
    A C committed
    					JSONArray arrUsers = j.getJSONArray("users");
    					for(int i=0;i<arrUsers.length();i++) {
    						if(((JSONObject) arrUsers.get(i)).getString("role").equals("A")) {
    							String usr=((JSONObject) arrUsers.get(i)).getString("user");
    							DBC.insertAmministra(usr, domain);
    						}
    						else if(((JSONObject) arrUsers.get(i)).getString("role").equals("U")) {
    							String usr=((JSONObject) arrUsers.get(i)).getString("user");
    							DBC.insertUsa(usr, domain);
    						}
    					}
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    					System.out.println("Using JSON: "+j.toString());
    
    A C's avatar
    A C committed
    					JSONArray arrServ = j.getJSONArray("services");
    					for(int i=0;i<arrServ.length();i++) {
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    
    						// String modul=((JSONObject) arrUsers.get(i)).getString("service");
    						// String host=((JSONObject) arrUsers.get(i)).getString("host");
    						// DBC.insertService(domain,host,modul);
    						String modul = arrServ.get(i).toString();
    						DBC.insertService(domain,modul);
    
    A C's avatar
    A C committed
    					}
    
    A C's avatar
    A C committed
    					//non ci sono controlli!!!!
    
    A C's avatar
    A C committed
    
    				} catch (SQLException | JSONException e) {
    					e.printStackTrace();
    				}
    			}
    
    A C's avatar
    A C committed
    
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    	private String readBody(InputStream requestBody) {
    		int req;
    		StringBuffer sb = new StringBuffer();
    		try {
    			while ((req = requestBody.read()) != -1)
    				sb.append(Character.toString((char) req));
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return sb.toString();
    	}
    
    }