Skip to content

Commit

Permalink
cloudflare client ip patch
Browse files Browse the repository at this point in the history
  • Loading branch information
rajranjan0608 committed May 23, 2022
1 parent 3da3a4b commit f9a968c
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 37 deletions.
62 changes: 32 additions & 30 deletions client/src/components/FaucetForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,26 @@ import FooterBox from './FooterBox';
import queryString from 'query-string';

const FaucetForm = (props: any) => {
const [chain, setChain] = useState<number | null>(null)
const [chainConfigs, setChainConfigs] = useState<any>([])
const [inputAddress, setInputAddress] = useState("")
const [chain, setChain] = useState<number | null>(null);
const [chainConfigs, setChainConfigs] = useState<any>([]);
const [inputAddress, setInputAddress] = useState("");
const [address, setAddress] = useState<string | null>(null);
const [faucetAddress, setFaucetAddress] = useState(null);
const [options, setOptions] = useState([])
const [options, setOptions] = useState([]);
const [balance, setBalance] = useState(0);
const [shouldAllowSend, setShouldAllowSend] = useState(false);
const [isLoading, setIsLoading] = useState<boolean>(false)
const [isLoading, setIsLoading] = useState<boolean>(false);
const [sendTokenResponse, setSendTokenResponse] = useState<any>({
txHash: null,
message: null
})
});

const recaptcha = new ReCaptcha(props.config.SITE_KEY, props.config.ACTION);

// Update chain configs
useEffect(() => {
updateChainConfigs();
}, [])
}, []);

useEffect(() => {
updateBalance()
Expand Down Expand Up @@ -76,6 +77,28 @@ const FaucetForm = (props: any) => {
}
}, [window.location.search, chainConfigs]);

// API calls
async function updateChainConfigs() {
const response = await props.axios.get(props.config.api.getChainConfigs);
setChainConfigs(response?.data);
}

async function updateBalance() {
const response = await props.axios.get(props.config.api.getBalance, {params: {chain: chainConfigs[chain!]?.ID}});

if(response?.data || response?.data == 0) {
setBalance(response?.data);
}
}

async function updateFaucetAddress() {
const response = await props.axios.get(props.config.api.faucetAddress, {params: {chain: chainConfigs[chain!]?.ID}});

if(response?.data) {
setFaucetAddress(response?.data);
}
}

function chainToIndex(id: any) {
if(typeof id == "string") {
id = id.toUpperCase();
Expand All @@ -89,14 +112,6 @@ const FaucetForm = (props: any) => {
return index;
}

async function updateFaucetAddress() {
const response = await props.axios.get(props.config.api.faucetAddress, {params: {chain: chainConfigs[chain!]?.ID}});

if(response?.data) {
setFaucetAddress(response?.data);
}
}

function updateAddress(addr: any): void {
setInputAddress(addr!)

Expand All @@ -111,24 +126,11 @@ const FaucetForm = (props: any) => {
}
}

async function updateBalance() {
const response = await props.axios.get(props.config.api.getBalance, {params: {chain: chainConfigs[chain!]?.ID}});

if(response?.data || response?.data == 0) {
setBalance(response?.data);
}
}

async function getCaptchaToken() {
const token = await recaptcha.getToken();
return token;
}

async function updateChainConfigs() {
const response = await props.axios.get(props.config.api.getChainConfigs);
setChainConfigs(response?.data);
}

async function updateChain(option: any) {
let chainNum = option.value

Expand Down Expand Up @@ -205,13 +207,13 @@ const FaucetForm = (props: any) => {
...base,
color: "white"
})
};
}

const ChainDropdown = () => (
<div style={{width: "100%", marginTop: "5px"}}>
<Select
options={options}
value={options[chain || 0]}
value={options[chain!]}
onChange={updateChain}
styles={customStyles}
/>
Expand Down
15 changes: 10 additions & 5 deletions middlewares/rateLimiter.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import rateLimit, { RateLimitRequestHandler } from 'express-rate-limit';
import { searchIP } from 'range_check';
import { RateLimiterConfig } from '../types';

export class RateLimiter {
Expand All @@ -18,10 +19,6 @@ export class RateLimiter {
}

rateLimiters.set(config.ID, this.getLimiter(RL_CONFIG));

if(RATELIMIT.REVERSE_PROXIES) {
app.set('trust proxy', RATELIMIT.REVERSE_PROXIES);
}
});

app.use(this.PATH, (req: any, res: any, next: any) => {
Expand All @@ -44,10 +41,18 @@ export class RateLimiter {
message: `Too many requests. Please try again after ${config.WINDOW_SIZE} minutes`
},
keyGenerator: (req, res) => {
return req.ip + req.body?.chain
const ip = this.getIP(req);
if(ip != null) {
return ip + req.body?.chain;
}
}
});

return limiter;
}

getIP(req: any) {
const ip = req.headers['cf-connecting-ip'] || req.ip;
return searchIP(ip);
}
}
35 changes: 35 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@
"dotenv": "^16.0.0",
"express": "^4.18.1",
"express-rate-limit": "^6.4.0",
"range_check": "^2.0.4",
"totp-generator": "^0.0.13",
"typescript": "^4.6.4",
"ts-node": "^10.7.0",
"typescript": "^4.6.4",
"web3": "^1.7.3"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ app.get('/ip', (req: any, res: any) => {
reqip: req.ip,
xfor: req.headers["x-forwarded-for"],
cloudflare: req.headers["cf-connecting-ip"]
})
});
})

app.get('*', async (req: any, res: any) => {
Expand Down

0 comments on commit f9a968c

Please sign in to comment.