c# – Redirect Uri desde Identity Server 4

Tengo Identity Server 4 conectado con AspNet Identity. El Login funciona correctamente, sin embargo, debo modificarlo para agregar una validación extra consultando un servicio web que me proporcionará ciertos datos y dependiendo de esos datos debo redireccionar un cliente Asp MVC a una Uri u otra, ¿Cómo puedo hacer esta redirección desde el Identity server? Imagino que sería irrelevante que el cliente envíe el parámetro Redirect Uri ya que el cliente no determina este dato.

Saludos cordiales.

Actualizar un solo campo de una tabla de acces desde c#

Tengo una duda acerca del metodo de actualizar un registro pues estoy guardando los datos en un archivo de acces y al hacer todas las funciones que he realizado funcionan correctamente pero me pregunto como puedo hacer para que al momento de actualizar y solo haber llenado un solo texbox
solo se modifique el campo correspondiente en acces y los de más que ya contengan algun datos no cambien su valor a 0 por la función string.IsNullOrWhiteSpace ¿existe alguna funcion que realice esto? espero puedan ayudarme
de antemano muchas gracias.
Ejemplo:

id Nombre Clabe   C1  C2 
1  juan   2020A   3   3

quiero Modificar c1

id Nombre Clabe   C1  C2 
1  juan   2020A   1   3

ya que la funcion ” string.IsNullOrWhiteSpace”
la use para solo ingresar algunos valores y devolveria esto

id Nombre Clabe   C1  C2 
1    0      0      1   0

Metodo para actualizar

public string Actualizar(ALUMNO p)
        {
           string Act = p.Periodo;
            switch (Act)
            {
                case "1° PARCIAL":
                    
                    break;
                case "2° PARCIAL":
                    break;
                case "3° PARCIAL":
                    break;

            }

            bool bandera = true;
            OleDbCommand cmd = new OleDbCommand();
            string mensaje = "";
            cmd.CommandText = string.Format
      ("update TablaAlumnos set " +
        "CLABE = '{0}',NOMBRE= '{1}', C1 = {2},C2= {3}, C3 = {4},C4= {5}, R1 = {6},H1= {7}, H2 = {8},H3= {9}, H4 = {10},R2= {11}, ACTYVAL1 = {12},ACTYVAL2= {13}, ACTYVAL3 = {14},ACTYVAL4= {15}, R3 = {16},DES1= {17}, DES2 = {18},DES3= {19}, DES4 = {20},R4= {21}, SUMA = {22},COMP_ADQ= '{23}'," +
        " INA={24}  where Id = {25}"
      , p.CLABE, p.NOMBRE, p.C1, p.C2, p.C3, p.C4, p.R1, p.H1, p.H2, p.H3, p.H4, p.R2, p.ACTYVAL1, p.ACTYVAL2, p.ACTYVAL3, p.ACTYVAL4, p.R3, p.DES1, p.DES2, p.DES3, p.DES4, p.R4, p.SUMA, p.COMP_ADQ, p.INA, p.Id);

            cmd.Connection = cn;
            try
            {
                cn.Open();
                if (cmd.ExecuteNonQuery() > 0)
                    bandera = true;
                mensaje = "Registro actualizado";
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message);
                mensaje = ex.Message;
            }
            finally
            {
                cn.Close();
            }
            return mensaje;
        }

Evento del botón

