1. JavaScript / Говнокод #14309

    +157

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    var allowed = [ 0xfe, 0xfc, 0xf8, 0xf0,
                    0xe0, 0xc0, 0x80, 0x00 ];
    for (var i = 0; i < parts.length; i++) {
        var part = parts[i]; 
       
        // ...
    
        if ($.grep(allowed, function(a) { return part == a; }).length > 0) {
            max = 0x00;
        } else {
            FocusObject(object);
            show_alert( jstextTemplate("<jstext>field_contains_bad_IP_mask</jstext>", {name: name}) );
            return false;
        }
    }

    Кусочек валидации для маски подсети. Мы не ищем лёгких путей.

    Запостил: Elvenfighter, 02 Января 2014

    Комментарии (12) RSS

    • Покормлю-ка я местных гурманов:
      function isMask(x){
        return typeof x === 'string' &&
          /^(\d+\.){3}\d+$/.test(x) &&
          !(x = ~x.split('.').reduce(function(m, x){
            return x >> 8 && 1 || m << 8 | x;
          }, 0), x & ++x);
      }
      Ответить
      • Мои пять копеек, тупые и банальные:
        function maskFromBitCount(count) {
            var s = [];
            for (var i=0; i<4; i++) {
                var bits = count >= 8 ? 8 : count;
                s[i] = (255 << (8-bits)) & 255;
                count -= bits;
            }
            return s.join('.');
        }
        
        function maskToBitCount(mask) {
            for (var i=0; i<=32; i++) {
                if (mask === maskFromBitCount(i))
                    return i;
            }
            return null;
        }
        
        function isValidMask(mask) {
            return bitCountFromMask(mask) != null;
        }
        Ответить
        • Лал, оригинально, тупо перебором. Алсо есть же uncontinious маски.
          Ответить
          • > тупо перебором
            Да 33 варианта всего же, лень думать было. Можно, кстати, вообще засунуть в хешмап все 33 варианта, и дергать оттуда.

            > Алсо есть же uncontinious маски.
            Бля, еще и такое безобразие есть... Век живи - век учись.

            Ну для них проверки уже смысла не имеют. Проверить на 0..255, да и хватит.
            Ответить
    • Что-то какой-то пиздец...

      224.224.224.224 - валидная маска
      255.255.255.0 - нет
      Ответить
      • на всякий случай: перед циклом обьявляется max
        var max = 0xff;


        и на месте пропуска (// ...)
        if (part > max) {
            FocusObject(object);
            show_alert( jstextTemplate("<jstext>field_contains_bad_IP_mask</jstext>", {name: name}) );
            return false;
        }
                if (part == max) { continue; }
        Ответить
        • Вот оно чё... ну тогда код должен работать.
          Ответить
    • Я бы сделал так
      re.match('^0b1*0*$', bin(iptoint(mask))) is not None


      Или ~iptoint(mask)+1 проверяем на равенство степени 2.
      Ответить
      • И тут на сцену выходит ipv6, и весь код из этого треда отправляется на помойку.
        Ответить
        • С хуле? Там маска разве не должна состоять из непрерывных цепочек 0 и 1? Или ты про iptoint, ну так функцию заменил и все. Нашел к чему прицепиться.
          Ответить

    Добавить комментарий