我试图在Apple Swift中实现一些AES256加密例程,以便在ObjC,C和Swift代码和数据类型之间实现互操作性,并且遇到了一些问题,我希望有人对某些事情提出一些建议我被忽视了.
正如大多数人所熟悉的那样,常见的C风格模式是声明一个未初始化的指针然后将其传递给一个函数,其中函数调用malloc()是一个对象并指向它的指针; 函数调用完成后,指针指向新创建的对象.Common Crypto库在某些地方使用它; 最值得注意的是,当创建一个新的CCCryptor对象(实际上是一个幕后的结构,看起来像是对CCCryptorRef的typedef'ed一个不透明的引用) - 调用CCCryptorCreate()的最后一个参数是这样一个指针,应该在函数调用的结论,包含一个指向CCCryptorRef的指针.
Swift给这个带来了皱纹 - 变量不能是未初始化的,它们总是有一个值或者是nil(/可选),因此我在这里碰到了一点点.以下不起作用,因为CCCryptorCreate(正确地)就好像我只是传递nil作为最后一个参数,我是:
var myCryptorRef: CMutablePointer<Unmanaged<CCCryptorRef>?> = nil
CCCryptorCreate(CCOperation(kCCEncrypt), CCAlgorithm(kCCAlgorithmAES128),
CCOptions(kCCOptionECBMode), seedData.bytes(), UInt(kCCKeySizeAES256),
nil, myCryptorRef)
Run Code Online (Sandbox Code Playgroud)
但你也不能将它声明为可选项,如下所示:
var myCryptorRef: CMutablePointer<Unmanaged<CCCryptorRef>?>?
Run Code Online (Sandbox Code Playgroud)
或者作为非指针类型:
var myCryptoRef: Unmanaged<CCCryptorRef>?
CCCryptorCreate(CCOperation(kCCEncrypt), CCAlgorithm(kCCAlgorithmAES128),
CCOptions(kCCOptionECBMode), seedData.bytes(), UInt(kCCKeySizeAES256),
nil, &myCryptorRef)
Run Code Online (Sandbox Code Playgroud)
由于CCCryptorCreate所期望的是指向CCCryptorRef的未初始化指针或者已经是malloc()的ed CCCryptorRef,尝试传递它尚未初始化的对象的地址并不像您期望的那样好.
所以,它归结为:任何人都可以在调用CCCryptorCreate之前想出一种初始化CCCryptor结构的方法(通过命名struct中的所有变量似乎不起作用的结构init的Swift标准方法),或者一些替代构造,这将允许我保留未初始化指针的C概念,以这种方式使用?感谢您提出的任何建议.
为了清楚起见,注释:Swift将对CCCryptorCreate()的调用解释如下:
CCCryptorCreate(op: CCOperation, alg: CCAlgorithm, options: CCOptions,
key: CConstVoidPointer, keyLength: UInt, iv: CConstVoidPointer,
cryptorRef: CMutablePointer<Unmanaged<CCCryptor>?>)
Run Code Online (Sandbox Code Playgroud)
对我尝试过的其他一些事情进行了额外的编辑:为了真正荒谬,我尝试了以下内容,但它也没有用(EXC_BAD_ACCESS调用fromOpaque):
var someMem = malloc(UInt(sizeof(CCCryptor)))
var crashTime = Unmanaged<CCCryptor>.fromOpaque(someMem)
Run Code Online (Sandbox Code Playgroud)
此外,每个地方都提到CCCryptor或CCCryptorRef,我已经尝试过任何一个 - 在CommonCrypto/CommonCryptor.h中,CCCryptorRef是这样定义的:
typedef struct _CCCryptor *CCCryptorRef
Run Code Online (Sandbox Code Playgroud)
因此,虽然现有的Objective-C代码示例使用CCCryptorRef,但我一直在尝试.
现在,被授予,这可能是由于对Plone中的角色/权限模型的误解,因为它与我过去使用过的许多系统有点不同,但是这里的情况和我陷入困境的地方.
- 客户端需要将Plone站点(4.3.3)仅限于登录用户,并且可以选择使所选内容对未登录的用户可见.很简单,Intranet工作流程适合这一目的,允许他们在外部发布他们想要的内容,并将其余内容保留在内部.没问题!
- 现在,这个网站有大约2K用户,他们组织了十几个组.某些页面和文件夹(显示在顶部导航栏以及侧边栏导航portlet)应仅对某些组的成员可见,只读,并且对站点管理员以外的任何其他登录用户完全不可见.我已进入相关文件夹和页面的"共享"选项卡,取消选中"从更高级别继承权限"框,并添加所需的组,选中"可以查看"权限框."登录用户"显示未选中任何框,并且未显示其他组.但是,它似乎没有任何效果 - 所有登录的用户,无论组关联,都可以看到导航栏中的项目,访问它们等等.
- 我试图创建一个复制Intranet工作流的新工作流,但有一个额外的发布状态,删除了成员角色的"视图"和"访问内容"权限,但是具有可预测的结果 - 无论如何对于组共享设置,没有管理员的用户可以在该点看到项目.
那么......我错过了什么?理想情况下,这是我们正在努力的权限模型:
1.)默认情况下,已创建的项目对于已登录的用户是可见的,只读.草案/内部发布状态对在这里也没问题.
2.)某些项目应有选择地在外部发布,任何人都可以访问该网站.
3.)在内部发布的项目中,某些组织只能访问和查看某些项目.写入/添加权限在这里不相关 - 有一小部分站点管理员将处理这些,我们只与选择性查看权限一起工作/苦苦挣扎.
我确信这只是我对Plone安全模型的一个结构性误解,但如果有人能给我一些关于从何处开始寻找或如何构建新工作流以实现我们正在努力实现的目标的指示,那就是太棒了 先感谢您!