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:
|
schedule:
|
||||||
# Build the staging image everyday at 00:00 UTC
|
# Build the staging image everyday at 00:00 UTC
|
||||||
- cron: "0 0 * * *"
|
- cron: "0 0 * * *"
|
||||||
|
push:
|
||||||
|
# Temporary workaround
|
||||||
|
branches:
|
||||||
|
- release
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# This should allow creation of docker images even in forked repositories
|
# This should allow creation of docker images even in forked repositories
|
||||||
IMAGE_NAME: ${{ github.repository }}
|
REPO: ${{ github.repository }}
|
||||||
REGISTRY: ghcr.io
|
REGISTRY: ghcr.io
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -20,21 +24,34 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
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
|
# Using the following workaround because currently GitHub Actions
|
||||||
# does not support logical AND/OR operations on triggers
|
# does not support logical AND/OR operations on triggers
|
||||||
# It's currently not possible to have `branches` under the `schedule` trigger
|
# It's currently not possible to have `branches` under the `schedule` trigger
|
||||||
- name: Checkout the release branch
|
- name: Checkout the release branch (on release)
|
||||||
if: ${{ github.event_name == 'release' }}
|
if: ${{ github.event_name == 'release' || github.event_name == 'push' }}
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4.1.2
|
||||||
with:
|
with:
|
||||||
ref: "release"
|
ref: "release"
|
||||||
|
|
||||||
- name: Checkout the staging branch
|
- name: Checkout the staging branch
|
||||||
if: ${{ github.event_name == 'schedule' }}
|
if: ${{ github.event_name == 'schedule' }}
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4.1.2
|
||||||
with:
|
with:
|
||||||
ref: "staging"
|
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
|
# Setting up QEMU for multi-arch image build
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v3
|
uses: docker/setup-qemu-action@v3
|
||||||
|
@ -47,7 +64,7 @@ jobs:
|
||||||
id: metadata
|
id: metadata
|
||||||
with:
|
with:
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
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
|
# Login into package repository as the person who created the release
|
||||||
- name: Log in to the Container registry
|
- 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.chat_completion_source == chat_completion_sources.MAKERSUITE) {
|
||||||
if (oai_settings.max_context_unlocked) {
|
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') {
|
} else if (value === 'gemini-1.5-pro-latest') {
|
||||||
$('#openai_max_context').attr('max', max_1mil);
|
$('#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') {
|
} else if (value === 'gemini-ultra' || value === 'gemini-1.0-pro-latest' || value === 'gemini-pro' || value === 'gemini-1.0-ultra-latest') {
|
||||||
|
|
|
@ -71,7 +71,7 @@ export class Popup {
|
||||||
this.ok.textContent = okButton ?? 'OK';
|
this.ok.textContent = okButton ?? 'OK';
|
||||||
this.cancel.textContent = cancelButton ?? 'Cancel';
|
this.cancel.textContent = cancelButton ?? 'Cancel';
|
||||||
|
|
||||||
switch(type) {
|
switch (type) {
|
||||||
case POPUP_TYPE.TEXT: {
|
case POPUP_TYPE.TEXT: {
|
||||||
this.input.style.display = 'none';
|
this.input.style.display = 'none';
|
||||||
this.cancel.style.display = 'none';
|
this.cancel.style.display = 'none';
|
||||||
|
@ -107,9 +107,16 @@ export class Popup {
|
||||||
// illegal argument
|
// illegal argument
|
||||||
}
|
}
|
||||||
|
|
||||||
this.ok.addEventListener('click', ()=>this.completeAffirmative());
|
this.input.addEventListener('keydown', (evt) => {
|
||||||
this.cancel.addEventListener('click', ()=>this.completeNegative());
|
if (evt.key != 'Enter' || evt.altKey || evt.ctrlKey || evt.shiftKey) return;
|
||||||
const keyListener = (evt)=>{
|
evt.preventDefault();
|
||||||
|
evt.stopPropagation();
|
||||||
|
this.completeAffirmative();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.ok.addEventListener('click', () => this.completeAffirmative());
|
||||||
|
this.cancel.addEventListener('click', () => this.completeNegative());
|
||||||
|
const keyListener = (evt) => {
|
||||||
switch (evt.key) {
|
switch (evt.key) {
|
||||||
case 'Escape': {
|
case 'Escape': {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
|
@ -127,7 +134,7 @@ export class Popup {
|
||||||
async show() {
|
async show() {
|
||||||
document.body.append(this.dom);
|
document.body.append(this.dom);
|
||||||
this.dom.style.display = 'block';
|
this.dom.style.display = 'block';
|
||||||
switch(this.type) {
|
switch (this.type) {
|
||||||
case POPUP_TYPE.INPUT: {
|
case POPUP_TYPE.INPUT: {
|
||||||
this.input.focus();
|
this.input.focus();
|
||||||
break;
|
break;
|
||||||
|
@ -196,7 +203,7 @@ export class Popup {
|
||||||
duration: animation_duration,
|
duration: animation_duration,
|
||||||
easing: animation_easing,
|
easing: animation_easing,
|
||||||
});
|
});
|
||||||
delay(animation_duration).then(()=>{
|
delay(animation_duration).then(() => {
|
||||||
this.dom.remove();
|
this.dom.remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -219,7 +226,7 @@ export function callGenericPopup(text, type, inputValue = '', { okButton, cancel
|
||||||
text,
|
text,
|
||||||
type,
|
type,
|
||||||
inputValue,
|
inputValue,
|
||||||
{ okButton, rows, wide, large, allowHorizontalScrolling, allowVerticalScrolling },
|
{ okButton, cancelButton, rows, wide, large, allowHorizontalScrolling, allowVerticalScrolling },
|
||||||
);
|
);
|
||||||
return popup.show();
|
return popup.show();
|
||||||
}
|
}
|
||||||
|
|
12
server.js
12
server.js
|
@ -499,11 +499,14 @@ const setupTasks = async function () {
|
||||||
|
|
||||||
const cleanupPlugins = await loadPlugins();
|
const cleanupPlugins = await loadPlugins();
|
||||||
|
|
||||||
|
const BackUpTitle = process.title;
|
||||||
|
|
||||||
const exitProcess = async () => {
|
const exitProcess = async () => {
|
||||||
statsEndpoint.onExit();
|
statsEndpoint.onExit();
|
||||||
if (typeof cleanupPlugins === 'function') {
|
if (typeof cleanupPlugins === 'function') {
|
||||||
await cleanupPlugins();
|
await cleanupPlugins();
|
||||||
}
|
}
|
||||||
|
setWindowTitle(BackUpTitle);
|
||||||
process.exit();
|
process.exit();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -520,7 +523,7 @@ const setupTasks = async function () {
|
||||||
|
|
||||||
if (autorun) open(autorunUrl.toString());
|
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));
|
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';
|
url.pathname = '/sdapi/v1/txt2img';
|
||||||
|
|
||||||
const body = { ...request.body };
|
const body = { ...request.body };
|
||||||
|
const auth = getBasicAuthHeader(request.body.auth);
|
||||||
delete body.url;
|
delete body.url;
|
||||||
|
delete body.auth;
|
||||||
|
|
||||||
const result = await fetch(url, {
|
const result = await fetch(url, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: JSON.stringify(body),
|
body: JSON.stringify(body),
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'Authorization': getBasicAuthHeader(request.body.auth),
|
'Authorization': auth,
|
||||||
},
|
},
|
||||||
timeout: 0,
|
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) {
|
function getIpFromRequest(req) {
|
||||||
let clientIp = req.connection.remoteAddress;
|
let clientIp = req.connection.remoteAddress;
|
||||||
let ip = ipaddr.parse(clientIp);
|
let ip = ipaddr.parse(clientIp);
|
||||||
|
@ -41,6 +57,7 @@ function getIpFromRequest(req) {
|
||||||
function whitelistMiddleware(listen) {
|
function whitelistMiddleware(listen) {
|
||||||
return function (req, res, next) {
|
return function (req, res, next) {
|
||||||
const clientIp = getIpFromRequest(req);
|
const clientIp = getIpFromRequest(req);
|
||||||
|
const forwardedIp = getForwardedIp(req);
|
||||||
|
|
||||||
if (listen && !knownIPs.has(clientIp)) {
|
if (listen && !knownIPs.has(clientIp)) {
|
||||||
const userAgent = req.headers['user-agent'];
|
const userAgent = req.headers['user-agent'];
|
||||||
|
@ -58,9 +75,13 @@ function whitelistMiddleware(listen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//clientIp = req.connection.remoteAddress.split(':').pop();
|
//clientIp = req.connection.remoteAddress.split(':').pop();
|
||||||
if (whitelistMode === true && !whitelist.some(x => ipMatching.matches(clientIp, ipMatching.getMatch(x)))) {
|
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'));
|
|| forwardedIp && whitelistMode === true && !whitelist.some(x => ipMatching.matches(forwardedIp, ipMatching.getMatch(x)))
|
||||||
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.');
|
) {
|
||||||
|
// 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();
|
next();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue