• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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