Ir para o conteúdo

Rankings


Conteúdo Popular

A mostrar o conteúdo com mais reputação desde 18-10-2017 em todas as áreas

  1. 3 pontos
    Para tornar este tópico menos político e mais prático, vou responder a esta questão: Por experiência própria, ainda tem tem bastante impacto. Qualquer software que trate/processe dados pessoais pode implementar estes pontos para ajudar o utilizador a cumprir com o regulamento: - impressão de pedidos de autorização para armazenamento de dados pessoais das diversas entidades; - direito a ser esquecido a pedido das entidades; - pseudonimizar dados pessoais (esconder dados pessoais a utilizadores que não necessitam de vê-los. Ex: mostrar apenas o código ou o primeiro nome ao utilizador que está a processar salários); - eliminar dados pessoais que já não são necessários (rotinas automáticas ou a pedido); - direito ao acesso e portabilidade dos dados (por exemplo exportar a ficha do cliente para um ficheiro); - proteção de dados pessoais (acessos condicionados na aplicação, boas práticas na política de passwords) - registo de acesso e tratamento de dados pessoais (por exemplo um log) Gostava que partilhassem outras experiências práticas de implementação do GDPR nas aplicações que desenvolvem.
  2. 3 pontos
    Ok, lembrei-me de uma forma de carregar a imagem. Faço notar, no entanto, que este não é um método eficiente! Essencialmente recorri a umas units muito úteis da FCL - um conjunto de units do Free Pascal que não fazem parte do "pacote de base" (RTL) - e à unit wingraph, uma melhoria da velhinha graph dos tempos do Turbo Pascal. Esta última é freeware e pode ser encontrada aqui. program CLIImage; uses fpreadbmp, fpimage, // Free Pascal FCL wingraph; // http://math.ubbcluj.ro/~sberinde/wingraph/ var image : TFPCustomImage; // Stream onde fica carregada a imagem reader : TFPCustomImageReader; // Leitor de imagens BMP driver, mode : smallint; // Para a janela gerada pelo 'wingraph' x, y : integer; // Coordenadas begin image := TFPMemoryImage.Create(500, 500); // Imagem 500x500 reader := TFPReaderBMP.Create; image.LoadFromFile('image.bmp', reader); // Leitura do ficheiro de imagem 'imagem.bmp' reader.Free; DetectGraph(driver, mode); // Inicialização da janela do 'wingraph' mode := m800x600; // Janela 800x600 será suficiente InitGraph(driver, mode, ''); // Gera a janela { Coloca a imagem na janela - é preciso converter o código RGB numa Color entendida pelo 'wingraph' } for y := 0 to image.Height-1 do for x := 0 to image.Width-1 do PutPixel(x, y, GetRGBColor(image.Colors[x,y].Red, image.Colors[x,y].Green, image.Colors[x,y].Blue)); readln; // Pausa do programa CloseGraph; // Fecha a janela do 'wingraph' image.Free; // Liberta recursos da imagem - OBRIGATÓRIO! end. Ainda assim, continuo a sugerir que, para este tipo de fins, se usem aplicações GUI em vez de CLI uma vez que isto é já uma arte arcaica e que, mais dia menos dia, deixará de ser praticável. Cumprimentos.
  3. 3 pontos
    Retirado da pagina que não consegues ver. Parâmetros de invocação da aplicação: Opção Opção extendida Descrição Obrigatório Exemplo de utilização Validações -XMS - Define o tamanho inicial e mínimo de memória para iniciar a aplicação. É definido através de um inteiro seguido da unidade de memória que este representa. Os valores possíveis para a unidade de memória são: g|G|m|M|k|K. Este valor terá de ser indicado antes do parâmetro "-jar". Não -XMS64m - -XMX - Define o tamanho máximo de memória que a aplicação poderá utilizar. É definido através de um inteiro seguido da unidade de memória que este representa. Valores possíveis para a unidade de memória: g|G|m|M|k|K. Este valor terá de ser indicado antes do parâmetro "-jar". Não -XMX1024m - -jar - Define o ficheiro jar onde se encontra a aplicação de envio de ficheiro SAF_T (PT). Caso o caminho para o ficheiro jar contenha espaços este terá de ser delimitado por aspas. Sim -jar FACTEMICLI-[VERSAO]-cmdClient.jar - -n --nif Define o NIF do comerciante para o qual se pretende enviar o ficheiro SAFT-T (PT) e que será utilizado para autenticação no portal. Poderá ser definido o sub-utilizador, através da seguinte formatação 123456789/1. Sim -i 123456789 -Terá de ser um NIF válido. -p --password Password do utilizador, no Portal das Finanças, para o qual se pretende realizar o envio de ficheiro SAF-T (PT). Sim -n xxxxxxxxx - Password terá de ser válida para o contribuinte em questão. -a --ano Ano a que se refere o ficheiro SAF-T(PT) a enviar. Sim -a 2013 - Terá de ser um valor numérico; - Dimensão igual a 4. -m --mes Mês a que se refere o ficheiro SAF-T(PT) a enviar. Sim -m 01 - Terá de ser um valor numérico; - Dimensão igual a 2. -op --operacao Indicação da operação que se pretende realizar, com um dos seguintes valores: - "validar": Valida o ficheiro SAF-T(PT) definido no parâmetro '-i'; - "enviar": Envia o ficheiro SAF-T(PT), definido no parâmetro '-i', para a AT. Sim -op enviar - O valor definido para a operação terá de ser um dos especificados. -i --input Indicação do caminho para o ficheiro SAF-T (PT) que pretende enviar/validar para a AT. Se o caminho contiver espaços este terá de ser delimitado por aspas. Sim -i "c:\Ficheiro saft-t (pt).xml" - Ficheiro tem de existir em disco. -v --version Indicação do formato de ficheiro a enviar, com um dos seguintes valores: - "R02": Portaria n.º 160/2013 (versão 1.02_01). - "R03": Portaria n.º 274/2013 (versão 1.03_01). - "R04": Portaria n.º 302/2016 (versão 1.04_01). Por omissão o formato de envio terá o valor "R04". O formato "R01" (Portaria n.º 1192/2009 (versão 1.01_01)) deixou de ser aceite a partir de 1 de Abril de 2014. Não -v R02 - O valor definido para o formato terá de ser um dos especificados. -o --output Indicação do caminho para o ficheiro onde será escrito o resultado do envio do ficheiro SAF-T (PT). Se o caminho contiver espaços este terá de ser delimitado por aspas. Por omissão escreve para a consola onde foi iniciado o envio. Não -o "c:\Ficheiro resultado.xml" -Pasta onde será colocado o ficheiro terá de existir em disco. -r --resumido Indicação do caminho para o ficheiro onde será escrito o ficheiro resumido. Se o caminho contiver espaços este terá de ser delimitado por aspas. Por omissão escreve o ficheiro na mesma directoria e nome, com sufixo 'resumido', do ficheiro definido no parâmetro '-i'. Não -r "c:\Ficheiro resumido.xml" - -t --testes Indicação de que se trata de um envio de testes, devendo o ficheiro ser ignorado para processamento. Não -t -h --help Imprime a listagem com todo os parâmetros existentes, bem como um exemplo de utilização. Não -h Exemplos de utilização: A configuração mínima para proceder ao envio do ficheiro SAF-T (PT) é a seguinte: java -jar FACTEMICLI-[VERSAO]-cmdClient.jar -n 123456789 -p xxxxxxxxx -a 2013 -m 01 -op enviar -i "C:\caminho para ficheiro\Nome_ficheiro.xml" Caso seja pretendido é possível indicar um ficheiro de saída para onde será escrito o resultado do processamento ou alterar a quantidade de memoria utilizada: java -Xms:256m -Xmx:1024m -jar FACTEMICLI-[VERSAO]-cmdClient.jar -n 123456789/14 -p xxxxxxxxx -a 2013 -m 01 -op enviar -i "C:\caminho para ficheiro\Nome_ficheiro.xml" -o "C:\caminho para ficheiro\Nome_ficheiro_saida.xml" Estrutura de resposta (XML) Nesta secção descreve-se a estrutura e informação da resposta ao envio de ficheiro SAF-T (PT) através do aplicativo batch. A especificação XSD da resposta enviada pelo servidor é a seguinte: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="response"> <xs:complexType> <xs:choice> <xs:element name="errors" type="errorType" minOccurs="1"/> <xs:sequence> <xs:element name="totalFaturas" type="xs:string" maxOccurs="1" minOccurs="1"></xs:element> <xs:element name="totalCreditos" type="xs:string" maxOccurs="1" minOccurs="1"></xs:element> <xs:element name="totalDebitos" type="xs:string" maxOccurs="1" minOccurs="1"></xs:element> <xs:element name="warning" type="xs:string" maxOccurs="1" minOccurs="0"></xs:element> <xs:element name="idFicheiro" type="xs:string" maxOccurs="1" minOccurs="0"></xs:element> <xs:element name="nomeFicheiro" type="xs:string" maxOccurs="1" minOccurs="1"></xs:element> <xs:element name="createdDate" type="xs:string" maxOccurs="1" minOccurs="1"></xs:element> </xs:sequence> </xs:choice> <xs:attribute name="code" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:complexType name="errorType"> <xs:sequence> <xs:element name="error" type="xs:string" maxOccurs="unbounded" minOccurs="1"/> </xs:sequence> </xs:complexType> </xs:schema> Exemplo de resposta de sucesso no envio do ficheiro SAF-T (PT). No caso de o ficheiro ser aceite mas com alguma condicionante, será colocada uma mensagem de "warning". <?xml version="1.0" encoding="ISO-8859-1"?> <response code="200"> <totalFaturas>10</totalFaturas> <totalCreditos>1234.56</totalCreditos> <totalDebitos>12.34</totalDebitos> <warning>Devido a todas as faturas serem anteriores a 1/Jan/2013 o ficheiro não será considerado para processamento.</warning> <idFicheiro>123</idFicheiro> <nomeFicheiro>saft-pt.xml</nomeFicheiro> <createdDate>2013-02-01 15:17:54</createdDate> </response> Exemplo de resposta quando existe um erro no envio ou validação do ficheiro SAF-T (PT). <?xml version="1.0" encoding="ISO-8859-1"?> <response code="-3"> <errors> <error>NIF do comerciante ('123456789') é diferente do NIF declarado no ficheiro SAF-T PT ('987654321').</error> </errors> </response> Códigos de resposta existentes Código de Resposta Mensagem de erro Descrição do erro -1 Ocorreu um erro durante o envio do ficheiro. Erro genérico na comunicação entre cliente e servidor. -2 O ficheiro recebido não tem o mesmo tamanho que o ficheiro enviado. Tamanho do ficheiro declarado no header pelo programa cliente não corresponde ao tamanho real enviado -3 Mensagem específica da validação que não está a ser respeitada. A mensagem de resposta para este erro é variável, estando a sua mensagem de erro dependente da validação que não é respeitada -4 Ocorreu um erro durante o envio do ficheiro. Erro ao inserir o ficheiro na base de dados -5 O ficheiro selecionado já foi enviado para a AT. Cenário em um ficheiro idêntico foi previamente enviado para a AT. -6 Erro no processo de conversão. Este erro ocorre caso exista algum problema durante o processo de conversão. É apresentada mensagem complementar indicando a origem do erro. -7 O cliente de linha de comandos que está a utilizar não se encontra atualizado. Por favor aceda ao portal e-fatura e obtenha a nova versão. Caso o cliente linha de comando que se encontra a utilizar não seja a versão mais actual. -8 O ficheiro resumido não pode ser o mesmo que o ficheiro seleccionado para envio. Caso em que o ficheiro indicado no parâmetro -i (ficheiro SAF-T (PT) a enviar para a AT) é o mesmo que o indicado pelo parâmetro -r (localização do ficheiro resumido). -9 Para poder entregar o SAF-T na versão que indicou necessita de atualizar o cliente de linha de comandos. Para isso, por favor, aceda ao portal e-fatura e obtenha a nova versão. Caso o cliente linha de comando que se encontra a utilizar não seja a versão mais actual para o formato de SAF-T que está a entregar. -401 Login failed for user 123456789. ERROR CODE: <ERRO ANTENTICAÇÃO> Quando ocorre um erro na autenticação do servidor -666 Ocorreu um erro. Erro não categorizado durante o processo de envio. É apresentada uma mensagem descritiva do erro. 200 - Sucesso no envio do ficheiro
  4. 2 pontos
    Aqui está a última versão da estrutura XML usada em Portugal para exportar o ficheiro SEPA: https://www.bportugal.pt/sites/default/files/sepa-manual-c2b-xml-022016-en.pdf Estamos a comparar se este ficheiro corresponde ao LibSEPA que já usamos para a Alemanha (https://libsepa.com/de/) ou se precisa de ajustes. O validador para as exportações eu encontrei aqui no fórum mesmo (ainda não testamos para ver se funciona): https://www.mobilefish.com/services/sepa_xml_validation/sepa_xml_validation.php
  5. 2 pontos
    Não que tenha grande interesse para a discussão em causa, mas mais para conhecimento, através da base de dados do IMT (consulta pela matrícula da viatura) consegues ver o nome e morada do proprietário, NIF, tipo e número do documento de identificação. Caso queiras saber o nome de uma pessoa pelo NIF vais ao portal das finanças e vais a Consultar/ Identificação de clientes/fornecedores e consegues ver o nome, o serviço de finanças e os dados relativos à actividade.
  6. 2 pontos
    That error is usually returned when your clock time is not in sync with theirs. To ensure this, you should always sync yours with Observatório Astronómico de Lisboa, using their ntp servers. Another possible cause, might be that their servers are on heavy loading, taking to long to parse your request, resulting also in a clock time difference between the time you issue the request and the time it is processed.
  7. 2 pontos
    Um resumo interessante de soluções de backup de vários tipos que encontrei na net: https://wiki.archlinux.org/index.php/Synchronization_and_backup_program (maioritariamente útil para sistema Linux). Aproveitava para deixar a questão: que soluções de backup usam/recomendam? Pessoalmente, faço essencialmente backups de uma máquina macOS, onde uso 3 métodos de backup: TimeMachine para backup incremental regular/automático de quase todo o sistema de ficheiros (para dois NAS locais). borg para backup incremental regular/automático das pastas mais importantes (para um NAS local e um servidor remoto). cópias manuais para documentos que não posso mesmo perder (para NAS local, sincronizado com a cloud). Entre as soluções automáticas, não confio muito no TimeMachine pois por vezes em caso de falha de rede ou dos NAS o backup fica corrompido. Mas contornei o problema com snapshots do sistema de ficheiros num dos NAS. Agrada-me a simplicidade da solução, que torna fácil verificar se consigo recuperar ficheiros. Não é lá muito eficiente em termos de espaço, pois mover um ficheiro significa que o mesmo será duplicado no backup. Estou bastante satisfeito com o borg, por ser bastante eficiente e funcional (compressão, deduplicação, reinício de backups interrompidos, cifragem, filtros, etc.). Apesar de nunca ter tido de recuperar dados, as validações periódicas dos backups não têm detectado qualquer problema. Para além disso faço backups completos de dados importantes e configurações de outras máquinas, essencialmente com scripts Bash para automatizar as tarefas (comprimir, cifrar, gerir versões, copiar entre máquinas). Os mais importantes também envio para a cloud. Ultimamente tenho lido algumas coisas sobre o restic, e também me parece um solução interessante (similar ao borg, mas com menos limitações relativamente ao local onde os backups são armazenados). Uma solução que provavelmente considerarei em backups para a cloud.
  8. 2 pontos
    Acho que o melhor é pensares num preço por hora, e depois orçamentares em função do tempo que costumas perder com o serviço. Se tiveres outras despesas para além do tempo (deslocações, material, etc.), também devem ser adicionados ao preço. É claro que depois temos então a questão de qual é o preço razoável por hora. Isto depende de muita coisa, por exemplo, complexidade do serviço, urgência, concorrência que tens, o teu interesse em ficar com o serviço, os impostos que pagas, as provas de experiência que tens... Pessoalmente, dificilmente pagaria mais de 25€/hora por serviços do género de migração de domínios (ou até de setup de um website num CMS qualquer) a alguém que está a fazer isto como extra. E para pagar isso, já teria que ser alguém com provas de saber fazer as coisas muito bem. Mas em último caso fazia eu o serviço, e não ganho 25€/hora líquidos, por isso ainda ficava a ganhar. Se tens um cliente que não sabe fazer as coisas, que precisa urgentemente do serviço, e as alternativas que ele tem forem empresas que cobram >50€/hora, podes conseguir cobrar mais do que os 25€/hora. Por outro lado, eu nem por 30€/hora faria serviços extra. É que por 30€/hora, depois de retirados os impostos, e tendo em conta as chatices que posso ter com burocracias (essencialmente Finanças), mais vale estar quieto, sobretudo se forem serviços pequenos. Estas considerações são para o caso de serviços com recibo (potencialmente acresce IVA aos preços dados). Caso contrário acho que os valores podem descer bastante (quer com o que poupas em impostos, sobretudo se estiveres já num escalão elevado, quer por não teres que perder tempo com burocracias). EDIT: Tens aqui um tópico antigo bastante detalhado sobre o assunto: https://www.portugal-a-programar.pt/forums/topic/4489-gestão-de-projectos-orçamentos/ (diria que o preços por hora apresentados estão desactualizados, contudo).
  9. 2 pontos
    Para quem anda à procura de informação sobre GDPR, a CNPD também tem alguns conteúdos no seu site, como orientações e FAQs: https://www.cnpd.pt/bin/rgpd/rgpd.htm
  10. 2 pontos
    I managed to send a valid request generating those openssl commands in PHP (using shell_exec and reading the resulting files back). I cheated a little bit in the -K parameter by using bin2hex. You write that you are you transforming the hex result of openssl rand into the byte equivalent. How are you achieving that? That might be the answer. shell_exec('openssl x509 -inform pem -outform pem -in certs/ChaveCifraPublicaAT.cer -pubkey -noout > certs/ChaveCifraPublicaAT2020_aux.pem'); shell_exec('openssl rand 16 -out rand.txt'); $key = file_get_contents('rand.txt'); shell_exec('openssl rsautl -encrypt -inkey certs/ChaveCifraPublicaAT2020_aux.pem -pubin -in rand.txt -out fileWithResult.txt'); shell_exec('openssl enc -base64 -in fileWithResult.txt -out fileWithBASE64Result.txt'); $nonce = file_get_contents('fileWithBASE64Result.txt'); file_put_contents('fileWithCreatedInside.txt', gmdate('Y-m-d\TH:i:s\Z')); shell_exec('openssl enc -base64 -aes-128-ecb -K '.bin2hex($key).' -in fileWithCreatedInside.txt -out fileWithENCCreatedInside.txt'); file_put_contents('fileWithPasswordInside.txt', 'mypassword'); shell_exec('openssl enc -base64 -aes-128-ecb -K '.bin2hex($key).' -in fileWithPasswordInside.txt -out fileWithENCPasswordInside.txt');
  11. 2 pontos
    Olá a todos! Estamos a tentar usar os Webservices referentes ao STADA Exportação. Finalmente hoje enviaram-nos um certificado para o sistema de testes sem o WSDL (apesar de já o ter pedido) e foi assim que cheguei a este fórum através do nome do ficheiro do certificado. Alguém tem experiência com o STADA Exportação ou consegue arranjar o WSDL? Para adiantar a parte da autenticação estou a tentar enviar umas faturas para o ambiente de testes e estou sempre a obter o famoso <?xml version='1.0' ?> <env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'> <env:Body> <env:Fault> <faultcode>env:Client</faultcode> <faultstring>Internal Error</faultstring> </env:Fault> </env:Body> </env:Envelope> Hoje estive na luta e consegui finalmente enviar alguma coisa para o servidor de testes. Basicamente a luz acendeu quando passei o parâmetro encoding com UTF-8 nas opções de encoding do SoapClient e devolveu um erro diferente de Internal Error. A partir daí foi dar marteladas atrás de marteladas, ler coisas neste tópico, tratar da autenticação e embrulhar Para quem esteja a chegar agora e trabalhe com PHP fica aqui o código com o SoapClient e phpseclib (não usa mcrypt que foi descontinuado nas versões mais recentes e é considerado inseguro). Este exemplo é para as guias de transporte. Eu vou estar a trabalhar com outros webservices que não estão no site das finanças referentes ao STADA Exportação portanto espero que a autenticação seja igual!! Neste caso estou a usar composer para instalar a dependência do phpseclib portanto terão de adaptar ao vosso código! 1. Obter os certificados do Portal das Finanças. 2. Pegar no ficheiro TesteWebservices.pfx, converter para o formato PEM e copiar o resultado para uma pasta acessível pelo vosso script (no meu caso a pasta certs). A password é TESTEwebservice. O comando irá retirar a password do ficheiro portanto não será necessária no código. openssl pkcs12 -in TesteWebservices.pfx -out TesteWebservices.pem -nodes 3. Copiar o ficheiro da chave pública da AT que está no link indicado no número 1 para a pasta do vosso script. 4. Personalizar o código em baixo com as vossas credenciais, caminhos e endpoints no array $options. <?php require 'vendor/autoload.php'; use phpseclib\Crypt\AES; use phpseclib\Crypt\Random; use phpseclib\Crypt\RSA; use phpseclib\File\X509; $transport = new stdClass(); $transport->TaxRegistrationNumber = '599999993'; $transport->CompanyName = 'Nome Empresa Lda'; $transport->CompanyAddress = new stdClass(); $transport->CompanyAddress->Addressdetail = 'Rua da Empresa, 123'; $transport->CompanyAddress->City = 'Maia'; $transport->CompanyAddress->PostalCode = '4470-263'; $transport->CompanyAddress->Country = 'PT'; $transport->DocumentNumber = bin2hex(openssl_random_pseudo_bytes(8)); $transport->MovementStatus = 'N'; $transport->MovementDate = date('Y-m-d'); $transport->MovementType = 'GT'; $transport->CustomerName = 'Nome Cliente Lda'; $transport->CustomerTaxID = 599999993; $transport->CustomerAddress = new stdClass(); $transport->CustomerAddress->Addressdetail = 'Local'; $transport->CustomerAddress->City = 'Lisboa'; $transport->CustomerAddress->PostalCode = '2775-089'; $transport->CustomerAddress->Country = 'PT'; $transport->AddressFrom = new stdClass(); $transport->AddressFrom->Addressdetail = 'Local carga'; $transport->AddressFrom->City = 'Maia'; $transport->AddressFrom->PostalCode = '4470-263'; $transport->AddressFrom->Country = 'PT'; $transport->AddressTo = new stdClass(); $transport->AddressTo->Addressdetail = 'Local entrega'; $transport->AddressTo->City = 'Lisboa'; $transport->AddressTo->PostalCode = '2775-089'; $transport->AddressTo->Country = 'PT'; $transport->VehicleID = '00-00-KK'; $transport->MovementStartTime = date('Y-m-d\TH:i:s', mktime(date('H') + 1, date('i'), 0, date('m'), date('d'), date('Y'))); $transport->MovementEndTime = date('Y-m-d\TH:i:s', mktime(date('H') + 5, date('i'), 0, date('m'), date('d'), date('Y'))); $transport->Line = []; $transport->Line[] = (function () { $line = new stdClass(); $line->ProductDescription = 'prod1'; $line->Quantity = 1; $line->UnitOfMeasure = 'Kg'; $line->UnitPrice = 11; return $line; })(); $transport->Line[] = (function () { $line = new stdClass(); $line->ProductDescription = 'prod2'; $line->Quantity = 1; $line->UnitOfMeasure = 'Kg'; $line->UnitPrice = 12; return $line; })(); $wsdl = 'wsdl/documentosTransporte.wsdl'; $options = [ 'local_cert' => 'certs/TesteWebservices.pem', 'encoding' => 'utf-8', 'soap_version' => SOAP_1_2, 'at_username' => '599999993/37', 'at_password' => 'testes1234', 'at_public_key' => 'certs/ChavePublicaAT.cer', 'location' => 'https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte', 'uri' => 'https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte', ]; $client = new SoapClientAT($wsdl, $options); var_dump($client->envioDocumentoTransporte($transport)); /** * Class SoapClientAT */ class SoapClientAT extends SoapClient { /** * @var array|null */ private $options = null; /** * SoapClientAT constructor. * @param string $wsdl * @param array $options */ public function __construct($wsdl, $options) { $this->options = $options; parent::__construct($wsdl, $options); } /** * @param DOMDocument $document * @return DOMElement */ private function createHeaderNode($document) { $publicKey = $this->options['at_public_key']; if (is_file($publicKey)) { $publicKey = file_get_contents($publicKey); } $key = Random::string(16); $certificate = new X509(); $certificate->loadX509($publicKey); $rsa = new RSA(); $rsa->loadKey($certificate->getPublicKey()); $rsa->setEncryptionMode(RSA::ENCRYPTION_PKCS1); $nonce = $rsa->encrypt($key); $cipher = new AES(AES::MODE_ECB); $cipher->setKey($key); $password = $cipher->encrypt($this->options['at_password']); $created = $cipher->encrypt(gmdate('Y-m-d\TH:i:s\Z')); $usernameToken = $document->createElement('wss:UsernameToken'); $usernameTokenData = [ 'wss:Username' => $this->options['at_username'], 'wss:Password' => base64_encode($password), 'wss:Nonce' => base64_encode($nonce), 'wss:Created' => base64_encode($created), ]; foreach ($usernameTokenData as $tag => $value) { $usernameToken->appendChild($document->createElement($tag, $value)); } $security = $document->createElement('wss:Security'); $security->appendChild($usernameToken); $security->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:wss', 'http://schemas.xmlsoap.org/ws/2002/12/secext' ); $header = $document->createElement('env:Header'); $header->appendChild($security); return $header; } /** * @param $request * @return string */ private function embedHeader($request) { $document = new DOMDocument(); $document->preserveWhiteSpace = true; $document->loadXML($request); $body = $document->getElementsByTagName('Body')->item(0); $header = $this->createHeaderNode($document); $envelope = $document->getElementsByTagName('Envelope'); $envelope->item(0)->insertBefore($header, $body); // Must change the namespace of the Envelope tag to match the one specified in the WSDL otherwise we'll get // an HTTP 500 Error with the text "Internal Error" $envelope->item(0)->setAttributeNS( 'http://www.w3.org/2000/xmlns/', 'xmlns:env', 'http://schemas.xmlsoap.org/soap/envelope/' ); return $document->saveXML(); } /** * @param string $request * @param string $location * @param string $action * @param int $version * @param int $one_way * * @return string */ public function __doRequest($request, $location, $action, $version, $one_way = 0) { $request = $this->embedHeader($request); return parent::__doRequest($request, $location, $action, $version, $one_way); } } Cumprimentos, Ricardo
  12. 2 pontos
    Tenho muitas reservas quanto à extensão e eficácia do poder que é dado às pessoas, essencialmente por duas razão: a base legal e a base de interesse público dão demasiada margem ao estado para continuar a abusar dos dados dos cidadãos; a legislação parece-me ter demasiados "buracos", o que dá margem às entidades com recursos para pagar a advogados (e algumas modificações na infraestrutura da empresa) para continuar a não respeitar a privacidade das pessoas. (Eu estou para ver que entidades é que vão resistir à tentação de invocar legítimo interesse para continuar a fazer tracking intensivo dos utilizadores, e se algum tribunal as vai impedir de o fazer.) No final, serão as pequenas entidades que se vão lixar, com custos elevados para perceberem o que é que têm que fazer, e para depois implementar uma política defensiva (em que na dúvida se uma medida é necessária ou não, aplica-se para evitar multas). Esperemos que no final disto tudo a generalidade das pessoas ganhe sensibilidade para passar a proteger a privacidade dos outros por omissão. E já agora que os produtos (e.g. software) que lidem dados pessoais fiquem melhor preparados para os proteger (e a verdade é que não falta software que podia/devia fazer bem mais para proteger os dados dos utilizadores).
  13. 2 pontos
    Eu não estou a dizer que isto vai resolver todos os problemas nem que a partir de agora vai tudo funcionar bem. Estou apenas a explicar o RGDP e o que aqui está em causa. @CJCV, "passe a publicidade", deixo aqui o conjunto de artigos que andamos a escrever sobre o RGDP (deve haver mais um esta semana): http://hexonio.com/blog/pt/2018/02/01/rgdp-explicado/ (e ainda por cima em Português, mimo hein? ) @apocsantos, repara que a partir de agora passas a poder ter uma forma de reclamares e seres ouvido quanto a todas essas questões. Não tens de te cingir às autoridades nacionais, podes escalar a coisa. Tem havido muita discussão (não só aqui mas em todo o lado) sobre o RGDP. O RGDP acaba por ser apenas uma evolução natural do que já existia. Acaba por ter algum foco adicional na componente do consentimento, acesso e segurança. Muitas das coisas que o regulamento refere até já deviam fazer parte das boas práticas das organizações.
  14. 2 pontos
    parece que queres algo deste género: +---------------------------------------+ +------+ |+---------+ +------+ | | user | -> || Web App | <-> | | *--------+| +------+ |+---------+ | | ! Cron |! | | Data | <-> | Router || +------+ |+---------+ | | | Job || | cell | -> || SMS API | <-> | | +--------+| +------+ |+---------+ +------+ | | +---------------------------------------+ | | +---------------------------------------+ +-----> | Operator | +---------------------------------------+
  15. 2 pontos
    Bom dia João Creio que estás com uma noção errada da realidade da faturação em PT, o que é normal para quem está fora da área de software deste género, por isso permite-me identificar alguns pontos: Em tempos isto foi importante, sim. Até há alguns anos atrás, software produzido internamente na empresa não necessitava de ser certificado. Já não é assim. Todo e qualquer software que produza faturas em Portugal deve ser certificado. A excepção teórica é quem já usava antes software não certificado e não atinge os 100000€ anuais não precisa trocar por software certificado. No entanto é só mesmo teórica, porque actualmente já não é possível enviar o ficheiro SAF-T em nenhuma versão anterior à 1.04, o que torna o uso de software antigo, não certificado, impossível na prática. Sim, existe. A AT disponibiliza duas formas de enviar os documentos de faturação, via ficheiro normalizado SAF-T (actualmente na v1.04_01), ou via WebService SOAP, através de API própria da AT, cujo padrão está disponível na página do E-Fatura, na área de Produtores de Software. No entanto, como já deves ter percebido do ponto anterior, não, não elimina a necessidade de certificares o teu software. Se queres fazer faturas nele, tens de o certificar. Poderia quando muito haver um software que disponibilize ele proprio a sua API, e nesse caso tu farias apenas o Front-End na tua LP de eleição. Mas o programa usado no que toca à AT seria sempre esse, e não o teu. Isto significa que a DB usada seria também a desse programa, e não a tua. O ficheiro SAF-T não serve para gerar faturas, mas sim para enviar para a AT as faturas geradas no programa, quando não usado o webservice. Quem não faça o envio imediato por WS, deve até ao dia 20 do mês seguinte ao da emissão das faturas (dia 25 era antigamente, já foi alterado) enviar o ficheiro para a AT, ou manualmente no portal E-Fatura ou por via da aplicação Java de Linha de Comandos que a AT disponibiliza para o efeito. Se quiseres mesmo avançar com esse projecto, terás mesmo de certificar o software, com tudo o que isso significa. Significa que tens de o fazer por forma a cumprir toda a legislação relevante em vigor, e manter o programa actualizado sempre que alguma dessa legislação seja alterada. Significa que tens de ir à AT, em Lx, para uma certificação, após o envio do Mod. 24, apresentar o teu produto, e corrigir tudo o que os inspectores considerarem errado para que o software passe, independentemente de teres ou não intenção de o vender. Se pesando os contras achares que os pros ainda valem a pena, força nisso. Tens muita informação nos tópicos respectivos que mencionaste, e se alguns links podem já estar em baixo, a informação que por lá anda é na sua maior parte um bom ponto de partida. Mas lembra-te que um software de faturação, com tanta alteração que a AT faz à legislação, é quase um trabalho a tempo inteiro. Vale a pena?
  16. 2 pontos
    A função void VianaDoCastelo tem como argumento(o que está entre parenteses) CIDADE *ap_cidade , ou seja, declaras que a função tem um argumento apontador do tipo de dados CIDADE e que dentro daquela função se chama ap_cidade (que também é o nome usado em main para criar o apontador). Na função distrito, no case 16, chama a função VianaDoCastelo sem passar o argumento que antes foi definido para essa função. A solução passa por passar o apontador que está na função Distrito (e que veio da função main) para a função VianaDoCastelo quando a chama, ficando no case 16 case (16): VianaDoCastelo(ap_cidade); break;
  17. 2 pontos
    Boa noite, tenho aqui umas dúvidas em duas questões de um exame, já pesquisei na internet mas não consigo chegar a nenhum consenso. Será que me podiam ajudar ? As perguntas são as seguintes : Posso implementar uma Stack com qualquer estrutura de dados ? Justifique e exemplifique a sua resposta. Um array ordenado de forma ascendente é sempre uma miniheap ? Obrigado
  18. 2 pontos
    assim de repente, vejo três grandes problemas: - o mais simples de perceber é que no teu ciclo de popular o segundo array só com os caracteres "alpha", quando a variável "Alpha" toma o valor de falso, nunca mais volta a ser verdadeiro, logo nunca irás copiar os caracteres após um caracter descartado - nesse mesmo ciclo, estás a copiar do array original para o segundo array, para a mesma posição, no entanto, se já descartaste um caracter, quer dizer que a posição final não é a mesma, pois não ? - existe um erro muito grave, mas de mais difícil compreensão. o que a tua função retorna, é a posição de memória de um bloco reservado dentro da função, que no fim desta, deixa de "existir". Por outras palavras, estás a retornar algo que dentro de momentos (após o retorno) pode ou não estar na posição retornada. a maneira mais simples é teres a função main a instanciar os dois arrays e a função fazer só o trabalho de filtragem e cópia para o segundo array,
  19. 2 pontos
    A partir do momento em que tu enfraqueces uma feature de segurança para uma entidade, enfraqueces para todos. Não só é um facto, como já está bastante demonstrado em vários casos que já aconteceram no passado. Acabas por não estar a expor a informação de uma má pessoa a uma entidade com autoridade, mas potencialmente colocar a informação de todos nas mãos de pessoas que a vão utilizar com más intenções.
  20. 2 pontos
    Pelo que percebi o jogo é à vez e basicamente tens dois modos: #1 Em Jogo: em que tens o browser à espera da resposta do jogado (aqui basta teres a coisa em formato post de um form) #2 Espera: em que tens o browser, por exemplo de segundo a segundo via Ajax com json, a ver se já pode jogar, basta teres uma resposta de 1 ou 0: Se tens uma resposta de, por exemplo, 1: continuas em espera. Se tens uma resposta de, por exemplo 0: invocas um url onde vais buscar as perguntas (basicamente onde o modo "em jogo" respode) Basicamente é isso. A parte da sintetização de fala podes fazer no servidor, tipo criar um MP3 temporário que depois tocas no browser.
  21. 2 pontos
    binca com isto : https://developer.mozilla.org/en-US/docs/Web/CSS/z-index
  22. 2 pontos
    Eu não crio nada. Quando a fatura está na Base de Dados, o utilizador escolhe a fatura e respetivas linhas. Se a fatura não está na Base de Dados, eu liberto os campos "Tipo de documento", "Serie" e "Numero de documento" para o utilizador introduzir manualmente em cada linha. Desde meados de 2013, com base num oficio circulado, salvo erro o 30141, passei a permitir esses campos vazios para se poder fazer Notas de crédito "rappel", ou seja, relativas a todas as faturas de um período, normalmente o ano anterior. O que obrigo sempre a preencher em todas as linhas é o Motivo, que obrigo a ter pelo menos 15 carateres. Ultimamente, por causa da nova Declaração Periódica do IVA, fui ver o ficheiro resumido que realmente é enviado para a AT e nada dessa informação é comunicada mensalmente.
  23. 2 pontos
    Coloco aqui a resposta da AT a uma questão que muitos de nós tivemos duvidas quando saiu a versão 1.04 do SAF-T. A resposta demorou tanto que até já me tinha esquecido da pergunta mas aqui fica para informação de todos: Pergunta: Resposta:
  24. 1 ponto
    @Rui Carlos, @apocsantos, efetivamente há questões que teimam em não mudar, a mediocridade e incompetência política é uma delas... @knightcoder, tenho cifrado dados pessoais na base de dados de forma a que só fiquem acessíveis (como referiste) na altura certa e a quem de direito. Isto permite reduzir situações de consulta a dados pessoais por, por exemplo, um DBA que faça uma query a uma base de dados. Outra coisa é manter um log temporal dos pedidos de esquecimento na situação em que se tenha de repor um backup antigo de forma a que se possa replicar os pedidos de esquecimento.
  25. 1 ponto
    Também reparei nisso... É para não nos esticarmos muito! Tenho de dizer aos "meus patrões" para nos darem uns rebuçados volta e meia...
×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.