Compare commits
24 Commits
64e8bc1911
...
86906576b3
Author | SHA1 | Date |
---|---|---|
steve02081504 | 86906576b3 | |
steve02081504 | f48d90a9c9 | |
Cohee | ba397dd2a8 | |
Cohee | ba312d316c | |
Cohee | 8ae9212cc5 | |
Cohee | 3a4405016c | |
Cohee | de8339f77b | |
Cohee | f79f335491 | |
Cohee | 6c8b29a39a | |
Zhongyi Lu | 792be63c5c | |
LenAnderson | 278ec029f5 | |
LenAnderson | 91558ad9ea | |
Cohee | 4f83782430 | |
Cohee | 2411a7480e | |
Cohee | f3f29cfe0b | |
caesarw | 299ee3ae90 | |
Cohee | b8ea75f79f | |
Cohee | 24ae6eb49c | |
Cohee | b18921de7f | |
Cohee | 48295bc378 | |
Cohee | b4fcfcd6d6 | |
Cohee | 679a249674 | |
Cohee | 368df65337 | |
Cohee | 13762470b0 |
|
@ -9,10 +9,14 @@ on:
|
|||
schedule:
|
||||
# Build the staging image everyday at 00:00 UTC
|
||||
- cron: "0 0 * * *"
|
||||
push:
|
||||
# Temporary workaround
|
||||
branches:
|
||||
- release
|
||||
|
||||
env:
|
||||
# This should allow creation of docker images even in forked repositories
|
||||
IMAGE_NAME: ${{ github.repository }}
|
||||
REPO: ${{ github.repository }}
|
||||
REGISTRY: ghcr.io
|
||||
|
||||
jobs:
|
||||
|
@ -20,21 +24,34 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Workaround for GitHub repo names containing uppercase characters
|
||||
- name: Set lowercase repo name
|
||||
run: |
|
||||
echo "IMAGE_NAME=${REPO,,}" >> ${GITHUB_ENV}
|
||||
|
||||
# Using the following workaround because currently GitHub Actions
|
||||
# does not support logical AND/OR operations on triggers
|
||||
# It's currently not possible to have `branches` under the `schedule` trigger
|
||||
- name: Checkout the release branch
|
||||
if: ${{ github.event_name == 'release' }}
|
||||
uses: actions/checkout@v3
|
||||
- name: Checkout the release branch (on release)
|
||||
if: ${{ github.event_name == 'release' || github.event_name == 'push' }}
|
||||
uses: actions/checkout@v4.1.2
|
||||
with:
|
||||
ref: "release"
|
||||
|
||||
- name: Checkout the staging branch
|
||||
if: ${{ github.event_name == 'schedule' }}
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4.1.2
|
||||
with:
|
||||
ref: "staging"
|
||||
|
||||
# Get current branch name
|
||||
# This is also part of the workaround for Actions not allowing logical
|
||||
# AND/OR operators on triggers
|
||||
# Otherwise the action triggered by schedule always has ref_name = release
|
||||
- name: Get the current branch name
|
||||
run: |
|
||||
echo "BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)" >> ${GITHUB_ENV}
|
||||
|
||||
# Setting up QEMU for multi-arch image build
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
@ -47,7 +64,7 @@ jobs:
|
|||
id: metadata
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: ${{ github.ref_name }}
|
||||
tags: ${{ env.BRANCH_NAME }}
|
||||
|
||||
# Login into package repository as the person who created the release
|
||||
- name: Log in to the Container registry
|
||||
|
|
|
@ -3566,7 +3566,7 @@ async function onModelChange() {
|
|||
|
||||
if (oai_settings.chat_completion_source == chat_completion_sources.MAKERSUITE) {
|
||||
if (oai_settings.max_context_unlocked) {
|
||||
$('#openai_max_context').attr('max', unlocked_max);
|
||||
$('#openai_max_context').attr('max', max_1mil);
|
||||
} else if (value === 'gemini-1.5-pro-latest') {
|
||||
$('#openai_max_context').attr('max', max_1mil);
|
||||
} else if (value === 'gemini-ultra' || value === 'gemini-1.0-pro-latest' || value === 'gemini-pro' || value === 'gemini-1.0-ultra-latest') {
|
||||
|
|
|
@ -107,6 +107,13 @@ export class Popup {
|
|||
// illegal argument
|
||||
}
|
||||
|
||||
this.input.addEventListener('keydown', (evt) => {
|
||||
if (evt.key != 'Enter' || evt.altKey || evt.ctrlKey || evt.shiftKey) return;
|
||||
evt.preventDefault();
|
||||
evt.stopPropagation();
|
||||
this.completeAffirmative();
|
||||
});
|
||||
|
||||
this.ok.addEventListener('click', () => this.completeAffirmative());
|
||||
this.cancel.addEventListener('click', () => this.completeNegative());
|
||||
const keyListener = (evt) => {
|
||||
|
@ -219,7 +226,7 @@ export function callGenericPopup(text, type, inputValue = '', { okButton, cancel
|
|||
text,
|
||||
type,
|
||||
inputValue,
|
||||
{ okButton, rows, wide, large, allowHorizontalScrolling, allowVerticalScrolling },
|
||||
{ okButton, cancelButton, rows, wide, large, allowHorizontalScrolling, allowVerticalScrolling },
|
||||
);
|
||||
return popup.show();
|
||||
}
|
||||
|
|
12
server.js
12
server.js
|
@ -499,11 +499,14 @@ const setupTasks = async function () {
|
|||
|
||||
const cleanupPlugins = await loadPlugins();
|
||||
|
||||
const BackUpTitle = process.title;
|
||||
|
||||
const exitProcess = async () => {
|
||||
statsEndpoint.onExit();
|
||||
if (typeof cleanupPlugins === 'function') {
|
||||
await cleanupPlugins();
|
||||
}
|
||||
setWindowTitle(BackUpTitle);
|
||||
process.exit();
|
||||
};
|
||||
|
||||
|
@ -520,7 +523,7 @@ const setupTasks = async function () {
|
|||
|
||||
if (autorun) open(autorunUrl.toString());
|
||||
|
||||
console.log(String.fromCharCode(27) + "]0;SillyTavern WebServer" + String.fromCharCode(7)); // set window title
|
||||
setWindowTitle('SillyTavern WebServer');
|
||||
|
||||
console.log(color.green('SillyTavern is listening on: ' + tavernUrl));
|
||||
|
||||
|
@ -589,3 +592,10 @@ function ensurePublicDirectoriesExist() {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setWindowTitle(title) {
|
||||
if (process.platform == 'win32')
|
||||
process.title = title
|
||||
else
|
||||
process.stdout.write('\x1b]2;' + title + '\x1b\x5c')
|
||||
}
|
||||
|
|
|
@ -685,14 +685,16 @@ drawthings.post('/generate', jsonParser, async (request, response) => {
|
|||
url.pathname = '/sdapi/v1/txt2img';
|
||||
|
||||
const body = { ...request.body };
|
||||
const auth = getBasicAuthHeader(request.body.auth);
|
||||
delete body.url;
|
||||
delete body.auth;
|
||||
|
||||
const result = await fetch(url, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(body),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': getBasicAuthHeader(request.body.auth),
|
||||
'Authorization': auth,
|
||||
},
|
||||
timeout: 0,
|
||||
});
|
||||
|
|
|
@ -19,6 +19,22 @@ if (fs.existsSync(whitelistPath)) {
|
|||
}
|
||||
}
|
||||
|
||||
function getForwardedIp(req) {
|
||||
// Check if X-Real-IP is available
|
||||
if (req.headers['x-real-ip']) {
|
||||
return req.headers['x-real-ip'];
|
||||
}
|
||||
|
||||
// Check for X-Forwarded-For and parse if available
|
||||
if (req.headers['x-forwarded-for']) {
|
||||
const ipList = req.headers['x-forwarded-for'].split(',').map(ip => ip.trim());
|
||||
return ipList[0];
|
||||
}
|
||||
|
||||
// If none of the headers are available, return undefined
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function getIpFromRequest(req) {
|
||||
let clientIp = req.connection.remoteAddress;
|
||||
let ip = ipaddr.parse(clientIp);
|
||||
|
@ -41,6 +57,7 @@ function getIpFromRequest(req) {
|
|||
function whitelistMiddleware(listen) {
|
||||
return function (req, res, next) {
|
||||
const clientIp = getIpFromRequest(req);
|
||||
const forwardedIp = getForwardedIp(req);
|
||||
|
||||
if (listen && !knownIPs.has(clientIp)) {
|
||||
const userAgent = req.headers['user-agent'];
|
||||
|
@ -58,9 +75,13 @@ function whitelistMiddleware(listen) {
|
|||
}
|
||||
|
||||
//clientIp = req.connection.remoteAddress.split(':').pop();
|
||||
if (whitelistMode === true && !whitelist.some(x => ipMatching.matches(clientIp, ipMatching.getMatch(x)))) {
|
||||
console.log(color.red('Forbidden: Connection attempt from ' + clientIp + '. If you are attempting to connect, please add your IP address in whitelist or disable whitelist mode in config.yaml in root of SillyTavern folder.\n'));
|
||||
return res.status(403).send('<b>Forbidden</b>: Connection attempt from <b>' + clientIp + '</b>. If you are attempting to connect, please add your IP address in whitelist or disable whitelist mode in config.yaml in root of SillyTavern folder.');
|
||||
if (whitelistMode === true && !whitelist.some(x => ipMatching.matches(clientIp, ipMatching.getMatch(x)))
|
||||
|| forwardedIp && whitelistMode === true && !whitelist.some(x => ipMatching.matches(forwardedIp, ipMatching.getMatch(x)))
|
||||
) {
|
||||
// Log the connection attempt with real IP address
|
||||
const ipDetails = forwardedIp ? `${clientIp} (forwarded from ${forwardedIp})` : clientIp;
|
||||
console.log(color.red('Forbidden: Connection attempt from ' + ipDetails + '. If you are attempting to connect, please add your IP address in whitelist or disable whitelist mode in config.yaml in root of SillyTavern folder.\n'));
|
||||
return res.status(403).send('<b>Forbidden</b>: Connection attempt from <b>' + ipDetails + '</b>. If you are attempting to connect, please add your IP address in whitelist or disable whitelist mode in config.yaml in root of SillyTavern folder.');
|
||||
}
|
||||
next();
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue