mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2026-01-22 03:05:48 +08:00
133 lines
3.7 KiB
Python
Executable File
133 lines
3.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
#
|
|
# Copyright 2012, 2013 Nick Galbreath
|
|
# nickg@client9.com
|
|
# BSD License -- see COPYING.txt for details
|
|
#
|
|
|
|
"""
|
|
Converts a libinjection JSON data file to a C header (.h) file
|
|
"""
|
|
|
|
import sys
|
|
|
|
def toc(obj):
|
|
""" main routine """
|
|
|
|
print("""
|
|
#ifndef LIBINJECTION_SQLI_DATA_H
|
|
#define LIBINJECTION_SQLI_DATA_H
|
|
|
|
#include "libinjection.h"
|
|
#include "libinjection_sqli.h"
|
|
|
|
typedef struct {
|
|
const char *word;
|
|
char type;
|
|
} keyword_t;
|
|
|
|
static size_t parse_money(sfilter * sf);
|
|
static size_t parse_other(sfilter * sf);
|
|
static size_t parse_white(sfilter * sf);
|
|
static size_t parse_operator1(sfilter *sf);
|
|
static size_t parse_char(sfilter *sf);
|
|
static size_t parse_hash(sfilter *sf);
|
|
static size_t parse_dash(sfilter *sf);
|
|
static size_t parse_slash(sfilter *sf);
|
|
static size_t parse_backslash(sfilter * sf);
|
|
static size_t parse_operator2(sfilter *sf);
|
|
static size_t parse_string(sfilter *sf);
|
|
static size_t parse_word(sfilter * sf);
|
|
static size_t parse_var(sfilter * sf);
|
|
static size_t parse_number(sfilter * sf);
|
|
static size_t parse_tick(sfilter * sf);
|
|
static size_t parse_ustring(sfilter * sf);
|
|
static size_t parse_qstring(sfilter * sf);
|
|
static size_t parse_nqstring(sfilter * sf);
|
|
static size_t parse_xstring(sfilter * sf);
|
|
static size_t parse_bstring(sfilter * sf);
|
|
static size_t parse_estring(sfilter * sf);
|
|
static size_t parse_bword(sfilter * sf);
|
|
""")
|
|
|
|
#
|
|
# Mapping of character to function
|
|
#
|
|
fnmap = {
|
|
'CHAR_WORD' : 'parse_word',
|
|
'CHAR_WHITE': 'parse_white',
|
|
'CHAR_OP1' : 'parse_operator1',
|
|
'CHAR_UNARY': 'parse_operator1',
|
|
'CHAR_OP2' : 'parse_operator2',
|
|
'CHAR_BANG' : 'parse_operator2',
|
|
'CHAR_BACK' : 'parse_backslash',
|
|
'CHAR_DASH' : 'parse_dash',
|
|
'CHAR_STR' : 'parse_string',
|
|
'CHAR_HASH' : 'parse_hash',
|
|
'CHAR_NUM' : 'parse_number',
|
|
'CHAR_SLASH': 'parse_slash',
|
|
'CHAR_SEMICOLON' : 'parse_char',
|
|
'CHAR_COMMA': 'parse_char',
|
|
'CHAR_LEFTPARENS': 'parse_char',
|
|
'CHAR_RIGHTPARENS': 'parse_char',
|
|
'CHAR_LEFTBRACE': 'parse_char',
|
|
'CHAR_RIGHTBRACE': 'parse_char',
|
|
'CHAR_VAR' : 'parse_var',
|
|
'CHAR_OTHER': 'parse_other',
|
|
'CHAR_MONEY': 'parse_money',
|
|
'CHAR_TICK' : 'parse_tick',
|
|
'CHAR_UNDERSCORE': 'parse_underscore',
|
|
'CHAR_USTRING' : 'parse_ustring',
|
|
'CHAR_QSTRING' : 'parse_qstring',
|
|
'CHAR_NQSTRING' : 'parse_nqstring',
|
|
'CHAR_XSTRING' : 'parse_xstring',
|
|
'CHAR_BSTRING' : 'parse_bstring',
|
|
'CHAR_ESTRING' : 'parse_estring',
|
|
'CHAR_BWORD' : 'parse_bword'
|
|
}
|
|
print()
|
|
print("typedef size_t (*pt2Function)(sfilter *sf);")
|
|
print("static const pt2Function char_parse_map[] = {")
|
|
pos = 0
|
|
for character in obj['charmap']:
|
|
print(" &%s, /* %d */" % (fnmap[character], pos))
|
|
pos += 1
|
|
print("};")
|
|
print()
|
|
|
|
# keywords
|
|
# load them
|
|
keywords = obj['keywords']
|
|
|
|
for fingerprint in list(obj['fingerprints']):
|
|
fingerprint = '0' + fingerprint.upper()
|
|
keywords[fingerprint] = 'F'
|
|
|
|
needhelp = []
|
|
for key in keywords.keys():
|
|
if key != key.upper():
|
|
needhelp.append(key)
|
|
|
|
for key in needhelp:
|
|
tmpv = keywords[key]
|
|
del keywords[key]
|
|
keywords[key.upper()] = tmpv
|
|
|
|
print("static const keyword_t sql_keywords[] = {")
|
|
for k in sorted(keywords.keys()):
|
|
if len(k) > 31:
|
|
sys.stderr.write("ERROR: keyword greater than 32 chars\n")
|
|
sys.exit(1)
|
|
|
|
print(" {\"%s\", '%s'}," % (k, keywords[k]))
|
|
print("};")
|
|
print("static const size_t sql_keywords_sz = %d;" % (len(keywords), ))
|
|
|
|
print("#endif")
|
|
return 0
|
|
|
|
if __name__ == '__main__':
|
|
import json
|
|
sys.exit(toc(json.load(sys.stdin)))
|
|
|