예제 #1
0
    def add_from_import(self, from_import_list):
        """Add imported modules from reserved modules to reserved.

        Parameters
        ----------
        from_import_list : list
        """
        if not from_import_list or \
                from_import_list[0] != 'from' or \
                'import' not in from_import_list[:]:
            return

        reserved_list = set()
        import_index = from_import_list[:].index('import')
        package_name = ''
        is_reserved = False
        for reserve_name in from_import_list[1:import_index]:
            # Start with first reserved directory in tree (if one exists)
            if not is_reserved:
                try:
                    get_reserved_by_name(reserve_name)
                    is_reserved = True
                    package_name = reserve_name
                except DoesNotExist:
                    continue
            if is_reserved:
                if reserve_name[0].isalpha() or reserve_name[0] == '_':
                    reserved_list.add(reserve_name)

        if is_reserved:
            # Get imported items
            for reserve_name in from_import_list[import_index + 1:]:
                if reserve_name[0].isalpha() or reserve_name[0] == '_':
                    reserved_list.add(reserve_name)
            add_reserveds(package_name, reserved_list)
예제 #2
0
    def add_kivy_import(self, kivy_import_list):
        """Add imported modules from reserved modules to reserved.

        Parameters
        ----------
        kivy_import_list : list
            Kivy import statement.
        """
        if not kivy_import_list or \
                kivy_import_list[0].strip() != '#:' or \
                kivy_import_list[1] != 'import':
            return

        reserved_list = set()
        package_name = ''
        is_reserved = False
        for reserve_name in kivy_import_list[3:]:
            # Start with first reserved directory in tree (if one exists)
            if not is_reserved:
                try:
                    get_reserved_by_name(reserve_name)
                    is_reserved = True
                    package_name = reserve_name
                except DoesNotExist:
                    continue
            if is_reserved:
                if reserve_name[0].isalpha() or reserve_name[0] == '_':
                    reserved_list.add(reserve_name)
        if is_reserved:
            reserved_list.add(kivy_import_list[2])
            add_reserveds(package_name, reserved_list)
예제 #3
0
    def add_from_import(self, from_import_list):
        """Add imported modules from reserved modules to reserved.

        Parameters
        ----------
        from_import_list : list
        """
        if not from_import_list or \
                from_import_list[0] != 'from' or \
                'import' not in from_import_list[:]:
            return

        reserved_list = set()
        import_index = from_import_list[:].index('import')
        package_name = ''
        is_reserved = False
        for reserve_name in from_import_list[1:import_index]:
            # Start with first reserved directory in tree (if one exists)
            if not is_reserved:
                try:
                    get_reserved_by_name(reserve_name)
                    is_reserved = True
                    package_name = reserve_name
                except DoesNotExist:
                    continue
            if is_reserved:
                if reserve_name[0].isalpha() or reserve_name[0] == '_':
                    reserved_list.add(reserve_name)

        if is_reserved:
            # Get imported items
            for reserve_name in from_import_list[import_index+1:]:
                if reserve_name[0].isalpha() or reserve_name[0] == '_':
                    reserved_list.add(reserve_name)
            add_reserveds(package_name, reserved_list)
예제 #4
0
def test_get_reserved_by_name():

    # Get good reserved_id
    reserved_row = get_reserved_by_name('reserved_one')
    assert reserved_row.id == 1
    assert reserved_row.name == u'reserved_one'

    # Fail at getting bad reserved_id
    with pytest.raises(DoesNotExist):
        get_reserved_by_name('junk')
예제 #5
0
 def validate_obfuscated_name(self):
     """Make sure the obfuscated name is unique."""
     if self.name != self.obfuscated_name:
         is_unique = False
         while not is_unique:
             if not self.obfuscated_name:
                 random_num = base_random_number(5)
                 self.obfuscated_name = base_alphabet_encode(random_num, 5)
             try:
                 get_reserved_by_name(self.obfuscated_name)
             except pwe.DoesNotExist:
                 is_unique = True
             else:
                 self.obfuscated_name = None
예제 #6
0
def test_add_reserveds():
    # Define values to be updated, and their new values
    names_to_update = {
        "variable": "v001",
        "variable_row": "v002",
        "scenario": "s001",
        "decision": "d001",
        "decision_row": "d002"
        }

    for ident_name, obfuscated_name in names_to_update.iteritems():
        identifier_row = get_identifier(None)
        save_identifier(
            identifier_row,
            name=ident_name,
            obfuscated_name=obfuscated_name
            )

    bnf_parser = ObfuscatePythonBNF(get_obfuscated_name)

    # Identifiers after leading reserved attributes should not be obfuscated
    # They should be added to reserved and removed from identifiers
    bnf_parser.attribs.parseString(
        "decision.scenario(variable) = reserved_one.variable "
        "+ view.reserved_one")

    assert bnf_parser.statement.transformString(
        "decision.scenario(variable) = reserved_one.variable") == \
        "d001.s001(variable)=reserved_one.variable"

    assert get_reserved_by_name('variable').primary_package == 'reserved_one'
    assert get_identifier_by_name('variable').obfuscated_name == 'variable'
    with pytest.raises(DoesNotExist):
        assert get_identifier_by_name('view').obfuscated_name != 'view'
