class Puppet::SyntaxCheckers::Base64

Public Instance Methods

check(text, syntax, acceptor, source_pos) click to toggle source

Checks the text for BASE64 syntax issues and reports them to the given acceptor. This checker allows the most relaxed form of Base64, including newlines and missing padding. It also accept URLsafe input.

@param text [String] The text to check @param syntax [String] The syntax identifier in mime style (e.g. 'base64', 'text/xxx+base64') @param acceptor [#accept] A Diagnostic acceptor @param source_pos [Puppet::Pops::Adapters::SourcePosAdapter] A source pos adapter with location information @api public

   # File lib/puppet/syntax_checkers/base64.rb
18 def check(text, syntax, acceptor, source_pos)
19   raise ArgumentError.new(_("Base64 syntax checker: the text to check must be a String.")) unless text.is_a?(String)
20   raise ArgumentError.new(_("Base64 syntax checker: the syntax identifier must be a String, e.g. json, data+json")) unless syntax.is_a?(String)
21   raise ArgumentError.new(_("Base64 syntax checker: invalid Acceptor, got: '%{klass}'.") % { klass: acceptor.class.name }) unless acceptor.is_a?(Puppet::Pops::Validation::Acceptor)
22   cleaned_text = text.gsub(/[\r?\n[:blank:]]/, '')
23   begin
24     # Do a strict decode64 on text with all whitespace stripped since the non strict version
25     # simply skips all non base64 characters
26     Base64.strict_decode64(cleaned_text)
27   rescue
28     msg = if (cleaned_text.bytes.to_a.size * 8) % 6 != 0
29             _("Base64 syntax checker: Cannot parse invalid Base64 string - padding is not correct")
30           else
31             _("Base64 syntax checker: Cannot parse invalid Base64 string - contains letters outside strict base 64 range (or whitespace)")
32           end
33 
34     # TODO: improve the pops API to allow simpler diagnostic creation while still maintaining capabilities
35     # and the issue code. (In this case especially, where there is only a single error message being issued).
36     #
37     issue = Puppet::Pops::Issues::issue(:ILLEGAL_BASE64) { msg }
38     acceptor.accept(Puppet::Pops::Validation::Diagnostic.new(:error, issue, source_pos.file, source_pos, {}))
39   end
40 end