Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构建后如何修改应用程序的源代码?xCode火花_Xcode_Macos_Info.plist_Sparkle - Fatal编程技术网

构建后如何修改应用程序的源代码?xCode火花

构建后如何修改应用程序的源代码?xCode火花,xcode,macos,info.plist,sparkle,Xcode,Macos,Info.plist,Sparkle,我正在做一个Mac代理,需要使用两个变量,这两个变量需要在用户每次下载代理时设置,我的第一次尝试是修改Info.plist文件并为Sparkle签名,但之后我意识到每次我修改该文件并签名,该签名与已下载的代理不同,可能会导致Sparkle出现问题: 出于安全考虑,因为Sparkle正在将可执行代码下载到用户的系统中,所以您必须非常小心安全性。 让Sparkle知道下载的更新未损坏并已提交 从您(而不是恶意攻击者)处,我们建议:列表项 使用与应用程序中包含的公共DSA密钥匹配的DSA签名对发布的

我正在做一个Mac代理,需要使用两个变量,这两个变量需要在用户每次下载代理时设置,我的第一次尝试是修改
Info.plist
文件并为Sparkle签名,但之后我意识到每次我修改该文件并签名,该签名与已下载的代理不同,可能会导致Sparkle出现问题:

  • 出于安全考虑,因为Sparkle正在将可执行代码下载到用户的系统中,所以您必须非常小心安全性。 让Sparkle知道下载的更新未损坏并已提交 从您(而不是恶意攻击者)处,我们建议:列表项

    • 使用与应用程序中包含的公共DSA密钥匹配的DSA签名对发布的更新存档进行代码签名
  • 有没有关于如何实现这一目标的建议

    下面是我修改和签名的脚本:

    import plistlib, sys, tempfile, subprocess, os, datetime
    
    
    # Read the plist file generated by xCode, and write the OrganizationID and OrganizationToken.
    plist_file = plistlib.Plist.fromFile("Agent.app/Contents/Info.plist") 
    plist_file['OrganizationID'] = sys.argv[1]
    plist_file['OrganizationToken'] = sys.argv[2]
    
    
    plistlib.writePlist(plist_file, "Agent.app/Contents/Info.plist")
    
    VERSION = plist_file['CFBundleVersion']
    DOWNLOAD_BASE_URL="https://url/core/mac/agent"
    RELEASENOTES_URL= DOWNLOAD_BASE_URL + "/release-notes.html#version-$VERSION"
    ARCHIVE_FILENAME="Agent %s.zip" % str(VERSION)
    DOWNLOAD_URL="%s/$%s" % (DOWNLOAD_BASE_URL, ARCHIVE_FILENAME)
    KEYCHAIN_PRIVKEY_NAME="sparkle_private_key/dsa_priv.pem"
    os.environ['openssl']= "/usr/bin/openssl"
    SIGNATURE= '$openssl dgst -sha1 -binary < "%s" | $openssl dgst -dss1 -sign "%s" | $openssl enc -base64' %  (ARCHIVE_FILENAME, KEYCHAIN_PRIVKEY_NAME)
    signature = subprocess.check_output(SIGNATURE, shell=True).strip()
    SIZE = 'stat -f %%z "%s"' % ARCHIVE_FILENAME
    size = subprocess.check_output(SIZE, shell=True).strip()
    PUBDATE = 'LC_TIME=en_US date +"%a, %d %b %G %T %z"'
    pubdate = subprocess.check_output(PUBDATE, shell=True).strip()
    
    
    xml = '''<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
    <channel>
    <title>Update</title>
    <link>
    http://sparkle-project.org/files/sparkletestcast.xml
    </link>
    <description>Most recent changes with links to updates.</description>
    <language>en</language>
    <item>
    <title>Version %s</title>
    <sparkle:releaseNotesLink>
    %s
    </sparkle:releaseNotesLink>
    <pubDate>%s</pubDate>
    <enclosure
    url="%s"
    sparkle:version="%s"
    type="application/octet-stream"
    length="%s"
    sparkle:dsaSignature="%s"
    />
    </item>
    </channel>
    </rss>''' % (VERSION, RELEASENOTES_URL, pubdate, DOWNLOAD_URL, VERSION,  size, signature)
    
    导入plistlib、sys、tempfile、子流程、操作系统、日期时间 #读取xCode生成的plist文件,并写入OrganizationID和OrganizationToken。 plist_file=plistlib.plist.fromFile(“Agent.app/Contents/Info.plist”) plist_文件['OrganizationID']=sys.argv[1] plist_文件['OrganizationToken']=sys.argv[2] plistlib.writePlist(plist_文件,“Agent.app/Contents/Info.plist”) 版本=plist_文件['CbundLeverVersion'] 下载_BASE_URL=”https://url/core/mac/agent" RELEASENOTES_URL=下载_BASE_URL+“/release notes.html#版本-$version” 存档\u FILENAME=“代理%s.zip”%str(版本) 下载\u URL=“%s/$%s”%(下载\u基本\u URL,存档\u文件名) KEYCHAIN\u PRIVKEY\u NAME=“sparkle\u private\u key/dsa\u priv.pem” os.environ['openssl']=“/usr/bin/openssl” 签名=“$openssl dgst-sha1-binary<%s”|$openssl dgst-dss1-签名“%s”|$openssl enc-base64%”(存档文件名,密钥链私钥名称) 签名=子进程。检查输出(签名,shell=True)。strip() 大小='stat-f%%z“%s”%ARCHIVE\u文件名 size=subprocess.check_输出(size,shell=True).strip() PUBDATE='LC_TIME=en_US date+%a,%d%b%G%T%z'' pubdate=subprocess.check_输出(pubdate,shell=True).strip() xml=“” 更新 http://sparkle-project.org/files/sparkletestcast.xml 带有更新链接的最新更改。 EN 版本%s % % “%”(版本、发行说明\u URL、发布日期、下载\u URL、版本、大小、签名)
    如果您的意思是每个下载的用户都应该获得一个唯一的包(其Info.plist已被修改的包)来下载,即您打算为每次下载重新计算一个新的DSA签名(这就是您的问题可以理解的方式),那么您打算做的不是非常HTTP缓存友好的(你的服务器和最终用户的机器之间的任何东西都不能缓存正在下载的应用程序存档文件)。我不鼓励这样做,除非下载的包很小。事实上,现在要想让你的软件轻松地成功部署到大多数Mac电脑上,这几乎是必需的(Sierra使未签名的应用程序部署更加困难),您需要重新创建Sparkle的DSA签名(实际上是可选的,请参见下文),但在Info.plist内容更改后,使用
    codesign
    重新签名应用程序包内容本身,这意味着为代理下载服务的服务器需要运行macOS并包含开发人员工具

    顺便说一句,DSA签名验证由Sparkle完成,并且仅当应用程序未经开发人员ID签名(或者如果appcast通过HTTP–)时才完成

    在不知道您打算保持何种用户状态的情况下,我会提出一种方案,您的应用程序将调用您的服务来获取变量值(例如,输入一些主机标识,例如or的一些盐散列,或者如果用户篡改它并不重要,甚至只是一些存储在用户默认值中的每个用户创建的随机值),并且您还需要确保最终用户没有篡改应用程序

    我希望这会有帮助!根据你的提问方式,我不确定我是否完全正确