Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/calling-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ on:
- agent/calling-improvement-db-admin
- agent/native-push-db-config
- agent/shared-chat-lock-delete-scope
- agent/admin-sidebar-social-db
pull_request:
branches:
- main
Expand Down
10 changes: 6 additions & 4 deletions backend/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ CALL_CONFIG_SECRET =
# Optional separate key for DB-backed chat translation/transcription provider secrets.
# Falls back to CALL_CONFIG_SECRET, STORAGE_CONFIG_SECRET, then JWT_SECRET. Keep stable.
CHAT_AI_CONFIG_SECRET =
# Optional separate key for encrypting DB-backed Google/Facebook/Telegram secrets.
# Falls back to CALL_CONFIG_SECRET, STORAGE_CONFIG_SECRET, then JWT_SECRET. Keep stable.
SOCIAL_AUTH_CONFIG_SECRET =
APP_ORIGIN = http://localhost:3000,http://127.0.0.1:3000
PUBLIC_ORIGIN = http://localhost:3000
API_BASE_URL = http://127.0.0.1:5599/api
Expand Down Expand Up @@ -51,10 +54,9 @@ CHAT_DUPLICATE_WINDOW_SEC = 30

# Email transport is stored in the database from Admin Settings > App Config.

GOOGLE_CLIENT_ID =
FACEBOOK_APP_ID =
TELEGRAM_BOT_USERNAME =
TELEGRAM_BOT_TOKEN =
# Google, Facebook and Telegram provider IDs/tokens are configured from
# Admin > Social Login and stored in MongoDB. Provider secrets are encrypted.
# No GOOGLE_CLIENT_ID / FACEBOOK_APP_ID / TELEGRAM_* environment values are used at runtime.

