/* * Copyright (c) 2016 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.android.vts.api; import com.android.vts.proto.VtsReportMessage.TestReportMessage; import com.android.vts.servlet.BaseServlet; import com.android.vts.util.DatastoreHelper; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.jackson.JacksonFactory; import com.google.api.services.oauth2.Oauth2; import com.google.api.services.oauth2.model.Tokeninfo; import com.google.protobuf.InvalidProtocolBufferException; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; import org.json.JSONException; import org.json.JSONObject; /** REST endpoint for posting data JSON to the Dashboard. */ @Deprecated public class BigtableLegacyJsonServlet extends HttpServlet { private static String SERVICE_CLIENT_ID; private static final String SERVICE_NAME = "VTS Dashboard"; private static final Logger logger = Logger.getLogger(BigtableLegacyJsonServlet.class.getName()); /** System Configuration Property class */ protected Properties systemConfigProp = new Properties(); @Override public void init(ServletConfig cfg) throws ServletException { super.init(cfg); try { InputStream defaultInputStream = BigtableLegacyJsonServlet.class .getClassLoader() .getResourceAsStream("config.properties"); systemConfigProp.load(defaultInputStream); SERVICE_CLIENT_ID = systemConfigProp.getProperty("appengine.serviceClientID"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // Retrieve the params String payload = new String(); JSONObject payloadJson; try { String line = null; BufferedReader reader = request.getReader(); while ((line = reader.readLine()) != null) { payload += line; } payloadJson = new JSONObject(payload); } catch (IOException | JSONException e) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); logger.log(Level.WARNING, "Invalid JSON: " + payload); return; } // Verify service account access token. boolean authorized = false; if (payloadJson.has("accessToken")) { String accessToken = payloadJson.getString("accessToken").trim(); GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); Oauth2 oauth2 = new Oauth2.Builder(new NetHttpTransport(), new JacksonFactory(), credential) .setApplicationName(SERVICE_NAME) .build(); Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(accessToken).execute(); if (tokenInfo.getIssuedTo().equals(SERVICE_CLIENT_ID)) { authorized = true; } } if (!authorized) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } // Parse the desired action and execute the command try { if (payloadJson.has("verb")) { switch (payloadJson.getString("verb")) { case "createTable": logger.log(Level.INFO, "Deprecated verb: createTable."); break; case "insertRow": insertData(payloadJson); break; default: logger.log( Level.WARNING, "Invalid Datastore REST verb: " + payloadJson.getString("verb")); throw new IOException("Unsupported POST verb."); } } } catch (IOException e) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); return; } response.setStatus(HttpServletResponse.SC_OK); } /** * Inserts a data into the Cloud Datastore * * @param payloadJson The JSON object representing the row to be inserted. Of the form: { * (deprecated) 'tableName' : 'table', (deprecated) 'rowKey' : 'row', (deprecated) 'family' * : 'family', (deprecated) 'qualifier' : 'qualifier', 'value' : 'value' } * @throws IOException */ private void insertData(JSONObject payloadJson) throws IOException { if (!payloadJson.has("value")) { logger.log(Level.WARNING, "Missing attributes for datastore api insertRow()."); return; } try { byte[] value = Base64.decodeBase64(payloadJson.getString("value")); TestReportMessage testReportMessage = TestReportMessage.parseFrom(value); } catch (InvalidProtocolBufferException e) { logger.log(Level.WARNING, "Invalid report posted to dashboard."); } } }