1 /* 2 * Copyright (c) 2016 Google Inc. All Rights Reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you 5 * may not use this file except in compliance with the License. You may 6 * obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 13 * implied. See the License for the specific language governing 14 * permissions and limitations under the License. 15 */ 16 17 package com.android.vts.api; 18 19 import com.android.vts.proto.VtsReportMessage.DashboardPostMessage; 20 import com.android.vts.proto.VtsReportMessage.TestReportMessage; 21 import com.android.vts.util.DatastoreHelper; 22 import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 23 import com.google.api.client.http.javanet.NetHttpTransport; 24 import com.google.api.client.json.jackson.JacksonFactory; 25 import com.google.api.services.oauth2.Oauth2; 26 import com.google.api.services.oauth2.model.Tokeninfo; 27 import java.io.BufferedReader; 28 import java.io.IOException; 29 import java.util.logging.Level; 30 import java.util.logging.Logger; 31 import javax.servlet.http.HttpServlet; 32 import javax.servlet.http.HttpServletRequest; 33 import javax.servlet.http.HttpServletResponse; 34 import org.apache.commons.codec.binary.Base64; 35 36 /** REST endpoint for posting data to the Dashboard. */ 37 public class DatastoreRestServlet extends HttpServlet { 38 private static final String SERVICE_CLIENT_ID = System.getProperty("SERVICE_CLIENT_ID"); 39 private static final Logger logger = Logger.getLogger(DatastoreRestServlet.class.getName()); 40 41 @Override doPost(HttpServletRequest request, HttpServletResponse response)42 public void doPost(HttpServletRequest request, HttpServletResponse response) 43 throws IOException { 44 // Retrieve the params 45 String payload = new String(); 46 DashboardPostMessage postMessage; 47 try { 48 String line = null; 49 BufferedReader reader = request.getReader(); 50 while ((line = reader.readLine()) != null) { 51 payload += line; 52 } 53 byte[] value = Base64.decodeBase64(payload); 54 postMessage = DashboardPostMessage.parseFrom(value); 55 } catch (IOException e) { 56 response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 57 logger.log(Level.WARNING, "Invalid proto: " + payload); 58 return; 59 } 60 61 // Verify service account access token. 62 boolean authorized = false; 63 if (postMessage.hasAccessToken()) { 64 String accessToken = postMessage.getAccessToken(); 65 GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); 66 Oauth2 oauth2 = 67 new Oauth2.Builder(new NetHttpTransport(), new JacksonFactory(), credential) 68 .build(); 69 Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(accessToken).execute(); 70 if (tokenInfo.getIssuedTo().equals(SERVICE_CLIENT_ID)) { 71 authorized = true; 72 } 73 } 74 75 if (!authorized) { 76 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 77 return; 78 } 79 80 for (TestReportMessage testReportMessage : postMessage.getTestReportList()) { 81 DatastoreHelper.insertData(testReportMessage); 82 } 83 84 response.setStatus(HttpServletResponse.SC_OK); 85 } 86 } 87