Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a3ab898e04 | |||
| dea67c0d86 | |||
| d13a2c237c | |||
| c592f0aa69 |
@@ -10,7 +10,7 @@
|
|||||||
"plugins": [
|
"plugins": [
|
||||||
{
|
{
|
||||||
"name": "claude-mem",
|
"name": "claude-mem",
|
||||||
"version": "7.3.8",
|
"version": "7.3.9",
|
||||||
"source": "./plugin",
|
"source": "./plugin",
|
||||||
"description": "Persistent memory system for Claude Code - context compression across sessions"
|
"description": "Persistent memory system for Claude Code - context compression across sessions"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file.
|
|||||||
|
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
|
## [7.3.8] - 2025-12-18
|
||||||
|
|
||||||
|
## Security Fix
|
||||||
|
|
||||||
|
Added localhost-only protection for admin endpoints to prevent DoS attacks when worker service is bound to 0.0.0.0 for remote UI access.
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
- Created `requireLocalhost` middleware to restrict admin endpoints
|
||||||
|
- Applied to `/api/admin/restart` and `/api/admin/shutdown`
|
||||||
|
- Returns 403 Forbidden for non-localhost requests
|
||||||
|
|
||||||
|
### Security Impact
|
||||||
|
Prevents unauthorized shutdown/restart of worker service when exposed on network.
|
||||||
|
|
||||||
|
Fixes security concern raised in #368.
|
||||||
|
|
||||||
## [7.3.7] - 2025-12-17
|
## [7.3.7] - 2025-12-17
|
||||||
|
|
||||||
## Windows Platform Stabilization
|
## Windows Platform Stabilization
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "claude-mem",
|
"name": "claude-mem",
|
||||||
"version": "7.3.8",
|
"version": "7.3.9",
|
||||||
"description": "Memory compression system for Claude Code - persist context across sessions",
|
"description": "Memory compression system for Claude Code - persist context across sessions",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"claude",
|
"claude",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "claude-mem",
|
"name": "claude-mem",
|
||||||
"version": "7.3.8",
|
"version": "7.3.9",
|
||||||
"description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions",
|
"description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Alex Newman"
|
"name": "Alex Newman"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -166,7 +166,7 @@ async function buildHooks() {
|
|||||||
'__DEFAULT_PACKAGE_VERSION__': `"${version}"`
|
'__DEFAULT_PACKAGE_VERSION__': `"${version}"`
|
||||||
},
|
},
|
||||||
banner: {
|
banner: {
|
||||||
js: '#!/usr/bin/env bun'
|
js: '#!/usr/bin/env node'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
import express, { Request, Response } from 'express';
|
import express, { Request, Response } from 'express';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import { readFileSync } from 'fs';
|
import { readFileSync, existsSync } from 'fs';
|
||||||
import { getPackageRoot } from '../../../../shared/paths.js';
|
import { getPackageRoot } from '../../../../shared/paths.js';
|
||||||
import { SSEBroadcaster } from '../../SSEBroadcaster.js';
|
import { SSEBroadcaster } from '../../SSEBroadcaster.js';
|
||||||
import { DatabaseManager } from '../../DatabaseManager.js';
|
import { DatabaseManager } from '../../DatabaseManager.js';
|
||||||
@@ -41,7 +41,19 @@ export class ViewerRoutes extends BaseRouteHandler {
|
|||||||
*/
|
*/
|
||||||
private handleViewerUI = this.wrapHandler((req: Request, res: Response): void => {
|
private handleViewerUI = this.wrapHandler((req: Request, res: Response): void => {
|
||||||
const packageRoot = getPackageRoot();
|
const packageRoot = getPackageRoot();
|
||||||
const viewerPath = path.join(packageRoot, 'plugin', 'ui', 'viewer.html');
|
|
||||||
|
// Try cache structure first (ui/viewer.html), then marketplace structure (plugin/ui/viewer.html)
|
||||||
|
const viewerPaths = [
|
||||||
|
path.join(packageRoot, 'ui', 'viewer.html'),
|
||||||
|
path.join(packageRoot, 'plugin', 'ui', 'viewer.html')
|
||||||
|
];
|
||||||
|
|
||||||
|
const viewerPath = viewerPaths.find(p => existsSync(p));
|
||||||
|
|
||||||
|
if (!viewerPath) {
|
||||||
|
throw new Error('Viewer UI not found at any expected location');
|
||||||
|
}
|
||||||
|
|
||||||
const html = readFileSync(viewerPath, 'utf-8');
|
const html = readFileSync(viewerPath, 'utf-8');
|
||||||
res.setHeader('Content-Type', 'text/html');
|
res.setHeader('Content-Type', 'text/html');
|
||||||
res.send(html);
|
res.send(html);
|
||||||
|
|||||||
Reference in New Issue
Block a user