예제 #7
0
def test_build_db():
    reserved_list = keyword.kwlist
    add_reserveds('Python', reserved_list)

    # Test some python keywords
    reserved_row = get_reserved_by_name('from')
    assert reserved_row.name == 'from'

    reserved_row = get_reserved_by_name('with')
    assert reserved_row.name == 'with'

    reserved_row = get_reserved_by_name('class')
    assert reserved_row.name == 'class'

    with pytest.raises(AssertionError):
        assert reserved_row.name == 'junk'
예제 #8
0
def test_add_reserveds():
    # Define values to be updated, and their new values
    names_to_update = {
        "variable": "v001",
        "variable_row": "v002",
        "scenario": "s001",
        "decision": "d001",
        "decision_row": "d002"
    }

    for ident_name, obfuscated_name in names_to_update.iteritems():
        identifier_row = get_identifier(None)
        save_identifier(identifier_row,
                        name=ident_name,
                        obfuscated_name=obfuscated_name)

    bnf_parser = ObfuscateKivyBNF(get_obfuscated_name)

    # Identifiers after leading reserved attributes should not be obfuscated
    # They should be added to reserved and removed from identifiers
    bnf_parser.attribs.parseString(
        "decision.scenario(variable) = reserved_one.variable "
        "+ view.reserved_one")

    assert bnf_parser.statement.transformString(
        "decision.scenario(variable) = reserved_one.variable") == \
        "d001.s001(variable)=reserved_one.variable"

    assert get_reserved_by_name('variable').primary_package == 'reserved_one'
    assert get_identifier_by_name('variable').obfuscated_name == 'variable'
    with pytest.raises(DoesNotExist):
        assert get_identifier_by_name('view').obfuscated_name != 'view'
예제 #9
0
def add_attribs_reserveds_list(attrib_list):
    """Add attributes that follow a reserved name to reserveds list."""
    if len(attrib_list) > 1:  # A single item does not change
        is_reserved = False
        reserved_set = set()
        for name in attrib_list:
            if not is_reserved:
                try:
                    get_reserved_by_name(name)
                    is_reserved = True
                    package_name = name
                    continue  # Don't add already reserved name
                except DoesNotExist:
                    continue
            if is_reserved:
                reserved_set.add(name)
        if reserved_set:
            add_reserveds(package_name, reserved_set)
예제 #10
0
def add_attribs_reserveds_list(attrib_list):
    """Add attributes that follow a reserved name to reserveds list."""
    if len(attrib_list) > 1:  # A single item does not change
        is_reserved = False
        reserved_set = set()
        for name in attrib_list:
            if not is_reserved:
                try:
                    get_reserved_by_name(name)
                    is_reserved = True
                    package_name = name
                    continue  # Don't add already reserved name
                except DoesNotExist:
                    continue
            if is_reserved:
                reserved_set.add(name)
        if reserved_set:
            add_reserveds(package_name, reserved_set)
예제 #11
0
def add_identifiers(identifier_list=None, do_obfuscate=True):
    """Add identifier and obfuscated names to Identifiers table.

    Parameters
    ----------
    do_obfuscate : bool
    identifier_list : list
    """
    for identifier_name in identifier_list:
        # Skip identifiers in reserved
        try:
            get_reserved_by_name(identifier_name)
        except DoesNotExist:
            pass
        else:
            continue

        if not do_obfuscate \
                or identifier_name[0:2] == '__' \
                or identifier_name == '__init__.py' \
                or identifier_name.startswith('test_') \
                or identifier_name.endswith('_test.py'):
            obfuscated_name = identifier_name
        else:
            obfuscated_name = ''

        identifier_row = get_identifier(None)
        try:
            save_identifier(identifier_row,
                            name=identifier_name,
                            obfuscated_name=obfuscated_name)
        except IntegrityError as e:
            if 'unique' not in e.message.lower():
                raise
            # If should not be obfuscated, replace obfuscated, o/w pass
            if not do_obfuscate:
                identifier_row = get_identifier_by_name(identifier_name)
                if identifier_row.obfuscated_name != identifier_name:
                    save_identifier(identifier_row,
                                    obfuscated_name=identifier_name)
예제 #12
0
def test_add_from_import():
    bnf_parser = ObfuscatePythonBNF(get_obfuscated_name)

    # Reserve imported modules if first from module is reserved
    bnf_parser.from_import.parseString(
        "   from some_module.reserved_one import is_reserved, also_is")
    assert get_reserved_by_name('is_reserved')
    assert get_reserved_by_name('also_is')

    # Reserve imported modules if first from module is reserved
    bnf_parser.from_import.parseString(
        "   from reserved_one.some_module import is_reserved, also_reserved")
    assert get_reserved_by_name('is_reserved').primary_package == \
        'reserved_one'
    assert get_reserved_by_name('also_reserved').primary_package == \
        'reserved_one'

    # Import (without a from) should take no action
    bnf_parser.from_import.parseString(
        "   import reserved_one, not_reserved_1, also_not_1")
    with pytest.raises(DoesNotExist):
        get_reserved_by_name('not_reserved_1')
    with pytest.raises(DoesNotExist):
        get_reserved_by_name('also_not_1')
예제 #13
0
def test_add_except_error():
    bnf_parser = ObfuscatePythonBNF(get_obfuscated_name)

    # Reserve exception names
    bnf_parser.except_error.parseString(
        "   except (FloatingPointError, SomeOtherError) as exc_err")
    assert get_reserved_by_name('FloatingPointError')
    assert get_reserved_by_name('SomeOtherError')
    with pytest.raises(DoesNotExist):
        assert get_reserved_by_name('exc_err')

    # Reserve exception names with double tab
    bnf_parser.except_error.parseString(
        "       except (FloatingPointError, SomeOtherError) as exc_err")
    assert get_reserved_by_name('FloatingPointError')
    assert get_reserved_by_name('SomeOtherError')
    with pytest.raises(DoesNotExist):
        assert get_reserved_by_name('exc_err')
예제 #14
0
def test_add_conseq_idents():
    bnf_parser = ObfuscateKivyBNF(get_obfuscated_name)

    # Identifiers after leading reserved attributes should not be obfuscated
    # conseq_idents will add identifiers indiscriminately
    bnf_parser.conseq_idents.parseString(
        "decision.scenario(variable) = reserved_one.variable")

    assert get_identifier_by_name('decision').obfuscated_name != 'decision'
    assert get_identifier_by_name('scenario').obfuscated_name != 'scenario'
    assert get_identifier_by_name('variable').obfuscated_name != 'variable'
    assert get_identifier_by_name('reserved_one').obfuscated_name == \
        'reserved_one'

    # attribs should reserve
    bnf_parser.attribs.parseString(
        "decision.scenario(variable) = reserved_one.variable")
    assert get_identifier_by_name('decision').obfuscated_name != 'decision'
    assert get_identifier_by_name('scenario').obfuscated_name != 'scenario'
    assert get_identifier_by_name('variable').obfuscated_name == 'variable'
    assert get_identifier_by_name('reserved_one').obfuscated_name == \
        'reserved_one'

    assert get_reserved_by_name('variable').primary_package == 'reserved_one'
예제 #15
0
def test_add_conseq_idents():
    bnf_parser = ObfuscateKivyBNF(get_obfuscated_name)

    # Identifiers after leading reserved attributes should not be obfuscated
    # conseq_idents will add identifiers indiscriminately
    bnf_parser.conseq_idents.parseString(
        "decision.scenario(variable) = reserved_one.variable")

    assert get_identifier_by_name('decision').obfuscated_name != 'decision'
    assert get_identifier_by_name('scenario').obfuscated_name != 'scenario'
    assert get_identifier_by_name('variable').obfuscated_name != 'variable'
    assert get_identifier_by_name('reserved_one').obfuscated_name == \
        'reserved_one'

    # attribs should reserve
    bnf_parser.attribs.parseString(
        "decision.scenario(variable) = reserved_one.variable")
    assert get_identifier_by_name('decision').obfuscated_name != 'decision'
    assert get_identifier_by_name('scenario').obfuscated_name != 'scenario'
    assert get_identifier_by_name('variable').obfuscated_name == 'variable'
    assert get_identifier_by_name('reserved_one').obfuscated_name == \
        'reserved_one'

    assert get_reserved_by_name('variable').primary_package == 'reserved_one'
예제 #16
0
def test_add_kivy_import():
    bnf_parser = ObfuscateKivyBNF(get_obfuscated_name)

    # Reserve imported modules from first reserved module
    bnf_parser.kivy_import.parseString(
        "#: import is_reserved some_module.reserved_one")
    assert get_reserved_by_name('is_reserved').primary_package == \
        'reserved_one'
    with pytest.raises(DoesNotExist):
        get_reserved_by_name('some_module')

    # Reserve imported modules if first from module is reserved
    bnf_parser.kivy_import.parseString(
        "#: import is_reserved reserved_one.some_module")
    assert get_reserved_by_name('is_reserved').primary_package == \
        'reserved_one'
    assert get_reserved_by_name('some_module').primary_package == \
        'reserved_one'

    # Import without directive should take no action
    bnf_parser.kivy_import.parseString("import not_reserved_1 reserved_one")
    with pytest.raises(DoesNotExist):
        get_reserved_by_name('not_reserved_1')
예제 #17
0
def test_add_kivy_import():
    bnf_parser = ObfuscateKivyBNF(get_obfuscated_name)

    # Reserve imported modules from first reserved module
    bnf_parser.kivy_import.parseString(
        "#: import is_reserved some_module.reserved_one")
    assert get_reserved_by_name('is_reserved').primary_package == \
        'reserved_one'
    with pytest.raises(DoesNotExist):
        get_reserved_by_name('some_module')

    # Reserve imported modules if first from module is reserved
    bnf_parser.kivy_import.parseString(
        "#: import is_reserved reserved_one.some_module")
    assert get_reserved_by_name('is_reserved').primary_package == \
        'reserved_one'
    assert get_reserved_by_name('some_module').primary_package == \
        'reserved_one'

    # Import without directive should take no action
    bnf_parser.kivy_import.parseString(
        "import not_reserved_1 reserved_one")
    with pytest.raises(DoesNotExist):
        get_reserved_by_name('not_reserved_1')
예제 #18
0
def test_get_dir(tmpdir):
    # Setup reserved folder
    reserved_row = get_reserved(None)
    assert 2 == save_reserved(
        reserved_row,
        name=u'/rsv_dir',
        primary_package='rsv_pkg')

    reserved_row = get_reserved(None)
    assert 3 == save_reserved(
        reserved_row,
        name=u'~rsv_file.py',
        primary_package='rsv_file_pkg')

    reserved_row = get_reserved(None)
    assert 4 == save_reserved(
        reserved_row,
        name=u'#no_obf',
        primary_package='no_obf_pkg')

    reserved_row = get_reserved(None)
    assert 5 == save_reserved(
        reserved_row,
        name=u'=no_obf_file.py')

    # Setup folders and files
    f = io.open(join(str(tmpdir), 'test.py'), 'w')
    f.close()

    f = io.open(join(str(tmpdir), 'rsv_file.py'), 'w')
    f.close()

    included_dir = join(str(tmpdir), 'not_rsv0')
    os.mkdir(included_dir)
    f = io.open(join(included_dir, 'not_rsv0a.py'), 'w')
    f.close()
    f = io.open(join(included_dir, 'not_rsv0b.py'), 'w')
    f.close()
    included_dir = join(str(tmpdir), 'not_rsv0', 'not_rsv0.1')
    os.mkdir(included_dir)
    f = io.open(join(included_dir, 'not_rsv0.1.py'), 'w')
    f.close()

    excluded_dir = join(str(tmpdir), 'rsv_dir')
    os.mkdir(excluded_dir)
    excluded_dir = join(str(tmpdir), 'rsv_dir', 'rsv_dir_subdir')
    os.mkdir(excluded_dir)
    f = io.open(join(excluded_dir, 'rsv_subdir_file.py'), 'w')
    f.close()

    included_dir = join(str(tmpdir), 'not_rsv_file')
    os.mkdir(included_dir)
    f = io.open(join(included_dir, 'not_rsv_file.py'), 'w')
    f.close()

    included_dir = join(str(tmpdir), 'not_rsv0', 'no_obf')
    os.mkdir(included_dir)
    included_dir = join(str(tmpdir), 'not_rsv0', 'no_obf', 'no_obf_1')
    os.mkdir(included_dir)
    f = io.open(join(included_dir, 'no_obf_1.py'), 'w')
    f.close()

    f = io.open(join(str(tmpdir), 'no_obf_file.py'), 'w')
    f.close()

    # Test reading directory structure
    get_files_gen = file_gen(str(tmpdir))
    num_lines = 0
    for file_name, dir_name, is_reserved_dir, is_reserved_file, \
            do_obfuscate in get_files_gen:
        if file_name == 'test.py':
            assert dir_name == str(tmpdir)
            assert not is_reserved_dir
            assert not is_reserved_file
            assert do_obfuscate
        if file_name == 'not_rsv0a.py':
            assert dir_name == join(str(tmpdir), 'not_rsv0')
            assert not is_reserved_dir
            assert not is_reserved_file
            assert do_obfuscate
        if file_name == 'not_rsv0b.py':
            assert dir_name == join(str(tmpdir), 'not_rsv0')
            assert not is_reserved_dir
            assert not is_reserved_file
            assert do_obfuscate
        if file_name == 'not_rsv0.1.py':
            assert dir_name == join(str(tmpdir), 'not_rsv0', 'not_rsv0.1')
            assert not is_reserved_dir
            assert not is_reserved_file
            assert do_obfuscate
        if file_name == 'not_rsv_file.py':
            assert dir_name == join(str(tmpdir), 'not_rsv_file')
            assert not is_reserved_dir
            assert not is_reserved_file
            assert do_obfuscate
        if file_name == 'rsv_subdir_file.py':
            assert dir_name == join(str(tmpdir), 'rsv_dir', 'rsv_dir_subdir')
            assert is_reserved_dir
            assert is_reserved_file
            assert not do_obfuscate
            assert get_reserved_by_name(
                ''.join(['/', 'rsv_dir_subdir'])).primary_package == 'rsv_pkg'
        if file_name == 'rsv_file.py':
            assert dir_name == str(tmpdir)
            assert not is_reserved_dir
            assert is_reserved_file
            assert not do_obfuscate
        if file_name == 'no_obf_1.py':
            assert dir_name == join(str(tmpdir), 'not_rsv0', 'no_obf', 
                                    'no_obf_1')
            assert not is_reserved_dir
            assert not is_reserved_file
            assert not do_obfuscate
            assert get_reserved_by_name(
                ''.join(['#', 'no_obf_1'])).primary_package == 'no_obf'
        if file_name == 'no_obf_file.py':
            assert dir_name == str(tmpdir)
            assert not is_reserved_dir
            assert not is_reserved_file
            assert not do_obfuscate
        num_lines += 1
    assert num_lines == 9
    assert get_reserved_by_name('~rsv_subdir_file.py').primary_package == \
        'rsv_dir_subdir'
    assert get_identifier_by_name('no_obf_1').name == 'no_obf_1'
예제 #19
0
def test_add_reserveds():
    #
    # Add python reserved names
    #
    reserved_list = keyword.kwlist
    add_reserveds('python', reserved_list)

    # Test 'python' in module reserved keywords
    reserved_row = get_reserved_by_name('python')
    assert reserved_row.name == 'python'
    assert reserved_row.primary_package == 'python'

    # Test some python keywords
    reserved_row = get_reserved_by_name('from')
    assert reserved_row.name == 'from'
    assert reserved_row.primary_package == 'python'

    reserved_row = get_reserved_by_name('with')
    assert reserved_row.name == 'with'
    assert reserved_row.primary_package == 'python'

    reserved_row = get_reserved_by_name('class')
    assert reserved_row.name == 'class'
    assert reserved_row.primary_package == 'python'

    #
    # Add kivy reserved names
    #
    reserved_list = [
        'after', 'App', 'app',
        'before', 'bold', 'BooleanProperty','BoxLayout', 'Button',
        'canvas', 'color',
        'disabled', 'dp', 'dpi2px', 'dx',
        'FileChooser', 'filechooser', 'FloatLayout', 'focus', 'font',
        'GridLayout',
        'halign', 'height', 'hint_text', 'horizontal',
        'id',
        'kivy',
        'Label', 'Logger', 'logger',
        'multiline',
        'NumericProperty',
        'ObjectProperty', 'on_focus', 'op_press', 'orientation',
        'padding', 'platform', 'properties', 'px',
        'Rectangle', 'require', 'rgba', 'root',
        'ScreenManager', 'screenmanager', 'self',
        'size', 'size_hint', 'size_hint_x', 'size_hint_y', 'StringProperty',
        'sp',
        'text', 'text_size',
        'uix', 'utils',
        'valign', 'vertical',
        ]
    add_reserveds('kivy', reserved_list)

    # Test some kivy keywords
    reserved_row = get_reserved_by_name('kivy')
    assert reserved_row.name == 'kivy'
    assert reserved_row.primary_package == 'kivy'

    reserved_row = get_reserved_by_name('color')
    assert reserved_row.name == 'color'
    assert reserved_row.primary_package == 'kivy'

    reserved_row = get_reserved_by_name('BoxLayout')
    assert reserved_row.name == 'BoxLayout'
    assert reserved_row.primary_package == 'kivy'

    with pytest.raises(DoesNotExist):
        get_reserved_by_name('junk')

    # Test removing of identifier for new reserved names

    #
    # Add python identifier names
    #
    identifier_list = [
        'variable',
        'variable_row',
        ]
    add_identifiers(identifier_list)

    reserved_list = ['variable']
    add_reserveds('test', reserved_list)

    assert get_identifier_by_name('variable_row').name == 'variable_row'
    assert get_identifier_by_name('variable').obfuscated_name == 'variable'

    #
    # Should not add __init__.py
    #
    reserved_list = ['__init__.py']
    add_reserveds('test', reserved_list, '=')

    with pytest.raises(DoesNotExist):
        get_identifier_by_name('__init__.py')
예제 #20
0
def file_gen(from_dir, do_recursive=True, file_name=None):
    """Process a file or directory.

    Parameters
    ----------
    do_recursive : bool
    file_name : str
    from_dir : str

    Yields
    ------
    dir_name : str
    do_obfuscate : bool
    file_name : str
    is_reserved_dir : bool
    is_reserved_file : bool
    """
    # Process for a single file
    if file_name:
        # Skip excluded files
        is_reserved_dir = None
        try:
            get_reserved_by_name(''.join(
                [reserved_prefixes.reserved_file, file_name]))
        except DoesNotExist:
            is_reserved_file = False
        else:
            is_reserved_file = True

        yield file_name, from_dir, is_reserved_dir, is_reserved_file
        return

    # Process for a directory
    for dir_name, subdir_list, file_list in walk(from_dir):
        if do_recursive and not dir_name:
            break
        # Remove unwanted files from file_list
        file_list = [
            file_name for file_name in file_list
            if file_name[-4:] not in ['.pyc', '.pyo']
        ]
        #####################
        # Process directories
        #####################
        is_reserved_dir = True
        do_obfuscate_dir = False

        # Identify reserved directories
        try:
            reserved_row = get_reserved_by_name(''.join(
                [reserved_prefixes.reserved_dir,
                 basename(dir_name)]))
        except DoesNotExist:
            is_reserved_dir = False
        else:
            # Add identifiers to reserved
            if subdir_list:
                add_reserveds(reserved_row.primary_package, subdir_list,
                              reserved_prefixes.reserved_dir)
            if file_list:
                add_reserveds(basename(dir_name), file_list,
                              reserved_prefixes.reserved_file)

        # Identify non-obfuscated directories
        if not is_reserved_dir:
            try:
                get_reserved_by_name(''.join(
                    [reserved_prefixes.non_obfuscated_dir,
                     basename(dir_name)]))
            except DoesNotExist:
                do_obfuscate_dir = True

                # Add to obfuscated identifiers
                add_identifiers(basename(dir_name))
                if subdir_list:
                    add_identifiers(subdir_list)
                if file_list:
                    ob_files = [
                        file_name[:-3] for file_name in file_list
                        if file_name[-3:] in ['.py', '.ky']
                    ]
                    if ob_files:
                        add_identifiers(ob_files)
            else:
                # Add non-obfuscated identifiers
                add_identifiers([basename(dir_name)], do_obfuscate=False)
                if subdir_list:
                    add_reserveds(basename(dir_name), subdir_list,
                                  reserved_prefixes.non_obfuscated_dir)
                if file_list:
                    add_reserveds(basename(dir_name), file_list,
                                  reserved_prefixes.non_obfuscated_file)

        for file_name in file_list:
            do_obfuscate = False
            is_reserved_file = False
            # Files in reserved directory are reserved
            if is_reserved_dir:
                is_reserved_file = True
            else:
                # Identify reserved files
                try:
                    get_reserved_by_name(''.join(
                        [reserved_prefixes.reserved_file, file_name]))
                except DoesNotExist:
                    # Identify files to obfuscate
                    if do_obfuscate_dir:
                        try:
                            get_reserved_by_name(''.join([
                                reserved_prefixes.non_obfuscated_file,
                                file_name
                            ]))
                        except DoesNotExist:
                            do_obfuscate = True
                else:
                    is_reserved_file = True

            if file_name == '__init__.py' and \
                    not is_reserved_dir and \
                    not do_obfuscate_dir:
                do_obfuscate = True

            yield file_name, dir_name, is_reserved_dir, is_reserved_file, \
                do_obfuscate
