Ejemplo n.º 1
0
 public function testSaveLoad()
 {
     $runName = uniqid('', true);
     $fileName = 'testfile_msg_' . date('Ymd_His') . '_' . $runName . '.yml';
     $msg = new Msg('test_data/' . $fileName);
     $msg->setDatadirBasePath('test_data');
     $msg->setDataChanged(true);
     $msg->setVersion(21);
     $this->assertEquals(21, $msg->getVersion());
     $msg->setId('cafed00d-2131-4159-8e11-0b4dbadb1738');
     $this->assertEquals('cafed00d-2131-4159-8e11-0b4dbadb1738', $msg->getId());
     $msg->setRelayNodeId('cafed00d-2231-4159-8e11-0b4dbadb1738');
     $this->assertEquals('cafed00d-2231-4159-8e11-0b4dbadb1738', $msg->getRelayNodeId());
     $msg->setSrcNodeId('cafed00d-2331-4159-8e11-0b4dbadb1738');
     $this->assertEquals('cafed00d-2331-4159-8e11-0b4dbadb1738', $msg->getSrcNodeId());
     $msg->setSrcSslKeyPub(static::SRC1_SSL_KEY_PUB);
     $this->assertEquals(static::SRC1_SSL_KEY_PUB, $msg->getSrcSslKeyPub());
     $msg->setSrcUserNickname('thefox');
     $this->assertEquals('thefox', $msg->getSrcUserNickname());
     $msg->setDstNodeId('cafed00d-2431-4159-8e11-0b4dbadb1738');
     $this->assertEquals('cafed00d-2431-4159-8e11-0b4dbadb1738', $msg->getDstNodeId());
     $msg->setDstSslPubKey(static::DST1_SSL_KEY_PUB);
     $this->assertEquals(static::DST1_SSL_KEY_PUB, $msg->getDstSslPubKey());
     $msg->setSubject('my first subject');
     $this->assertEquals('my first subject', $msg->getSubject());
     $msg->setText('hello world! this is a test');
     $this->assertEquals('hello world! this is a test', $msg->getText());
     $msg->setPassword('my_password01');
     $this->assertEquals('my_password01', $msg->getPassword());
     $msg->setChecksum('checksuuuum_sum');
     $this->assertEquals('checksuuuum_sum', $msg->getChecksum());
     $msg->setSentNodes(array(21, 2, 1987));
     $msg->addSentNode(42);
     $this->assertEquals(array(21, 2, 1987, 42), $msg->getSentNodes());
     $msg->setRelayCount(22);
     $this->assertEquals(22, $msg->getRelayCount());
     $msg->setForwardCycles(23);
     $msg->incForwardCycles();
     $this->assertEquals(24, $msg->getForwardCycles());
     $msg->setEncryptionMode('D');
     $this->assertEquals('D', $msg->getEncryptionMode());
     $msg->setStatus('O');
     $this->assertEquals('O', $msg->getStatus());
     $msg->setTimeCreated(679874400);
     $this->assertEquals(679874400, $msg->getTimeCreated());
     $msg->setSslKeyPrv(static::SRC1_SSL_KEY_PRV, static::SSL_KEY_PRV_PASS);
     $this->assertTrue($msg->encrypt());
     $this->assertTrue((bool) $msg->save());
     $finder = new Finder();
     $files = $finder->in('test_data')->depth(0)->name($fileName)->files();
     $this->assertEquals(1, count($files));
     $msg = new Msg('test_data/' . $fileName);
     $msg->setDatadirBasePath('test_data');
     $this->assertTrue($msg->load());
     $this->assertEquals(21, $msg->getVersion());
     $this->assertEquals('cafed00d-2131-4159-8e11-0b4dbadb1738', $msg->getId());
     $this->assertEquals('cafed00d-2231-4159-8e11-0b4dbadb1738', $msg->getRelayNodeId());
     $this->assertEquals('cafed00d-2331-4159-8e11-0b4dbadb1738', $msg->getSrcNodeId());
     $this->assertEquals(static::SRC1_SSL_KEY_PUB, $msg->getSrcSslKeyPub());
     $this->assertEquals('cafed00d-2431-4159-8e11-0b4dbadb1738', $msg->getDstNodeId());
     $this->assertEquals(array(21, 2, 1987, 42), $msg->getSentNodes());
     $this->assertEquals(22, $msg->getRelayCount());
     $this->assertEquals(24, $msg->getForwardCycles());
     $this->assertEquals('D', $msg->getEncryptionMode());
     $this->assertEquals('O', $msg->getStatus());
     $this->assertEquals(679874400, $msg->getTimeCreated());
     $msg = new Msg('test_data/' . $fileName);
     $msg->setDatadirBasePath('test_data');
     $this->assertTrue($msg->load());
     $msg->setDstSslPubKey(static::DST1_SSL_KEY_PUB);
     $msg->setSslKeyPrv(static::DST1_SSL_KEY_PRV, static::SSL_KEY_PRV_PASS);
     $subject = 'N/A';
     $text = 'N/A';
     try {
         $text = $msg->decrypt();
         $subject = $msg->getSubject();
     } catch (Exception $e) {
         $text = $e->getMessage();
     }
     $this->assertEquals('my first subject', $subject);
     $this->assertEquals('hello world! this is a test', $text);
     $this->assertEquals('thefox', $msg->getSrcUserNickname());
     $msg = new Msg('test_data/' . $fileName);
     $msg->setDatadirBasePath('test_data');
     $this->assertTrue($msg->load());
     $msg->setDstSslPubKey(static::DST2_SSL_KEY_PUB);
     $msg->setSslKeyPrv(static::DST2_SSL_KEY_PRV, static::SSL_KEY_PRV_PASS);
     $subject = 'N/A';
     $text = 'N/A';
     try {
         $text = $msg->decrypt();
         $subject = $msg->getSubject();
     } catch (Exception $e) {
         $text = 'FAILED OK';
     }
     $this->assertEquals('N/A', $subject);
     $this->assertEquals('FAILED OK', $text);
     $this->assertEquals('', $msg->getSrcUserNickname());
     $msg = new Msg('test_data/not_existing.yml');
     $this->assertFalse($msg->load());
 }
Ejemplo n.º 2
0
 private function handleCommandMsg($line)
 {
     #print __CLASS__.'->'.__FUNCTION__.': "'.$line.'"'."\n";
     $line = substr($line, 3);
     #print __CLASS__.'->'.__FUNCTION__.': get table'."\n";
     $table = $this->ipcKernelConnection->execSync('getTable');
     #print __CLASS__.'->'.__FUNCTION__.': get msgDb'."\n";
     #$msgDb = $this->ipcKernelConnection->execSync('getMsgDb');
     $msgs = $this->ipcKernelConnection->execSync('msgDbMsgGetMsgsForDst');
     $msgsByIndex = array_keys($msgs);
     #ve($msgDb);
     #ve($msgs);
     #ve($msgsByIndex);
     /*
     		if(!$msgDb){
     			print __CLASS__.'->'.__FUNCTION__.': get msgDb failed'."\n";
     			return;
     		}*/
     if ($line) {
         $line = substr($line, 1);
         $args = preg_split('/ /', $line);
         #ve($args);
         #print __CLASS__.'->'.__FUNCTION__.': rest "'.$line.'"'."\n";
         #$this->printPs1(true, 'handleCommandMsg A');
         if ($args[0] == 'new' || $args[0] == 'n') {
             if (Uuid::isValid($args[1])) {
                 if ($args[1] != $table->getLocalNode()->getIdHexStr()) {
                     $this->sttyExitIcanonMode();
                     $this->sttyEchoOn();
                     stream_set_blocking(STDIN, 1);
                     print PHP_EOL . 'Subject: ';
                     $subject = strtolower(substr(fgets(STDIN, 100), 0, -1));
                     if (!$subject) {
                         $subject = 'No Subject';
                     }
                     #print "Subject: '".$subject."'\n\n";
                     print PHP_EOL . 'Enter the text to send.' . PHP_EOL;
                     print 'NOTE: end text with  <RETURN>.<RETURN>' . PHP_EOL;
                     $text = '';
                     while (!$this->getExit()) {
                         $line = fgets(STDIN, 1024);
                         #print "line: '".substr($line, 0, -1)."'\n";
                         if (substr($line, 0, -1) == '.') {
                             break;
                         }
                         $text .= $line;
                         #sleep(1);
                     }
                     if (!$this->getExit()) {
                         $text = substr($text, 0, -1);
                         print 'Send msg? [Y/n] ';
                         $answer = strtolower(substr(fgets(STDIN, 100), 0, -1));
                         if (!$answer) {
                             $answer = 'y';
                         }
                         print "Answer: '" . $answer . "'" . PHP_EOL;
                         #print "Text: '".$text."'\n";
                         stream_set_blocking(STDIN, 0);
                         $this->sttyEnterIcanonMode();
                         $this->sttyEchoOff();
                         if ($answer == 'y') {
                             $dstNodeId = $args[1];
                             #$dstNodeId = '42785b21-011b-4093-b61d-000000000001';
                             #$text = 'this is  a test. '.date('Y-m-d H:i:s');
                             $table = $this->ipcKernelConnection->execSync('getTable');
                             $msg = new Msg();
                             $msg->setSrcNodeId($this->settings->data['node']['id']);
                             $msg->setSrcSslKeyPub($table->getLocalNode()->getSslKeyPub());
                             $msg->setSrcUserNickname($this->userNickname);
                             $dstNode = new Node();
                             $dstNode->setIdHexStr($dstNodeId);
                             $msg->setDstNodeId($dstNode->getIdHexStr());
                             if ($oDstNode = $table->nodeFind($dstNode)) {
                                 #print 'found node in table'.PHP_EOL;
                                 $msg->setDstSslPubKey($oDstNode->getSslKeyPub());
                             }
                             #else{ print 'node not found'.PHP_EOL; }
                             $msg->setSubject($subject);
                             $msg->setText($text);
                             $msg->setSslKeyPrvPath($this->settings->data['node']['sslKeyPrvPath'], $this->settings->data['node']['sslKeyPrvPass']);
                             $msg->setStatus('O');
                             $encrypted = false;
                             #print 'DstSslPubKey: '.strlen($msg->getDstSslPubKey()).PHP_EOL;
                             if ($msg->getDstSslPubKey()) {
                                 #print 'use dst key'.PHP_EOL;
                                 $msg->setEncryptionMode('D');
                             } else {
                                 // Encrypt with own public key
                                 // while destination public key is not available.
                                 #print 'use local key'.PHP_EOL;
                                 $msg->setEncryptionMode('S');
                                 $msg->setDstSslPubKey($table->getLocalNode()->getSslKeyPub());
                             }
                             try {
                                 $encrypted = $msg->encrypt();
                                 if ($encrypted) {
                                     $this->ipcKernelConnection->execAsync('msgDbMsgAdd', array($msg));
                                     $this->msgAdd('OK: msg created ' . $msg->getId(), true, true);
                                 } else {
                                     $this->msgAdd('ERROR: could not encrypt message.', true, true);
                                 }
                             } catch (Exception $e) {
                                 $this->msgAdd('ERROR: ' . $e->getMessage(), true, true);
                             }
                             #$this->printPs1(true, 'handleCommandMsg B');
                         } else {
                             print 'Nothing created, nothing sent.' . PHP_EOL;
                             $this->printPs1(true, 'handleCommandMsg C');
                         }
                     }
                 } else {
                     $this->msgAdd();
                     $this->msgAdd('Send a message to yourself?', false, true);
                 }
             } else {
                 $this->msgAdd();
                 $this->msgAdd('ERROR: "' . $args[1] . '" is not a UUID.', false, true);
             }
         } elseif ($args[0] == 'read' || $args[0] == 'r') {
             if (isset($args[1])) {
                 $msg = null;
                 if (Uuid::isValid($args[1])) {
                     if (isset($msgs[$args[1]])) {
                         $msg = $msgs[$args[1]];
                     }
                 } else {
                     $no = (int) $args[1] - 1;
                     if (isset($msgsByIndex[$no])) {
                         $msg = $msgs[$msgsByIndex[$no]];
                     }
                 }
                 if ($msg) {
                     $msg->setDstSslPubKey($table->getLocalNode()->getSslKeyPub());
                     $sslKeyPrvPath = $this->settings->data['node']['sslKeyPrvPath'];
                     $sslKeyPrvPass = $this->settings->data['node']['sslKeyPrvPass'];
                     $msg->setSslKeyPrvPath($sslKeyPrvPath, $sslKeyPrvPass);
                     #ve($msg);
                     $text = null;
                     try {
                         $text = $msg->decrypt();
                     } catch (Exception $e) {
                         $text = null;
                         #print 'ERROR: decrypt: '.$e->getMessage().PHP_EOL;
                     }
                     $dateCreated = new DateTime();
                     $dateCreated->setTimestamp($msg->getTimeCreated());
                     $dateReceived = new DateTime();
                     $dateReceived->setTimestamp($msg->getTimeReceived());
                     $fromLine = '';
                     if ($msg->getSrcUserNickname()) {
                         $fromLine .= $msg->getSrcUserNickname() . ' ';
                     }
                     $fromLine .= '<' . $msg->getSrcNodeId() . '>';
                     $toLine = '';
                     if ($table->getLocalNode()->getIdHexStr() == $msg->getDstNodeId()) {
                         $toLine .= 'Me ';
                     }
                     $toLine .= '<' . $msg->getDstNodeId() . '>';
                     $this->msgAdd();
                     if (!$text) {
                         $this->msgAdd('WARNING: could not decrypt text. Only meta data available.', false, false);
                     }
                     $this->msgAdd('----- MESSAGE BEGIN -----');
                     $this->msgAdd('Subject: ' . $msg->getSubject(), false, false);
                     $this->msgAdd('From: ' . $fromLine, false, false);
                     $this->msgAdd('To: ' . $toLine, false, false);
                     $this->msgAdd('Msg ID: ' . $msg->getId(), false, false);
                     $this->msgAdd('Status: ' . $msg->getStatusText(), false, false);
                     $this->msgAdd('Created:  ' . $dateCreated->format('Y-m-d H:i:s'), false, false);
                     $this->msgAdd('Received: ' . $dateReceived->format('Y-m-d H:i:s'), false, false);
                     if ($text) {
                         $this->msgAdd();
                         $this->msgAdd($text, false, false);
                         $msg->setStatus('R');
                         $this->ipcKernelConnection->execAsync('msgDbMsgUpdate', array($msg));
                     }
                     $this->msgAdd('----- MESSAGE END -----', false, true);
                 } else {
                     $this->msgAdd();
                     $this->msgAdd('ERROR: could not read msg "' . $args[1] . '".', false, true);
                 }
             } else {
                 $this->msgAdd();
                 $this->msgAdd('ERROR: you must specify a msg number or ID.', false, true);
             }
         }
     } else {
         $format = '%3d %1s %36s %s %s';
         $this->msgAdd();
         $this->msgAdd('  # N FROM                                 CRATED              RECEIVED', false, true);
         $no = 0;
         foreach ($msgs as $msgId => $msg) {
             $no++;
             $dateCreated = new DateTime();
             $dateCreated->setTimestamp($msg->getTimeCreated());
             $dateReceived = new DateTime();
             $dateReceived->setTimestamp($msg->getTimeReceived());
             $line = sprintf($format, $no, $msg->getStatus() == 'U' ? '*' : ' ', $msg->getSrcNodeId(), $dateCreated->format('Y-m-d H:i:s'), $dateReceived->format('Y-m-d H:i:s'));
             $this->msgAdd($line, false, false);
         }
         $this->msgAdd('END OF LIST', false, true);
     }
 }
