Beispiel #1
0
def search_and_replace(
    site: mwclient.Site,
    search: str,
    regex: re.Pattern,
    replace: str,
    namespace: int = 0,
) -> None:
    for result in site.search(search, namespace=namespace, what='text'):
        page = site.pages[result['title']]
        text = page.text()
        newtext = regex.sub(replace, text)
        if newtext != text:
            page.edit(newtext,
                      summary=f'replace {regex.pattern} with {replace} (auto)')
            logger.info('page %s updated.', page.page_title)
        else:
            logger.warning('page %s not updated.', page.page_title)
Beispiel #2
0
 async def search(self, ctx,
                  site_name: Option(str,
                                    'What wiki to search',
                                    autocomplete=wikis_autocomplete),
                  query: str):
     mw_options = conf.get_object(ctx.guild, 'mwSites')
     if site_name not in mw_options:
         return await ctx.respond(
             f'"{site_name}" is not a valid search source on this server.')
     site = Site(mw_options[site_name]['url'],
                 path=mw_options[site_name]['path'],
                 clients_useragent=USER_AGENT)
     results = site.search(query)
     title = results.next().get('title').replace(' ', '_')
     await ctx.respond(f'First result for "{query}":\n' + str(
         f'https://{mw_options[site_name]["url"]}{mw_options[site_name]["pagePath"]}{title}'
     ))
Beispiel #3
0
class Wiki:
    def __init__(self,
                 device: str,
                 buildid: str,
                 *,
                 boardconfig: str = None) -> None:
        self.site = WikiSite('www.theiphonewiki.com')

        self.device = device
        self.buildid = buildid
        self.board = boardconfig

    def get_firm_page(self) -> str:
        results = list(self.site.search(f'{self.buildid} ({self.device})'))
        if len(results) == 0:
            raise ValueError(
                f'No Firmware Keys page for device: {self.device}, buildid: {self.buildid}.'
            )

        return self.site.pages[results[0]['title']].text()

    def parse_page(self, page: str) -> dict:
        page = ' '.join([
            x for x in page.split(' ') if x != ''
        ]).replace('{{', '{| class="wikitable"').replace(
            '}}', '|}'
        )  # Have to coerce wikitextparser into recognizing it as a table for easy parsing
        page_data = dict()
        for entry in wikiparse(page).tables[0].data()[0]:
            key, item = entry.split(' = ')
            page_data[key] = item

        if self.board is not None:
            if ('Model' not in page_data.keys()) and ('Model2'
                                                      not in page_data.keys()):
                return page_data

            if self.board.lower() not in [
                    x.lower() for x in page_data.values()
            ]:
                raise ValueError(
                    f'Boardconfig: {self.board} for device: {self.device} is not valid!'
                )

            if page_data['Model2'].lower() == self.board.lower():
                for key in page_data.keys():
                    if '2' in key:
                        page_data[key.replace('2', '')] = page_data[key]

            for key in list(page_data.keys()):
                if '2' in key:
                    del page_data[key]

        return page_data

    def get_keys(self, page: str) -> str:
        page_data = self.parse_page(page)
        response = {
            'identifier': page_data['Device'],
            'buildid': page_data['Build'],
            'codename': page_data['Codename'],
            'restoreramdiskexists': 'RestoreRamdisk' in page_data.keys(),
            'updateramdiskexists': 'UpdateRamdisk' in page_data.keys(),
            'keys': list()
        }

        for component in page_data.keys():
            if any(x == component
                   for x in ('Version', 'Build', 'Device', 'Model', 'Codename',
                             'Baseband', 'DownloadURL')):
                continue

            if any(component.endswith(x) for x in ('Key', 'IV', 'KBAG')):
                continue

            image = {
                'image': component,
                'filename': page_data[component],
                'date': datetime.now().isoformat()
            }

            if any(component == x
                   for x in ('RootFS', 'RestoreRamdisk', 'UpdateRamdisk')):
                image['filename'] += '.dmg'

            for key in ('IV', 'Key') if component != 'RootFS' else ('Key', ):
                if component + key not in page_data.keys():
                    continue

                if any(x in page_data[component + key]
                       for x in ('Unknown', 'Not Encrypted')):
                    continue

                image[key.lower()] = page_data[component + key]

            if ('iv' not in image.keys()) and ('key' not in image.keys()):
                if not image['filename'].endswith('.dmg'):
                    continue

            if ('iv' in image.keys()) and ('key' in image.keys()):
                image['kbag'] = image['iv'] + image['key']

            response['keys'].append(image)

        return json.dumps(response)