示例#1
0
    def execute(self, arg_components: components, arg_arguments):
        log.debug(self.__class__.__name__, "ENTER")

        ret_state = STATE.PLUGIN
        ret_arg = None

        verify_result, remainings = arg_components.modeler.uicc.verify_pin(
            PIN_TYPE.ADM1, toBytes(arg_arguments))

        # If enabled 'configuration.adm', store the adm code for auto verify
        if verify_result == ERROR.NONE:
            arg_components.modeler.uicc.adm_verified = True
            if arg_components.config.adm == 1:
                arg_components.config.update_adm_code(
                    arg_components.modeler.uicc.iccid, arg_arguments)
        else:
            if remainings == 0:
                ret_state = STATE.ERROR
                ret_arg = res.get_string("adm_blocked")
            else:
                ret_state = STATE.ADM_CODE
                ret_arg = res.get_string("incorrect_adm_code").format(
                    remainings)

        log.debug(self.__class__.__name__, "EXIT")
        return (ret_state, ret_arg)
示例#2
0
    def execute(self, arg_components: components, arg_arguments):
        log.debug(self.__class__.__name__, "ENTER")

        ret_state = STATE.EXIT
        ret_arguments = None
        if arg_components.modeler.reader.name == None:
            ret_state = STATE.ERROR
            ret_arguments = res.get_string("no_cardreader")
        else:
            ret = arg_components.modeler.open()
            if ret == ERROR.CARD_ABSENT:
                ret_state = STATE.ERROR
                ret_arguments = res.get_string("no_card")
            elif ret == ERROR.CARD_INVALID:
                ret_state = STATE.ERROR
                ret_arguments = res.get_string("invalid_card")
            else:
                ret_state = STATE.PIN_CODE
                out_msg = layout_initial.layout(
                    res.get_string("reader_connected"),
                    arg_components.modeler.reader.name)
                print(out_msg)

        log.debug(self.__class__.__name__, "EXIT")
        return (ret_state, ret_arguments)
示例#3
0
    def help(self):
        '''
        Returns a help string by 'help' resource key.
        If resource not defined 'help' key, will call 'summary()' to instead it.
        '''
        ret_help = res.get_string("help", self.__class__.__name__)

        if ret_help == None:
            ret_help = self.summary()
        else:
            ret_help = ret_help.format(res.get_string("app_name"), self.__class__.__name__)
        return ret_help
示例#4
0
    def execute(self, arg_components: components, arg_arguments):
        log.debug(self.__class__.__name__, "ENTER")

        out_msg = layout_startup.layout(arg_name=res.get_string(
                                        'app_name'),
                                        arg_version=res.get_string(
                                        'app_version'),
                                        arg_copyright=res.get_string(
                                        'copyright'))

        print(out_msg)

        log.debug(self.__class__.__name__, "EXIT")
        return (STATE.INITIAL, None)
示例#5
0
    def execute(self, arg_components: components, arg_arguments=''):
        log.debug(self.__class__.__name__, "ENTER")

        uicc: uicc = arg_components.modeler.uicc

        change_pin1_state_key = None
        dict_args = convert_arguments_to_dict(arg_arguments)
        for key, value in dict_args.items():
            if key == "pin1":
                change_pin1_state_key = value

        # change pin1 state
        if change_pin1_state_key != None:
            if is_valid_pin_code(change_pin1_state_key) == False:
                print(self.get_res("invalid_pin"))
            else:
                msg = None
                if uicc.pin_enabled:
                    ret_result, ret_retries = uicc.disable_pin(
                        toASCIIBytes(change_pin1_state_key))
                    msg = self.get_res(
                        'disable_ok') if ret_result == ERROR.NONE else self.get_res('disable_fail')
                else:
                    ret_result, ret_retries = uicc.enable_pin(
                        toASCIIBytes(change_pin1_state_key))
                    msg = self.get_res(
                        'enable_ok') if ret_result == ERROR.NONE else self.get_res('enable_fail')
                print(msg)

            print(os.linesep, end='')

        print(self.get_res("pin1").format(self.get_res("enable"),
                                          res.get_string("yes") if uicc.pin_enabled else res.get_string("no")))
        print(self.get_res("pin1").format(self.get_res("verify"),
                                          res.get_string("yes") if uicc.pin_verified else res.get_string("na")))

        ret_result, ret_retries = uicc.verify_pin(PIN_TYPE.PIN1, "")
        print(self.get_res("pin1").format(self.get_res("retries"), ret_retries))

        # space line
        print('')

        print(self.get_res("adm").format(self.get_res("verify"),
                                         res.get_string("yes") if uicc.adm_verified else res.get_string("no")))

        ret_result, ret_retries = uicc.verify_pin(PIN_TYPE.ADM1, "")
        print(self.get_res("adm").format(self.get_res("retries"), ret_retries))

        log.debug(self.__class__.__name__, "EXIT")
