Do not allow comma in topic name in publish via GET endpoint (no ticket)
This commit is contained in:
		
							parent
							
								
									806893962c
								
							
						
					
					
						commit
						b409c89d3b
					
				
					 3 changed files with 26 additions and 12 deletions
				
			
		|  | @ -11,17 +11,23 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release | ||||||
| * Download attachments to cache folder ([#181](https://github.com/binwiederhier/ntfy/issues/181)) | * Download attachments to cache folder ([#181](https://github.com/binwiederhier/ntfy/issues/181)) | ||||||
| * Regularly delete attachments for deleted notifications ([#142](https://github.com/binwiederhier/ntfy/issues/142)) | * Regularly delete attachments for deleted notifications ([#142](https://github.com/binwiederhier/ntfy/issues/142)) | ||||||
| 
 | 
 | ||||||
| Bugs: | **Bugs:** | ||||||
| 
 | 
 | ||||||
| * IllegalStateException: Failed to build unique file ([#177](https://github.com/binwiederhier/ntfy/issues/177), thanks to [@Fallenbagel](https://github.com/Fallenbagel) for reporting) | * IllegalStateException: Failed to build unique file ([#177](https://github.com/binwiederhier/ntfy/issues/177), thanks to [@Fallenbagel](https://github.com/Fallenbagel) for reporting) | ||||||
| * SQLiteConstraintException: Crash during UP registration ([#185](https://github.com/binwiederhier/ntfy/issues/185)) | * SQLiteConstraintException: Crash during UP registration ([#185](https://github.com/binwiederhier/ntfy/issues/185)) | ||||||
| * Refresh preferences screen after settings import (#183, thanks to [@cmeis](https://github.com/cmeis) for reporting) | * Refresh preferences screen after settings import (#183, thanks to [@cmeis](https://github.com/cmeis) for reporting) | ||||||
| 
 | 
 | ||||||
| Thanks: | **Thanks:** | ||||||
| 
 | 
 | ||||||
| * Many thanks to [@cmeis](https://github.com/cmeis), [@Fallenbagel](https://github.com/Fallenbagel), [@Joeharrison94](https://github.com/Joeharrison94), | * Many thanks to [@cmeis](https://github.com/cmeis), [@Fallenbagel](https://github.com/Fallenbagel), [@Joeharrison94](https://github.com/Joeharrison94), | ||||||
|   and [@rogeliodh](https://github.com/rogeliodh) for input on the new attachment logic, and for testing the release |   and [@rogeliodh](https://github.com/rogeliodh) for input on the new attachment logic, and for testing the release | ||||||
| 
 | 
 | ||||||
|  | ## ntfy server v1.19.0 (UNRELEASED) | ||||||
|  | 
 | ||||||
|  | **Bugs:** | ||||||
|  | 
 | ||||||
|  | * Do not allow comma in topic name in publish via GET endpoint (no ticket)  | ||||||
|  | 
 | ||||||
| --> | --> | ||||||
| 
 | 
 | ||||||
| ## ntfy server v1.18.1 | ## ntfy server v1.18.1 | ||||||
|  |  | ||||||
|  | @ -55,15 +55,15 @@ type handleFunc func(http.ResponseWriter, *http.Request, *visitor) error | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	// If changed, don't forget to update Android App and auth_sqlite.go | 	// If changed, don't forget to update Android App and auth_sqlite.go | ||||||
| 	topicRegex        = regexp.MustCompile(`^[-_A-Za-z0-9]{1,64}$`)               // No /! | 	topicRegex             = regexp.MustCompile(`^[-_A-Za-z0-9]{1,64}$`)               // No /! | ||||||
| 	topicPathRegex    = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}$`)              // Regex must match JS & Android app! | 	topicPathRegex         = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}$`)              // Regex must match JS & Android app! | ||||||
| 	extTopicPathRegex = regexp.MustCompile(`^/[^/]+\.[^/]+/[-_A-Za-z0-9]{1,64}$`) // Extended topic path, for web-app, e.g. /example.com/mytopic | 	externalTopicPathRegex = regexp.MustCompile(`^/[^/]+\.[^/]+/[-_A-Za-z0-9]{1,64}$`) // Extended topic path, for web-app, e.g. /example.com/mytopic | ||||||
| 	jsonPathRegex     = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/json$`) | 	jsonPathRegex          = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/json$`) | ||||||
| 	ssePathRegex      = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/sse$`) | 	ssePathRegex           = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/sse$`) | ||||||
| 	rawPathRegex      = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/raw$`) | 	rawPathRegex           = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/raw$`) | ||||||
| 	wsPathRegex       = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/ws$`) | 	wsPathRegex            = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/ws$`) | ||||||
| 	authPathRegex     = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/auth$`) | 	authPathRegex          = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/auth$`) | ||||||
| 	publishPathRegex  = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/(publish|send|trigger)$`) | 	publishPathRegex       = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}/(publish|send|trigger)$`) | ||||||
| 
 | 
 | ||||||
| 	webConfigPath    = "/config.js" | 	webConfigPath    = "/config.js" | ||||||
| 	staticRegex      = regexp.MustCompile(`^/static/.+`) | 	staticRegex      = regexp.MustCompile(`^/static/.+`) | ||||||
|  | @ -293,7 +293,7 @@ func (s *Server) handleInternal(w http.ResponseWriter, r *http.Request, v *visit | ||||||
| 		return s.limitRequests(s.authRead(s.handleSubscribeWS))(w, r, v) | 		return s.limitRequests(s.authRead(s.handleSubscribeWS))(w, r, v) | ||||||
| 	} else if r.Method == http.MethodGet && authPathRegex.MatchString(r.URL.Path) { | 	} else if r.Method == http.MethodGet && authPathRegex.MatchString(r.URL.Path) { | ||||||
| 		return s.limitRequests(s.authRead(s.handleTopicAuth))(w, r, v) | 		return s.limitRequests(s.authRead(s.handleTopicAuth))(w, r, v) | ||||||
| 	} else if r.Method == http.MethodGet && (topicPathRegex.MatchString(r.URL.Path) || extTopicPathRegex.MatchString(r.URL.Path)) { | 	} else if r.Method == http.MethodGet && (topicPathRegex.MatchString(r.URL.Path) || externalTopicPathRegex.MatchString(r.URL.Path)) { | ||||||
| 		return s.handleTopic(w, r) | 		return s.handleTopic(w, r) | ||||||
| 	} | 	} | ||||||
| 	return errHTTPNotFound | 	return errHTTPNotFound | ||||||
|  |  | ||||||
|  | @ -203,6 +203,14 @@ func TestServer_PublishPriority(t *testing.T) { | ||||||
| 	require.Equal(t, 40007, toHTTPError(t, response.Body.String()).Code) | 	require.Equal(t, 40007, toHTTPError(t, response.Body.String()).Code) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func TestServer_PublishGETOnlyOneTopic(t *testing.T) { | ||||||
|  | 	// This tests a bug that allowed publishing topics with a comma in the name (no ticket) | ||||||
|  | 
 | ||||||
|  | 	s := newTestServer(t, newTestConfig(t)) | ||||||
|  | 	response := request(t, s, "GET", "/mytopic,mytopic2/publish?m=hi", "", nil) | ||||||
|  | 	require.Equal(t, 404, response.Code) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func TestServer_PublishNoCache(t *testing.T) { | func TestServer_PublishNoCache(t *testing.T) { | ||||||
| 	s := newTestServer(t, newTestConfig(t)) | 	s := newTestServer(t, newTestConfig(t)) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue