don't apply speed limit to localhost, to avoid an accidental harsh limit to prevent you from opening admin interface

Massimo Melina committed Mar 31, 2022 at 11:05 UTC 912503d482e3860b927bb20f91f2040a25a59c48
4 files changed +13 -11
admin/src/ConfigPage.ts
+1 -1
@@ -61,7 +61,7 @@ export default function ConfigPage() {
61 { k: 'https_port', comp: ServerPort, label: "HTTPS port", status: status?.https||true, suggestedPort: 443 },
62 values.https_port >= 0 && { k: 'cert', label: "HTTPS certificate file" },
63 values.https_port >= 0 && { k: 'private_key', label: "HTTPS private key file" },
64 - { k: 'max_kbps', ...maxSpeedDefaults, label: "Limit output KB/s" },
64 + { k: 'max_kbps', ...maxSpeedDefaults, label: "Limit output KB/s", helperText: "Doesn't apply to localhost" },
65 { k: 'max_kbps_per_ip', ...maxSpeedDefaults, label: "Limit output KB/s per-ip" },
66 { k: 'log', label: "Main log file" },
67 { k: 'error_log', label: "Error log file" },
server/src/adminApis.ts
+2 -7
@@ -7,7 +7,7 @@ import { BUILD_TIMESTAMP, FORBIDDEN, HFS_STARTED, VERSION } from './const'
7 import vfsApis from './api.vfs'
8 import accountsApis from './api.accounts'
9 import { Connection, getConnections } from './connections'
10 -import { onOffMap, pendingPromise } from './misc'
10 +import { isLocalHost, onOffMap, pendingPromise } from './misc'
11 import _ from 'lodash'
12 import events from './events'
13 import { getFromAccount } from './perm'
@@ -109,10 +109,5 @@ for (const k in adminApis) {
109 }
110
111 export function ctxAdminAccess(ctx: Koa.Context) {
112 - return isLocalHost(ctx.ip)
113 - || getFromAccount(ctx.state.account, a => a.admin)
114 -}
115 -
116 -function isLocalHost(s: string) {
117 - return s === '127.0.0.1' || s === '::1' || s === '::ffff:127.0.0.1'
112 + return isLocalHost(ctx) || getFromAccount(ctx.state.account, a => a.admin)
113 }
server/src/misc.ts
+7
@@ -6,6 +6,7 @@ import { basename, dirname } from 'path'
6 import { watch } from 'fs'
7 import _ from 'lodash'
8 import { Readable } from 'stream'
9 +import Koa from 'koa'
10
11 export type Callback<IN=void, OUT=void> = (x:IN) => OUT
12 export type Dict<T = any> = Record<string, T>
@@ -221,3 +222,9 @@ export function typedKeys<T>(o: T) {
222 export function with_<T,RT>(par:T, cb: (par:T) => RT) {
223 return cb(par)
224 }
225 +
226 +export function isLocalHost(s: string | Koa.Context) {
227 + if (typeof s !== 'string')
228 + s = s.ip
229 + return s === '127.0.0.1' || s === '::1' || s === '::ffff:127.0.0.1'
230 +}
server/src/throttler.ts
+3 -3
@@ -4,8 +4,8 @@ import { Readable } from 'stream'
4 import Koa from 'koa'
5 import { ThrottledStream, ThrottleGroup } from './ThrottledStream'
6 import { subscribeConfig } from './config'
7 -import { getOrSet } from './misc'
8 -import { socket2connection, updateConnection } from './connections'
7 +import { getOrSet, isLocalHost } from './misc'
8 +import { updateConnection } from './connections'
9 import _ from 'lodash'
10
11 const mainThrottleGroup = new ThrottleGroup(Infinity)
@@ -25,7 +25,7 @@ const SymTimeout = Symbol('timeout')
25 export const throttler: Koa.Middleware = async (ctx, next) => {
26 await next()
27 const { body } = ctx
28 - if (!body || !(body instanceof Readable) || ctx.state.account?.ignore_limits)
28 + if (!body || !(body instanceof Readable) || ctx.state.account?.ignore_limits || isLocalHost(ctx))
29 return
30 const ipGroup = getOrSet(ip2group, ctx.ip, ()=> {
31 const tg = new ThrottleGroup(Infinity, mainThrottleGroup)