forked from liaoque/ipasign
-
Notifications
You must be signed in to change notification settings - Fork 0
/
signIpa.py
149 lines (124 loc) · 4.36 KB
/
signIpa.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import argparse
from isign import isign
from os.path import abspath, expanduser
import logging
FORMATTER = logging.Formatter('%(message)s')
def log_to_stderr(level=logging.INFO):
root = logging.getLogger()
root.setLevel(level)
handler = logging.StreamHandler()
handler.setFormatter(FORMATTER)
root.addHandler(handler)
def absolute_path_argument(path):
return abspath(expanduser(path))
def parse_args():
# note that for arguments which eventually get fed into
# isign.resign, we deliberately don't set defaults. The kwarg
# defaults in isign.resign will be used
parser = argparse.ArgumentParser(
description='Resign an iOS application with a new identity '
'and provisioning profile. See documentation for '
'how to obtain properly formatted credentials.')
parser.add_argument(
'-p', '--provisioning-profile',
dest='provisioning_profile',
required=False,
metavar='<your.mobileprovision path>',
type=absolute_path_argument,
help='Path to provisioning profile'
)
parser.add_argument(
'-k', '--key',
dest='key',
required=False,
metavar='<key path>',
type=absolute_path_argument,
help='Path to your organization\'s key in PEM format.'
)
parser.add_argument(
'-c', '--certificate',
dest='certificate',
required=False,
metavar='<certificate path>',
type=absolute_path_argument,
help='Path to your organization\'s certificate in PEM format'
)
parser.add_argument(
'-o', '--output',
dest='output_path',
required=False,
metavar='<output path>',
type=absolute_path_argument,
help='Path to output file or directory'
)
parser.add_argument(
'-i', '--info',
dest='info_props',
required=False,
metavar='<Info.plist properties>',
help='List of comma-delimited key=value pairs of Info.plist properties to override'
)
parser.add_argument(
'app_paths',
nargs=1,
metavar='<app path>',
type=absolute_path_argument,
help='Path to application to re-sign, typically a '
'directory ending in .app or file ending in .ipa.'
)
parser.add_argument(
'-e', '--entitlements',
dest='alternate_entitlements_path',
required=False,
metavar='<alternate entitlements path>',
type=absolute_path_argument,
help='Sign with these entitlements, rather than ones extracted from provisioning profile'
)
return parser.parse_args()
def filter_args(args, interested):
""" Filter all args to args that we are interested in """
# We want the unused command line args to be
# missing in kwargs, so the defaults are used
kwargs = {}
for k, v in vars(args).iteritems():
if k in interested and v is not None:
kwargs[k] = v
return kwargs
if __name__ == '__main__':
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
reload(sys)
sys.setdefaultencoding(defaultencoding)
args = parse_args()
level = logging.INFO
log_to_stderr(level)
# Handle the various kinds of resign operations
kwargs = {}
# There's only one output path, so it doesn't make sense
# to have multiple input paths
app_path = args.app_paths[0]
# Convert the Info.plist property pairs to a dict format
if args.info_props:
info_props = {}
for arg in args.info_props.split(','):
i = arg.find('=')
if i < 0:
raise Exception('Invalid Info.plist argument: ' + arg)
info_props[arg[0:i]] = arg[i + 1:]
if info_props:
kwargs['info_props'] = info_props
# Handle standard resign. User may have specified all, some
# or none of the credential files, in which case we rely on
# isign.resign() to supply defaults.
# Massage args into method arguments
resign_args = ['certificate',
'key',
'apple_cert',
'provisioning_profile',
'output_path',
'alternate_entitlements_path']
kwargs.update(filter_args(args, resign_args))
isign.resign(app_path, **kwargs)