private void btnActualizar_Click(object sender, EventArgs e)
        {
            try
            {
                ALUMNO p = new ALUMNO();

                p.Id = Convert.ToInt32(txtId.Text);
                p.CLABE = this.txtNombre.Text;
                p.NOMBRE = this.txtClabe.Text;

                // p.C1 = int.Parse(txtCon1.Text);
                p.C1 = (!string.IsNullOrWhiteSpace(txtCon1.Text)) ? Convert.ToInt32(txtCon1.Text) : 0;
                //p.C2 = int.Parse(txtCon2.Text);
                p.C2 = (!string.IsNullOrWhiteSpace(txtCon2.Text)) ? Convert.ToInt32(txtCon2.Text) : 0;
                // p.C3 = int.Parse(txtCon3.Text);
                p.C3 = (!string.IsNullOrWhiteSpace(txtCon3.Text)) ? Convert.ToInt32(txtCon3.Text) : 0;
                //p.C4 = int.Parse(txtCon4.Text);
                p.C4 = (!string.IsNullOrWhiteSpace(txtCon4.Text)) ? Convert.ToInt32(txtCon4.Text) : 0;
                p.R1 = Convert.ToInt32(p.C1 + p.C2 + p.C3 + p.C4);

                //p.H1 = int.Parse(txtHab1.Text);
                p.H1 = (!string.IsNullOrWhiteSpace(txtHab1.Text)) ? Convert.ToInt32(txtHab1.Text) : 0;
                //p.H2 = int.Parse(txtHab2.Text);
                p.H2 = (!string.IsNullOrWhiteSpace(txtHab2.Text)) ? Convert.ToInt32(txtHab2.Text) : 0;
                //p.H3 = int.Parse(txtHab3.Text);
                p.H3 = (!string.IsNullOrWhiteSpace(txtHab3.Text)) ? Convert.ToInt32(txtHab3.Text) : 0;
                //p.H4 = int.Parse(txtHab4.Text);
                p.H4 = (!string.IsNullOrWhiteSpace(txtHab4.Text)) ? Convert.ToInt32(txtHab4.Text) : 0;
                p.R2 = Convert.ToInt32(p.H1 + p.H2 + p.H3 + p.H4);

                //p.ACTYVAL1 = int.Parse(txtAct1.Text);
                p.ACTYVAL1 = (!string.IsNullOrWhiteSpace(txtAct1.Text)) ? Convert.ToInt32(txtAct1.Text) : 0;
                //p.ACTYVAL2 = int.Parse(txtAct2.Text);
                p.ACTYVAL2 = (!string.IsNullOrWhiteSpace(txtAct2.Text)) ? Convert.ToInt32(txtAct2.Text) : 0;
                //p.ACTYVAL3 = int.Parse(txtAct3.Text);
                p.ACTYVAL3 = (!string.IsNullOrWhiteSpace(txtAct3.Text)) ? Convert.ToInt32(txtAct3.Text) : 0;
                //p.ACTYVAL4 = int.Parse(txtAct4.Text);
                p.ACTYVAL4 = (!string.IsNullOrWhiteSpace(txtAct4.Text)) ? Convert.ToInt32(txtAct4.Text) : 0;
                p.R3 = Convert.ToInt32(p.ACTYVAL1 + p.ACTYVAL2 + p.ACTYVAL3 + p.ACTYVAL4);

                //p.DES1 = int.Parse(txtDes1.Text);
                p.DES1 = (!string.IsNullOrWhiteSpace(txtDes1.Text)) ? Convert.ToInt32(txtDes1.Text) : 0;
                // p.DES2 = int.Parse(txtDes2.Text);
                p.DES2 = (!string.IsNullOrWhiteSpace(txtDes2.Text)) ? Convert.ToInt32(txtDes2.Text) : 0;
                //p.DES3 = int.Parse(txtDes3.Text);
                p.DES3 = (!string.IsNullOrWhiteSpace(txtDes3.Text)) ? Convert.ToInt32(txtDes3.Text) : 0;
                //p.DES4 = int.Parse(txtDes4.Text);
                p.DES4 = (!string.IsNullOrWhiteSpace(txtDes4.Text)) ? Convert.ToInt32(txtDes4.Text) : 0;
                p.R4 = Convert.ToInt32(p.DES1 + p.DES2 + p.DES3 + p.DES4);

                p.SUMA = p.R1 + p.R2 + p.R3 + p.R4;

                p.COMP_ADQ = txtComp.Text.ToString();

                p.INA = 10;

                p.Periodo = cbPeriodo.Text;
                if (crud.Actualizar(p).Equals("registro Actualizado correctamente"))
                {
                    MessageBox.Show(crud.Actualizar(p));
                    llenargrid();
                }
                else
                {
                    MessageBox.Show(crud.Actualizar(p));
                    llenargrid();
                }
            }
           catch (Exception)
            {

                MessageBox.Show("Ingreso algun valor desconocido o faltan campos por llenar");
            }
        }

javascript – Ejecutar Script desde PHP con un worker

Si quiero lanzar un script algo pesado utilizando la función exec en PHP ¿Debería usar un worker? Y en caso de ser así, en la función del worker ¿debería meter el código PHP?
Es para una app que estoy realizando, tengo un botón que inicia la instalación de un script externo, el problema es que, al no realizar la tarea en segundo plano, la web se sobrecarga hasta que finaliza la instalación del script. Entonces mi duda es, como fusionar correctamente la instalación del script en PHP con el worker en JS. Perdón si no fui claro en la pregunta, se que me expreso fatal.

