GOOGLE ADS

miércoles, 4 de mayo de 2022

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección.

Tengo algunos requestsdocumentos que pueden presentar una subcolección llamada status. Mis reglas actuales son algo así:

rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {

// I use it to check if user is signed in
function userSignedIn() {
return request.auth!= null;
}

match /requests/{requestId} {

// I use it to check if user is the owner of the request
function userCanAccess () {
return userSignedIn() && request.auth.uid == get(/databases/$(database)/documents/requests/$(requestId)).data.userId;
}


// allow read to logged user who own request
allow read, update: if userCanAccess();

// anyone can create a new request
allow create: if true;

// no one can delete the request
allow delete: if false;



match /status/{statusId} {
// allow read and update of status to logged user who own request
allow read, update: if userCanAccess();

// anyone can create the status
allow create: if true;

// no one can delete the status
allow delete: if false;
}
}
}
}

Mi primera forma de verificar si el usuario tenía acceso fue por request.auth.uid == resource.data.userId, sin embargo, solo funciona para requestsdocumentos, no para statusdocumentos, ya que no tienen el userIdcampo.

Estoy usando flutter para hacer la solicitud con el código:

FirebaseFirestore.instance
.collection('requests')
.where('userId', isEqualTo: user.uid)
.orderBy('requestedOn', descending: true)
.snapshots()
.listen((snapshot) {
// Here I read requests and their status
});

Sin embargo, estoy recibiendo Error: [cloud_firestore/permission-denied] Missing or insufficient permissions.. ¿Cómo puedo resolverlo (o depurarlo)? Usando las reglas del patio de recreo en firestore, con exactamente lo mismo uid, puedo completar la lectura.


Solución del problema


Me pregunto si la get()llamada puede estar causando problemas. Prueba esto:

function userCanAccess () {
return userSignedIn() && request.auth.uid == requestId.data.userId;
}

WSL: ¿por qué falla Maven?

Estoy usando WSL (Ubuntu shell) en Windows. Instalé Java y Maven y una vez que ejecuto Maven desde el shell de Ubuntu obtengo:

$ mvn
[ERROR] Error executing Maven.
[ERROR] java.lang.IllegalStateException: Unable to load cache item
[ERROR] Caused by: Unable to load cache item
[ERROR] Caused by: Could not initialize class com.google.inject.internal.cglib.core.$MethodWrapper

Por supuesto, no sucede una vez que ejecuto Maven desde el shell de Windows "normal".

Sabes que puedo hacer para solucionarlo?

Edit:
$ echo $JAVA_HOME
/usr/lib/jvm/java-17-openjdk-amd64
$ java -version
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 17.0.2+8-Ubuntu-120.04, mixed mode, sharing)
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.2, vendor: Private Build, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.10.16.3-microsoft-standard-wsl2", arch: "amd64", family: "unix"


Solución del problema

Gracias a @ Turing85 por referirme al error.

Me quedé con Java 17, pero descargué la versión 3.8.5 de Maven.

Puede ver una explicación aquí sobre cómo hacerlo:
https://websiteforstudents.com/how-to-install-apache-maven-on-ubuntu-linux/

Error de referencia: el tipo no está definido en React.js [cerrado]

Cerrado. Esta pregunta no es reproducible o fue causada por errores tipográficos. Actualmente no está aceptando respuestas.


Solución del problema

Supongo que la switchafirmación es incorrecta. La instrucción Switch debe tener solo una expresión.

Creo que debería seraction.type

switch(action.type)

Obteniendo el error "NotSameOriginAfterDefaultedToSameOriginByCoep" con Helmet

Veo el siguiente error en la consola de mi navegador cuando uso Helmet.js:

 net::ERR_BLOCKED_BY_RESPONSE.NotSameOriginAfterDefaultedToSameOriginByCoep

¿Qué tengo que hacer?


Solución del problema

tl; dr: deshabilite el Cross-Origin-Embedder-Policyencabezado, habilitado de forma predeterminada en Helmet v5.

app.use(
helmet({
crossOriginEmbedderPolicy: false,
//...
})
);

Helmet v5 establece el encabezado de Cross-Origin-Embedder-Policyrespuesta HTTP en require-corp. (Esto era posible en Helmet v4, pero estaba desactivado de forma predeterminada, por lo que la mayoría de la gente no lo usaba).

Establecer este encabezado significa que cargar recursos de origen cruzado (como una imagen de otro recurso) es más complicado. Por ejemplo, cargar un origen cruzado como este...

<img alt="My picture" src="https://example.com/image.png">

... no funcionará a menos example.comque lo permita explícitamente, estableciendo algunos encabezados de respuesta propios. Su navegador intentará cargar example.com/image.pngy, si no está explícitamente permitido, dejará caer la respuesta.

Para solucionar esto, puede evitar que Helmet configure el Cross-Origin-Embedder-Policyencabezado, así:

app.use(
helmet({
crossOriginEmbedderPolicy: false,
//...
})
);

