Spaces:
Paused
Paused
Update server.js
Browse files
server.js
CHANGED
|
@@ -31,6 +31,10 @@ if (hfUserConfig) {
|
|
| 31 |
const ADMIN_USERNAME = process.env.USER_NAME || 'admin';
|
| 32 |
const ADMIN_PASSWORD = process.env.USER_PASSWORD || 'password';
|
| 33 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
// 存储会话 token 的简单内存数据库(生产环境中应使用数据库或 Redis)
|
| 35 |
const sessions = new Map();
|
| 36 |
const SESSION_TIMEOUT = 24 * 60 * 60 * 1000; // 24小时超时
|
|
@@ -131,12 +135,27 @@ app.get('/api/proxy/spaces', async (req, res) => {
|
|
| 131 |
try {
|
| 132 |
if (!spaceCache.isExpired()) {
|
| 133 |
console.log('从缓存获取 Spaces 数据');
|
| 134 |
-
// 从缓存返回的数据也需要过滤
|
| 135 |
const cachedSpaces = spaceCache.getAll().map(space => {
|
| 136 |
const { token, ...safeSpace } = space; // 移除 token 字段
|
| 137 |
return safeSpace;
|
| 138 |
});
|
| 139 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
}
|
| 141 |
|
| 142 |
const allSpaces = [];
|
|
@@ -186,7 +205,22 @@ app.get('/api/proxy/spaces', async (req, res) => {
|
|
| 186 |
allSpaces.sort((a, b) => a.name.localeCompare(b.name));
|
| 187 |
spaceCache.updateAll(allSpaces);
|
| 188 |
console.log(`总共获取到 ${allSpaces.length} 个 Spaces`);
|
| 189 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
} catch (error) {
|
| 191 |
console.error(`代理获取 spaces 列表失败:`, error.message);
|
| 192 |
res.status(500).json({ error: '获取 spaces 列表失败', details: error.message });
|
|
|
|
| 31 |
const ADMIN_USERNAME = process.env.USER_NAME || 'admin';
|
| 32 |
const ADMIN_PASSWORD = process.env.USER_PASSWORD || 'password';
|
| 33 |
|
| 34 |
+
// 从环境变量获取是否在未登录时展示 private 实例的配置,默认值为 false
|
| 35 |
+
const SHOW_PRIVATE = process.env.SHOW_PRIVATE === 'true';
|
| 36 |
+
console.log(`SHOW_PRIVATE 配置: ${SHOW_PRIVATE ? '未登录时展示 private 实例' : '未登录时隐藏 private 实例'}`);
|
| 37 |
+
|
| 38 |
// 存储会话 token 的简单内存数据库(生产环境中应使用数据库或 Redis)
|
| 39 |
const sessions = new Map();
|
| 40 |
const SESSION_TIMEOUT = 24 * 60 * 60 * 1000; // 24小时超时
|
|
|
|
| 135 |
try {
|
| 136 |
if (!spaceCache.isExpired()) {
|
| 137 |
console.log('从缓存获取 Spaces 数据');
|
| 138 |
+
// 从缓存返回的数据也需要根据登录状态和 SHOW_PRIVATE 过滤 private 字段
|
| 139 |
const cachedSpaces = spaceCache.getAll().map(space => {
|
| 140 |
const { token, ...safeSpace } = space; // 移除 token 字段
|
| 141 |
return safeSpace;
|
| 142 |
});
|
| 143 |
+
|
| 144 |
+
// 检查是否登录
|
| 145 |
+
const authHeader = req.headers['authorization'];
|
| 146 |
+
const isAuthenticated = authHeader && authHeader.startsWith('Bearer ') && sessions.get(authHeader.split(' ')[1]);
|
| 147 |
+
|
| 148 |
+
// 登录状态下返回所有实例,未登录时根据 SHOW_PRIVATE 决定是否返回 private 实例
|
| 149 |
+
if (isAuthenticated) {
|
| 150 |
+
console.log('用户已登录,返回所有实例');
|
| 151 |
+
return res.json(cachedSpaces);
|
| 152 |
+
} else if (SHOW_PRIVATE) {
|
| 153 |
+
console.log('用户未登录,但 SHOW_PRIVATE 为 true,返回所有实例');
|
| 154 |
+
return res.json(cachedSpaces);
|
| 155 |
+
} else {
|
| 156 |
+
console.log('用户未登录,SHOW_PRIVATE 为 false,过滤 private 实例');
|
| 157 |
+
return res.json(cachedSpaces.filter(space => !space.private));
|
| 158 |
+
}
|
| 159 |
}
|
| 160 |
|
| 161 |
const allSpaces = [];
|
|
|
|
| 205 |
allSpaces.sort((a, b) => a.name.localeCompare(b.name));
|
| 206 |
spaceCache.updateAll(allSpaces);
|
| 207 |
console.log(`总共获取到 ${allSpaces.length} 个 Spaces`);
|
| 208 |
+
|
| 209 |
+
// 检查是否登录
|
| 210 |
+
const authHeader = req.headers['authorization'];
|
| 211 |
+
const isAuthenticated = authHeader && authHeader.startsWith('Bearer ') && sessions.get(authHeader.split(' ')[1]);
|
| 212 |
+
|
| 213 |
+
// 登录状态下返回所有实例,未登录时根据 SHOW_PRIVATE 决定是否返回 private 实例
|
| 214 |
+
if (isAuthenticated) {
|
| 215 |
+
console.log('用户已登录,返回所有实例');
|
| 216 |
+
res.json(allSpaces);
|
| 217 |
+
} else if (SHOW_PRIVATE) {
|
| 218 |
+
console.log('用户未登录,但 SHOW_PRIVATE 为 true,返回所有实例');
|
| 219 |
+
res.json(allSpaces);
|
| 220 |
+
} else {
|
| 221 |
+
console.log('用户未登录,SHOW_PRIVATE 为 false,过滤 private 实例');
|
| 222 |
+
res.json(allSpaces.filter(space => !space.private));
|
| 223 |
+
}
|
| 224 |
} catch (error) {
|
| 225 |
console.error(`代理获取 spaces 列表失败:`, error.message);
|
| 226 |
res.status(500).json({ error: '获取 spaces 列表失败', details: error.message });
|