/**
* Copyright 2016 benjobs
* <p>
* 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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 org.opencron.server.job;
import org.opencron.common.utils.*;
import org.opencron.server.domain.User;
import org.opencron.server.service.TerminalService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public final class OpencronTools {
public static final String CACHED_AGENT_ID = "opencron_agent";
public static final String CACHED_JOB_ID = "opencron_job";
public static final String LOGIN_USER = "opencron_user";
public static final String LOGIN_USER_ID = "opencron_user_id";
public static final String PERMISSION = "permission";
public static final String SSH_SESSION_ID = "ssh_session_id";
public static final String HTTP_SESSION_ID = "http_session_id";
public static final String CSRF_NAME = "csrf";
public static final String LOGIN_MSG = "loginMsg";
public static final String CONTEXT_PATH_NAME = "contextPath";
private static String resourceId;
private static Logger logger = LoggerFactory.getLogger(OpencronTools.class);
public static boolean isPermission(HttpSession session) {
Object obj = session.getAttribute(PERMISSION);
if (obj == null) {
return false;
}
return (Boolean) obj;
}
public static void logined(HttpServletRequest request, User user) {
HttpSession session = request.getSession();
session.setAttribute(HTTP_SESSION_ID, session.getId());
session.setAttribute(LOGIN_USER, user);
session.setAttribute(LOGIN_USER_ID, user.getUserId());
session.setAttribute(CONTEXT_PATH_NAME, WebUtils.getWebUrlPath(request));
}
public static User getUser(HttpSession session) {
return (User) session.getAttribute(LOGIN_USER);
}
public static Long getUserId(HttpSession session) {
return (Long) session.getAttribute(LOGIN_USER_ID);
}
public static void invalidSession(HttpSession session) throws Exception {
session.removeAttribute(LOGIN_USER);
session.removeAttribute(LOGIN_USER_ID);
session.removeAttribute(PERMISSION);
session.removeAttribute(HTTP_SESSION_ID);
session.removeAttribute(SSH_SESSION_ID);
session.removeAttribute(CSRF_NAME);
TerminalService.TerminalSession.exit(session.getId());
session.removeAttribute(LOGIN_MSG);
session.removeAttribute(CONTEXT_PATH_NAME);
session.invalidate();
}
public static String getCSRF(HttpSession session) {
String token;
synchronized (session) {
token = (String) session.getAttribute(CSRF_NAME);
if (null == token) {
token = CommonUtils.uuid();
session.setAttribute(CSRF_NAME, token);
}
}
return token;
}
public static String getCSRF(HttpServletRequest request) {
String csrf = request.getHeader(CSRF_NAME);
if (csrf == null) {
csrf = request.getParameter(CSRF_NAME);
}
return csrf;
}
public static void setSshSessionId(HttpSession session, String sshSessionId) {
session.setAttribute(SSH_SESSION_ID, sshSessionId);
}
public static String getResourceId() {
if (resourceId == null) {
resourceId = CommonUtils.uuid();
}
return resourceId;
}
public static class CACHE {
private static Map<String, Object> cache = new ConcurrentHashMap<String, Object>(0);
public static Object get(String key) {
return cache.get(key);
}
public static <T> T get(String key, Class<T> clazz) {
return (T) cache.get(key);
}
public static void put(String key, Object value) {
cache.put(key, value);
}
public static Object remove(String key) {
return cache.remove(key);
}
}
public static class Auth {
public static String publicKey = null;
public static String privateKey = null;
private static final String charset = "UTF-8";
public static String KEY_PATH = null;
public static String PRIVATE_KEY_PATH = null;
public static String PUBLIC_KEY_PATH = null;
private static void generateKey() {
if (CommonUtils.isEmpty(publicKey, privateKey)) {
try {
File keyPath = new File(KEY_PATH);
if (!keyPath.exists()) {
keyPath.mkdirs();
}
Map<String, Object> keyMap = RSAUtils.genKeyPair();
publicKey = RSAUtils.getPublicKey(keyMap);
privateKey = RSAUtils.getPrivateKey(keyMap);
File pubFile = new File(getPublicKeyPath());
File prvFile = new File(getPrivateKeyPath());
IOUtils.writeText(pubFile, publicKey, charset);
IOUtils.writeText(prvFile, privateKey, charset);
} catch (Exception e) {
logger.error("[opencron] error:{}" + e.getMessage());
throw new RuntimeException("init RSA'publicKey and privateKey error!");
}
}
}
public static String getPublicKey() {
return getKey(KeyType.PUBLIC);
}
public static String getPrivateKey() {
return getKey(KeyType.PRIVATE);
}
private static String getKey(KeyType type) {
File file = new File(type.equals(KeyType.PUBLIC) ? getPublicKeyPath() : getPrivateKeyPath());
if (file.exists()) {
switch (type) {
case PUBLIC:
publicKey = IOUtils.readText(file, charset);
if (CommonUtils.isEmpty(publicKey)) {
generateKey();
}
break;
case PRIVATE:
privateKey = IOUtils.readText(file, charset);
if (CommonUtils.isEmpty(privateKey)) {
generateKey();
}
break;
}
} else {
generateKey();
}
return type.equals(KeyType.PUBLIC) ? publicKey : privateKey;
}
private static String getKeyPath() {
if (KEY_PATH == null) {
KEY_PATH = System.getProperties().getProperty("user.home") + File.separator + ".opencron";
// 从config.properties配置都读取用户手动设置的keypath的位置,配置文件里默认没有,不建议用户指定
// 如果指定了位置可能会导致之前所有已可ssh登录的机器无法登陆,需要再次输入用户名密码
String path = PropertyPlaceholder.get("opencron.keypath");
if (path != null) {
KEY_PATH = path;
}
}
return KEY_PATH;
}
private static String getPrivateKeyPath() {
PRIVATE_KEY_PATH = getKeyPath() + File.separator + "id_rsa";
return PRIVATE_KEY_PATH;
}
private static String getPublicKeyPath() {
PUBLIC_KEY_PATH = getPrivateKeyPath() + ".pub";
return PUBLIC_KEY_PATH;
}
enum KeyType {
PUBLIC, PRIVATE
}
}
}