示例#6
0
    def exec(self):
        try:
            state_class = __import__("control.state.%s" % (self.__state),
                                     fromlist=[self.__state])
            state_instance = getattr(state_class, self.__state)()
            log.debug(self.__class__.__name__, self.__state)
            self.__state, self.__arguments = state_instance.execute(
                self.__components, self.__arguments)
        except Exception as e:
            error_class = e.__class__.__name__
            reason = e.args[0]
            cl, exc, tb = sys.exc_info()
            lastCallStack = traceback.extract_tb(tb)[-1]
            fileName = lastCallStack[0]
            lineNum = lastCallStack[1]
            funcName = lastCallStack[2]
            callstack = os.linesep.join([
                line.strip()
                for line in traceback.format_exc(limit=5).splitlines()[1:-1]
            ])

            errMsg = res.get_string("exception").format(
                os.path.basename(fileName), lineNum, funcName, reason,
                callstack)

            self.__state = STATE.EXCEPTION
            self.__arguments = errMsg

        if self.__state == STATE.NONE:
            return False

        return True
示例#7
0
    def execute(self, arg_components: components, arg_arguments):
        log.debug(self.__class__.__name__, "ENTER")

        out_msg = layout_help.layout(arg_help=res.get_string('help'))
        print(out_msg)
        log.debug(self.__class__.__name__, "EXIT")
        return (STATE.CLI, None)
示例#8
0
    def execute(self, arg_components: components, arg_arguments):
        log.debug(self.__class__.__name__, "ENTER")

        ret_state = STATE.ADM_VERIFY
        ret_arg = None
        adm_code = None
        out_msg = ''

        # if 'arg_arguments' exist, means may the auto verify fail
        # so we can't read the adm code from .xml file
        if arg_arguments == None:
            # Auto ADM operation (read from usim_modifier.xml)
            adm_code = arg_components.config.query_adm_code(
                arg_components.modeler.uicc.iccid)
        if adm_code == None:
            if arg_arguments == None:
                if arg_components.config.admhex == 1:
                    out_msg = res.get_string("input_adm_code_hex")
                else:
                    out_msg = res.get_string("input_adm_code")
            else:
                out_msg = arg_arguments
            print(layout_adm_code.layout(arg_msg=out_msg), end='')
            adm_code = input().strip().upper()

            # convert the 8 digits format to 16 hex digit
            if arg_components.config.admhex == 0:
                adm_code_byte = toASCIIBytes(adm_code)
                adm_code = toHexString(adm_code_byte, format=PACK)

            if len(adm_code) == 0:
                ret_state = STATE.PLUGIN
                print(
                    layout_adm_code.layout(
                        arg_msg=res.get_string("terminated_adm_code")))
            elif not is_valid_adm_code(adm_code):
                ret_state = STATE.ADM_CODE
                if arg_components.config.admhex == 1:
                    ret_arg = res.get_string("invalid_adm_code_hex")
                else:
                    ret_arg = res.get_string("invalid_adm_code")

        if ret_state == STATE.ADM_VERIFY:
            ret_arg = adm_code

        log.debug(self.__class__.__name__, "EXIT")
        return (ret_state, ret_arg)
