ckruse / CFPropertyList

Read, write and manipulate both binary and XML property lists as defined by apple
MIT License
212 stars 47 forks source link

Cannot parse some sort of NeXT Step style Property List #67

Open manicmaniac opened 6 months ago

manicmaniac commented 6 months ago

CFPropertyList::List raises an error when the following types of Property List.

1. Dictionary without surrounding { }

require 'cfpropertylist'

data = 'foo = bar;'
CFPropertyList::List.new(data: data)
/path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbPlainCFPropertyList.rb:25:in `load': content after root object (CFFormatError)
    from /path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb:321:in `load_str'
    from /path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb:239:in `initialize'
    from /var/folders/tm/wy8sj46s6yq4rlfgsxyvd1l80000gn/T/vdeL7YX/205:5:in `new'
    from /var/folders/tm/wy8sj46s6yq4rlfgsxyvd1l80000gn/T/vdeL7YX/205:5:in `<main>'

I cannot find the specification but I think it is a valid format because of some reasons.

1. `plutil` can parse it. ```sh $ echo 'foo = bar;' | plutil -p - { "foo" => "bar" } ``` 2. `pl` can parse it. ```sh $ echo 'foo = bar;' | pl { foo = bar; } ``` 3. Foundation classes can parse it. ```swift import Foundation try! "foo = bar;".write(toFile: "foobar.plist", atomically: false, encoding: .utf8) print(NSDictionary(contentsOfFile: "foobar.plist")!) // prints // { // foo = bar; // } ``` And also, `.strings` format, which is often used as iOS localized string file, is encoded as this kind of Property List.

Whitespaces at the end

require 'cfpropertylist'

data = "foo\n"
CFPropertyList::List.new(data: data)
/path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbPlainCFPropertyList.rb:25:in `load': content after root object (CFFormatError)
    from /path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb:321:in `load_str'
    from /path/to/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb:239:in `initialize'
    from /var/folders/tm/wy8sj46s6yq4rlfgsxyvd1l80000gn/T/vdeL7YX/188:5:in `new'
    from /var/folders/tm/wy8sj46s6yq4rlfgsxyvd1l80000gn/T/vdeL7YX/188:5:in `<main>'

I think it is also valid because of the following reasons.

1. `plutil` can parse it. ```sh $ printf 'foo\n' | plutil -p - "foo" ``` 2. `pl` can parse it. ```sh $ printf 'foo\n' | pl foo ``` 3. Foundation classes can parse it. ```swift import Foundation try! "foo\n".write(toFile: "foobar.plist", atomically: false, encoding: .utf8) print(try! NSString(contentsOfFile: "foobar.plist", encoding: String.Encoding.utf8.rawValue)) // prints foo ```
ckruse commented 6 months ago

I‘m seriously surprised that there are still people using this format.

Thank you for your report. Sadly I won‘t find the time to have a look at it today, but I will have a look at it in the next few days.