예제 #21
0
def file_gen(from_dir, do_recursive=True, file_name=None):
    """Process a file or directory.

    Parameters
    ----------
    do_recursive : bool
    file_name : str
    from_dir : str

    Yields
    ------
    dir_name : str
    do_obfuscate : bool
    file_name : str
    is_reserved_dir : bool
    is_reserved_file : bool
    """
    # Process for a single file
    if file_name:
        # Skip excluded files
        is_reserved_dir = None
        try:
            get_reserved_by_name(''.join([
                reserved_prefixes.reserved_file, file_name]))
        except DoesNotExist:
            is_reserved_file = False
        else:
            is_reserved_file = True

        yield file_name, from_dir, is_reserved_dir, is_reserved_file
        return

    # Process for a directory
    for dir_name, subdir_list, file_list in walk(from_dir):
        if do_recursive and not dir_name:
            break
        # Remove unwanted files from file_list
        file_list = [file_name for file_name in file_list
                     if file_name[-4:] not in ['.pyc', '.pyo']
                     ]
        #####################
        # Process directories
        #####################
        is_reserved_dir = True
        do_obfuscate_dir = False

        # Identify reserved directories
        try:
            reserved_row = get_reserved_by_name(
                ''.join([reserved_prefixes.reserved_dir, basename(dir_name)]))
        except DoesNotExist:
            is_reserved_dir = False
        else:
            # Add identifiers to reserved
            if subdir_list:
                add_reserveds(reserved_row.primary_package, subdir_list,
                              reserved_prefixes.reserved_dir)
            if file_list:
                add_reserveds(basename(dir_name), file_list,
                              reserved_prefixes.reserved_file)

        # Identify non-obfuscated directories
        if not is_reserved_dir:
            try:
                get_reserved_by_name(''.join([
                    reserved_prefixes.non_obfuscated_dir, basename(dir_name)]))
            except DoesNotExist:
                do_obfuscate_dir = True

                # Add to obfuscated identifiers
                add_identifiers(basename(dir_name))
                if subdir_list:
                    add_identifiers(subdir_list)
                if file_list:
                    ob_files = [
                        file_name[:-3] for file_name in file_list
                        if file_name[-3:] in ['.py', '.ky']
                        ]
                    if ob_files:
                        add_identifiers(ob_files)
            else:
                # Add non-obfuscated identifiers
                add_identifiers([basename(dir_name)], do_obfuscate=False)
                if subdir_list:
                    add_reserveds(basename(dir_name), subdir_list,
                                  reserved_prefixes.non_obfuscated_dir)
                if file_list:
                    add_reserveds(basename(dir_name), file_list,
                                  reserved_prefixes.non_obfuscated_file)

        for file_name in file_list:
            do_obfuscate = False
            is_reserved_file = False
            # Files in reserved directory are reserved
            if is_reserved_dir:
                is_reserved_file = True
            else:
                # Identify reserved files
                try:
                    get_reserved_by_name(''.join([
                        reserved_prefixes.reserved_file, file_name]))
                except DoesNotExist:
                    # Identify files to obfuscate
                    if do_obfuscate_dir:
                        try:
                            get_reserved_by_name(''.join([
                                reserved_prefixes.non_obfuscated_file,
                                file_name]))
                        except DoesNotExist:
                            do_obfuscate = True
                else:
                    is_reserved_file = True

            if file_name == '__init__.py' and \
                    not is_reserved_dir and \
                    not do_obfuscate_dir:
                do_obfuscate = True

            yield file_name, dir_name, is_reserved_dir, is_reserved_file, \
                do_obfuscate
