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)
  • 相关阅读:
    CSS改变插入光标颜色caret-color简介及其它变色方法(转)
    Javascript常见性能优化
    安装和使用Karma-Jasmine进行自动化测试
    宝塔 ftp 不能连接 列出时出错
    windows 开机总动运行bat文件
    PHP回调函数--call_user_func_array
    php 获取数组第一个key 第一个键值对 等等
    ssi的使用 开启 配置等
    go get请求 json字符串转为结构体
    php protected 类型如何获取
  • 原文地址:https://www.cnblogs.com/575dsj/p/9415376.html
Copyright © 2011-2022 走看看