| /** |
| * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. |
| * |
| * This software is licensed under the GNU General Public License v3 or later. |
| * |
| * It is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation, either version 3 of the License, or any later version. |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| * |
| */ |
| |
| package com.cloud.user; |
| |
| import com.cloud.server.ManagementService; |
| import com.cloud.utils.component.ComponentLocator; |
| |
| public class UserContext { |
| |
| private static ThreadLocal<UserContext> s_currentContext = new ThreadLocal<UserContext>(); |
| private static final ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name); |
| private static final AccountService _accountMgr = locator.getManager(AccountService.class); |
| |
| private long userId; |
| private String sessionId; |
| private Account account; |
| private long startEventId = 0; |
| private long accountId; |
| private String eventDetails; |
| |
| private boolean apiServer; |
| |
| private static UserContext s_adminContext = new UserContext(_accountMgr.getSystemUser().getId(), _accountMgr.getSystemAccount(), null, false); |
| |
| 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 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 s_adminContext; |
| } |
| 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; |
| } |
| } |