예제 #22
0
def test_add_attribs():
    bnf_parser = ObfuscatePythonBNF(get_obfuscated_name)

    # Identifiers after leading reserved attributes should not be obfuscated

    # Attribs should reserve and unobfuscate names in identifiers
    source = "decision.scenario(variable) = reserved_one.variable.another"
    bnf_parser.attribs.parseString(source)
    bnf_parser.conseq_idents.parseString(source)
    assert get_identifier_by_name('decision').obfuscated_name != 'decision'
    assert get_identifier_by_name('scenario').obfuscated_name != 'scenario'
    assert get_identifier_by_name('variable').obfuscated_name == 'variable'
    assert get_identifier_by_name('another').obfuscated_name == 'another'
    assert get_identifier_by_name('reserved_one').obfuscated_name == \
        'reserved_one'

    assert get_reserved_by_name('variable').primary_package == 'reserved_one'
    assert get_reserved_by_name('another').primary_package == 'reserved_one'

    # Attribs should reserve only after reserved name
    source = "decision.scenario.reserved_one.variable2.another2"
    bnf_parser.attribs.parseString(source)
    bnf_parser.conseq_idents.parseString(source)
    assert get_identifier_by_name('decision').obfuscated_name != 'decision'
    assert get_identifier_by_name('scenario').obfuscated_name != 'scenario'
    assert get_identifier_by_name('variable2').obfuscated_name == 'variable2'
    assert get_identifier_by_name('another2').obfuscated_name == 'another2'
    assert get_identifier_by_name('reserved_one').obfuscated_name == \
        'reserved_one'

    # Attribs should reserve only after reserved name, not parameters
    source = "decision.scenario.reserved_one(variable3).another3"
    bnf_parser.attribs.parseString(source)
    bnf_parser.conseq_idents.parseString(source)
    assert get_identifier_by_name('decision').obfuscated_name != 'decision'
    assert get_identifier_by_name('scenario').obfuscated_name != 'scenario'
    assert get_identifier_by_name('variable3').obfuscated_name != 'variable3'
    assert get_identifier_by_name('another3').obfuscated_name != 'another3'
    assert get_identifier_by_name('reserved_one').obfuscated_name == \
        'reserved_one'

    # Attribs should reserve only after reserved name
    source = "decision.scenario.reserved_one.variable4 " \
             "+ variable5.reserved_one.another5"
    bnf_parser.attribs.parseString(source)
    bnf_parser.conseq_idents.parseString(source)
    assert get_identifier_by_name('decision').obfuscated_name != 'decision'
    assert get_identifier_by_name('scenario').obfuscated_name != 'scenario'
    assert get_identifier_by_name('variable4').obfuscated_name == 'variable4'
    assert get_identifier_by_name('variable5').obfuscated_name != 'variable5'
    assert get_identifier_by_name('another5').obfuscated_name == 'another5'
    assert get_identifier_by_name('reserved_one').obfuscated_name == \
        'reserved_one'

    # Attribs should reserve even if they are functions
    source = "decision.scenario.reserved_one.variable6(another6)"
    bnf_parser.attribs.parseString(source)
    bnf_parser.conseq_idents.parseString(source)
    assert get_identifier_by_name('decision').obfuscated_name != 'decision'
    assert get_identifier_by_name('scenario').obfuscated_name != 'scenario'
    assert get_identifier_by_name('variable6').obfuscated_name == 'variable6'
    assert get_identifier_by_name('another6').obfuscated_name != 'another6'
    assert get_identifier_by_name('reserved_one').obfuscated_name == \
           'reserved_one'
예제 #23
0
def test_add_reserveds():
    #
    # Add python reserved names
    #
    reserved_list = keyword.kwlist
    add_reserveds('python', reserved_list)

    # Test 'python' in module reserved keywords
    reserved_row = get_reserved_by_name('python')
    assert reserved_row.name == 'python'
    assert reserved_row.primary_package == 'python'

    # Test some python keywords
    reserved_row = get_reserved_by_name('from')
    assert reserved_row.name == 'from'
    assert reserved_row.primary_package == 'python'

    reserved_row = get_reserved_by_name('with')
    assert reserved_row.name == 'with'
    assert reserved_row.primary_package == 'python'

    reserved_row = get_reserved_by_name('class')
    assert reserved_row.name == 'class'
    assert reserved_row.primary_package == 'python'

    #
    # Add kivy reserved names
    #
    reserved_list = [
        'after',
        'App',
        'app',
        'before',
        'bold',
        'BooleanProperty',
        'BoxLayout',
        'Button',
        'canvas',
        'color',
        'disabled',
        'dp',
        'dpi2px',
        'dx',
        'FileChooser',
        'filechooser',
        'FloatLayout',
        'focus',
        'font',
        'GridLayout',
        'halign',
        'height',
        'hint_text',
        'horizontal',
        'id',
        'kivy',
        'Label',
        'Logger',
        'logger',
        'multiline',
        'NumericProperty',
        'ObjectProperty',
        'on_focus',
        'op_press',
        'orientation',
        'padding',
        'platform',
        'properties',
        'px',
        'Rectangle',
        'require',
        'rgba',
        'root',
        'ScreenManager',
        'screenmanager',
        'self',
        'size',
        'size_hint',
        'size_hint_x',
        'size_hint_y',
        'StringProperty',
        'sp',
        'text',
        'text_size',
        'uix',
        'utils',
        'valign',
        'vertical',
    ]
    add_reserveds('kivy', reserved_list)

    # Test some kivy keywords
    reserved_row = get_reserved_by_name('kivy')
    assert reserved_row.name == 'kivy'
    assert reserved_row.primary_package == 'kivy'

    reserved_row = get_reserved_by_name('color')
    assert reserved_row.name == 'color'
    assert reserved_row.primary_package == 'kivy'

    reserved_row = get_reserved_by_name('BoxLayout')
    assert reserved_row.name == 'BoxLayout'
    assert reserved_row.primary_package == 'kivy'

    with pytest.raises(DoesNotExist):
        get_reserved_by_name('junk')

    # Test removing of identifier for new reserved names

    #
    # Add python identifier names
    #
    identifier_list = [
        'variable',
        'variable_row',
    ]
    add_identifiers(identifier_list)

    reserved_list = ['variable']
    add_reserveds('test', reserved_list)

    assert get_identifier_by_name('variable_row').name == 'variable_row'
    assert get_identifier_by_name('variable').obfuscated_name == 'variable'

    #
    # Should not add __init__.py
    #
    reserved_list = ['__init__.py']
    add_reserveds('test', reserved_list, '=')

    with pytest.raises(DoesNotExist):
        get_identifier_by_name('__init__.py')
