Remove eval from remote_census_api

The use of eval is a serious security risk, so we change by JSON.parse method
This commit is contained in:
taitus
2019-10-21 16:52:20 +02:00
parent bb627a7117
commit 7e779bf68b
4 changed files with 52 additions and 53 deletions

View File

@@ -132,7 +132,7 @@ en:
method_name: "Request method name" method_name: "Request method name"
method_name_description: "Request method name accepted by the City Census WebService." method_name_description: "Request method name accepted by the City Census WebService."
structure: "Request Structure" structure: "Request Structure"
structure_description: 'Request Structure that receives the Census WebService of the City council. The "static" values of this request should be filled. Values related to Document Type, Document Number, Date of Birth and Postal Code should be blank.' structure_description: 'Request Structure that receives the Census WebService of the City council. The "static" values of this request should be filled. Values related to Document Type, Document Number, Date of Birth and Postal Code should be null. Example of a valid format: { "request": { "codigo_institucion": 1, "codigo_portal": 1, "codigo_usuario": 1, "documento": null, "tipo_documento": null, "codigo_idioma": 102, "nivel": 3 } }'
document_type: "Path for Document Type" document_type: "Path for Document Type"
document_type_description: "Path in the request structure that sends the Document Type. DO NOT FILL IN if the WebService does not require the Document Type to verify a user." document_type_description: "Path in the request structure that sends the Document Type. DO NOT FILL IN if the WebService does not require the Document Type to verify a user."
document_number: "Path for Document Number" document_number: "Path for Document Number"

View File

@@ -132,7 +132,7 @@ es:
method_name: "Nombre del método de la petición" method_name: "Nombre del método de la petición"
method_name_description: "Nombre del método qe acepta el WebService del Censo del Ayuntamiento." method_name_description: "Nombre del método qe acepta el WebService del Censo del Ayuntamiento."
structure: "Estructura de la petición" structure: "Estructura de la petición"
structure_description: 'Estructura de la petición que recibe el WebService del Censo del Ayuntamiento. Los valores "fijos" de esta petición deberan informarse. Los valores relacionado con Tipo de Documento, Número de Documento, Fecha de Nacimiento y Código Postal deberán dejarse en blanco.' structure_description: 'Estructura de la petición que recibe el WebService del Censo del Ayuntamiento. Los valores "fijos" de esta petición deberan informarse. Los valores relacionado con Tipo de Documento, Número de Documento, Fecha de Nacimiento y Código Postal deberán dejarse con valor null. Ejemplo de formato válido: { "request": { "codigo_institucion": 1, "codigo_portal": 1, "codigo_usuario": 1, "documento": null, "tipo_documento": null, "codigo_idioma": 102, "nivel": 3 } }'
document_type: "Ruta para Tipo de Documento" document_type: "Ruta para Tipo de Documento"
document_type_description: "Ruta donde se encuentra el campo en la estructura de la petición que envia el Tipo de Documento. NO RELLENAR en caso de que el WebService no requiera el Tipo de Documento para verificar un usuario." document_type_description: "Ruta donde se encuentra el campo en la estructura de la petición que envia el Tipo de Documento. NO RELLENAR en caso de que el WebService no requiera el Tipo de Documento para verificar un usuario."
document_number: "Ruta para Número de Documento" document_number: "Ruta para Número de Documento"

View File

@@ -84,7 +84,7 @@ class RemoteCensusApi
end end
def request(document_type, document_number, date_of_birth, postal_code) def request(document_type, document_number, date_of_birth, postal_code)
structure = eval(Setting["remote_census.request.structure"]) structure = JSON.parse(Setting["remote_census.request.structure"])
fill_in(structure, Setting["remote_census.request.document_type"], document_type) fill_in(structure, Setting["remote_census.request.document_type"], document_type)
fill_in(structure, Setting["remote_census.request.document_number"], document_number) fill_in(structure, Setting["remote_census.request.document_number"], document_number)
@@ -100,12 +100,11 @@ class RemoteCensusApi
def fill_in(structure, path_value, value) def fill_in(structure, path_value, value)
path = parse_path(path_value) path = parse_path(path_value)
update_value(structure, path, value) if path.present? update_value(structure, path, value) if path.present?
end end
def parse_path(path_value) def parse_path(path_value)
path_value.split(".").map { |section| section.to_sym } if path_value.present? path_value.split(".") if path_value.present?
end end
def update_value(structure, path, value) def update_value(structure, path, value)

View File

@@ -65,15 +65,15 @@ describe RemoteCensusApi do
before do before do
Setting["feature.remote_census"] = true Setting["feature.remote_census"] = true
Setting["remote_census.request.structure"] = "{ request: Setting["remote_census.request.structure"] = '{ "request":
{ codigo_institucion: 1, { "codigo_institucion": 1,
codigo_portal: 1, "codigo_portal": 1,
codigo_usuario: 1, "codigo_usuario": 1,
documento: 'xxx', "documento": null,
tipo_documento: 'xxx', "tipo_documento": null,
codigo_idioma: '102', "codigo_idioma": 102,
nivel: '3' } "nivel": 3 }
}" }'
Setting["remote_census.request.document_type"] = "request.tipo_documento" Setting["remote_census.request.document_type"] = "request.tipo_documento"
Setting["remote_census.request.document_number"] = "request.documento" Setting["remote_census.request.document_number"] = "request.documento"
Setting["remote_census.request.date_of_birth"] = nil Setting["remote_census.request.date_of_birth"] = nil
@@ -86,14 +86,14 @@ describe RemoteCensusApi do
request = RemoteCensusApi.new.send(:request, document_type, document_number, nil, nil) request = RemoteCensusApi.new.send(:request, document_type, document_number, nil, nil)
expect(request).to eq({ :request => expect(request).to eq({ "request" =>
{ :codigo_institucion => 1, { "codigo_institucion" => 1,
:codigo_portal => 1, "codigo_portal" => 1,
:codigo_usuario => 1, "codigo_usuario" => 1,
:documento => "0123456", "documento" => "0123456",
:tipo_documento => "1", "tipo_documento" => "1",
:codigo_idioma => "102", "codigo_idioma" => 102,
:nivel => "3" } "nivel" => 3 }
}) })
end end
@@ -105,29 +105,29 @@ describe RemoteCensusApi do
request = RemoteCensusApi.new.send(:request, document_type, document_number, date_of_birth, postal_code) request = RemoteCensusApi.new.send(:request, document_type, document_number, date_of_birth, postal_code)
expect(request).to eq({ :request => expect(request).to eq({ "request" =>
{ :codigo_institucion => 1, { "codigo_institucion" => 1,
:codigo_portal => 1, "codigo_portal" => 1,
:codigo_usuario => 1, "codigo_usuario" => 1,
:documento => "0123456", "documento" => "0123456",
:tipo_documento => "1", "tipo_documento" => "1",
:codigo_idioma => "102", "codigo_idioma" => 102,
:nivel => "3" } "nivel" => 3 }
}) })
end end
it "when send date_of_birth and postal_code but are configured" do it "when send date_of_birth and postal_code but are configured" do
Setting["remote_census.request.structure"] = "{ request: Setting["remote_census.request.structure"] = '{ "request":
{ codigo_institucion: 1, { "codigo_institucion": 1,
codigo_portal: 1, "codigo_portal": 1,
codigo_usuario: 1, "codigo_usuario": 1,
documento: nil, "documento": "nil",
tipo_documento: nil, "tipo_documento": "null",
fecha_nacimiento: nil, "fecha_nacimiento": "null",
codigo_postal: nil, "codigo_postal": "nil",
codigo_idioma: '102', "codigo_idioma": 102,
nivel: '3' } "nivel": 3 }
}" }'
Setting["remote_census.request.date_of_birth"] = "request.fecha_nacimiento" Setting["remote_census.request.date_of_birth"] = "request.fecha_nacimiento"
Setting["remote_census.request.postal_code"] = "request.codigo_postal" Setting["remote_census.request.postal_code"] = "request.codigo_postal"
document_type = "1" document_type = "1"
@@ -137,16 +137,16 @@ describe RemoteCensusApi do
request = RemoteCensusApi.new.send(:request, document_type, document_number, date_of_birth, postal_code) request = RemoteCensusApi.new.send(:request, document_type, document_number, date_of_birth, postal_code)
expect(request).to eq({ :request => expect(request).to eq({ "request" =>
{ :codigo_institucion => 1, { "codigo_institucion" => 1,
:codigo_portal => 1, "codigo_portal" => 1,
:codigo_usuario => 1, "codigo_usuario" => 1,
:documento => "0123456", "documento" => "0123456",
:tipo_documento => "1", "tipo_documento" => "1",
:fecha_nacimiento => "1980-01-01", "fecha_nacimiento" => "1980-01-01",
:codigo_postal => "28001", "codigo_postal" => "28001",
:codigo_idioma => "102", "codigo_idioma" => 102,
:nivel => "3" } "nivel" => 3 }
}) })
end end