¿Como hago la configuracion de flask-admin desde un blueprint?

Estoy trabajando con Flask pero estoy haciendo las configuraciones globales desde un archivo ‘init.py’ y estoy modularizando todo con blueprints, la estructura es mas o menos la siguiente.

introducir la descripción de la imagen aquí

En mi archivo init.py estoy declarando admin = Admin() y dentro de la funcion create_app() que contiene las configuraciones inicializo admin admin.init_app()

Ya desde otro archivo es donde quiero crear las vistas para mis modelos, pero si lo hago con blueprint me dice que el blueprint se esta repitiendo y esto me pasa con todos mis blueprints, sin importar su nombre.

¿Como hago para declarar en otro archivo todo flask-admin?

pgadmin – Conectar desde Windows a Ubuntu Server virtual

Necesito conectar desde mi equipo host Windows 10 a una base de datos que tengo en Ubuntu Server 20.04 que he instalado en VirtualBox. Cuando lo hago, me da este fallo:

Unable to connect to server:

could not connect to server: Connection refused (0x0000274D/10061) Is
the server running on host “192.168.1.66” and accepting TCP/IP
connections on port 5432?

¿Alguna solución?

Gracias de antemano.

Fallo de conexion en bbdd desde android studio a phpmyadmin

Buenas estoy intentando hacer una conexion a base de datos que tengo en phpmyadmin con el servidor xampp, le puse el archivo de conexion en su lugar correspondiente y cuando ejecuto el codigo me dice todo el rato que fallo de conexion, por mas que añado los permisos en el manifest no me deja. La tabla contiene los campos Nombre, Apellidos, Email, Contraseña y telefono. El codigo me funciona bien tanto el archivo conexion.php como el codigo el unico problema es que siempre me da error de conexion.

public static class Prueba extends AsyncTask<String, Void, String>{

        private WeakReference<Context> context;

        public Prueba(Context context){
            this.context = new WeakReference<>(context);
        }

        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        @Override
        protected String doInBackground(String... params) {
            String registrar_url = "http://localhost/conexion.php";
            String resultado;

            try{
                URL url = new URL(registrar_url);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoOutput(true);
                OutputStream outputStream = httpURLConnection.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));

                String nombre = params(0);
                String apellidos = params(1);
                String email = params(2);
                String password = params(3);
                String telefono = params(4);

                String data = URLEncoder.encode("nombre", "UTF-8") + "=" + URLEncoder.encode(nombre, "UTF-8")
                        + "&" + URLEncoder.encode("apellidos", "UTF-8") + "=" + URLEncoder.encode(apellidos, "UTF-8")
                        + "&" + URLEncoder.encode("email", "UTF-8") + "=" + URLEncoder.encode(email, "UTF-8")
                        + "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8")
                        + "&" + URLEncoder.encode("telefono", "UTF-8") + "=" + URLEncoder.encode(telefono, "UTF-8");

                bufferedWriter.write(data);
                bufferedWriter.flush();
                bufferedWriter.close();
                outputStream.close();

                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
                StringBuilder message = new StringBuilder();

                String line;

                while((line = bufferedReader.readLine())!=null){
                    message.append(line);
                }
                resultado = message.toString();

                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();
            }catch (MalformedURLException e){
                Log.d("URL", "Se ha utilizado una URL con formato incorrecto.");
                resultado = "Se ha producido un Error";
            }catch (IOException e){
                Log.d("Conexion", "Error inesperado!, posibles problemas de conexion de red");
                resultado = "Se ha producido un Error, comprueba tu conexion a Internet";
            }
            return resultado;
        }

        protected void onPostExecute(String resultado){
            Toast.makeText(context.get(), resultado, Toast.LENGTH_SHORT).show();
        }

    }
```

Y esto es lo que tengo en el boton para ejecutar el codigo.
```
btn_registrar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new Prueba(MainActivity.this).execute(nombre, apellidos, email, password, telefono);
                
            }
        });
