Don't blow up when working with bad egg configurations; avoids boot crash; closes pterodactyl/panel#2035
This commit is contained in:
		
							parent
							
								
									911b809a4e
								
							
						
					
					
						commit
						64cad5c35d
					
				| 
						 | 
				
			
			@ -40,6 +40,39 @@ type ConfigurationFile struct {
 | 
			
		|||
	configuration []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Custom unmarshaler for configuration files. If there is an error while parsing out the
 | 
			
		||||
// replacements, don't fail the entire operation, just log a global warning so someone can
 | 
			
		||||
// find the issue, and return an empty array of replacements.
 | 
			
		||||
//
 | 
			
		||||
// I imagine people will notice configuration replacement isn't working correctly and then
 | 
			
		||||
// the logs should help better expose that issue.
 | 
			
		||||
func (f *ConfigurationFile) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	var m map[string]*json.RawMessage
 | 
			
		||||
	if err := json.Unmarshal(data, &m); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := json.Unmarshal(*m["file"], &f.FileName); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := json.Unmarshal(*m["parser"], &f.Parser); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := json.Unmarshal(*m["replace"], &f.Replace); err != nil {
 | 
			
		||||
		zap.S().Warnw(
 | 
			
		||||
			"failed to unmarshal configuration file replacement",
 | 
			
		||||
			zap.String("file", f.FileName),
 | 
			
		||||
			zap.Error(err),
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		f.Replace = []ConfigurationFileReplacement{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Defines a single find/replace instance for a given server configuration file.
 | 
			
		||||
type ConfigurationFileReplacement struct {
 | 
			
		||||
	Match       string       `json:"match"`
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +85,7 @@ type ConfigurationFileReplacement struct {
 | 
			
		|||
func (cfr *ConfigurationFileReplacement) UnmarshalJSON(data []byte) error {
 | 
			
		||||
	m, err := jsonparser.GetString(data, "match")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.WithStack(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	cfr.Match = m
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -60,14 +93,24 @@ func (cfr *ConfigurationFileReplacement) UnmarshalJSON(data []byte) error {
 | 
			
		|||
	// We only check keypath here since match & replace_with should be present on all of
 | 
			
		||||
	// them, however if_value is optional.
 | 
			
		||||
	if err != nil && err != jsonparser.KeyPathNotFoundError {
 | 
			
		||||
		return errors.WithStack(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	cfr.IfValue = iv
 | 
			
		||||
 | 
			
		||||
	rw, dt, _, err := jsonparser.Get(data, "replace_with")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.WithStack(err)
 | 
			
		||||
		if err != jsonparser.KeyPathNotFoundError {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Okay, likely dealing with someone who forgot to upgrade their eggs, so in
 | 
			
		||||
		// that case, fallback to using the old key which was "value".
 | 
			
		||||
		rw, dt, _, err = jsonparser.Get(data, "value")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cfr.ReplaceWith = ReplaceValue{
 | 
			
		||||
		value:     rw,
 | 
			
		||||
		valueType: dt,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user