/*
* Copyright 2014 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.google.samples.apps.iosched.server.gcm;
import javax.servlet.http.HttpServletRequest;
public class AuthHelper {
/** Keys that can be used to request GCM registration */
private static final String[][] REGISTRATION_KEYS = {
// TODO: Change keys for your project
{"AIzaSyBndbXpESxV6MjIGBW7ArDA6PQmVFiQ4o4", "Android app registration key"},
};
/** Keys that can be used to request full admin privileges. */
private static final String[][] ADMIN_KEYS = {
// TODO: Change keys for your project
{"8ec8ce66-d828-43cd-8c58-abd4121e1717", "Command line tool admin key"},
{"7ea6b7b1-91ce-487b-b718-dd385c88ca8d", "Updater AppEngine app"}
};
/**
* Extract authorization info from the HTTP request header or query param.
* @param req
* @return null if no authorization found. An AuthInfo with admin set to true if a valid admin key
* is used, or set to false if any non-admin key is present.
*/
public static AuthInfo processAuthorization(HttpServletRequest req) {
// Authenticate request
// Auth key defaults to the 'key' query parameter
String authKey = req.getParameter("key");
String authHeader = req.getHeader("Authorization");
if (authHeader != null) {
// Use 'Authorization: key=...' header
String splitHeader[] = authHeader.split("=");
if ("key".equals(splitHeader[0])) {
authKey = splitHeader[1];
}
}
if (authKey == null) {
return null;
}
for (String[] candidateKey : ADMIN_KEYS) {
if (candidateKey[0].equals(authKey)) {
// caller is an admin
AuthInfo info = new AuthInfo(candidateKey[0], candidateKey[1]);
info.permAdmin = true;
return info;
}
}
for (String[] candidateKey : REGISTRATION_KEYS) {
if (candidateKey[0].equals(authKey)) {
// caller is using a valid registration API key, so they
// can register
AuthInfo info = new AuthInfo(candidateKey[0], candidateKey[1]);
info.permRegister = true;
return info;
}
}
// the key is not a special admin or registration key, so all the user can do is
// send message to themselves
AuthInfo info = new AuthInfo(authKey, "User");
info.permSendSelfMessage = true;
return info;
}
public static class AuthInfo {
public boolean permAdmin = false;
public boolean permRegister = false;
public boolean permSendSelfMessage = false;
public String authKey;
public String clientName;
public AuthInfo(String authKey, String clientName) {
this.authKey = authKey;
this.clientName = clientName;
}
}
}