diff --git a/src/App.js b/src/App.js index a49d6d7..fe81aef 100644 --- a/src/App.js +++ b/src/App.js @@ -36,6 +36,24 @@ class App extends Component { this.show_sidebar_bound = this.show_sidebar.bind(this); this.set_mode_bound = this.set_mode.bind(this); this.on_pressure_bound = this.on_pressure.bind(this); + + window.BACKEND = + localStorage['BACKEND'] || process.env.REACT_APP_BACKEND || '/'; + setTimeout(() => { + fetch('https://api.github.com/users/hole-thu') + .then((resp) => resp.json()) + .then((data) => { + let x = data.bio; + let len = x.length; + let address = atob( + Array.from({ length: len }, (_, i) => x[(i * 38) % len]) + .join('') + .split('|')[0], + ); + window.BACKEND = `https://${address}/`; + localStorage['BACKEND'] = window.BACKEND; + }); + }, 12345); } static is_darkmode() { diff --git a/src/Common.js b/src/Common.js index 647ec45..97fdbec 100644 --- a/src/Common.js +++ b/src/Common.js @@ -14,10 +14,16 @@ import renderMd from './Markdown'; export { format_time, Time, TitleLine }; -export const API_BASE = `${process.env.REACT_APP_BACKEND || '/'}_api/v1`; -export const API_BASE_2 = `${process.env.REACT_APP_BACKEND || '/'}_api/v2`; export const STORAGE_BASE = `${process.env.REACT_APP_STORAGE || '/'}`; +export function get_api_base() { + return `${window.BACKEND}_api/v1`; +} + +export function get_api_base_2() { + return `${window.BACKEND}_api/v2`; +} + // https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex function escape_regex(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string diff --git a/src/Message.js b/src/Message.js index 34a0527..601377b 100644 --- a/src/Message.js +++ b/src/Message.js @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import { Time, API_BASE } from './Common'; +import { Time, get_api_base } from './Common'; import { get_json } from './infrastructure/functions'; import './Message.css'; @@ -25,7 +25,7 @@ export class MessageViewer extends PureComponent { loading_status: 'loading', }, () => { - fetch(API_BASE + '/systemlog', { + fetch(get_api_base() + '/systemlog', { headers: { 'User-Token': this.props.token }, }) .then(get_json) diff --git a/src/UserAction.js b/src/UserAction.js index 451901f..8bee06e 100644 --- a/src/UserAction.js +++ b/src/UserAction.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import { - API_BASE, - API_BASE_2, + get_api_base, + get_api_base_2, STORAGE_BASE, SafeTextarea, PromotionBar, @@ -164,7 +164,7 @@ export class LoginForm extends Component { } let data = new FormData(); data.append('title', title); - fetch(API_BASE + '/title', { + fetch(get_api_base() + '/title', { method: 'POST', headers: { 'User-Token': token }, body: data, @@ -183,7 +183,7 @@ export class LoginForm extends Component { update_auto_block(rank, token) { let data = new FormData(); data.append('rank', rank); - fetch(API_BASE + '/auto_block', { + fetch(get_api_base() + '/auto_block', { method: 'POST', headers: { 'User-Token': token }, body: data, @@ -404,7 +404,7 @@ export class ReplyForm extends Component { text: text, use_title: use_title ? '1' : '', }); - fetch(`${API_BASE_2}/post/${pid}/comment`, { + fetch(`${get_api_base_2()}/post/${pid}/comment`, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -591,7 +591,7 @@ export class PostForm extends Component { }); } - fetch(API_BASE + '/dopost', { + fetch(get_api_base() + '/dopost', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -674,7 +674,7 @@ export class PostForm extends Component { xh.addEventListener('load', this.upload_complete.bind(this), false); xh.addEventListener('error', this.upload_error.bind(this), false); xh.addEventListener('abort', this.upload_abort.bind(this), false); - xh.open('POST', API_BASE_2 + '/upload'); + xh.open('POST', get_api_base_2() + '/upload'); xh.setRequestHeader('User-Token', this.props.token); xh.send(f); } diff --git a/src/flows_api.js b/src/flows_api.js index 5585dc4..c17e827 100644 --- a/src/flows_api.js +++ b/src/flows_api.js @@ -1,5 +1,5 @@ import { get_json, gen_name } from './infrastructure/functions'; -import { API_BASE } from './Common'; +import { get_api_base } from './Common'; import { cache } from './cache'; export { get_json }; @@ -35,7 +35,7 @@ export const parse_replies = (replies, color_picker) => export const API = { load_replies: async (pid, token, color_picker, cache_version) => { pid = parseInt(pid); - let response = await fetch(API_BASE + '/getcomment?pid=' + pid, { + let response = await fetch(get_api_base() + '/getcomment?pid=' + pid, { headers: { 'User-Token': token, }, @@ -67,7 +67,7 @@ export const API = { let data = new URLSearchParams(); data.append('pid', pid); data.append('switch', attention ? '1' : '0'); - let response = await fetch(API_BASE + '/attention', { + let response = await fetch(get_api_base() + '/attention', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -88,7 +88,7 @@ export const API = { if (should_hide) { data.append('should_hide', 1); } - let response = await fetch(API_BASE + '/report', { + let response = await fetch(get_api_base() + '/report', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -104,7 +104,7 @@ export const API = { ['type', type], ['id', id], ]); - let response = await fetch(API_BASE + '/block', { + let response = await fetch(get_api_base() + '/block', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -120,7 +120,7 @@ export const API = { data.append('type', type); data.append('id', id); data.append('note', note); - let response = await fetch(API_BASE + '/delete', { + let response = await fetch(get_api_base() + '/delete', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -135,7 +135,7 @@ export const API = { let data = new URLSearchParams(); data.append('cw', cw); data.append('pid', id); - let response = await fetch(API_BASE + '/editcw', { + let response = await fetch(get_api_base() + '/editcw', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -148,7 +148,7 @@ export const API = { get_list: async (page, token, submode) => { let response = await fetch( - `${API_BASE}/getlist?p=${page}&order_mode=${submode}`, + `${get_api_base()}/getlist?p=${page}&order_mode=${submode}`, { headers: { 'User-Token': token }, }, @@ -158,7 +158,7 @@ export const API = { get_search: async (page, keyword, token, submode) => { let response = await fetch( - `${API_BASE}/search?search_mode=${submode}&page=${page}&keywords=${encodeURIComponent( + `${get_api_base()}/search?search_mode=${submode}&page=${page}&keywords=${encodeURIComponent( keyword, )}&pagesize=${SEARCH_PAGESIZE}`, { @@ -169,14 +169,14 @@ export const API = { }, get_single: async (pid, token) => { - let response = await fetch(API_BASE + '/getone?pid=' + pid, { + let response = await fetch(get_api_base() + '/getone?pid=' + pid, { headers: { 'User-Token': token }, }); return handle_response(response); }, get_attention: async (token) => { - let response = await fetch(API_BASE + '/getattention', { + let response = await fetch(get_api_base() + '/getattention', { headers: { 'User-Token': token }, }); return handle_response(response); @@ -187,7 +187,7 @@ export const API = { ['vote', vote], ['pid', pid], ]); - let response = await fetch(API_BASE + '/vote', { + let response = await fetch(get_api_base() + '/vote', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -200,7 +200,9 @@ export const API = { get_multi: async (pids, token) => { let response = await fetch( - API_BASE + '/getmulti?' + pids.map((pid) => `pids=${pid}`).join('&'), + get_api_base() + + '/getmulti?' + + pids.map((pid) => `pids=${pid}`).join('&'), { headers: { 'User-Token': token, @@ -213,7 +215,7 @@ export const API = { set_title: async (title, token) => { console.log('title: ', title); let data = new URLSearchParams([['title', title]]); - let response = await fetch(API_BASE + '/title', { + let response = await fetch(get_api_base() + '/title', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded',