Compare commits
	
		
			2 Commits
		
	
	
		
			14696371e2
			...
			f27116930a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f27116930a | |||
| c200d5bf73 | 
							
								
								
									
										26
									
								
								atom.go
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								atom.go
									
									
									
									
									
								
							| @@ -3,6 +3,7 @@ package atomfeed | |||||||
| import ( | import ( | ||||||
| 	"mime" | 	"mime" | ||||||
| 	"net/url" | 	"net/url" | ||||||
|  | 	"regexp" | ||||||
| 	"strings" | 	"strings" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -13,11 +14,32 @@ type ( | |||||||
| 	URI          string | 	URI          string | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func isValidURL(testURL URI) bool { | func isValidURL(uri URI) bool { | ||||||
| 	_, err := url.ParseRequestURI(string(testURL)) | 	_, err := url.ParseRequestURI(string(uri)) | ||||||
| 	return err == nil | 	return err == nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func isValidURN(uri URI) bool { | ||||||
|  | 	pattern := `\A(?i:urn:(?!urn:)(?<nid>[a-z0-9][a-z0-9-]{1,31}):(?<nss>(?:[-a-z0-9()+,.:=@;$_!*'&~\/]|%[0-9a-f]{2})+)(?:\?\+(?<rcomponent>.*?))?(?:\?=(?<qcomponent>.*?))?(?:#(?<fcomponent>.*?))?)\z` | ||||||
|  | 	return regexp.MustCompile(pattern).MatchString(string(uri)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func isValidURI(uri URI) bool { | ||||||
|  | 	return isValidURL(uri) || isValidURN(uri) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func isCorrectlyEscaped(text string) bool { | ||||||
|  | 	relevantEntities := []string{"&", "<", ">", """, "'"} | ||||||
|  |  | ||||||
|  | 	for _, entity := range relevantEntities { | ||||||
|  | 		if strings.Contains(text, entity) { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  |  | ||||||
| func isCompositeMediaType(mediaType string) bool { | func isCompositeMediaType(mediaType string) bool { | ||||||
| 	mediaType, _, err := mime.ParseMediaType(mediaType) | 	mediaType, _, err := mime.ParseMediaType(mediaType) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								category.go
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								category.go
									
									
									
									
									
								
							| @@ -3,6 +3,7 @@ package atomfeed | |||||||
| import ( | import ( | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"html" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type Category struct { | type Category struct { | ||||||
| @@ -22,11 +23,25 @@ func NewCategory(term string) (*Category, error) { | |||||||
| 	return &Category{Term: term, Content: content}, nil | 	return &Category{Term: term, Content: content}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (c *Category) SetLabel(label string) { | ||||||
|  | 	c.Label = html.UnescapeString(label) | ||||||
|  | } | ||||||
|  |  | ||||||
| func (c *Category) Check() error { | func (c *Category) Check() error { | ||||||
| 	if c.Term == "" { | 	if c.Term == "" { | ||||||
| 		return errors.New("term attribute of category empty") | 		return errors.New("term attribute of category empty") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if c.Scheme != "" { | ||||||
|  | 		if !isValidURI(c.Scheme) { | ||||||
|  | 			return fmt.Errorf("scheme attribute of category %v not correctly formatted", c.Scheme) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if !isCorrectlyEscaped(c.Label) { | ||||||
|  | 		return fmt.Errorf("label attribute of category %v not correctly escaped", c.Label) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if c.Content == nil { | 	if c.Content == nil { | ||||||
| 		return errors.New("no content element of category") | 		return errors.New("no content element of category") | ||||||
| 	} else { | 	} else { | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ func newOutOfLineContent(mediaType string, content any) (*OutOfLineContent, erro | |||||||
| 		return nil, fmt.Errorf("content type %T incompatible with out of line content", content) | 		return nil, fmt.Errorf("content type %T incompatible with out of line content", content) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if !isValidURL(content.(URI)) { | 	if !isValidURI(content.(URI)) { | ||||||
| 		return nil, errors.New("content not a valid uri") | 		return nil, errors.New("content not a valid uri") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ func (p *Person) Check() error { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if p.URI != "" { | 	if p.URI != "" { | ||||||
| 		if !isValidURL(p.URI) { | 		if !isValidURI(p.URI) { | ||||||
| 			return fmt.Errorf("uri element of person %v not correctly formatted", p.Name) | 			return fmt.Errorf("uri element of person %v not correctly formatted", p.Name) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -15,6 +15,10 @@ func (p *PlainText) Check() error { | |||||||
| 		return errors.New("type attribute of plain text must be text or html if not omitted") | 		return errors.New("type attribute of plain text must be text or html if not omitted") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if p.Type == "html" && !isCorrectlyEscaped(p.Text) { | ||||||
|  | 		return errors.New("text element of plain text not correctly escaped") | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if p.Text == "" { | 	if p.Text == "" { | ||||||
| 		return errors.New("text element of plain text empty") | 		return errors.New("text element of plain text empty") | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								text.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								text.go
									
									
									
									
									
								
							| @@ -15,7 +15,7 @@ func NewText(textType, content string) (Text, error) { | |||||||
| 	case "text", "": | 	case "text", "": | ||||||
| 		return &PlainText{Type: textType, Text: content}, nil | 		return &PlainText{Type: textType, Text: content}, nil | ||||||
| 	case "html": | 	case "html": | ||||||
| 		return &PlainText{Type: textType, Text: html.EscapeString(content)}, nil | 		return &PlainText{Type: textType, Text: html.UnescapeString(content)}, nil | ||||||
| 	case "xhtml": | 	case "xhtml": | ||||||
| 		return &XHTMLText{ | 		return &XHTMLText{ | ||||||
| 			Type: textType, | 			Type: textType, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user