Diferencia entre revisiones de «Cabina de votaciones - 17 18 - G2»

De Wiki de EGC
Saltar a: navegación, buscar
(Añaadida la sección de decisiones de diseño y indicado el proceso de cifrado del voto)
 
(No se muestran 9 ediciones intermedias de otro usuario)
Línea 26: Línea 26:
 
- lodash: 4.17.4 <br/>
 
- lodash: 4.17.4 <br/>
 
- async: 2.6.0 <br/>
 
- async: 2.6.0 <br/>
- js-base64: 2.4.0 <br/>
 
 
Sistema de gestión de bibliotecas: npm<br/>
 
Sistema de gestión de bibliotecas: npm<br/>
 
Base de datos: No (Aunque es necesaria alguna forma de verificar los votos a partir del usuario encriptado).<br/>
 
Base de datos: No (Aunque es necesaria alguna forma de verificar los votos a partir del usuario encriptado).<br/>
Línea 37: Línea 36:
 
'''Estructura de un voto''':
 
'''Estructura de un voto''':
  
id: (int) identificador del voto [pk, autoincrementable]<br/>
+
id_user: (int) identificador del usuario que ha votado, es única y es posible verificar el voto [unique, not null]<br/>
encrypted_user: (string) identificador del usuario que ha votado de forma encriptada, es única y es posible verificar el voto (voto anónimo) [unique, not null]<br/>
+
id_election: (int) identificador de la votación [fk, not null]<br/>
id_election: (int) identificador de la votación [fk, not null]<br/>
+
encrypted_answers: (string) es un string con el contenido de la votación cifrado.<br/>
encrypted_answers: (string) es un string con el contenido de la votación cifrado.<br/>
 
  
 
'''Consulta de permisos de voto'''
 
'''Consulta de permisos de voto'''
Línea 66: Línea 64:
 
Tipo: POST
 
Tipo: POST
 
URL: http://egc-cabina.es/api/create/vote.json
 
URL: http://egc-cabina.es/api/create/vote.json
Parámetros: id_user: (int) Identificador del usuario (sin encriptar)
+
Parámetros:  
 +
            id_user: (int) Identificador del usuario (sin encriptar)
 
             id_election: (int) Identificador de la votación
 
             id_election: (int) Identificador de la votación
             answers: (list[string]) Lista con las respuestas de la votación de forma ordenada (en la posición 1 estará la respuesta a la pregunta 1 de la votación)
+
             answers: (list[(int,string)]) Lista que contendrá el par question_id, que es el identificador de la pregunta como int, y answer, que es la respuesta del usuario. La representación de cada par sería la siguiente:
Formato JSON Ejemplo: Creando un voto por el usuario 23, la votación 34, el grupo de usuarios 13.
+
            {
 +
                "question_id": 0,
 +
                "answer": "..."
 +
            }
 +
 
 +
Formato JSON Ejemplo: Creando un voto por el usuario 23, la votación 34, el grupo de usuarios 13. Se debe enviar:
 +
 
 +
    {
 +
        "id_user": 23,
 +
        "id_election": 34,
 +
        "answers": [
 +
            {
 +
                "question_id": 0,
 +
                "answer": "Algo"
 +
            },
 +
            {
 +
                "question_id": 1,
 +
                "answer": "Sí"
 +
            }
 +
        ]
 +
    }
 +
 
 +
La respuesta a esta petición será:       
  
 
     {
 
     {
 
         "result": true,
 
         "result": true,
         "vote": {
+
         "reason": "can_vote"
            "id": "1",
 
            "encrypted_user": "as5d8gr4",
 
            "id_election": "34",
 
            "id_group": "13",
 
            "encrypted_answers": "..."
 
        }
 
 
     }
 
     }
  
Línea 88: Línea 103:
 
'''Votación de la pregunta X'''
 
'''Votación de la pregunta X'''
  
     {% block body %}
+
     {% block body %}<br/>
     <hX>{% election.nombre %}</hX><br/>
+
     <\h2>{{ election['nombre'] }}<\/h2><br/>
 
     <\hr/><br/>
 
     <\hr/><br/>
     <\p>{% election.descripcion %}<\/p><br/>
+
     <\p>{{ election['descripcion'] }}<\/p><br/>
 
     <\hr/><br/>
 
     <\hr/><br/>
     {% for question in election.preguntas %}
+
     {% for question in election['preguntas'] %}<br/>
         <\p>Pregunta {% question.nombre %}<\/p><br/>  
+
         <\p>Pregunta {{ question['nombre'] }}<\/p><br/>
         <\span>{% question.descripcion %}<\/span><br/>
+
         <\span>{{ question['descripcion'] }}<\/span><br/>
         {% if question.tipo_pregunta == "Cerrada" <br/>
+
         {% if question['tipo_pregunta'] == "Cerrada" %}<br/>
          {% for answer in question.respuestas %}<br/>
+
            <select><br/>
              <select><br/>
+
            {% for answer in question['respuestas'] %}<br/>
                  <option value="{% answer.seleccionada %}">{% answer.texto_pregunta %}<br/>
+
                <option value="{{\answer.seleccionada}}">{{answer['texto_pregunta']}}</option><br/>
              </select><br/>
+
            {% endfor %}<br/>
          {% endfor %}
+
            </select><br/>
          {% if question.tipo_pregunta == "Abierta" %}<br/>
+
        {% endif %}<br/>
              <label...>{% question.texto_pregunta %}</label><br/>
+
        {% if question['tipo_pregunta'] == "Abierta" %}<br/>
              <input value="{% question.answers[0].texto_respuesta" /><br/>
+
            <\p><br/>
          {% endif %}
+
                {{ question['texto_pregunta'] }}<br/>
         {% endif %}
+
                <input id="answer" value="{{ question.respuestas[0].texto_respuesta}}" /><br/>
     {% endfor %}
+
            <\/p><br/>
 +
         {% endif %}<br/>
 +
     {% endfor %}<br/>
 +
    <button>Enviar voto</button><br/>
 
     <\hr/><br/>
 
     <\hr/><br/>
     <button>Siguiente pregunta</button><br/>
+
     {% endblock %}<br/>
  
 
'''Final de la votación de la encuesta'''
 
'''Final de la votación de la encuesta'''
  
     {% block body %}
+
     {% block body %}<br/>
     <hX>{% election.nombre %}</hX><br/>
+
     <\h2>{{ election.nombre }}<\/h2><br/>
 
     <\hr/><br/>
 
     <\hr/><br/>
     <\p>{% election.descripcion %}<\/p><br/>
+
     <\p>{{ election.descripcion }}<\/p><br/>
 
     <\hr/><br/>
 
     <\hr/><br/>
     <\p>Gracias por responder a {% election.nombre %}<\/p><br/>
+
     <\p>Gracias por responder a {{ election.nombre }}<\/p><br/>
 
     <button>Finalizar</button>
 
     <button>Finalizar</button>
 +
    {% endblock %}
 +
 +
Para que pueda mostrarse, se ha tenido que añadir <\ en la mayoría de las etiquetas HTML, así como añadir \answers en el select dentro de la página de votación.
  
 
== Código de respuesta del servidor HTTP ==
 
== Código de respuesta del servidor HTTP ==
Línea 148: Línea 169:
 
|}
 
|}
  
=== Decisiones de diseño ===
+
'''
 +
== Decisiones de diseño ==
 +
'''
  
 
'''Cifrado de los votos'''
 
'''Cifrado de los votos'''
 
Para el cifrado de los votos, se seguirá el siguiente criptosistema. Primero, se recogerá la representación en JSON del voto, siguiendo el siguiente formato:
 
Para el cifrado de los votos, se seguirá el siguiente criptosistema. Primero, se recogerá la representación en JSON del voto, siguiendo el siguiente formato:
  {  
+
  {
    {
+
    "question_id": <id_de_la_pregunta>,
        "question_id": <id_de_la_pregunta>, "response": <respuesta_a_la_pregunta>  
+
    "answer": "<respuesta_a_la_pregunta>"
    },
 
    {
 
        ...
 
    }
 
 
  }
 
  }
  
 
Después, se cifrará el contenido de éste JSON a base64, usando como encodificado UTF-8. Finalmente, se recogerá la clave de cifrado de la votación y se aplicará el cifrado XOR, aplicando XOR a la clave y el string en base64 antes mencionado.
 
Después, se cifrará el contenido de éste JSON a base64, usando como encodificado UTF-8. Finalmente, se recogerá la clave de cifrado de la votación y se aplicará el cifrado XOR, aplicando XOR a la clave y el string en base64 antes mencionado.
 +
 +
== Documentación==
 +
 +
Os dejamos la documentación final del proyecto para que os sirva de ayuda para los próximos años en la asignatura.
 +
 +
Enlace de los documentos: https://mega.nz/#F!C5cSQIBT!8mbrI89vF0l96D0Yby1SJA

Revisión actual del 18:01 14 ene 2018

Objetivo del subsistema

Permitir la votación para las distintas votaciones disponibles en el sistema.

Consideraciones

Resumen del trabajo

Nuestro trabajo consistirá en realizar el apartado de cabina de votación que consiste en permitir mediante el uso de un conjunto de métodos la posibilidad de que los usuarios puedan votar anónimamente teniendo en cuenta las restricciones posibles que puedan existir.

Objetivo del subsistema

Nuestro trabajo consistirá en realizar el apartado de cabina de votación que consiste en permitir mediante el uso de un conjunto de métodos la posibilidad de que los usuarios puedan votar anónimamente teniendo en cuenta las restricciones posibles que puedan existir.

Tecnologías que se usarán: Subsistema: Cabina de votación
Lenguaje/Herramienta: Node.js 9.2 (Javascript v8)
Bibliotecas:
- restify: 6.3.4
- rest: 2.0.0
- lodash: 4.17.4
- async: 2.6.0
Sistema de gestión de bibliotecas: npm
Base de datos: No (Aunque es necesaria alguna forma de verificar los votos a partir del usuario encriptado).

APIs y datos que se usarán y devolverán

Estructura de un voto:

id_user: (int) identificador del usuario que ha votado, es única y es posible verificar el voto [unique, not null]
id_election: (int) identificador de la votación [fk, not null]
encrypted_answers: (string) es un string con el contenido de la votación cifrado.

Consulta de permisos de voto Tipo: GET
URL: http://egc-cabina.es/api/check/vote.json?user=x&election=y
Parámetros:

           user: Nombre de usuario al que comprobar si puede votar
           election: Identificador de la votación a comprobar

Formato JSON Ejemplo, usuario "user" puede votar en "election":

   {
       "result": true,
       "reason": "can_vote"
   }

Otras consideraciones: "reason" determina la razón de por qué no puede votar y pueden ser alguno de los siguientes:

- "can_vote" El usuario puede votar.
- "already_voted" El usuario ha realizado su voto y la votación es de un sólo voto, por lo tanto no podrá votar.
- "cant_vote" El usuario no pertenece a un grupo de votación.
- "user_not_found" El usuario introducido no existe.
- "election_not_found" La votación introducida no existe.
- "election_not_open" La votación no ha abierto todavía el plazo de votación.

Creación de voto: Tipo: POST URL: http://egc-cabina.es/api/create/vote.json Parámetros:

           id_user: (int) Identificador del usuario (sin encriptar)
           id_election: (int) Identificador de la votación
           answers: (list[(int,string)]) Lista que contendrá el par question_id, que es el identificador de la pregunta como int, y answer, que es la respuesta del usuario. La representación de cada par sería la siguiente:
           {
               "question_id": 0,
               "answer": "..."
           }

Formato JSON Ejemplo: Creando un voto por el usuario 23, la votación 34, el grupo de usuarios 13. Se debe enviar:

   {
       "id_user": 23,
       "id_election": 34,
       "answers": [
           {
               "question_id": 0,
               "answer": "Algo"
           },
           {
               "question_id": 1,
               "answer": "Sí"
           }
        ]
   }

La respuesta a esta petición será:

   {
       "result": true,
       "reason": "can_vote"
   }

Plantillas HTML

Se tiene pensado que el formato de la cabina de votación sea el siguiente:

Votación de la pregunta X

   {% block body %}
<\h2>{{ election['nombre'] }}<\/h2>
<\hr/>
<\p>{{ election['descripcion'] }}<\/p>
<\hr/>
{% for question in election['preguntas'] %}
<\p>Pregunta {{ question['nombre'] }}<\/p>
<\span>{{ question['descripcion'] }}<\/span>
{% if question['tipo_pregunta'] == "Cerrada" %}
<select>
{% for answer in question['respuestas'] %}
<option value="Plantilla:\answer.seleccionada">{{answer['texto_pregunta']}}</option>
{% endfor %}
</select>
{% endif %}
{% if question['tipo_pregunta'] == "Abierta" %}
<\p>
{{ question['texto_pregunta'] }}
<input id="answer" value="{{ question.respuestas[0].texto_respuesta}}" />
<\/p>
{% endif %}
{% endfor %}
<button>Enviar voto</button>
<\hr/>
{% endblock %}

Final de la votación de la encuesta

   {% block body %}
<\h2>Plantilla:Election.nombre<\/h2>
<\hr/>
<\p>Plantilla:Election.descripcion<\/p>
<\hr/>
<\p>Gracias por responder a Plantilla:Election.nombre<\/p>
<button>Finalizar</button> {% endblock %}

Para que pueda mostrarse, se ha tenido que añadir <\ en la mayoría de las etiquetas HTML, así como añadir \answers en el select dentro de la página de votación.

Código de respuesta del servidor HTTP

Para nuestra API, hemos definido los siguientes códigos de respuestas del servidor HTTP:

Código Valor result Valor msg Posible motivo
200 true Successfull El usuario ha realizado correctamente el voto
404 false User not found El usuario no ha realizado correctamente el voto
403 false Don't have access El usuario ha realizado correctamente el voto pero no tiene los permisos necesarios para el procesamiento de su voto

Decisiones de diseño

Cifrado de los votos Para el cifrado de los votos, se seguirá el siguiente criptosistema. Primero, se recogerá la representación en JSON del voto, siguiendo el siguiente formato:

{
   "question_id": <id_de_la_pregunta>,
   "answer": "<respuesta_a_la_pregunta>" 
}

Después, se cifrará el contenido de éste JSON a base64, usando como encodificado UTF-8. Finalmente, se recogerá la clave de cifrado de la votación y se aplicará el cifrado XOR, aplicando XOR a la clave y el string en base64 antes mencionado.

Documentación

Os dejamos la documentación final del proyecto para que os sirva de ayuda para los próximos años en la asignatura.

Enlace de los documentos: https://mega.nz/#F!C5cSQIBT!8mbrI89vF0l96D0Yby1SJA