```



¿Cómo envio una variable desde JavaScript hacia PHP?

tengo un boton el cual ejecuta una funcion de javascript al hacer click y pasa un parametro (n), el codigo es:

<script>

 function myuser(n){

        var user = n

    }

</script>

Yo una vez obtenida esta variable, lo que quiero hacer ahora es, en la misma función poder pasar esa variable hacia un archivo php y a la vez redirigirme a el para poder imprimir esa variable, estuve investigando un poco pero nada me dio resultado, entiendo que es algo confuso por el hecho de que ambos lenguajes funcionan de distintas maneras pero confio en que hay forma de hacerlo, si me pueden dar una mano seria genial! gracias y saludos.

Como podría añadir o "inyectar" un componente desde un servicio al doom en angular?

Como podría crear un componente desde un servicio en angular, quiero hacer como un servicio de alertas, pero no se como "inyectar" o "agregar" un componente desde un servicio al doom, alguna sugerencia?

javascript – Enviar mensaje a whatsapp desde la web

Necesito hacer el efecto de enviar mensaje a whatsapp así como se muestra en el siguiente enlace

ver ejemplo

No he intentado nada por no tengo la mas remota de idea de como hacerlo, se que hay API´s pero no se si algunas de ellas me van a funcionar tal y como se muestra en el enlace, no se también si esto se pueda hacer con PHP o JavaScript

Agradecería que pudieran ayudarme

En mi transicion desde docker-compose a Docker Swarm no encuentro un remplazo para el .env

Despues de aprender docker-compose, me veo en la necesidad de usar Docker Swarm para desplegar Traefik.

docker-compose permite sustituir ciertas variables del docker-compose.yml desde un .env como en este caso:

.env

ACME_EMAIL=email.yourdomain.com
URL_TRAEFIK_DASHBOARD=traefik.yourdomain.com
HTTPD_AUTH=test:(hash)

docker-compose.yml (version docker-compose)

version: "3.3"

services:
  traefik:
    container_name: ${TRAEFIK_CONTAINER_NAME:-traefik}
    image: "traefik:${TRAEFIK_IMAGE_TAG:-latest}"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro" 
      - ".letsencrypt:/letsencrypt" # Create a letsencrypt dir within the folder where the docker-compose file is
    command:
      - "--log.level=DEBUG" # Verbose debug
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false" # Do not expose containers by default
      # Define entrypoints
      - "--entryPoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      # Letsencrypt for https
      # - "--certificatesresolvers.le.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.le.acme.email=${ACME_EMAIL}"
      - "--certificatesresolvers.le.acme.httpchallenge.entryPoint=web"
      #- "--certificatesResolvers.le.acme.tlschallenge=true" # Enable a tls challenge named "le"
      - "--certificatesresolvers.le.acme.httpchallenge=true" # Enable a http challenge named "le"
      - "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json" # Tell to store the certificate on a path under our volume
    labels:
      # Redirect 80 to 443 (force https everywhere)
      - "traefik.http.routers.https-redirect.entrypoints=web"
      - "traefik.http.routers.https-redirect.rule=hostregexp(`{any:.*}`)" 
      - "traefik.http.routers.https-redirect.middlewares=redirect-to-https"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      
      # Traefic dashboard
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`${URL_TRAEFIK_DASHBOARD}`)"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.tls.certresolver=le"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.middlewares=authtraefik"
      - "traefik.http.middlewares.authtraefik.basicauth.users=${HTTPD_AUTH}"

networks:
  default:
    external:
      name: ${NETWORK:-reverse-proxy}

Sin embargo ésto no es posible en Docker Swarm y cuando haces un depliegue con:

docker stack deploy -c docker-compose.yml traefik

las variables de entorno del .env no se leen y por lo tanto el stack falla o se despliega sin la configuracion.

He leido sobre configs y secrets y no concibo la forma de utilizarlos correctamente en la siguiente configuracion para Docker Swarm de Traefik:

docker-compose.yml (version swarm)

version: '3.3'

services:

  traefik:
    # Use the latest Traefik image
    image: traefik:v2.2
    ports:
      # Listen on port 80, default for HTTP, necessary to redirect to HTTPS
      - 80:80
      # Listen on port 443, default for HTTPS
      - 443:443
    deploy:
      placement:
        constraints:
          # Make the traefik service run only on the node with this label
          # as the node with it has the volume for the certificates
          - node.labels.traefik-public.traefik-public-certificates == true
      labels:
        # Enable Traefik for this service, to make it available in the public network
        - traefik.enable=true

        # Use the traefik-public network (declared below)
        - traefik.docker.network=traefik-public

        # Use the custom label "traefik.constraint-label=traefik-public"
        # This public Traefik will only use services with this label
        # That way you can add other internal Traefik instances per stack if needed
        - traefik.constraint-label=traefik-public

        # admin-auth middleware with HTTP Basic auth
        # Using the environment variables USERNAME and HASHED_PASSWORD
        - traefik.http.middlewares.admin-auth.basicauth.users=${HTTPD_AUTH}

        # https-redirect middleware to redirect HTTP to HTTPS
        # It can be re-used by other stacks in other Docker Compose files
        - traefik.http.middlewares.https-redirect.redirectscheme.scheme=https
        - traefik.http.middlewares.https-redirect.redirectscheme.permanent=true
        

        # traefik-http set up only to use the middleware to redirect to https
        # Uses the environment variable DOMAIN
        - traefik.http.routers.traefik-public-http.rule=Host(`${URL_TRAEFIK_DASHBOARD}`)
        - traefik.http.routers.traefik-public-http.entrypoints=http
        - traefik.http.routers.traefik-public-http.middlewares=https-redirect

        # traefik-https the actual router using HTTPS
        # Uses the environment variable DOMAIN
        - traefik.http.routers.traefik-public-https.rule=Host(`${URL_TRAEFIK_DASHBOARD}`)
        - traefik.http.routers.traefik-public-https.entrypoints=https
        - traefik.http.routers.traefik-public-https.tls=true

        # Use the special Traefik service api@internal with the web UI/Dashboard
        - traefik.http.routers.traefik-public-https.service=api@internal

        # Use the "le" (Let's Encrypt) resolver created below
        - traefik.http.routers.traefik-public-https.tls.certresolver=le

        # Enable HTTP Basic auth, using the middleware created above
        - traefik.http.routers.traefik-public-https.middlewares=admin-auth
        
        # Define the port inside of the Docker service to use
        - traefik.http.services.traefik-public.loadbalancer.server.port=8080
    volumes:
      # Add Docker as a mounted volume, so that Traefik can read the labels of other services
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # Mount the volume to store the certificates
      - traefik-public-certificates:/certificates

    command:
      # Enable Docker in Traefik, so that it reads labels from Docker services
      - --providers.docker
      # Add a constraint to only use services with the label "traefik.constraint-label=traefik-public"
      - --providers.docker.constraints=Label(`traefik.constraint-label`, `traefik-public`)
      # Do not expose all Docker services, only the ones explicitly exposed
      - --providers.docker.exposedbydefault=false
      # Enable Docker Swarm mode
      - --providers.docker.swarmmode
      # Create an entrypoint "http" listening on address 80
      - --entrypoints.http.address=:80
      # Create an entrypoint "https" listening on address 443
      - --entrypoints.https.address=:443
      # Create the certificate resolver "le" for Let's Encrypt, uses the environment variable EMAIL
      - --certificatesresolvers.le.acme.email=${ACME_EMAIL}
      # Store the Let's Encrypt certificates in the mounted volume
      - --certificatesresolvers.le.acme.storage=/certificates/acme.json
      # Use the TLS Challenge for Let's Encrypt
      - --certificatesresolvers.le.acme.tlschallenge=true
      # Enable the access log, with HTTP requests
      - --accesslog
      # Enable the Traefik log, for configurations and errors
      - --log
      # Enable the Dashboard and API
      - --api
    networks:
      # Use the public network created to be shared between Traefik and
      # any other service that needs to be publicly available with HTTPS
      - traefik-public

volumes:
  # Create a volume to store the certificates, there is a constraint to make sure
  # Traefik is always deployed to the same Docker node with the same volume containing
  # the HTTPS certificates
  traefik-public-certificates:

networks:
  # Use the previously created public network "traefik-public", shared with other
  # services that need to be publicly available via this Traefik
  traefik-public:
    external: true

Un workarround es utilizar docker-compose config y pasarlo a un archivo o leer el stdin desde docker stack deploy:

docker-compose config | docker stack deploy -c - traefik

Esto en la mayoria de los casos funciona sin problemas, en el mio se produce un error:

networks.traefik-public Additional property name is not allowed

El docker-compose.yml tiene una red externa definida como:

traefik-public:
    external: true

Y la salida de docker-compose config produce el siguiente resultado indeseado:

 . . .
networks:
      traefik-public: null
. . .

¿Cómo puedo configurar este docker compose de forma dinámica utilizando docker config o secrets? ya que desde un archivo .env no esposible.

No deberia tener que “hardcodear” mi configuracion en el docker-compose.

La unica solucion que he encontrado es hacer export de todas las variables de entorno que necesito antes de desplegar el stack.