# Web/PWA push remains environment-backed.
VAPID_PUBLIC_KEY =
Expand Down
2 changes: 1 addition & 1 deletion backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"scripts": {
"predev": "node scripts/free-ports.js 8080",
"dev": "nodemon --watch server --watch .env --ignore logs --ignore uploads server",
"build": "node --check server/index.js && node --check server/server.js && node --check server/bootstrap.js && node --check server/config.js && node --check server/db/sequelize.js && node --check server/db/connect.js && node --check server/db/models/inbox.js && node --check server/db/models/chat.js && node --check server/db/models/chatRoomCounter.js && node --check server/db/models/messageReceipt.js && node --check server/db/models/chatDraft.js && node --check server/db/models/messageRequest.js && node --check server/db/models/chatTopic.js && node --check server/db/models/e2eeDeviceKey.js && node --check server/db/models/resumableUpload.js && node --check server/db/models/chatAiConfig.js && node --check server/db/models/profile.js && node --check server/db/models/group.js && node --check server/db/models/channel.js && node --check server/db/models/adminStorageConfig.js && node --check server/db/models/adminCallConfig.js && node --check server/db/models/callHistory.js && node --check server/db/models/profilePhoto.js && node --check server/db/models/nativePushDevice.js && node --check server/helpers/storageConfig.js && node --check server/helpers/callConfig.js && node --check server/helpers/callHistory.js && node --check server/helpers/callState.js && node --check server/helpers/avatarDefaults.js && node --check server/helpers/ensureAvatarDefaults.js && node --check server/helpers/ensureProfile.js && node --check server/helpers/privacy.js && node --check server/helpers/profilePhotos.js && node --check server/helpers/livekit.js && node --check server/helpers/nativePushConfig.js && node --check server/helpers/nativePush.js && node --check server/helpers/storage.js && node --check server/helpers/videoPipeline.js && node --check server/helpers/accountArchive.js && node --check server/helpers/accountExport.js && node --check server/helpers/logger.js && node --check server/helpers/chatAbuse.js && node --check server/helpers/chatMentions.js && node --check server/helpers/messageRequests.js && node --check server/helpers/chatReliability.js && node --check server/helpers/chatAiConfig.js && node --check server/helpers/e2eeKeyDirectory.js && node --check server/helpers/chatMaintenance.js && node --check server/middleware/chatSendIdempotency.js && node --check server/controllers/avatar.js && node --check server/controllers/profile.js && node --check server/controllers/chatUpload.js && node --check server/controllers/chatSecurity.js && node --check server/controllers/chatDeletion.js && node --check server/controllers/chatV2.js && node --check server/controllers/chatAiAdmin.js && node --check server/controllers/chatSuggestions.js && node --check server/controllers/chatResumableUpload.js && node --check server/controllers/storageAdmin.js && node --check server/controllers/callingAdmin.js && node --check server/controllers/callingPushAdmin.js && node --check server/controllers/callingConfig.js && node --check server/controllers/nativePush.js && node --check server/controllers/accountStorage.js && node --check server/routes/profile.js && node --check server/routes/inbox.js && node --check server/routes/chat.js && node --check server/routes/chatV2.js && node --check server/routes/chatAiAdmin.js && node --check server/routes/storageAdmin.js && node --check server/routes/callingAdmin.js && node --check server/routes/callingPushAdmin.js && node --check server/routes/callingConfig.js && node --check server/routes/setting.js && node --check server/helpers/socketAdapter.js && node --check server/socket/auth.js && node --check server/socket/index.js && node --check server/socket/events/chatV2.js && node --check server/socket/events/calling.js && node --check server/socket/events/backgroundCalling.js && node --check server/socket/events/groupModeration.js && node --check server/socket/events/room.js && node --check server/routes/cron.js && node --check api/index.js",
"build": "node --check server/index.js && node --check server/server.js && node --check server/bootstrap.js && node --check server/config.js && node --check server/db/sequelize.js && node --check server/db/connect.js && node --check server/db/models/inbox.js && node --check server/db/models/chat.js && node --check server/db/models/chatRoomCounter.js && node --check server/db/models/messageReceipt.js && node --check server/db/models/chatDraft.js && node --check server/db/models/messageRequest.js && node --check server/db/models/chatTopic.js && node --check server/db/models/e2eeDeviceKey.js && node --check server/db/models/resumableUpload.js && node --check server/db/models/chatAiConfig.js && node --check server/db/models/adminSocialAuthConfig.js && node --check server/db/models/profile.js && node --check server/db/models/group.js && node --check server/db/models/channel.js && node --check server/db/models/adminStorageConfig.js && node --check server/db/models/adminCallConfig.js && node --check server/db/models/callHistory.js && node --check server/db/models/profilePhoto.js && node --check server/db/models/nativePushDevice.js && node --check server/helpers/storageConfig.js && node --check server/helpers/callConfig.js && node --check server/helpers/callHistory.js && node --check server/helpers/callState.js && node --check server/helpers/avatarDefaults.js && node --check server/helpers/ensureAvatarDefaults.js && node --check server/helpers/ensureProfile.js && node --check server/helpers/privacy.js && node --check server/helpers/profilePhotos.js && node --check server/helpers/livekit.js && node --check server/helpers/nativePushConfig.js && node --check server/helpers/nativePush.js && node --check server/helpers/storage.js && node --check server/helpers/videoPipeline.js && node --check server/helpers/accountArchive.js && node --check server/helpers/accountExport.js && node --check server/helpers/logger.js && node --check server/helpers/chatAbuse.js && node --check server/helpers/chatMentions.js && node --check server/helpers/messageRequests.js && node --check server/helpers/chatReliability.js && node --check server/helpers/chatAiConfig.js && node --check server/helpers/socialAuthConfig.js && node --check server/helpers/e2eeKeyDirectory.js && node --check server/helpers/chatMaintenance.js && node --check server/middleware/chatSendIdempotency.js && node --check server/controllers/avatar.js && node --check server/controllers/profile.js && node --check server/controllers/chatUpload.js && node --check server/controllers/chatSecurity.js && node --check server/controllers/chatDeletion.js && node --check server/controllers/chatV2.js && node --check server/controllers/chatAiAdmin.js && node --check server/controllers/chatSuggestions.js && node --check server/controllers/chatResumableUpload.js && node --check server/controllers/socialAuth.js && node --check server/controllers/socialAuthAdmin.js && node --check server/controllers/storageAdmin.js && node --check server/controllers/callingAdmin.js && node --check server/controllers/callingPushAdmin.js && node --check server/controllers/callingConfig.js && node --check server/controllers/nativePush.js && node --check server/controllers/accountStorage.js && node --check server/routes/profile.js && node --check server/routes/inbox.js && node --check server/routes/chat.js && node --check server/routes/chatV2.js && node --check server/routes/chatAiAdmin.js && node --check server/routes/socialAuthAdmin.js && node --check server/routes/storageAdmin.js && node --check server/routes/callingAdmin.js && node --check server/routes/callingPushAdmin.js && node --check server/routes/callingConfig.js && node --check server/routes/setting.js && node --check server/helpers/socketAdapter.js && node --check server/socket/auth.js && node --check server/socket/index.js && node --check server/socket/events/chatV2.js && node --check server/socket/events/calling.js && node --check server/socket/events/backgroundCalling.js && node --check server/socket/events/groupModeration.js && node --check server/socket/events/room.js && node --check server/routes/cron.js && node --check api/index.js",
"start": "node server"
},
"dependencies": {
Expand Down
12 changes: 0 additions & 12 deletions frontend/admin/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,5 @@
</head>
<body>
<div id="admin-root"></div>
<div id="admin-shortcuts" style="display:none;position:fixed;right:18px;bottom:18px;z-index:99999;gap:8px;flex-direction:column;align-items:flex-end">
<a href="/admin/calling-push" style="padding:10px 14px;border-radius:12px;background:#2563eb;color:#fff;text-decoration:none;font:600 13px Arial,sans-serif;box-shadow:0 8px 24px rgba(0,0,0,.18)">Native Call Push</a>
<a href="/admin/calling" style="padding:10px 14px;border-radius:12px;background:#0f766e;color:#fff;text-decoration:none;font:600 13px Arial,sans-serif;box-shadow:0 8px 24px rgba(0,0,0,.18)">Calling & WebRTC</a>
<a href="/admin/storage" style="padding:10px 14px;border-radius:12px;background:#111827;color:#fff;text-decoration:none;font:600 13px Arial,sans-serif;box-shadow:0 8px 24px rgba(0,0,0,.18)">FTP Storage</a>
</div>
<script>
try {
if (localStorage.getItem('admin_token')) {
document.getElementById('admin-shortcuts').style.display = 'flex';
}
} catch (error) {}
</script>
</body>
</html>
2 changes: 2 additions & 0 deletions frontend/admin/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import App from './app';
import ChatAiConfig from './chatAiConfig';
import { registerServiceWorker } from '../client/pwa/registerSW';
import { installProfilePasswordPanel } from './profilePassword';
import { installAdminSidebarTools } from './sidebarTools';

const removeLoginPasswordMinLength = () => {
const passwordInput = document.querySelector('.auth-form input[type="password"]');
Expand All @@ -22,4 +23,5 @@ root.render(
);
removeLoginPasswordMinLength();
installProfilePasswordPanel();
installAdminSidebarTools();
registerServiceWorker();
2 changes: 1 addition & 1 deletion frontend/admin/socialAuth.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#0ea5e9" />
<link rel="icon" href="http://syncchat.smshagor.com/uploads/favicon.png" />
<link rel="icon" href="https://syncchat.smshagor.com/uploads/favicon.png" />
<title>SyncChat Admin — Social Login</title>
</head>
<body>
Expand Down
52 changes: 52 additions & 0 deletions frontend/babel.admin-safe-strings.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
module.exports = function adminSafeStrings({ types: t }) {
const isNamedCall = (node, name) =>
t.isCallExpression(node) &&
t.isMemberExpression(node.callee) &&
!node.callee.computed &&
t.isIdentifier(node.callee.property, { name });

const safeString = (node) =>
t.callExpression(t.identifier('String'), [
t.logicalExpression('||', t.cloneNode(node, true), t.stringLiteral('')),
]);

return {
name: 'syncchat-admin-safe-strings',
visitor: {
CallExpression(path, state) {
const filename = String(state?.filename || '').replace(/\\/g, '/');
if (!filename.endsWith('/admin/app.jsx')) return;

const { node } = path;
if (
!t.isMemberExpression(node.callee) ||
node.callee.computed ||
!t.isIdentifier(node.callee.property, { name: 'toLowerCase' })
) {
return;
}

const receiver = node.callee.object;
let nextReceiver = null;

if (isNamedCall(receiver, 'trim')) {
const trimBase = receiver.callee.object;
nextReceiver = t.callExpression(
t.memberExpression(safeString(trimBase), t.identifier('trim')),
[]
);
} else {
nextReceiver = safeString(receiver);
}

path.replaceWith(
t.callExpression(
t.memberExpression(nextReceiver, t.identifier('toLowerCase')),
node.arguments.map((arg) => t.cloneNode(arg, true))
)
);
path.skip();
},
},
};
};
16 changes: 16 additions & 0 deletions frontend/vercel.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,22 @@
{ "source": "/assets/images/default-channel-avatar.png", "destination": "/assets/icons/channel-avatar.svg", "permanent": false }
],
"rewrites": [
{
"source": "/admin/storage",
"destination": "/admin/storage.html"
},
{
"source": "/admin/calling",
"destination": "/admin/calling.html"
},
{
"source": "/admin/calling-push",
"destination": "/admin/calling-push.html"
},
{
"source": "/admin/social-auth",
"destination": "/admin/social-auth.html"
},
{
"source": "/admin/:path*",
"destination": "/admin/index.html"
Expand Down
8 changes: 7 additions & 1 deletion frontend/webpack.common.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ module.exports = {
storage: './admin/storage.jsx',
calling: './admin/calling.jsx',
callingPush: './admin/callingPush.jsx',
socialAuth: './admin/socialAuth.jsx',
},
cache: {
type: 'filesystem',
Expand All @@ -24,7 +25,11 @@ module.exports = {
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: { cacheDirectory: true, cacheCompression: false },
options: {
cacheDirectory: true,
cacheCompression: false,
plugins: [path.resolve(__dirname, 'babel.admin-safe-strings.js')],
},
},
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] },
{
Expand Down Expand Up @@ -54,5 +59,6 @@ module.exports = {
new HtmlWebpackPlugin({ template: './admin/storage.html', chunks: ['storage'], filename: 'admin/storage.html' }),
new HtmlWebpackPlugin({ template: './admin/calling.html', chunks: ['calling'], filename: 'admin/calling.html' }),
new HtmlWebpackPlugin({ template: './admin/callingPush.html', chunks: ['callingPush'], filename: 'admin/calling-push.html' }),
new HtmlWebpackPlugin({ template: './admin/socialAuth.html', chunks: ['socialAuth'], filename: 'admin/social-auth.html' }),
],
};
Loading