示例#9
0
    def summary(self):
        '''
        Returns a summary string by 'summary' resource key.
        If resource not defined 'help' key, will return 'None', and ignore that.
        '''
        ret_summary = res.get_string("summary", self.__class__.__name__)

        return ret_summary
示例#10
0
    def execute(self, arg_components: components, arg_arguments):
        ret_state = STATE.DISPATCH
        ret_arguments = None

        log.debug(self.__class__.__name__, "ENTER")

        out_msg = layout_cli.layout(arg_prefix=res.get_string('app_name'))
        print(out_msg, end='')
        ret_arguments = input().strip()

        log.debug(self.__class__.__name__, "EXIT")
        return (ret_state, ret_arguments)
示例#11
0
    def execute(self, arg_components: components, arg_arguments):
        log.debug(self.__class__.__name__, "ENTER")

        ret_state = STATE.PIN_VERIFY
        ret_arg = None
        pin_code = None
        out_msg = ''

        if arg_components.modeler.uicc.pin_enabled == True:
            # if 'arg_arguments' exist, means may the auto verify fail.
            # so we can't read the pin code from .xml file
            if arg_arguments == None:
                # Auto PIN operation (read from usim_modifier.xml)
                pin_code = arg_components.config.query_pin_code(
                arg_components.modeler.uicc.iccid)
            
            if pin_code == None:
                if arg_arguments == None:
                    out_msg = res.get_string("input_pin_code")
                else:
                    out_msg = arg_arguments
                print(layout_pin_code.layout(arg_msg=out_msg), end='')
                pin_code = input().strip()

            if len(pin_code) == 0:
                ret_state = STATE.ERROR
                ret_arg = res.get_string("terminated_pin_code")
            elif not is_valid_pin_code(pin_code):
                ret_state = STATE.PIN_CODE
                ret_arg = res.get_string("invalid_pin_code")

            if ret_state == STATE.PIN_VERIFY:
                ret_arg = pin_code
        else:
            ret_state = STATE.ADM_CODE

        log.debug(self.__class__.__name__, "EXIT")
        return (ret_state, ret_arg)
示例#12
0
    def execute(self, arg_components: components, arg_arguments):
        log.debug(self.__class__.__name__, "ENTER")

        plugin_class = __import__("model.plugins.%s.%s" %
                                  (arg_arguments, arg_arguments),
                                  fromlist=[arg_arguments])
        instance_class = getattr(plugin_class, arg_arguments)()
        out_msg = layout_plugin_help.layout(
            arg_format=res.get_string('plugin_help_header'),
            arg_name=arg_arguments,
            arg_help=instance_class.help())

        print(out_msg)
        log.debug(self.__class__.__name__, "EXIT")
        return (STATE.CLI, None)
示例#13
0
    def execute(self, arg_components: components, arg_arguments):
        log.debug(self.__class__.__name__, "ENTER")

        plugins = arg_components.plugin[:]

        # check the ADM verify state
        # org: plugin name, version, is update adm require
        # new: plugin name, version, is updatable

        # is_update_require_adm:
        # - None: No update feature
        # - True: update need adm verified
        # - False: Didn't need adm for update

        str_yes = res.get_string("yes")
        str_no = res.get_string("no")
        str_na = res.get_string("na")
        for plugin in plugins:
            if plugin[3] == None:
                plugin[3] = str_na
            elif arg_components.modeler.uicc.adm_verified:
                plugin[3] = str_yes
            else:
                plugin[3] = str_yes if plugin[3] == arg_components.modeler.uicc.adm_verified else str_no

            if plugin[4]:
                plugin[4] = str_yes
            else:
                plugin[4] = str_no

        out_msg = layout_plugin_list.layout(arg_format=res.get_string('plugin_found'),
                                            arg_plugin=plugins)
        print(out_msg)

        log.debug(self.__class__.__name__, "EXIT")
        return (STATE.CLI, None)
