useragent.js 1.54 KB
'use strict';

const cache = global.yoho.cache.master;
const _ = require('lodash');
const logger = global.yoho.logger;


module.exports = (limiter, policy) => {
    const blackKey = 'pc:limiter:ua:black',
        whiteKey = 'pc:limiter:ua:white';

    const ua = limiter.req.header('User-Agent');

    return Promise.all([
        cache.getAsync(blackKey),
        cache.getAsync(whiteKey)
    ]).then((args) => {
        let blacklist = [];
        let whitelist = [];

        try {
            blacklist = JSON.parse(args[0]) || [];
        } catch (error) {
            logger.error(error);
        }

        try {
            whitelist = JSON.parse(args[1]) || [];
        } catch (error) {
            logger.error(error);
        }

        if (blacklist.length === 0 && whitelist.length === 0) {
            return Promise.resolve(true);
        }

        const test = (list) => {
            let result = false;

            _.each(list, (item) => {
                let regexp;

                try {
                    regexp = new RegExp(item);
                } catch (e) {
                    logger.error(e);
                }

                if (regexp.test(ua)) {
                    result = true;
                }
            });

            return result;
        };

        if (test(blacklist)) {
            return Promise.resolve(policy);
        } else if (test(whitelist)) {
            return Promise.resolve({
                exclusion: true
            });
        } else {
            return Promise.resolve(true);
        }
    });

};