Ejemplo n.º 3
0
 public function msgUpdate(Msg $msgNew)
 {
     $rv = false;
     if (isset($this->msgs[$msgNew->getId()])) {
         $msgOld = $this->msgs[$msgNew->getId()];
         if ($msgOld->getVersion() != $msgNew->getVersion()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: version'."\n";
             $msgOld->setVersion($msgNew->getVersion());
             $this->setDataChanged(true);
             $rv = true;
         }
         /*if($msgOld->getId() != $msgNew->getId()){
         			#print __CLASS__.'->'.__FUNCTION__.': changed: id'."\n";
         			$msgOld->setId($msgNew->getId());
         			$this->setDataChanged(true);
         			$rv = true;
         		}*/
         if ($msgOld->getSrcNodeId() != $msgNew->getSrcNodeId()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed srcNodeId: '.$msgOld->getSrcNodeId().' '.$msgNew->getSrcNodeId()."\n";
             $msgOld->setSrcNodeId($msgNew->getSrcNodeId());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getSrcSslKeyPub() != $msgNew->getSrcSslKeyPub()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: srcSslKeyPub'."\n";
             $msgOld->setSrcSslKeyPub($msgNew->getSrcSslKeyPub());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getDstNodeId() != $msgNew->getDstNodeId()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: dstNodeId'."\n";
             $msgOld->setDstNodeId($msgNew->getDstNodeId());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getDstSslPubKey() != $msgNew->getDstSslPubKey()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: dstSslPubKey'."\n";
             $msgOld->setDstSslPubKey($msgNew->getDstSslPubKey());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getSubject() != $msgNew->getSubject()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: subject'."\n";
             $msgOld->setSubject($msgNew->getSubject());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getBody() != $msgNew->getBody()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: text'."\n";
             $msgOld->setBody($msgNew->getBody());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getText() != $msgNew->getText()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: text'."\n";
             $msgOld->setText($msgNew->getText());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getPassword() != $msgNew->getPassword()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: password'."\n";
             $msgOld->setPassword($msgNew->getPassword());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getChecksum() != $msgNew->getChecksum()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: checksum'."\n";
             $msgOld->setChecksum($msgNew->getChecksum());
             $this->setDataChanged(true);
             $rv = true;
         }
         $msgOldSentNodes = $msgOld->getSentNodes();
         $msgNewSentNodes = $msgNew->getSentNodes();
         #if(count($msgOldSentNodes) < count($msgNewSentNodes)){
         if ($msgOldSentNodes != $msgNewSentNodes) {
             $msgOld->setSentNodes(array_unique(array_merge($msgOldSentNodes, $msgNewSentNodes)));
         }
         if ($msgOld->getRelayCount() != $msgNew->getRelayCount()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: relayCount'."\n";
             $msgOld->setRelayCount($msgNew->getRelayCount());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getForwardCycles() != $msgNew->getForwardCycles()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: forwardCycles'."\n";
             $msgOld->setForwardCycles($msgNew->getForwardCycles());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getEncryptionMode() != $msgNew->getEncryptionMode()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: encryptionMode, '.$msgOld->getEncryptionMode();
             #print ', '.$msgNew->getEncryptionMode()."\n";
             $msgOld->setEncryptionMode($msgNew->getEncryptionMode());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getStatus() != $msgNew->getStatus()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: status'."\n";
             $msgOld->setStatus($msgNew->getStatus());
             $this->setDataChanged(true);
             $rv = true;
         }
         if ($msgOld->getTimeCreated() != $msgNew->getTimeCreated()) {
             #print __CLASS__.'->'.__FUNCTION__.': changed: timeCreated'."\n";
             $msgOld->setTimeCreated($msgNew->getTimeCreated());
             $this->setDataChanged(true);
             $rv = true;
         }
         /*if($msgOld->getDataChanged() != $msgNew->getDataChanged()){
         			#print __CLASS__.'->'.__FUNCTION__.': changed: dataChanged'."\n";
         			$msgOld->setDataChanged($msgNew->getDataChanged());
         		}*/
     }
     return $rv;
 }
