mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Merge remote-tracking branch 'upstream/staging' into staging
This commit is contained in:
29
.github/workflows/docker-publish.yml
vendored
29
.github/workflows/docker-publish.yml
vendored
@@ -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') {
|
||||||
|
@@ -107,6 +107,13 @@ export class Popup {
|
|||||||
// illegal argument
|
// 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.ok.addEventListener('click', () => this.completeAffirmative());
|
||||||
this.cancel.addEventListener('click', () => this.completeNegative());
|
this.cancel.addEventListener('click', () => this.completeNegative());
|
||||||
const keyListener = (evt) => {
|
const keyListener = (evt) => {
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user