001 /*
002 * Copyright (c) 2011, Cloudera, Inc. All Rights Reserved.
003 *
004 * Cloudera, Inc. licenses this file to you under the Apache License,
005 * Version 2.0 (the "License"). You may not use this file except in
006 * compliance with the License. You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * This software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
011 * CONDITIONS OF ANY KIND, either express or implied. See the License for
012 * the specific language governing permissions and limitations under the
013 * License.
014 */
015 package com.cloudera.lib.wsrs;
016
017 import com.sun.jersey.api.core.HttpContext;
018 import com.sun.jersey.core.spi.component.ComponentContext;
019 import com.sun.jersey.core.spi.component.ComponentScope;
020 import com.sun.jersey.server.impl.inject.AbstractHttpContextInjectable;
021 import com.sun.jersey.spi.inject.Injectable;
022 import com.sun.jersey.spi.inject.InjectableProvider;
023 import org.slf4j.MDC;
024
025 import javax.ws.rs.core.Context;
026 import javax.ws.rs.ext.Provider;
027 import java.lang.reflect.Type;
028 import java.security.Principal;
029 import java.util.regex.Pattern;
030
031 @Provider
032 public class UserProvider extends AbstractHttpContextInjectable<Principal> implements
033 InjectableProvider<Context, Type> {
034
035 public static final String USER_NAME_PARAM = "user.name";
036
037 public static final Pattern USER_PATTERN = Pattern.compile("[_a-zA-Z0-9]+");
038
039 private static class UserParam extends StringParam {
040
041 public UserParam(String user) {
042 super(USER_NAME_PARAM, user, USER_PATTERN);
043 }
044 }
045
046 @Override
047 public Principal getValue(HttpContext httpContext) {
048 Principal principal = httpContext.getRequest().getUserPrincipal();
049 if (principal == null) {
050 final String user = httpContext.getRequest().getQueryParameters().getFirst(USER_NAME_PARAM);
051 if (user != null) {
052 principal = new Principal() {
053 @Override
054 public String getName() {
055 return new UserParam(user).value();
056 }
057 };
058 }
059 }
060 if (principal != null) {
061 MDC.put("user", principal.getName());
062 }
063 return principal;
064 }
065
066 @Override
067 public ComponentScope getScope() {
068 return ComponentScope.PerRequest;
069 }
070
071 @Override
072 public Injectable getInjectable(ComponentContext componentContext, Context context, Type type) {
073 return (type.equals(Principal.class)) ? this : null;
074 }
075 }