diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 0000000..ddacffa --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,66 @@ +Política de privacidade +======================= + +### 1\. Do direito à privacidade + +A Lei 13709/2018 - Lei Geral de Proteção de Dados (LGPD) estabelece como fundamento o respeito à privacidade. A privacidade é um direito conferido a todo indivíduo e consiste na habilidade que este tem de controlar a exposição de informações sobre sua vida pessoal, sua intimidade, bem como a disponibilidade de dados sobre si mesmo, de retificar, ratificar ou apagar estes e de proteger a confidencialidade de suas comunicações, seu domicílio, sua imagem, honra e reputação perante terceiros. Desse modo, a presente Política de Privacidade (“Política”) tem o propósito de comunicar de forma simples quais tipos de dados pessoais serão coletados, quando, de que forma e para quais finalidades serão utilizados. + +Quando o usuário aceita esta Política de Privacidade, confere sua livre e expressa concordância com os termos aqui estipulados, diretamente ou por meio de seu responsável legal, que deve estar ciente também das regras aqui estabelecidas + +Este documento tem a finalidade de estabelecer a Política de Privacidade e os Termos de Uso. + +### 2. Do propósito da coleta, uso e armazenamento das informações do usuário + +A coleta, uso e armazenamento das suas informações têm como propósitos: + +* promover os serviços da Universidade, além de informar sobre novidades, conteúdos e demais informações relevantes; +* armazenar preferências de usuário com relação a interface do aplicativo; +* facilitar a organização do estudante durante o semestre letivo. +* oferecer uma função opcional de automatização da sincronização do saldo do restaurante universitário, mediante a utilização do RA/CPF e senha do SIGA. Quando habilitada, essas informações serão armazenadas de forma segura no secure storage, a fim de possibilitar a sincronização automática do saldo do restaurante universitário no UFSCar Planner. + +Quando você usa o aplicativo, alguns dos dados inseridos são salvos localmente no seu dispositivo, enquanto outros não serão salvos. Logo, os dados inseridos no aplicativo são exclusivamente de seu acesso. + +### 3. Sobre os dados tratados + +| Dados Coletados | Dado Obrigatório | Dado Armazenado | Finalidade | Bases Legais | +| --- | --- | --- | --- | --- | +| Campus | Sim | Sim | Identificação necessária à operação do sistema e aos serviços prestados por meio dele. | O tratamento dos dados é amparado nos parágrafos I e III, art.7 da Lei Nº 13.709, DE 14 DE AGOSTO DE 2018 que diz:Art. 7º O tratamento de dados pessoais somente poderá ser realizado nas seguintes hipóteses:I - mediante o fornecimento de consentimento pelo titular;...III - pela administração pública, para o tratamento e uso compartilhado de dados necessários à execução de políticas públicas previstas em leis e regulamentos ou respaldadas em contratos, convênios ou instrumentos congêneres, observadas as disposições do Capítulo IV desta Lei; | +| CPF | Não | Opcional\* (armazenado no secure storage apenas caso o usuário aceite e ative a função de sincronização automatica de saldo) | Dado necessário para a automatização da sincronização do saldo do restaurante universitário, quando habilitada pelo usuário. Dado necessário a integração do UFSCar Planner ao Sistema de Gestão Acadêmica. | Consentimento do titular\*\* | +| RA | Não | Opcional\* (armazenado no secure storage apenas caso o usuário aceite e ative a função de sincronização automatica de saldo) | Dado necessário para a automatização da sincronização do saldo do restaurante universitário, quando habilitada pelo usuário.Dado necessário a integração do UFSCar Planner ao Sistema de Gestão Acadêmica. | Consentimento do titular\*\* | +| Senha do Sistema SIGA | Não | Opcional\* (armazenado no secure storage apenas caso o usuário aceite e ative a função de sincronização automatica de saldo) | Dado necessário para a automatização da sincronização do saldo do restaurante universitário, quando habilitada pelo usuário. Dado necessário a integração do UFSCar Planner ao Sistema de Gestão Acadêmica. | Consentimento do titular\*\* | +| Fuso-horário | Não | Não | Aprimorar a interação do usuário com o sistema | +| Apelido | Sim | Sim | Tornar o uso do sistema mais acolhedor ao usuário. | +| Notas | Não | Sim | Sendo uma plataforma de organização universitária, o tratamento desse tipo de dado faz parte dos serviços prestados por meio do UFSCar Planner. | +| Frequências | Não | Sim | Sendo uma plataforma de organização universitária, o tratamento desse tipo de dado faz parte dos serviços prestados por meio do UFSCar Planner. | +| Eventos | Não | Sim | Sendo uma plataforma de organização universitária, o tratamento desse tipo de dado faz parte dos serviços prestados por meio do UFSCar Planner. | +| Saldo atual da _carteirinha do restaurante universitário_ | Não | Sim (armazenado no secure storage) | Sendo uma plataforma de organização universitária, o tratamento desse tipo de dado faz parte dos serviços prestados por meio do UFSCar Planner. | +| Valor padrão da refeição do restaurante universitário | Não | Sim | Sendo uma plataforma de organização universitária, o tratamento desse tipo de dado faz parte dos serviços prestados por meio do UFSCar Planner. | +| Disciplinas a que o usuário está vinculado | Não | Sim | Sendo uma plataforma de organização universitária, o tratamento desse tipo de dado faz parte dos serviços prestados por meio do UFSCar Planner. | + +\* O fornecimento do CPF, RA e Senha do sistema SIGA é opcional e requer o consentimento do titular. + +\*\* O tratamento do CPF, RA e Senha do sistema SIGA para a automatização da sincronização do saldo do restaurante universitário é realizado com base no consentimento do titular. O usuário pode optar por habilitar essa função no UFSCar Planner e fornecer seu CPF, RA e Senha do SIGA, cientes de que essas informações serão armazenadas de forma segura no secure storage e utilizadas exclusivamente para a finalidade de automatização da sincronização do saldo do restaurante universitário. + +### 4. Gestão e segurança das informações do usuário + +Os dados sensíveis, como CPF, RA e Senha do SIGA, fornecidos pelo usuário para a automatização da sincronização do saldo do restaurante universitário serão armazenados de forma segura no secure storage. + +Os dados sobre os deferimentos do usuário serão obtidos após a verificação de seu vínculo com a Instituição, utilizando os dados relacionados a esta inseridos pelo usuário voluntariamente. + +As informações são protegidas com padrões de segurança e confidencialidade, para fornecer aos usuários um ambiente seguro e confiável através do uso de criptografia, certificações digitais e acessos controlados. + +### 5\. Cookies Utilizados + +O aplicativo não utiliza cookies. + +### 6\. Compartilhamento + +Os dados coletados e enviados para o Google Analytics são anonimizados, fora isto o aplicativo não compartilha dados com terceiros. + +### 7. Disposições Finais + +As disposições constantes desta Política de Privacidade estão sujeitas à melhoria e ao aprimoramento contínuo e podem ser atualizadas ou modificadas a qualquer momento, de forma unilateral ou em razão de lei, cabendo ao usuário, ou a seu responsável legal, caso seja menor de idade, o dever de ciência de seu teor no momento do acesso aos sites e plataformas de sistemas da instituição. É recomendado que a leitura periódica desta Política seja realizada para fins de atualização e conhecimento de direitos e obrigações. + +### 8. Contato + +Caso tenha alguma dúvida ou sugestão sobre esta Política de Privacidade, não hesite em nos contatar através do email petbcc@ufscar.br. diff --git a/helpers/balance.ts b/helpers/balance.ts index ad72f9d..7f2de76 100644 --- a/helpers/balance.ts +++ b/helpers/balance.ts @@ -1,4 +1,36 @@ +import { Dispatch } from "redux"; +import { UpdateUserAction, updateUser } from "../redux/actions/userActions"; import { User } from "../redux/types/user"; +import * as SecureStore from "expo-secure-store"; + +/** + * Define o token no SecureStore. + * @param token - O token para definir. + * @returns `true` sse a operação foi um sucesso. + */ +async function setRuAuthToken(token: string): Promise { + if (!await SecureStore.isAvailableAsync()) { return false; } + await SecureStore.setItemAsync("ufscarplanner.user.ruauth", token); + return true; +} + +/** + * Apaga o token no SecureStore. + */ +async function deleteRuAuthToken(): Promise { + if (await SecureStore.isAvailableAsync()) { + SecureStore.deleteItemAsync("ufscarplanner.user.ruauth"); + } +} + +/** + * Extrai o token do SecureStore. + * @returns O token extraído, ou nulo se não existir. + */ +async function getRuAuthToken(): Promise { + if (!await SecureStore.isAvailableAsync()) { return null; } + return await SecureStore.getItemAsync("ufscarplanner.user.ruauth"); +} const URL = "https://sistemas.ufscar.br/sagui-api/integracoes/pwacesso/consultar-saldo"; @@ -23,13 +55,47 @@ export function isBalanceSyncEnabled(user: User): boolean { } /** - * Tenta obter o saldo pela API. - * @param user - O usuário para autenticar a API. + * Altera o estado da sincronização. + * @param user - O objeto de usuário para submeter ao estado. + * @param token - O token de autorização da API. + * @param dispatch - A função de dispatch do estado. + */ +export async function enableBalanceSync( + user: User, + token: string, + dispatch: Dispatch, +) { + if (await setRuAuthToken(token)) { + dispatch(updateUser({ ...user, balanceSyncToken: "" })); + } else { + dispatch(updateUser({ ...user, balanceSyncToken: token })); + } +} + +/** + * Desabilita a sincronização. + * @param user - O objeto de usuário para submeter ao estado. + * @param dispatch - A função de dispatch do estado. + */ +export async function disableBalanceSync( + user: User, + dispatch: Dispatch, +) { + await deleteRuAuthToken(); + const newUser = { ...user }; + delete newUser.balanceSyncToken; + dispatch(updateUser(newUser)); +} + +/** + * Tenta obter o saldo pela API usando o token diretamente. + * @param token - O token para autenticar. * @returns O saldo, ou uma string de erro em caso de erro. */ -export async function tryGetBalance(user: User): Promise { - if (!isBalanceSyncEnabled(user)) { return BalanceErr.DISABLED; } - const headers = { Authorization: "Basic " + user.balanceSyncToken }; +export async function tryGetBalanceWithToken( + token: string, +): Promise { + const headers = { Authorization: "Basic " + token }; const response = await fetch(URL, { headers }); if (response.status == 200) { try { @@ -48,3 +114,23 @@ export async function tryGetBalance(user: User): Promise { return BalanceErr.UNKNOWN; } } + +/** + * Tenta obter o saldo pela API, usando o SecureStore caso necessário. + * @param user - O usuário para autenticar a API. + * @returns O saldo, ou uma string de erro em caso de erro. + */ +export async function tryGetBalance(user: User): Promise { + if (!isBalanceSyncEnabled(user)) { return BalanceErr.DISABLED; } + if (user.balanceSyncToken == "") { + const token = await getRuAuthToken(); + if (token === null) { + // O token sumiu do SecureStore! + return BalanceErr.UNKNOWN; + } else { + return await tryGetBalanceWithToken(token); + } + } else { + return tryGetBalanceWithToken(user.balanceSyncToken as string); + } +} diff --git a/package.json b/package.json index 375bbd3..a355aaf 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "expo-device": "^5.2.1", "expo-linear-gradient": "~12.1.2", "expo-notifications": "~0.18.1", + "expo-secure-store": "^12.1.1", "expo-status-bar": "~1.4.4", "expo-updates": "^0.16.4", "lodash.debounce": "^4.0.8", diff --git a/redux/types/user.ts b/redux/types/user.ts index 3cc66e4..72a5a57 100644 --- a/redux/types/user.ts +++ b/redux/types/user.ts @@ -40,6 +40,9 @@ export type User = { /** * O token de autorização Basic do usuário para sincronização do RU. Não é * definido se a sincronização estiver desativada. + * + * Se a sincronização estiver ativada e o token for amazenado no armazenamento + * seguro, o valor deste campo é igual à string vazia. */ balanceSyncToken?: string, } diff --git a/screens/Dashboard.js b/screens/Dashboard.js index 5762255..c24ac27 100644 --- a/screens/Dashboard.js +++ b/screens/Dashboard.js @@ -9,9 +9,8 @@ import ScrollView from "./../components/ScrollView"; import Progress from "../components/Progress"; import TextTicker from "react-native-text-ticker"; import { SIGA } from "../helpers/helper"; -import { isBalanceSyncEnabled } from "../helpers/balance"; +import { disableBalanceSync, isBalanceSyncEnabled } from "../helpers/balance"; import { Button, Portal, Dialog } from "react-native-paper"; -import { updateUser } from "../redux/actions/userActions"; import Toast from "react-native-toast-message"; export default function Dashboard() { @@ -277,11 +276,9 @@ export default function Dashboard() { Cancelar