示例#14
0
def layout(arg_format='', arg_plugin=[]):

    # head line
    ret_layout = res.get_string("plugin_head").format(
        res.get_string("plugin_name"),
        res.get_string("plugin_version"),
        res.get_string("plugin_update"),
        res.get_string("plugin_autoexec"),
        res.get_string("plugin_summary")) + os.linesep

    ret_layout = layout_oneline.layout(
        arg_string=ret_layout, arg_style=STYLE.BRIGHT)

    for plugin in arg_plugin:
        ret_layout += res.get_string("plugin_item").format(
            plugin[0],
            plugin[1],
            plugin[3],
            plugin[4],
            plugin[2]) + os.linesep
    return ret_layout
示例#15
0
    def execute(self, arg_components: components, arg_arguments):
        log.debug(self.__class__.__name__, "ENTER")

        plugin_count = 0
        plugin = []

        plugins_list = os.listdir("./model/plugins")
        for filename in plugins_list:
            name, ext = os.path.splitext(filename)
            if ext != '.py' and name != '__pycache__' and name != '.DS_Store':
                try:
                    plugin_class = __import__("model.plugins.%s.%s" %
                                              (name, name), fromlist=[name])

                    res_files = [os.path.join(r, file) for r, d, f in os.walk(
                        './model/plugins/%s/values' % (name)) for file in f]
                    res.add_resource(name, res_files)

                    instance_class = getattr(plugin_class, name)()

                    if instance_class.summary() != None:
                        plugin_count += 1
                        plugin.append([name,
                                       instance_class.version(),
                                       instance_class.summary(),
                                       instance_class.is_update_require_adm,
                                       instance_class.is_auto_exec])

                except:
                    log.debug(self.__class__.__name__,
                              "Error to import '%s' plugin." % (name))

        arg_components.plugin = plugin
        out_msg = layout_plugin.layout(arg_format=res.get_string("plugin_loaded"),
                                       arg_count=plugin_count)
        print(out_msg)
        log.debug(self.__class__.__name__, "EXIT")
        return (STATE.AUTO_EXEC, None)
示例#16
0
 def get_res(self, arg_resid):
     return res.get_string(arg_resid, self.__class__.__name__)
示例#17
0
    def execute(self, arg_components: components, arg_arguments=''):
        log.debug(self.__class__.__name__, "ENTER")

        update_log = None
        update_localized = None
        update_pin = None
        update_adm = None
        update_autoexec = None
        update_admhex = None

        dict_args = convert_arguments_to_dict(arg_arguments)
        for key, value in dict_args.items():
            if key == "log":
                update_log = int(value)
            elif key == "localized":
                update_localized = int(value)
            elif key == "pin":
                update_pin = int(value)
            elif key == "adm":
                update_adm = int(value)
            elif key == "autoexec":
                update_autoexec = int(value)
            elif key == "admhex":
                update_admhex = int(value)

        if update_log != None:
            arg_components.config.log = update_log
        if update_localized != None:
            arg_components.config.localized = update_localized
        if update_pin != None:
            arg_components.config.pin = update_pin
        if update_adm != None:
            arg_components.config.adm = update_adm
        if update_autoexec != None:
            arg_components.config.autoexec = update_autoexec
        if update_admhex != None:
            arg_components.config.admhex = update_admhex

        if update_log != None or update_localized != None or update_pin != None or update_adm != None or update_autoexec != None or update_admhex != None:
            arg_components.config.save()

        print(
            self.get_res("log").format(
                res.get_string("yes") if arg_components.config.log ==
                1 else res.get_string("no")))

        print(
            self.get_res("localized").format(
                res.get_string("yes") if arg_components.config.localized ==
                1 else res.get_string("no")))

        print(
            self.get_res("pin").format(
                res.get_string("yes") if arg_components.config.pin ==
                1 else res.get_string("no")))

        print(
            self.get_res("adm").format(
                res.get_string("yes") if arg_components.config.adm ==
                1 else res.get_string("no")))

        print(
            self.get_res("autoexec").format(
                res.get_string("yes") if arg_components.config.autoexec ==
                1 else res.get_string("no")))

        print(
            self.get_res("admhex").format(
                res.get_string("yes") if arg_components.config.admhex ==
                1 else res.get_string("no")))

        log.debug(self.__class__.__name__, "EXIT")