zoukankan      html  css  js  c++  java
  • python 检测mobileprovision证书的过期时间

    https://github.com/manicmaniac/provisioning/blob/master/provisioning/profile.py

    
    
    # 解析mobileprovision证书
    # !/usr/bin/env python
    # -*- coding:utf-8 -*-

    import getpass
    import platform
    import plistlib
    import uuid
    from datetime import datetime

    import os
    from OpenSSL.crypto import FILETYPE_ASN1, load_certificate


    class ProvisioningProfile(object):
    '''
    Apple's provisioning profile.
    '''

    def __init__(self, data):
    self._data = data
    self._plist = self._extract_plist(data)
    self._developer_certificates = None
    self._uuid = None

    def is_expired(self, date=datetime.now()):
    '''
    :param date: date to compare
    :type date: datetime.datetime
    :returns: True if expired
    :rtype: bool
    '''
    return self.expiration_date < date

    def _extract_plist(self, data):

    try:
    from pyasn1.codec.der import decoder
    except ImportError:
    plist = data[62, data.rfind('</plist>')]
    else:
    plist = str(decoder.decode(data)[0][1][2][1])
    return plistlib.readPlistFromString(plist)

    @property
    def data(self):
    '''
    :returns: encrypted binary
    :rtype: str
    '''
    return self._data

    @property
    def application_identifier_prefix(self):
    '''
    :returns: ApplicationIdentifierPrefix
    :rtype: str
    '''
    return self._plist['ApplicationIdentifierPrefix']

    @property
    def creation_date(self):
    '''
    :returns: CreationDate
    :rtype: datetime.datetime
    '''
    return self._plist['CreationDate']

    @property
    def developer_certificates(self):
    '''
    :returns: DeveloperCertificates
    :rtype: list of OpenSSL.crypto.X509 instance
    '''
    if self._developer_certificates is None:
    self._developer_certificates = []
    for item in self._plist['DeveloperCertificates']:
    certificate = load_certificate(FILETYPE_ASN1, item.data)
    self._developer_certificates.append(certificate)
    return self._developer_certificates

    @property
    def expiration_date(self):
    '''
    :returns: ExpirationDate
    :rtype: datetime.datetime
    '''
    return self._plist['ExpirationDate']

    @property
    def name(self):
    '''
    :returns: Name
    :rtype: str
    '''
    return self._plist['Name']

    @property
    def provisioned_devices(self):
    '''
    :returns: UDIDs of ProvisionedDevices
    :rtype: list of str
    '''
    return self._plist['ProvisionedDevices']

    @property
    def time_to_live(self):
    '''
    :returns: TimeToLive
    :rtype: int
    '''
    return self._plist['TimeToLive']

    @property
    def uuid(self):
    '''
    :returns: UUID
    :rtype: uuid.UUID
    '''
    if self._uuid is None:
    self._uuid = uuid.UUID(self._plist['UUID'])
    return self._uuid

    @property
    def version(self):
    '''
    :returns: Version
    :rtype: str
    '''
    return str(self._plist['Version'])


    PROVISIONING_PROFILES_DIR = '/Users/{user}/Library/MobileDevice/Provisioning Profiles'


    def stored_provisioning_profiles(user=getpass.getuser()):
    '''
    :param user: user
    :type user: str
    :returns: ProvisioningProfiles stored in user directory
    :rtype: list of provisioning.profile.ProvisioningProfile
    '''
    if platform.system() != 'Darwin':
    raise OSError('only permitted on OSX.')
    base_path = PROVISIONING_PROFILES_DIR.format(user=user)
    provisioning_profiles = []
    for item in os.listdir(base_path):
    path = os.path.join(base_path, item)
    if path.endswith('.provisioningprofile') or path.endswith('.mobileprovision'):
    with open(path) as f:
    data = f.read()
    provisioning_profiles.append(ProvisioningProfile(data))
    return provisioning_profiles
     
    # 使用方法
    from provisioning.profile import ProvisioningProfile
    with open('/Users/shujian.dong/Downloads/iOS证书过期提醒/12_Zodiac_Signs_Adhoc_Profile.mobileprovision') as f:
        p = ProvisioningProfile(f.read())
    
    print p.expiration_date
    print type(p.expiration_date)
  • 相关阅读:
    18、【opencv入门】形态学图像处理(一):开运算、闭运算、形态学梯度、顶帽、黑帽合辑
    17、【opencv入门】形态学图像处理(一):膨胀与腐蚀
    16、【opencv入门】创建Trackbar & 图像对比度、亮度值调整
    c++ 售货员的难题
    c++ 火柴棒等式
    c++ 素数圈
    c++ 分解数
    c++ 走迷宫
    c++ 二叉树遍历
    c++ n皇后问题
  • 原文地址:https://www.cnblogs.com/575dsj/p/9415376.html
Copyright © 2011-2022 走看看