예제 #24
0
def test_get_dir(tmpdir):
    # Setup reserved folder
    reserved_row = get_reserved(None)
    assert 2 == save_reserved(reserved_row,
                              name=u'/rsv_dir',
                              primary_package='rsv_pkg')

    reserved_row = get_reserved(None)
    assert 3 == save_reserved(reserved_row,
                              name=u'~rsv_file.py',
                              primary_package='rsv_file_pkg')

    reserved_row = get_reserved(None)
    assert 4 == save_reserved(reserved_row,
                              name=u'#no_obf',
                              primary_package='no_obf_pkg')

    reserved_row = get_reserved(None)
    assert 5 == save_reserved(reserved_row, name=u'=no_obf_file.py')

    # Setup folders and files
    f = io.open(join(str(tmpdir), 'test.py'), 'w')
    f.close()

    f = io.open(join(str(tmpdir), 'rsv_file.py'), 'w')
    f.close()

    included_dir = join(str(tmpdir), 'not_rsv0')
    os.mkdir(included_dir)
    f = io.open(join(included_dir, 'not_rsv0a.py'), 'w')
    f.close()
    f = io.open(join(included_dir, 'not_rsv0b.py'), 'w')
    f.close()
    included_dir = join(str(tmpdir), 'not_rsv0', 'not_rsv0.1')
    os.mkdir(included_dir)
    f = io.open(join(included_dir, 'not_rsv0.1.py'), 'w')
    f.close()

    excluded_dir = join(str(tmpdir), 'rsv_dir')
    os.mkdir(excluded_dir)
    excluded_dir = join(str(tmpdir), 'rsv_dir', 'rsv_dir_subdir')
    os.mkdir(excluded_dir)
    f = io.open(join(excluded_dir, 'rsv_subdir_file.py'), 'w')
    f.close()

    included_dir = join(str(tmpdir), 'not_rsv_file')
    os.mkdir(included_dir)
    f = io.open(join(included_dir, 'not_rsv_file.py'), 'w')
    f.close()

    included_dir = join(str(tmpdir), 'not_rsv0', 'no_obf')
    os.mkdir(included_dir)
    included_dir = join(str(tmpdir), 'not_rsv0', 'no_obf', 'no_obf_1')
    os.mkdir(included_dir)
    f = io.open(join(included_dir, 'no_obf_1.py'), 'w')
    f.close()

    f = io.open(join(str(tmpdir), 'no_obf_file.py'), 'w')
    f.close()

    # Test reading directory structure
    get_files_gen = file_gen(str(tmpdir))
    num_lines = 0
    for file_name, dir_name, is_reserved_dir, is_reserved_file, \
            do_obfuscate in get_files_gen:
        if file_name == 'test.py':
            assert dir_name == str(tmpdir)
            assert not is_reserved_dir
            assert not is_reserved_file
            assert do_obfuscate
        if file_name == 'not_rsv0a.py':
            assert dir_name == join(str(tmpdir), 'not_rsv0')
            assert not is_reserved_dir
            assert not is_reserved_file
            assert do_obfuscate
        if file_name == 'not_rsv0b.py':
            assert dir_name == join(str(tmpdir), 'not_rsv0')
            assert not is_reserved_dir
            assert not is_reserved_file
            assert do_obfuscate
        if file_name == 'not_rsv0.1.py':
            assert dir_name == join(str(tmpdir), 'not_rsv0', 'not_rsv0.1')
            assert not is_reserved_dir
            assert not is_reserved_file
            assert do_obfuscate
        if file_name == 'not_rsv_file.py':
            assert dir_name == join(str(tmpdir), 'not_rsv_file')
            assert not is_reserved_dir
            assert not is_reserved_file
            assert do_obfuscate
        if file_name == 'rsv_subdir_file.py':
            assert dir_name == join(str(tmpdir), 'rsv_dir', 'rsv_dir_subdir')
            assert is_reserved_dir
            assert is_reserved_file
            assert not do_obfuscate
            assert get_reserved_by_name(''.join(
                ['/', 'rsv_dir_subdir'])).primary_package == 'rsv_pkg'
        if file_name == 'rsv_file.py':
            assert dir_name == str(tmpdir)
            assert not is_reserved_dir
            assert is_reserved_file
            assert not do_obfuscate
        if file_name == 'no_obf_1.py':
            assert dir_name == join(str(tmpdir), 'not_rsv0', 'no_obf',
                                    'no_obf_1')
            assert not is_reserved_dir
            assert not is_reserved_file
            assert not do_obfuscate
            assert get_reserved_by_name(''.join(
                ['#', 'no_obf_1'])).primary_package == 'no_obf'
        if file_name == 'no_obf_file.py':
            assert dir_name == str(tmpdir)
            assert not is_reserved_dir
            assert not is_reserved_file
            assert not do_obfuscate
        num_lines += 1
    assert num_lines == 9
    assert get_reserved_by_name('~rsv_subdir_file.py').primary_package == \
        'rsv_dir_subdir'
    assert get_identifier_by_name('no_obf_1').name == 'no_obf_1'