mirror of
				https://github.com/gristlabs/grist-core.git
				synced 2025-06-13 20:53:59 +00:00 
			
		
		
		
	(core) Fix issue with sandboxUtil where %s in message would get interpreted wrongly
Summary: - Also converted sandboxUtil to typescript. - The issue with %s manifested when a Python traceback contained "%s" in the string; in that case the object with log metadata (e.g. docId) would confusingly replace %s as if it were part of the message from Python. Test Plan: Added a test case for the fix. Reviewers: alexmojaki Reviewed By: alexmojaki Differential Revision: https://phab.getgrist.com/D3486
This commit is contained in:
		
							parent
							
								
									983638a5c5
								
							
						
					
					
						commit
						b57a211741
					
				@ -1,26 +1,18 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Various utilities and constants for communicating with the python sandbox.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var MemBuffer = require('app/common/MemBuffer');
 | 
			
		||||
var log = require('./log');
 | 
			
		||||
import * as MemBuffer from 'app/common/MemBuffer';
 | 
			
		||||
import * as log from 'app/server/lib/log';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SandboxError is an error type for reporting errors forwarded from the sandbox.
 | 
			
		||||
 */
 | 
			
		||||
function SandboxError(message) {
 | 
			
		||||
  // Poorly documented node feature, required to make the derived error keep a proper stack trace.
 | 
			
		||||
  Error.captureStackTrace(this, this.constructor);
 | 
			
		||||
  this.name = 'SandboxError';
 | 
			
		||||
  this.message = "[Sandbox] " + (message || 'Python reported an error');
 | 
			
		||||
export class SandboxError extends Error {
 | 
			
		||||
  constructor(message: string) {
 | 
			
		||||
    super("[Sandbox] " + (message || 'Python reported an error'));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
SandboxError.prototype = new Error();
 | 
			
		||||
// We need to set the .constructor property for Error.captureStackTrace to work correctly.
 | 
			
		||||
SandboxError.prototype.constructor = SandboxError;
 | 
			
		||||
 | 
			
		||||
exports.SandboxError = SandboxError;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -30,9 +22,9 @@ exports.SandboxError = SandboxError;
 | 
			
		||||
 *    DATA = data must be a value to return to a call from the other side
 | 
			
		||||
 *    EXC = data must be an exception to return to a call from the other side
 | 
			
		||||
 */
 | 
			
		||||
exports.CALL = null;
 | 
			
		||||
exports.DATA = true;
 | 
			
		||||
exports.EXC = false;
 | 
			
		||||
export const CALL = null;
 | 
			
		||||
export const DATA = true;
 | 
			
		||||
export const EXC = false;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -40,19 +32,18 @@ exports.EXC = false;
 | 
			
		||||
 * The logged output is line-oriented, so that the prefix is only inserted at the start of a line.
 | 
			
		||||
 * Binary data is encoded as with JSON.stringify.
 | 
			
		||||
 */
 | 
			
		||||
function makeLinePrefixer(prefix, logMeta) {
 | 
			
		||||
  var partial = '';
 | 
			
		||||
  return data => {
 | 
			
		||||
export function makeLinePrefixer(prefix: string, logMeta: object) {
 | 
			
		||||
  let partial = '';
 | 
			
		||||
  return (data: Uint8Array) => {
 | 
			
		||||
    partial += MemBuffer.arrayToString(data);
 | 
			
		||||
    var newline;
 | 
			
		||||
    let newline;
 | 
			
		||||
    while ((newline = partial.indexOf("\n")) !== -1) {
 | 
			
		||||
      var line = partial.slice(0, newline);
 | 
			
		||||
      const line = partial.slice(0, newline);
 | 
			
		||||
      partial = partial.slice(newline + 1);
 | 
			
		||||
      // Escape some parts of the string by serializing it to JSON (without the quotes).
 | 
			
		||||
      log.rawInfo(prefix + JSON.stringify(line).slice(1, -1).replace(/\\"/g, '"')
 | 
			
		||||
        .replace(/\\\\/g, '\\'),
 | 
			
		||||
      log.origLog('info', "%s%s", prefix,
 | 
			
		||||
        JSON.stringify(line).slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'),
 | 
			
		||||
        logMeta);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
exports.makeLinePrefixer = makeLinePrefixer;
 | 
			
		||||
@ -126,7 +126,7 @@ export function setTmpLogLevel(level: string, optCaptureFunc?: (level: string, m
 | 
			
		||||
 * captures those at minLevel and higher. Returns a promise for the array of "level: message"
 | 
			
		||||
 * strings. These may be tested using testUtils.assertMatchArray(). Callback may return a promise.
 | 
			
		||||
 */
 | 
			
		||||
export async function captureLog(minLevel: string, callback: any) {
 | 
			
		||||
export async function captureLog(minLevel: string, callback: () => void|Promise<void>): Promise<string[]> {
 | 
			
		||||
  const messages: string[] = [];
 | 
			
		||||
  const prevLogLevel = log.transports.file.level;
 | 
			
		||||
  const name = _.uniqueId('CaptureLog');
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user