#!/usr/bin/env python2.7
#
# Copyright 2017 Google LLC
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import glob
import os
import os.path
import re
import shutil
import subprocess
import sys
import tempfile

# Arguments to the script:
#  pkg              path to application directory, e.g. out/Debug/dm.app
#                   executable and plist should already be in this directory
#  identstr         search string (regex fragment) for code signing identity
#  profile          path or name of provisioning profile
pkg,identstr,profile = sys.argv[1:]

# Find the signing identity.
identity = None
for line in subprocess.check_output([
    'security', 'find-identity']).decode('utf-8').split('\n'):
  m = re.match(r'''.*\) (.*) "''' + identstr + '"', line)
  if m:
    identity = m.group(1)
if identity is None:
  print("Signing identity matching '" + identstr + "' not found.")
  print("Please verify by running 'security find-identity' or checking your keychain.")
  sys.exit(1)

# Find the mobile provisioning profile.
mobileprovision = None
if os.path.isfile(profile):
  mobileprovision = profile
else:
  for p in glob.glob(os.path.join(os.environ['HOME'], 'Library', 'MobileDevice',
                                  'Provisioning Profiles',
                                  '*.mobileprovision')):
    if re.search(r'''<key>Name</key>
\t<string>''' + profile + r'''</string>''', open(p, 'rb').read().decode("utf-8", "ignore"), re.MULTILINE):
      mobileprovision = p
if mobileprovision is None:
  print("Provisioning profile matching '" + profile + "' not found.")
  print("Please verify that the correct profile is installed in '${HOME}/Library/MobileDevice/Provisioning Profiles' or specify the path directly.")
  sys.exit(1)

# The .mobileprovision just gets copied into the package.
shutil.copy(mobileprovision,
            os.path.join(pkg, 'embedded.mobileprovision'))

# Extract the appliciation identitifer prefix from the .mobileprovision.
m = re.search(r'''<key>ApplicationIdentifierPrefix</key>
\t<array>
\t<string>(.*)</string>''', open(mobileprovision, 'rb').read().decode("utf-8", "ignore"), re.MULTILINE)
prefix = m.group(1)

app, _ = os.path.splitext(os.path.basename(pkg))

# Write a minimal entitlements file, then codesign.
with tempfile.NamedTemporaryFile() as f:
  f.write('''
<plist version="1.0">
  <dict>
    <key>application-identifier</key> <string>{prefix}.com.google.{app}</string>
    <key>get-task-allow</key>         <true/>
  </dict>
</plist>
'''.format(prefix=prefix, app=app).encode("utf-8"))
  f.flush()

  subprocess.check_call(['codesign',
                         '--force',
                         '--sign', identity,
                         '--entitlements', f.name,
                         '--timestamp=none',
                         pkg])
