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 });
|