Ejemplo n.º 4
0
 public function mailNew($event, $from, $rcpt, $mail)
 {
     #fwrite(STDOUT, 'mail new: /'.$from.'/ a/'.join('/ /', $rcpt).'/'."\n");
     #$this->log->debug('mailNew: '.$event->getTrigger().' /'.$from.'/');
     $settings = $this->getSettings();
     $table = $this->ipcKernelConnection->execSync('getTable');
     $text = $mail->getBody();
     foreach ($rcpt as $dstNodeId) {
         $dstNodeId = substr($dstNodeId, 0, strpos($dstNodeId, '@'));
         #fwrite(STDOUT, 'to: /'.$dstNodeId.'/'."\n");
         $msg = new Msg();
         $msg->setSrcNodeId($settings->data['node']['id']);
         $msg->setSrcSslKeyPub($table->getLocalNode()->getSslKeyPub());
         $msg->setSrcUserNickname($settings->data['user']['nickname']);
         $dstNode = new Node();
         $dstNode->setIdHexStr($dstNodeId);
         $msg->setDstNodeId($dstNode->getIdHexStr());
         if ($oDstNode = $table->nodeFind($dstNode)) {
             #print 'found node in table'.PHP_EOL;
             $msg->setDstSslPubKey($oDstNode->getSslKeyPub());
         }
         #else{ print 'node not found'.PHP_EOL; }
         $msg->setSubject($mail->getSubject());
         $msg->setText($text);
         $msg->setSslKeyPrvPath($settings->data['node']['sslKeyPrvPath'], $settings->data['node']['sslKeyPrvPass']);
         $msg->setStatus('O');
         $encrypted = false;
         #print 'DstSslPubKey: '.strlen($msg->getDstSslPubKey()).PHP_EOL;
         if ($msg->getDstSslPubKey()) {
             #print 'use dst key'.PHP_EOL;
             $msg->setEncryptionMode('D');
         } else {
             // Encrypt with own public key
             // while destination public key is not available.
             #print 'use local key'.PHP_EOL;
             $msg->setEncryptionMode('S');
             $msg->setDstSslPubKey($table->getLocalNode()->getSslKeyPub());
         }
         try {
             $encrypted = $msg->encrypt();
             if ($encrypted) {
                 $this->ipcKernelConnection->execAsync('msgDbMsgAdd', array($msg));
                 $this->log->debug('OK: msg created ' . $msg->getId());
             } else {
                 $this->log->error('Could not encrypt message.');
             }
         } catch (Exception $e) {
             $this->log->error('ERROR: ' . $e->getMessage());
         }
     }
 }