Hice una pequeña aplicación de muestra que puedes usar para jugar con esto. En mis pruebas, no parece funcionar en HTTP, pero sí en HTTPS, lo que podría explicar por qué las cosas solo fallan en producción.

La mutación de consulta de reacción isError no se establece en verdadero en POST fallido

Estoy usando la siguiente solicitud de publicación de búsqueda para crear un elemento en mi base de datos. Estoy tratando de usar react-query para detectar el error arrojado por la solicitud.

export function createItem(id, body, token) {
fetch(`${API_URL}/${id}/items`, {
method: 'post',
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` },
body: JSON.stringify(body)
})
.then(res => {
if (res.ok) {
return res.json()
}
console.log(res.status)
throw new Error("Error creating review")
})
.catch((err) => console.log(err))
}

Tengo la mutación establecida así:

const mutation = useMutation(() => {
return createItem(props.item.id, item, token)
})

Y se llama con:

<Button disabled={!valid} onPress={() => mutation.mutate()}>
Submit
</Button>

Yo uso esta lógica para mostrar el error:

{
mutation.isError && <Text>{mutation.error.message}</Text>
}

Veo los createItemerrores de función con un código de estado 400, que es lo que espero, pero reaccionar-consulta no se establece isErroren verdadero. En cambio isSuccesses cierto. ¿Estoy manejando mal el error de alguna manera?


Solución del problema

Desde los documentos de consulta de reacción, devuelven una promesa a la mutación, así que intente cambiar su función createItema lo siguiente:

export function createItem(id, body, token) {
// return the fetch as a promise
return fetch(`${API_URL}/${id}/items`, {
method: 'post',
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` },
body: JSON.stringify(body)
})
// remove then and catch here

Resolver múltiples promesas dentro de un observable que no funciona

Estoy usando Firebase Storage y estoy tratando de cargar todos los activos a través de una llamada de función. La única forma de obtener una URL de activos es llamar, getDownloadURLlo que devuelve una promesa. Necesito llamar a esto para cada activo, pero no puedo hacerlo esperar a que se cumplan todas las promesas antes de continuar por alguna razón.

Pensé que devolver una promesa mergeMapharía esperar a todos, pero ese no parece ser el caso.

He mirado una serie de preguntas con respecto a las promesas y RXJS, pero parece que no puedo averiguar qué está mal con el código.

getAssets() {
return this.authService.user$.pipe(
first(),
switchMap(user => defer(() => from(this.afs.storage.ref(`${user.uid}/assets`).listAll()))),
switchMap(assets => from(assets.items).pipe(
mergeMap(async (asset) => {

return new Promise((res, rej) => {

asset.getDownloadURL().then(url => {

const _asset = {
name: asset.name,
url,
};

this.assets.push(_asset);
res(_asset);
})
.catch((e) => rej(e));
});
}),
)),
map(() => this.assets),
);
}
...
this.getAssets().subscribe(assets => console.log(assets)); // this runs before all asset's url has been resolved


Solución del problema


const { from } = rxjs
const { mergeMap } = rxjs.operators
const assets = [1,2,3,4,5]
function getUrl (index) {
return new Promise((res) => {
setTimeout(() => res(`http://example.com/${index}`), Math.random() * 3 + 1000)
})
}
// add param2 1 for mergeMap === concatMap
from(assets).pipe(
mergeMap(asset => {
return getUrl(asset)
}, 1)
).subscribe(console.log)

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/7.5.5/rxjs.umd.min.js"></script>

Palabras coincidentes y palabras delimitadas por dos puntos parciales entre paréntesis (excluyendo paréntesis)

Estoy tratando de extraer símbolos bursátiles de un cuerpo de texto. Estos partidos generalmente vienen en las siguientes formas:

(<symbol>) => (VOO)
(<market>:<symbol>) => (NASDAQ:C)

En los casos de muestra que se muestran arriba, me gustaría hacer coincidir VOO y C, omitiendo todo lo demás. Esta expresión regular me lleva a la mitad del camino:

(?<=\()(.*?)(?=\))

Con esto, coincido con lo que está incluido entre paréntesis, pero la lógica que ignora el "ruido" NASDAQ:me elude. Me encantaría aprender a especificar condicionalmente este patrón/lógica.

¿Algunas ideas? ¡Gracias!


Solución del problema

Puedes usar

[A-Z]+(?=\))

Vea la demostración de expresiones regulares.

Detalles:


  • [A-Z]+- una o más letras ASCII mayúsculas

  • (?=\))- una anticipación positiva que coincide con una ubicación seguida inmediatamente por un )carácter.


Alternativamente, puede usar lo siguiente para capturar los valores en el Grupo 1:

\((?:[^():]*:)?([A-Z]+)\)

Vea esta demostración de expresiones regulares. Detalles:


  • \(- un (char

  • (?:[^():]*:)?- una secuencia opcional de cero o más caracteres que no sean (, )y :luego un :carácter

  • ([A-Z]+)- Grupo 1: una o más letras ASCII mayúsculas

  • \)- un )char.

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...