Build Status Swift 4.0 License

SwiftNetrc

用于 (命令行/服务器端) Swift 的 .netrc 解析器。

概要

let netrc = SwiftNetrc()

let username = netrc['myserver.com'].username
let password = netrc['myserver.com'].password

let (username, password) = netrc.credentials('myserver.com')

描述

SwiftNetrc 按照 GNU ftp 遵循的规则 解析 .netrc 文件。

该解析器足够智能,可以识别密码短语,但有一些注意事项(请参见下面的“解析器如何工作”和“已知问题”)。

如果输入文件可被用户以外的任何人读取,则会抛出 SwiftNetrc.SwiftNetrcError.fileGroupOrWorldWritableOrExecutable 错误。

解析示例

全部在同一行 - 空格被忽略

machine mymachine login joe password mypass

多行也没问题。即使带有密码短语。

machine mymachine
    login joe
    password This is my Awesome p@ssw0rd!

密码短语可以在同一行

machine mymachine login joe password This is my Awesome p@ssw0rd!

或者(请参阅解析器如何工作),这是与上面的密码短语相同的短语(因为所有空格都被缩减为单个空格)

machine mymachine login joe password This   is
    my
            Awesome
    p@ssw0rd!

包含多个单词的值(机器名、登录名、密码)不能包含除自身之外的键令牌(machine、login、password、account 或 macdef),否则它将被解释为新令牌(解析器将抛出 noValueForToken 错误)。例如,由于最后的 "machine",这将失败并出现 noValueForToken 错误

machine mymachine login joe password This is my machine

但这可以工作,因为解析器足够智能,可以识别它已经在解析 "password"。

machine mymachine login joe password This is my password

然而,这将起作用,因为键令牌区分大小写("Machine" 不会被解释为新令牌)

machine mymachine login joe password This is my Machine

这也将起作用,因为令牌在空格处分割,因此“.”是令牌的一部分。

machine mymachine login joe password This is my machine.

解析器如何工作

解析器去除前导、尾随和多余的令牌间空格,然后按空格将单词拆分为“令牌”数组。因此,例如

machine mymachine login joe password mypass

将被分解为

["machine", "mymachine", "login", "joe", "password", "mypass"]

然后,解析器逐步查找键令牌“machine”、“login”、“password”、“account”和“macdef”。当它找到其中一个键令牌时,它会将下一个令牌分配为 SwiftNetrc 对象中该令牌属性的值。如果下一个令牌不是键令牌,它会被附加到前一个键令牌的值。

安装

SPM

.package( "https://github.com/ggruen/SwiftNetrc.git", from: "1.0.0" )

已知问题

密码短语有一些限制

密码短语不能包含 "machine"、"login"、"account" 或 "macdef"(小写)。

密码短语不能有前导、尾随或单词间多余的空格。

.netrc 不能包含注释

.netrc 文件不能包含注释(这是一个特性,以防止与令牌中的 #'s 混淆,例如密码中)

命令行实用程序存在,但几乎没用

在构建时会构建一个命令行实用程序,但它目前只运行解析器,如果没有错误,则打印“.netrc 文件解析没有错误”,否则打印错误并退出 1。我想你可以用它来测试你的 .netrc 文件,如下所示

swift build
./.build/x86_64-apple-macosx10.10/debug/SwiftNetrc && ftp ftp.myserver.com

如果你真的想,你可以“安装”它

cp ./.build/x86_64-apple-macosx10.10/debug/SwiftNetrc /usr/local/bin/swiftnetrc

然后你可以只运行 "swiftnetrc" 来解析和报告你的 .netrc 文件。令人兴奋,我知道。

Account、macdef 和 default 没有什么作用

default 令牌当前被忽略。

accountmacdef 被存储,但 SwiftNetrc 不会对 macdef 做任何处理(例如,运行宏),因为它不是 ftp 客户端。 :)

开发

最简单的方法是在 Mac 上开发,然后构建 LinuxMain.swift 并在 Linux 上测试并修复任何问题。

获取代码

git clone https://github.com/ggruen/SwiftNetrc.git
cd SwiftNetrc
swift package update && swift package generate-xcodeproj

编辑文件

open -a Xcode.app SwiftNetrc.xcodeproj

测试(在 Xcode 中,或)

swift test

准备提交

sourcery # Download from https://github.com/krzysztofzablocki/Sourcery/releases/latest
git add -A
git commit

然后,在 Linux 上签出

git clone https://github.com/ggruen/SwiftNetrc.git
cd SwiftNetrc
swift package update
swift test

修复任何差异(在 Mac 上工作但在 Linux 上不工作的内容)。

vim -p SwiftNetrcTests/SwiftNetrcTests.swift SwiftNetrcCode/SwiftNetrc.swift
git add -A
git commit
git push