| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you 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.cloud.user; |
| |
| import com.cloud.utils.component.ComponentContext; |
| import javax.inject.Inject; |
| |
| public class UserContext { |
| private static ThreadLocal<UserContext> s_currentContext = new ThreadLocal<UserContext>(); |
| |
| private long userId; |
| private String sessionId; |
| private Account account; |
| private long startEventId = 0; |
| private long accountId; |
| private String eventDetails; |
| private boolean apiServer; |
| |
| @Inject private AccountService _accountMgr = null; |
| |
| public UserContext() { |
| } |
| |
| public UserContext(long userId, Account accountObject, String sessionId, boolean apiServer) { |
| this.userId = userId; |
| this.account = accountObject; |
| this.sessionId = sessionId; |
| this.apiServer = apiServer; |
| } |
| |
| public long getCallerUserId() { |
| return userId; |
| } |
| |
| public User getCallerUser() { |
| if (_accountMgr == null) { |
| _accountMgr = ComponentContext.getComponent(AccountService.class); |
| } |
| return _accountMgr.getActiveUser(userId); |
| } |
| |
| public void setCallerUserId(long userId) { |
| this.userId = userId; |
| } |
| |
| public String getSessionId() { |
| return sessionId; |
| } |
| |
| public Account getCaller() { |
| return account; |
| } |
| |
| public void setCaller(Account accountObject) { |
| this.account = accountObject; |
| } |
| |
| public void setSessionKey(String sessionId) { |
| this.sessionId = sessionId; |
| } |
| |
| public boolean isApiServer() { |
| return apiServer; |
| } |
| |
| public void setApiServer(boolean apiServer) { |
| this.apiServer = apiServer; |
| } |
| |
| public static UserContext current() { |
| UserContext context = s_currentContext.get(); |
| if (context == null) { |
| // |
| // TODO: we should enforce explicit UserContext setup at major entry-points for security concerns, |
| // however, there are many places that run background jobs assume the system context. |
| // |
| // If there is a security concern, all entry points from user (including the front end that takes HTTP |
| // request in and |
| // the core async-job manager that runs commands from user) have explicitly setup the UserContext. |
| // |
| return UserContextInitializer.getInstance().getAdminContext(); |
| } |
| return context; |
| } |
| |
| public static void updateContext(long userId, Account accountObject, String sessionId) { |
| UserContext context = current(); |
| assert (context != null) : "Context should be already setup before you can call this one"; |
| |
| context.setCallerUserId(userId); |
| context.setCaller(accountObject); |
| context.setSessionKey(sessionId); |
| } |
| |
| public static void registerContext(long userId, Account accountObject, String sessionId, boolean apiServer) { |
| s_currentContext.set(new UserContext(userId, accountObject, sessionId, apiServer)); |
| } |
| |
| public static void unregisterContext() { |
| s_currentContext.set(null); |
| } |
| |
| public void setStartEventId(long startEventId) { |
| this.startEventId = startEventId; |
| } |
| |
| public long getStartEventId() { |
| return startEventId; |
| } |
| |
| public long getAccountId() { |
| return accountId; |
| } |
| |
| public void setAccountId(long accountId) { |
| this.accountId = accountId; |
| } |
| |
| public void setEventDetails(String eventDetails) { |
| this.eventDetails = eventDetails; |
| } |
| |
| public String getEventDetails() { |
| return eventDetails; |
| } |
| } |