diff --git a/app/Classes/FTNMessage.php b/app/Classes/FTNMessage.php index 2ae86b8..82864c9 100644 --- a/app/Classes/FTNMessage.php +++ b/app/Classes/FTNMessage.php @@ -2,16 +2,25 @@ namespace App\Classes; +use Illuminate\Support\Arr; + use App\Exceptions\InvalidFidoPacketException; +/** + * Class FTNMessage + * NOTE: FTN Echomail Messages are ZONE agnostic. + * + * @package App\Classes + */ class FTNMessage extends FTN { - private $_src = NULL; - private $_dst = NULL; + private $src = NULL; // SRC N/F from packet + private $dst = NULL; // DST N/F from packet - private $flags = NULL; - private $cost = 0; + private $flags = NULL; // Flags from packet + private $cost = 0; // Cost from packet + // @todo need to validate these string lengths when creating packet. private $from = NULL; // FTS-0001.016 From Name: upto 36 chars null terminated private $to = NULL; // FTS-0001.016 To Name: upto 36 chars null terminated private $subject = NULL; // FTS-0001.016 Subject: upto 72 chars null terminated @@ -31,8 +40,9 @@ class FTNMessage extends FTN private $_other = []; private $unknown = []; - private $fqfa = NULL; // Fully qualified fidonet source where packet originated - private $fqda = NULL; // Fully qualified fidonet destination address (Netmail) + // We auto create these values - they are used to create packets. + private $_fqfa = NULL; // Fully qualified fidonet source where packet originated + private $_fqda = NULL; // Fully qualified fidonet destination address (Netmail) // Single value kludge items private $_kludge = [ @@ -90,15 +100,30 @@ class FTNMessage extends FTN { switch ($k) { - case 'fz': return $this->znfp($this->fqfa,'z'); - case 'fn': return $this->znfp($this->fqfa,'n'); - case 'ff': return $this->znfp($this->fqfa,'f'); - case 'fp': return $this->znfp($this->fqfa,'p'); + case 'fz': return ftn_address_split($this->_fqfa,'z'); + case 'fn': return ftn_address_split($this->_fqfa,'n'); + case 'ff': return ftn_address_split($this->_fqfa,'f'); + case 'fp': return ftn_address_split($this->_fqfa,'p'); - case 'tz': return $this->znfp($this->fqda,'z'); - case 'tn': return $this->znfp($this->fqda,'n'); - case 'tf': return $this->znfp($this->fqda,'f'); - case 'tp': return $this->znfp($this->fqda,'p'); + case 'fqfa': return $this->_fqfa; + + // Echomails dont have a fully qualified from address + case 'tz': return ftn_address_split($this->_fqda,'z'); + case 'tn': return ftn_address_split($this->_fqda,'n'); + case 'tf': return ftn_address_split($this->_fqda,'f'); + case 'tp': return ftn_address_split($this->_fqda,'p'); + + case 'tearline': + return '--- FTNHub'; + + case 'type': + if ($this->echoarea) + return 'echomail'; + + if ($this->intl) + return 'netmail'; + + return NULL; default: return isset($this->{$k}) ? $this->{$k} : NULL; @@ -111,10 +136,17 @@ class FTNMessage extends FTN { case 'fqfa': case 'fqda': - $this->{$k} = $v; + $this->{'_'.$k} = $v; - if ($this->fqfa AND $this->fqda) - $this->intl = sprintf('%s %s',$this->fqda,$this->fqfa); + if ($this->_fqfa AND $this->_fqda) + $this->intl = sprintf('%s %s',$this->_fqda,$this->_fqfa); + + case 'origin': + if (! $this->_fqfa) + throw new \Exception('Must set from address before origin'); + + $this->origin = sprintf(' * Origin: %s (%s)',$v,$this->_fqfa); + break; default: $this->{$k} = $v; @@ -128,6 +160,7 @@ class FTNMessage extends FTN */ public function __toString(): string { + // if (f->net == 65535) { /* Point packet - Get Net from auxNet */ $return = ''; $return .= pack(join('',collect($this->struct)->pluck(1)->toArray()), @@ -136,7 +169,7 @@ class FTNMessage extends FTN $this->fn, $this->tn, $this->flags, - 0 // @todo cost + $this->cost ); // @todo use pack for this. @@ -144,22 +177,45 @@ class FTNMessage extends FTN $return .= $this->to."\00"; $return .= $this->from."\00"; $return .= $this->subject."\00"; - $return .= $this->message."\00"; + + // Add some kludges + $return .= "\01MSGID ".$this->_fqfa." 1"."\r"; + + foreach ($this->_kludge as $k=>$v) + { + if ($x=$this->kludge->get($k)) + $return .= chr(1).$v.$x."\r"; + } + + $return .= $this->message."\r"; + $return .= $this->tearline."\r"; + $return .= $this->origin."\r"; + + switch ($this->type) + { + case 'echomail': + break; + + case 'netmail': + foreach ($this->via as $k=>$v) + $return .= "\01Via: ".$v."\r"; + + // @todo Set product name/version as var + $return .= sprintf('%sVia: %s @%s.UTC %s %i.%i', + chr(1), + '10:0/0', + now('UTC')->format('Ymd.His'), + 'FTNHub', + 1,1)."\r"; + + break; + } + + $return .= "\00"; return $return; } - public function description() - { - switch ($this->type()) - { - case 'echomail': return sprintf('Echomail: '.$this->echoarea); - case 'netmail': return sprintf('Netmail: %s->%s',$this->fqfa,$this->fqda); - default: - return 'UNKNOWN'; - } - } - /** * Return an array of flag descriptions * @@ -215,25 +271,25 @@ class FTNMessage extends FTN $result = unpack($this->unpackheader($this->struct),$header); // For Echomail this is the packet src. - $this->psn = array_get($result,'onet'); - $this->psf = array_get($result,'onode'); + $this->psn = Arr::get($result,'onet'); + $this->psf = Arr::get($result,'onode'); - $this->_src = sprintf('%s/%s', + $this->src = sprintf('%s/%s', $this->psn, $this->psf ); // For Echomail this is the packet dst. - $this->pdn = array_get($result,'dnet'); - $this->pdf = array_get($result,'dnode'); + $this->pdn = Arr::get($result,'dnet'); + $this->pdf = Arr::get($result,'dnode'); - $this->_dst = sprintf('%s/%s', + $this->dst = sprintf('%s/%s', $this->pdn, $this->pdf ); - $this->flags = array_get($result,'flags'); - $this->cost = array_get($result,'cost'); + $this->flags = Arr::get($result,'flags'); + $this->cost = Arr::get($result,'cost'); } public function parsemessage(string $message) @@ -259,14 +315,33 @@ class FTNMessage extends FTN { $this->message .= substr($v,$x+1,$y-$x-1); $this->parseorigin(substr($v,$y)); + + // If this is netmail, the FQFA will have been set by the INTL line, we can skip the rest of this $matches = []; + // Capture the fully qualified 4D name from the Origin Line - it tells us the ZONE. preg_match('/^.*\((.*)\)$/',$this->origin,$matches); - if (($this->type() == 'Netmail' AND array_get($matches,1) != $this->fqfa) OR ! array_get($matches,1)) - throw new InvalidFidoPacketException(sprintf('Source address mismatch? [%s,%s]',$this->fqfa,array_get($matches,1))); + // Double check we have an address in the origin line + if (! Arr::get($matches,1)) + throw new InvalidFidoPacketException(sprintf('No address in Origin?',$matches)); - $this->fqfa = array_get($matches,1); + // Double check, our src and origin match + if (! preg_match('#^[0-9]+:'.$this->src.'#',$matches[1])) + throw new InvalidFidoPacketException(sprintf('Source address mismatch? [%s,%s]',$this->_fqfa,$matches[1])); + + // If this is netmail, a double check our FQFA matches + if ($this->type == 'netmail') { + if ($this->_fqfa != $matches[1]) + throw new InvalidFidoPacketException(sprintf('Source address mismatch? [%s,%s]',$this->_fqfa,$matches[1])); + + // For other types, this is our only way of getting a FQFA + } else { + $this->_fqfa = $matches[1]; + + // Our FQDA is not available, we'll assume its the same zone as our FQFA + $this->_fqda = sprintf('%d:%s',ftn_address_split($this->_fqfa,'z'),$this->dst); + } } $v = substr($v,0,$x+1); @@ -299,7 +374,7 @@ class FTNMessage extends FTN elseif ($t = $this->kludge('INTL ',$v)) { $this->intl = $t; - list($this->fqda,$this->fqfa) = explode(' ',$t); + list($this->_fqda,$this->_fqfa) = explode(' ',$t); } elseif ($t = $this->kludge('MSGID: ',$v)) @@ -344,10 +419,9 @@ class FTNMessage extends FTN $result = collect(explode("\r",$message))->filter(); foreach ($result as $k => $v) { - foreach ($this->_kludge as $a => $b) { - if ($t = $this->kludge($b, $v)) { - $this->kludge->put($a, $t); + if ($t = $this->kludge($b,$v)) { + $this->kludge->put($a,$t); break; } } @@ -369,35 +443,4 @@ class FTNMessage extends FTN } } } - - public function type() - { - if ($this->echoarea) - return 'echomail'; - - if ($this->intl) - return 'netmail'; - - return 'UNKNOWN'; - } - - private function znfp(string $data,string $key) - { - switch ($key) { - case 'z': - return substr($data,0,strpos($data,':')); - case 'n': - $x = strpos($data,':')+1; - return substr($data,$x,strpos($data,'/')-$x); - case 'f': - $x = strpos($data,'/')+1; - return substr($data,$x,strpos($data,'.') ?: strlen($data)-$x); - case 'p': - $x = strpos($data,'.'); - return $x ? substr($data,$x+1) : 0; - - default: - abort(500,'Unknown key: '.$key); - } - } } \ No newline at end of file diff --git a/app/Classes/FTNPacket.php b/app/Classes/FTNPacket.php index 9cc8af6..54ca05c 100644 --- a/app/Classes/FTNPacket.php +++ b/app/Classes/FTNPacket.php @@ -66,16 +66,6 @@ class FTNPacket extends FTN { $this->messages = collect(); - // @todo - is this appropriate to set here - $this->date = now(); - $this->software['prodcode-lo'] = 0; - $this->software['prodcode-hi'] = 1; - $this->software['rev-maj'] = 2; - $this->software['rev-min'] = 3; - $this->cap['valid'] = 0; // @todo this is wrong - $this->cap['word'] = 0; // @todo this is wrong - $this->pktver = 0x02; - if ($file) { $this->filename = $file; @@ -83,8 +73,42 @@ class FTNPacket extends FTN } } + public function __get($k) + { + switch ($k) + { + case 'fz': return ftn_address_split($this->pktsrc,'z'); + case 'fn': return ftn_address_split($this->pktsrc,'n'); + case 'ff': return ftn_address_split($this->pktsrc,'f'); + case 'fp': return ftn_address_split($this->pktsrc,'p'); + + case 'tz': return ftn_address_split($this->pktdst,'z'); + case 'tn': return ftn_address_split($this->pktdst,'n'); + case 'tf': return ftn_address_split($this->pktdst,'f'); + case 'tp': return ftn_address_split($this->pktdst,'p'); + + default: + return isset($this->{$k}) ? $this->{$k} : NULL; + } + } + public function __toString(): string { + // @todo - is this appropriate to set here + $this->date = now(); + $this->pktsrc = '10:1/5.0'; + $this->pktdst = '10:1/0.0'; + + $this->software['prodcode-lo'] = 0x00; + $this->software['prodcode-hi'] = 0xde; + $this->software['rev-maj'] = 0x00; + $this->software['rev-min'] = 0x01; + + // Type 2+ Packet + $this->cap['valid'] = 0x0100; + $this->cap['word'] = 0x0001; + $this->pktver = 0x0002; + $return = $this->createHeader(); foreach ($this->messages as $o) @@ -102,8 +126,8 @@ class FTNPacket extends FTN { try { $a = pack(join('',collect($this->pack1)->pluck(1)->toArray()), - $this->sf, - $this->df, + $this->ff, + $this->tf, $this->date->year, $this->date->month, $this->date->day, @@ -112,27 +136,27 @@ class FTNPacket extends FTN $this->date->second, $this->baud, $this->pktver, - $this->sn, - $this->dn, - $this->software['prodcode-lo'], // @todo change to this software - $this->software['rev-maj'] // @todo change to this software + $this->fn, // @todo if point, this needs to be 0xff + $this->tn, + $this->software['prodcode-lo'], // @todo change to this software + $this->software['rev-maj'] // @todo change to this software ); $b = pack(join('',collect($this->pack2)->pluck(1)->toArray()), - $this->sz, - $this->dz, - 0x00, // Baud - $this->cap['valid'], // @todo to check - $this->software['prodcode-hi'], // @todo change to this software - $this->software['rev-min'], // @todo change to this software - $this->cap['word'], // @todo to check - $this->sz, - $this->dz, - $this->sp, - $this->dp + 0x0000, // @note: Type 2 packet this is $this->sz, + 0x0000, // @note: Type 2 packet this is $this->dz, + 0x0000, // Filler $this->>sn if message to point. + $this->cap['valid'], // @todo to check + $this->software['prodcode-hi'], // @todo change to this software + $this->software['rev-min'], // @todo change to this software + $this->cap['word'], // @todo to check + $this->fz, + $this->tz, + $this->fp, // @note: point address, type 2+ packets + $this->tp // @note: point address, type 2+ packets ); - return $a.pack('a8',$this->password).$b."mbse"; // @todo change to this software + return $a.pack('a8',strtoupper($this->password)).$b."mbse"; // @todo change to this software } catch (\Exception $e) { return $e->getMessage(); @@ -185,7 +209,7 @@ class FTNPacket extends FTN // Messages start with 02H 00H if (strlen($x) == 2 AND $x != "\02\00") - throw new InvalidFidoPacketException('Not a valid packet: '.$x); + throw new InvalidFidoPacketException('Not a valid packet: '.bin2hex($x)); // No message attached else if (! strlen($x)) @@ -222,6 +246,7 @@ class FTNPacket extends FTN $result2 = unpack($this->unpackheader($this->pack2),substr($header,0x22,0x14)); $this->proddata = array_get(unpack('A*p',substr($header,0x36,4)),'p'); + // @todo replcae these vars with the tz/fz $this->sz = array_get($result2,'ozone'); $this->sn = array_get($result1,'onet'); $this->sf = array_get($result1,'onode'); diff --git a/app/Console/Commands/FtnPkt.php b/app/Console/Commands/FtnPkt.php index 2813598..c623323 100644 --- a/app/Console/Commands/FtnPkt.php +++ b/app/Console/Commands/FtnPkt.php @@ -56,7 +56,7 @@ class FtnPkt extends Command $o->fqfa, $o->to, $o->fqda, - $o->description(), + $o->type, strlen($o->message) )); diff --git a/app/Console/Commands/ImportNodelist.php b/app/Console/Commands/ImportNodelist.php index 6d9770d..93358b0 100644 --- a/app/Console/Commands/ImportNodelist.php +++ b/app/Console/Commands/ImportNodelist.php @@ -90,7 +90,7 @@ class ImportNodelist extends Command default: $this->error(sprintf('Unhandled first field [%s]',$fields[0])); $bar->advance(); - continue; + continue 2; } if (! $zone) diff --git a/app/Console/Commands/ImportPacket.php b/app/Console/Commands/ImportPacket.php index 0a4d542..cf7ea36 100644 --- a/app/Console/Commands/ImportPacket.php +++ b/app/Console/Commands/ImportPacket.php @@ -2,23 +2,22 @@ namespace App\Console\Commands; -use Carbon\Carbon; use Illuminate\Console\Command; -use App\Traits\{GetNode,ParseNodes,ParseZNFPDomain}; +use App\Traits\{GetNode,ParseNodes}; use App\Classes\FTNPacket; use App\Models\{Echomail,Netmail,Zone}; class ImportPacket extends Command { - use GetNode,ParseNodes,ParseZNFPDomain; + use GetNode,ParseNodes; /** * The name and signature of the console command. * * @var string */ - protected $signature = 'import:pkt {file : Packet File}'; + protected $signature = 'import:pkt {file : Packet File} {--f|force : Force import of duplicates}'; /** * The console command description. @@ -49,60 +48,78 @@ class ImportPacket extends Command foreach ($pkt->messages as $o) { - switch ($o->type()) + $o->date->setTimezone(($o->tzutc >= 0 ? '+' : '').substr_replace($o->tzutc,':',2,0)); + + switch ($o->type) { case 'echomail': - $date = Carbon::createFromFormat('d M y H:i:s',$o->date,($o->tzutc >= 0 ? '+' : '').substr_replace($o->tzutc,':',2,0)); - // See if we already have this message. - $eo = Echomail::firstOrNew([ - 'date'=>$date, - 'from_ftn'=>$this->get_node($o->fz,$o->fn,$o->ff,$o->fp)->id, + $oo = Echomail::firstOrNew([ + 'date'=>$o->date, + 'from_ftn'=>$this->get_node(['z'=>$o->fz,'n'=>$o->fn,'f'=>$o->ff,'p'=>$o->fp])->id, 'msgid'=>$o->msgid, ]); - if (md5(utf8_decode($eo->message)) == md5($o->message)) - { - $this->warn(sprintf('Duplicate message: %s@%s with id: %s',$o->from,$o->fqfa,$o->msgid)); - continue; - } + $oo->area = $o->echoarea; - $eo->pkt_from = $this->get_node($pkt->sz,$pkt->sn,$pkt->sf,$pkt->sp)->id; - $eo->pkt_to = $this->get_node($pkt->dz,$pkt->dn,$pkt->df,$pkt->dp)->id; - $eo->pkt = $pkt->filename; - $eo->pkt_date = $pkt->date; + break; - $eo->flags = $o->flags; - $eo->cost = $o->cost; - $eo->from_user = utf8_encode($o->from); - $eo->to_user = utf8_encode($o->to); - $eo->subject = utf8_encode($o->subject); - $eo->tz = $o->tzutc; + case 'netmail': + // See if we already have this message. + $oo = Netmail::firstOrNew([ + 'date'=>$o->date, + 'from_ftn'=>$this->get_node(['z'=>$o->fz,'n'=>$o->fn,'f'=>$o->ff,'p'=>$o->fp])->id, + 'msgid'=>$o->msgid, + ]); - $eo->area = $o->echoarea; - $eo->replyid = $o->replyid; - $eo->message = utf8_encode($o->message); + $oo->to_ftn = $this->get_node(['z'=>$o->tz,'n'=>$o->tn,'f'=>$o->tf,'p'=>$o->tp])->id; - $eo->origin = utf8_encode($o->origin); - //$eo->original = (string)$o; + break; - $eo->save(); + default: + abort(500,'Unknown type: '.$o->type); + } - foreach ($o->kludge as $k=>$v) - { - $eo->kludges()->attach($k,['value'=>json_encode($v)]); - } + if (md5(utf8_decode($oo->message)) == md5($o->message)) + { + $this->warn(sprintf('Duplicate message: %s@%s with id: %s',$o->from,$o->fqfa,$o->msgid)); + if (! $this->option('force')) + continue; + } - foreach ($o->unknown as $v) - { - $eo->kludges()->attach('UNKNOWN',['value'=>json_encode($v)]); - } + $oo->pkt_from = $this->get_node(['z'=>$pkt->sz,'n'=>$pkt->sn,'f'=>$pkt->sf,'p'=>$pkt->sp])->id; + $oo->pkt_to = $this->get_node(['z'=>$pkt->dz,'n'=>$pkt->dn,'f'=>$pkt->df,'p'=>$pkt->dp])->id; + $oo->pkt = $pkt->filename; + $oo->pkt_date = $pkt->date; + $oo->flags = $o->flags; + $oo->cost = $o->cost; + $oo->from_user = utf8_encode($o->from); + $oo->to_user = utf8_encode($o->to); + $oo->subject = utf8_encode($o->subject); + $oo->tz = $o->tzutc; + $oo->replyid = $o->replyid; + $oo->message = utf8_encode($o->message); + $oo->origin = utf8_encode($o->origin); + $oo->save(); + foreach ($o->kludge as $k=>$v) + { + $oo->kludges()->attach($k,['value'=>json_encode($v)]); + } + + foreach ($o->unknown as $v) + { + $oo->kludges()->attach('UNKNOWN',['value'=>json_encode($v)]); + } + + // Finish off the import + switch($o->type) { + case 'echomail': foreach ($o->seenby as $v) { foreach ($this->parse_nodes(Zone::findOrFail($pkt->sz),$v) as $no) { - $eo->seenbys()->attach($no->id); + $oo->seenbys()->attach($no->id); } } @@ -111,71 +128,25 @@ class ImportPacket extends Command { foreach ($this->parse_nodes(Zone::findOrFail($pkt->sz),$v) as $no) { - $eo->paths()->attach($no->id,['sequence'=>$seq++]); + $oo->paths()->attach($no->id,['sequence'=>$seq++]); } } - break; - case 'netmail': - $date = Carbon::createFromFormat('d M y H:i:s',$o->date,($o->tzutc >= 0 ? '+' : '').substr_replace($o->tzutc,':',2,0)); - - // See if we already have this message. - $no = Netmail::firstOrNew([ - 'date'=>$date, - 'from_ftn'=>$this->get_node($o->fz,$o->fn,$o->ff,$o->fp)->id, - 'msgid'=>$o->msgid, - ]); - - if (md5(utf8_decode($no->message)) == md5($o->message)) - { - $this->warn(sprintf('Duplicate message: %s@%s with id: %s',$o->from,$o->fqfa,$o->msgid)); - //continue; - } - - $no->pkt_from = $this->get_node($pkt->sz,$pkt->sn,$pkt->sf,$pkt->sp)->id; - $no->pkt_to = $this->get_node($pkt->dz,$pkt->dn,$pkt->df,$pkt->dp)->id; - $no->pkt = $pkt->filename; - $no->pkt_date = $pkt->date; - - $no->flags = $o->flags; - $no->cost = $o->cost; - $no->from_user = utf8_encode($o->from); - $no->to_user = utf8_encode($o->to); - $no->to_ftn = $this->get_node($o->tz,$o->tn,$o->tf,$o->tp)->id; - $no->subject = utf8_encode($o->subject); - $no->tz = $o->tzutc; - - $no->replyid = $o->replyid; - $no->message = utf8_encode($o->message); - - $no->origin = utf8_encode($o->origin); - - $no->save(); - - foreach ($o->kludge as $k=>$v) - { - $no->kludges()->attach($k,['value'=>json_encode($v)]); - } - - foreach ($o->unknown as $v) - { - $no->kludges()->attach('UNKNOWN',['value'=>json_encode($v)]); - } - - $seq = 0; - foreach ($o->via as $v) - { - dump($v); - $data = preg_split('/\s/',$v); - $ftno = $this->parse_znfp_domain($data[0]); - unset($data[0]); - - $no->paths()->attach($ftno->id,['sequence'=>$seq++,'value'=>json_encode($data)]); - } break; - default: - abort(500,'Unknown type: '.$o->type()); + case 'netmail': + $seq = 0; + + foreach ($o->via as $v) + { + $data = preg_split('/\s/',$v); + $ftno = $this->get_node(ftn_address_split($data[0])); + unset($data[0]); + + $oo->paths()->attach($ftno->id,['sequence'=>$seq++,'value'=>json_encode($data)]); + } + + break; } } } diff --git a/app/Models/Netmail.php b/app/Models/Netmail.php index eeec940..a96d302 100644 --- a/app/Models/Netmail.php +++ b/app/Models/Netmail.php @@ -8,6 +8,7 @@ class Netmail extends Model { protected $dates = ['date']; protected $fillable = ['date','msgid','from_ftn']; + public $timestamps = FALSE; // @todo Remove, seems an issue with cockroach updating tables. public function kludges() { diff --git a/app/Traits/GetNode.php b/app/Traits/GetNode.php index 81f3c9f..4133637 100644 --- a/app/Traits/GetNode.php +++ b/app/Traits/GetNode.php @@ -2,6 +2,8 @@ namespace App\Traits; +use Illuminate\Support\Arr; + use App\Models\{Node,Zone}; trait GetNode @@ -10,11 +12,19 @@ trait GetNode * Get an FTN record * If the record doesnt exist, we'll create it */ - protected function get_node($z,$n,$f,$p=0,$create=TRUE) + protected function get_node(array $address,$create=TRUE) { + if (! $z=Arr::get($address,'z')) + throw new \Exception('Zone cannot be zero'); + $zo = Zone::firstOrCreate(['id'=>$z]); - $no = Node::firstOrNew(['zone_id'=>$zo->id,'host_id'=>$n,'node_id'=>$f,'point_id'=>$p]); + $no = Node::firstOrNew([ + 'zone_id'=>$zo->id, + 'host_id'=>Arr::get($address,'n'), + 'node_id'=>Arr::get($address,'f'), + 'point_id'=>Arr::get($address,'p',0) + ]); if (! $no->exists AND $create) { diff --git a/app/Traits/ParseNodes.php b/app/Traits/ParseNodes.php index 5a464d1..2e8d33d 100644 --- a/app/Traits/ParseNodes.php +++ b/app/Traits/ParseNodes.php @@ -9,7 +9,7 @@ trait ParseNodes /** * Parse a seenby or path list and return node models */ - protected function parse_nodes(Zone $zone,string $line,$create=TRUE) + protected function parse_nodes(Zone $zo,string $line,$create=TRUE) { $net = FALSE; $result = collect(); @@ -24,7 +24,7 @@ trait ParseNodes if (! $net) throw new \Exception('Missing Net?',$node); - $result->push($this->get_node($zone->id,$net,$node,0,$create)); + $result->push($this->get_node(['z'=>$zo->id,'n'=>$net,'f'=>$node,'p'=>0],$create)); } return $result; diff --git a/app/Traits/ParseZNFPDomain.php b/app/Traits/ParseZNFPDomain.php deleted file mode 100644 index 6821803..0000000 --- a/app/Traits/ParseZNFPDomain.php +++ /dev/null @@ -1,26 +0,0 @@ -get_node($z,$n,$f,$p,$create); - } -} \ No newline at end of file diff --git a/app/helpers.php b/app/helpers.php index 4567b3a..5a0cc89 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -51,4 +51,59 @@ if (! function_exists('hex_dump')) { return $result; } +} + +/** + * Split out an FTN address into its parts + * + * This function takes a fully qualified FTN address and splits it out into + * its components: + * Z:N/F.P@D + */ +if (! function_exists('ftn_address_split')) { + function ftn_address_split(string $address,$key=NULL) + { + if ($key AND ! in_array($key,['z','n','f','p','d'])) + { + throw new \Exception('Unknown key :'.$key.' for '.$address); + } + + //$data = "10:12/909"; + //$data = "10:12/909.5"; + //$data = "10:12/909@foo"; + //$data = "10:12/909.5@foo"; + $z = substr($address,0,strpos($address,':')); + + if ($key == 'z') + return $z; + + $x = strpos($address,':')+1; + $n = substr($address,$x,strpos($address,'/')-$x); + + if ($key == 'n') + return $n; + + $x = strpos($address,'/')+1; + $f = substr($address,$x, + (strpos($address,'.') ?: + (strpos($address,'@') ?: strlen($address)))-$x); + + if ($key == 'f') + return $f; + + $x = strpos($address,'.'); + $p = $x ? substr($address,$x+1,(strpos($address,'@') ?: strlen($address))-$x-1) : 0; + + if ($key == 'p') + return $p; + + // @todo We dont handle domain yet. + $x = strpos($address,'@'); + $d = $x ? substr($address,$x+1) : NULL; + + if ($key == 'd') + return $d; + + return ['z'=>$z,'n'=>$n,'f'=>$f,'p'=>$p,'d'=>$d]; + } } \ No newline at end of file diff --git a/composer.json b/composer.json index 88c6c0e..b4e7722 100644 --- a/composer.json +++ b/composer.json @@ -7,7 +7,7 @@ "require": { "php": "^7.1.3", "fideloper/proxy": "^4.0", - "laravel/framework": "5.7.*", + "laravel/framework": "5.8.*", "laravel/tinker": "^1.0", "nbj/cockroachdb-laravel": "^0.0.6@alpha" }, @@ -16,8 +16,8 @@ "filp/whoops": "^2.0", "fzaninotto/faker": "^1.4", "mockery/mockery": "^1.0", - "nunomaduro/collision": "^2.0", - "phpunit/phpunit": "^7.0" + "nunomaduro/collision": "^3.0", + "phpunit/phpunit": "^7.5" }, "autoload": { "files": [ diff --git a/composer.lock b/composer.lock index c5d1c04..6d62f75 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f4fa68dee51390d0fc4c5887b35c10f6", + "content-hash": "64f4eefa4d1d4c5b126f243cb0defab2", "packages": [ { "name": "dnoegel/php-xdg-base-dir", @@ -162,25 +162,30 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v2.2.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5" + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/92a2c3768d50e21a1f26a53cb795ce72806266c5", - "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27", "shasum": "" }, "require": { - "php": ">=7.0.0" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "~6.4" + "phpunit/phpunit": "^6.4|^7.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, "autoload": { "psr-4": { "Cron\\": "src/Cron/" @@ -207,20 +212,20 @@ "cron", "schedule" ], - "time": "2018-06-06T03:12:17+00:00" + "time": "2019-03-31T00:38:28+00:00" }, { "name": "egulias/email-validator", - "version": "2.1.6", + "version": "2.1.7", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "0578b32b30b22de3e8664f797cf846fc9246f786" + "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0578b32b30b22de3e8664f797cf846fc9246f786", - "reference": "0578b32b30b22de3e8664f797cf846fc9246f786", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/709f21f92707308cdf8f9bcfa1af4cb26586521e", + "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e", "shasum": "" }, "require": { @@ -264,20 +269,20 @@ "validation", "validator" ], - "time": "2018-09-25T20:47:26+00:00" + "time": "2018-12-04T22:38:24+00:00" }, { "name": "erusev/parsedown", - "version": "1.7.1", + "version": "1.7.3", "source": { "type": "git", "url": "https://github.com/erusev/parsedown.git", - "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1" + "reference": "6d893938171a817f4e9bc9e86f2da1e370b7bcd7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", - "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/6d893938171a817f4e9bc9e86f2da1e370b7bcd7", + "reference": "6d893938171a817f4e9bc9e86f2da1e370b7bcd7", "shasum": "" }, "require": { @@ -310,20 +315,20 @@ "markdown", "parser" ], - "time": "2018-03-08T01:11:30+00:00" + "time": "2019-03-17T18:48:37+00:00" }, { "name": "fideloper/proxy", - "version": "4.0.0", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "cf8a0ca4b85659b9557e206c90110a6a4dba980a" + "reference": "177c79a2d1f9970f89ee2fb4c12b429af38b6dfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/cf8a0ca4b85659b9557e206c90110a6a4dba980a", - "reference": "cf8a0ca4b85659b9557e206c90110a6a4dba980a", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/177c79a2d1f9970f89ee2fb4c12b429af38b6dfb", + "reference": "177c79a2d1f9970f89ee2fb4c12b429af38b6dfb", "shasum": "" }, "require": { @@ -364,7 +369,7 @@ "proxy", "trusted proxy" ], - "time": "2018-02-07T20:20:57+00:00" + "time": "2019-01-10T14:06:47+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -410,33 +415,34 @@ }, { "name": "jakub-onderka/php-console-highlighter", - "version": "v0.3.2", + "version": "v0.4", "source": { "type": "git", "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", - "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", - "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547", + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547", "shasum": "" }, "require": { - "jakub-onderka/php-console-color": "~0.1", - "php": ">=5.3.0" + "ext-tokenizer": "*", + "jakub-onderka/php-console-color": "~0.2", + "php": ">=5.4.0" }, "require-dev": { "jakub-onderka/php-code-style": "~1.0", - "jakub-onderka/php-parallel-lint": "~0.5", + "jakub-onderka/php-parallel-lint": "~1.0", "jakub-onderka/php-var-dump-check": "~0.1", "phpunit/phpunit": "~4.0", "squizlabs/php_codesniffer": "~1.5" }, "type": "library", "autoload": { - "psr-0": { - "JakubOnderka\\PhpConsoleHighlighter": "src/" + "psr-4": { + "JakubOnderka\\PhpConsoleHighlighter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -450,47 +456,50 @@ "homepage": "http://www.acci.cz/" } ], - "time": "2015-04-20T18:58:01+00:00" + "description": "Highlight PHP code in terminal", + "time": "2018-09-29T18:48:56+00:00" }, { "name": "laravel/framework", - "version": "v5.7.13", + "version": "v5.8.17", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "3ff3110ac14f2b4876acaff289bb55a1af74f02e" + "reference": "33c04dd2a431adeeb49926a4f2b20590cc033ca2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/3ff3110ac14f2b4876acaff289bb55a1af74f02e", - "reference": "3ff3110ac14f2b4876acaff289bb55a1af74f02e", + "url": "https://api.github.com/repos/laravel/framework/zipball/33c04dd2a431adeeb49926a4f2b20590cc033ca2", + "reference": "33c04dd2a431adeeb49926a4f2b20590cc033ca2", "shasum": "" }, "require": { "doctrine/inflector": "^1.1", "dragonmantank/cron-expression": "^2.0", + "egulias/email-validator": "^2.0", "erusev/parsedown": "^1.7", + "ext-json": "*", "ext-mbstring": "*", "ext-openssl": "*", "league/flysystem": "^1.0.8", "monolog/monolog": "^1.12", - "nesbot/carbon": "^1.26.3", + "nesbot/carbon": "^1.26.3 || ^2.0", "opis/closure": "^3.1", "php": "^7.1.3", "psr/container": "^1.0", "psr/simple-cache": "^1.0", "ramsey/uuid": "^3.7", "swiftmailer/swiftmailer": "^6.0", - "symfony/console": "^4.1", - "symfony/debug": "^4.1", - "symfony/finder": "^4.1", - "symfony/http-foundation": "^4.1", - "symfony/http-kernel": "^4.1", - "symfony/process": "^4.1", - "symfony/routing": "^4.1", - "symfony/var-dumper": "^4.1", + "symfony/console": "^4.2", + "symfony/debug": "^4.2", + "symfony/finder": "^4.2", + "symfony/http-foundation": "^4.2", + "symfony/http-kernel": "^4.2", + "symfony/process": "^4.2", + "symfony/routing": "^4.2", + "symfony/var-dumper": "^4.2", "tijsverkoyen/css-to-inline-styles": "^2.2.1", - "vlucas/phpdotenv": "^2.2" + "vlucas/phpdotenv": "^3.3" }, "conflict": { "tightenco/collect": "<5.5.33" @@ -533,12 +542,12 @@ "league/flysystem-cached-adapter": "^1.0", "mockery/mockery": "^1.0", "moontoast/math": "^1.1", - "orchestra/testbench-core": "3.7.*", - "pda/pheanstalk": "^3.0", - "phpunit/phpunit": "^7.0", + "orchestra/testbench-core": "3.8.*", + "pda/pheanstalk": "^4.0", + "phpunit/phpunit": "^7.5|^8.0", "predis/predis": "^1.1.1", - "symfony/css-selector": "^4.1", - "symfony/dom-crawler": "^4.1", + "symfony/css-selector": "^4.2", + "symfony/dom-crawler": "^4.2", "true/punycode": "^2.1" }, "suggest": { @@ -556,17 +565,18 @@ "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", "moontoast/math": "Required to use ordered UUIDs (^1.1).", "nexmo/client": "Required to use the Nexmo transport (^1.0).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (^3.0).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", "predis/predis": "Required to use the redis cache and queue drivers (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^3.0).", - "symfony/css-selector": "Required to use some of the crawler integration testing tools (^4.1).", - "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (^4.1).", - "symfony/psr-http-message-bridge": "Required to psr7 bridging features (^1.0)." + "symfony/css-selector": "Required to use some of the crawler integration testing tools (^4.2).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (^4.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^1.1).", + "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.7-dev" + "dev-master": "5.8-dev" } }, "autoload": { @@ -594,7 +604,7 @@ "framework", "laravel" ], - "time": "2018-11-07T12:41:02+00:00" + "time": "2019-05-14T16:02:41+00:00" }, { "name": "laravel/tinker", @@ -661,16 +671,16 @@ }, { "name": "league/flysystem", - "version": "1.0.48", + "version": "1.0.51", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "a6ded5b2f6055e2db97b4b859fdfca2b952b78aa" + "reference": "755ba7bf3fb9031e6581d091db84d78275874396" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a6ded5b2f6055e2db97b4b859fdfca2b952b78aa", - "reference": "a6ded5b2f6055e2db97b4b859fdfca2b952b78aa", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/755ba7bf3fb9031e6581d091db84d78275874396", + "reference": "755ba7bf3fb9031e6581d091db84d78275874396", "shasum": "" }, "require": { @@ -741,7 +751,7 @@ "sftp", "storage" ], - "time": "2018-10-15T13:53:10+00:00" + "time": "2019-03-30T13:22:34+00:00" }, { "name": "monolog/monolog", @@ -868,28 +878,30 @@ }, { "name": "nesbot/carbon", - "version": "1.34.4", + "version": "2.18.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "b9a444d829c9a16735aceca1b173e765745bcc0c" + "reference": "8322b7bd1805be31867c13bf3cdaab948a0dd406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/b9a444d829c9a16735aceca1b173e765745bcc0c", - "reference": "b9a444d829c9a16735aceca1b173e765745bcc0c", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/8322b7bd1805be31867c13bf3cdaab948a0dd406", + "reference": "8322b7bd1805be31867c13bf3cdaab948a0dd406", "shasum": "" }, "require": { - "php": ">=5.3.9", - "symfony/translation": "~2.6 || ~3.0 || ~4.0" + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/translation": "^3.4 || ^4.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7" - }, - "suggest": { - "friendsofphp/php-cs-fixer": "Needed for the `composer phpcs` command. Allow to automatically fix code style.", - "phpstan/phpstan": "Needed for the `composer phpstan` command. Allow to detect potential errors." + "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", + "kylekatarnls/multi-tester": "^1.1", + "phpmd/phpmd": "^2.6", + "phpstan/phpstan": "^0.11", + "phpunit/phpunit": "^7.5 || ^8.0", + "squizlabs/php_codesniffer": "^3.4" }, "type": "library", "extra": { @@ -901,7 +913,7 @@ }, "autoload": { "psr-4": { - "": "src/" + "Carbon\\": "src/Carbon/" } }, "notification-url": "https://packagist.org/downloads/", @@ -922,20 +934,20 @@ "datetime", "time" ], - "time": "2018-11-13T08:26:10+00:00" + "time": "2019-05-16T18:44:35+00:00" }, { "name": "nikic/php-parser", - "version": "v4.1.0", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "d0230c5c77a7e3cfa69446febf340978540958c0" + "reference": "5221f49a608808c1e4d436df32884cbc1b821ac0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/d0230c5c77a7e3cfa69446febf340978540958c0", - "reference": "d0230c5c77a7e3cfa69446febf340978540958c0", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/5221f49a608808c1e4d436df32884cbc1b821ac0", + "reference": "5221f49a608808c1e4d436df32884cbc1b821ac0", "shasum": "" }, "require": { @@ -951,7 +963,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -973,20 +985,20 @@ "parser", "php" ], - "time": "2018-10-10T09:24:14+00:00" + "time": "2019-02-16T20:54:15+00:00" }, { "name": "opis/closure", - "version": "3.1.1", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/opis/closure.git", - "reference": "d3209e46ad6c69a969b705df0738fd0dbe26ef9e" + "reference": "09b4389715a7eec100176ea58286649181753508" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/d3209e46ad6c69a969b705df0738fd0dbe26ef9e", - "reference": "d3209e46ad6c69a969b705df0738fd0dbe26ef9e", + "url": "https://api.github.com/repos/opis/closure/zipball/09b4389715a7eec100176ea58286649181753508", + "reference": "09b4389715a7eec100176ea58286649181753508", "shasum": "" }, "require": { @@ -994,12 +1006,12 @@ }, "require-dev": { "jeremeamia/superclosure": "^2.0", - "phpunit/phpunit": "^4.0" + "phpunit/phpunit": "^4.0|^5.0|^6.0|^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "3.2.x-dev" } }, "autoload": { @@ -1034,7 +1046,7 @@ "serialization", "serialize" ], - "time": "2018-10-02T13:36:53+00:00" + "time": "2019-05-05T12:50:25+00:00" }, { "name": "paragonie/random_compat", @@ -1081,6 +1093,56 @@ ], "time": "2018-07-02T15:55:56+00:00" }, + { + "name": "phpoption/phpoption", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed", + "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "4.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-0": { + "PhpOption\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "time": "2015-07-25T16:39:46+00:00" + }, { "name": "psr/container", "version": "1.0.0", @@ -1132,16 +1194,16 @@ }, { "name": "psr/log", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", "shasum": "" }, "require": { @@ -1175,7 +1237,7 @@ "psr", "psr-3" ], - "time": "2016-10-10T12:19:37+00:00" + "time": "2018-11-20T15:27:04+00:00" }, { "name": "psr/simple-cache", @@ -1383,25 +1445,28 @@ }, { "name": "swiftmailer/swiftmailer", - "version": "v6.1.3", + "version": "v6.2.1", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "8ddcb66ac10c392d3beb54829eef8ac1438595f4" + "reference": "5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8ddcb66ac10c392d3beb54829eef8ac1438595f4", - "reference": "8ddcb66ac10c392d3beb54829eef8ac1438595f4", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a", + "reference": "5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a", "shasum": "" }, "require": { "egulias/email-validator": "~2.0", - "php": ">=7.0.0" + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" }, "require-dev": { "mockery/mockery": "~0.9.1", - "symfony/phpunit-bridge": "~3.3@dev" + "symfony/phpunit-bridge": "^3.4.19|^4.1.8" }, "suggest": { "ext-intl": "Needed to support internationalized email addresses", @@ -1410,7 +1475,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.1-dev" + "dev-master": "6.2-dev" } }, "autoload": { @@ -1438,30 +1503,34 @@ "mail", "mailer" ], - "time": "2018-09-11T07:12:52+00:00" + "time": "2019-04-21T09:21:45+00:00" }, { "name": "symfony/console", - "version": "v4.1.7", + "version": "v4.2.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "432122af37d8cd52fba1b294b11976e0d20df595" + "reference": "e2840bb38bddad7a0feaf85931e38fdcffdb2f81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/432122af37d8cd52fba1b294b11976e0d20df595", - "reference": "432122af37d8cd52fba1b294b11976e0d20df595", + "url": "https://api.github.com/repos/symfony/console/zipball/e2840bb38bddad7a0feaf85931e38fdcffdb2f81", + "reference": "e2840bb38bddad7a0feaf85931e38fdcffdb2f81", "shasum": "" }, "require": { "php": "^7.1.3", + "symfony/contracts": "^1.0", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/dependency-injection": "<3.4", "symfony/process": "<3.3" }, + "provide": { + "psr/log-implementation": "1.0" + }, "require-dev": { "psr/log": "~1.0", "symfony/config": "~3.4|~4.0", @@ -1471,7 +1540,7 @@ "symfony/process": "~3.4|~4.0" }, "suggest": { - "psr/log-implementation": "For using the console logger", + "psr/log": "For using the console logger", "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "" @@ -1479,7 +1548,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1506,20 +1575,91 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-10-31T09:30:44+00:00" + "time": "2019-04-08T14:23:48+00:00" }, { - "name": "symfony/css-selector", - "version": "v4.1.7", + "name": "symfony/contracts", + "version": "v1.1.0", "source": { "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "d67de79a70a27d93c92c47f37ece958bf8de4d8a" + "url": "https://github.com/symfony/contracts.git", + "reference": "d3636025e8253c6144358ec0a62773cae588395b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/d67de79a70a27d93c92c47f37ece958bf8de4d8a", - "reference": "d67de79a70a27d93c92c47f37ece958bf8de4d8a", + "url": "https://api.github.com/repos/symfony/contracts/zipball/d3636025e8253c6144358ec0a62773cae588395b", + "reference": "d3636025e8253c6144358ec0a62773cae588395b", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "psr/cache": "^1.0", + "psr/container": "^1.0", + "symfony/polyfill-intl-idn": "^1.10" + }, + "suggest": { + "psr/cache": "When using the Cache contracts", + "psr/container": "When using the Service contracts", + "symfony/cache-contracts-implementation": "", + "symfony/event-dispatcher-implementation": "", + "symfony/http-client-contracts-implementation": "", + "symfony/service-contracts-implementation": "", + "symfony/translation-contracts-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\": "" + }, + "exclude-from-classmap": [ + "**/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A set of abstractions extracted out of the Symfony components", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-04-27T14:29:50+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v4.2.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "48eddf66950fa57996e1be4a55916d65c10c604a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/48eddf66950fa57996e1be4a55916d65c10c604a", + "reference": "48eddf66950fa57996e1be4a55916d65c10c604a", "shasum": "" }, "require": { @@ -1528,7 +1668,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1559,20 +1699,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-10-02T16:36:10+00:00" + "time": "2019-01-16T20:31:39+00:00" }, { "name": "symfony/debug", - "version": "v4.1.7", + "version": "v4.2.8", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "19090917b848a799cbae4800abf740fe4eb71c1d" + "reference": "2d279b6bb1d582dd5740d4d3251ae8c18812ed37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/19090917b848a799cbae4800abf740fe4eb71c1d", - "reference": "19090917b848a799cbae4800abf740fe4eb71c1d", + "url": "https://api.github.com/repos/symfony/debug/zipball/2d279b6bb1d582dd5740d4d3251ae8c18812ed37", + "reference": "2d279b6bb1d582dd5740d4d3251ae8c18812ed37", "shasum": "" }, "require": { @@ -1588,7 +1728,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1615,24 +1755,25 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-10-31T09:09:42+00:00" + "time": "2019-04-11T11:27:41+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.1.7", + "version": "v4.2.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "552541dad078c85d9414b09c041ede488b456cd5" + "reference": "fbce53cd74ac509cbe74b6f227622650ab759b02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/552541dad078c85d9414b09c041ede488b456cd5", - "reference": "552541dad078c85d9414b09c041ede488b456cd5", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/fbce53cd74ac509cbe74b6f227622650ab759b02", + "reference": "fbce53cd74ac509cbe74b6f227622650ab759b02", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.1.3", + "symfony/contracts": "^1.0" }, "conflict": { "symfony/dependency-injection": "<3.4" @@ -1651,7 +1792,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1678,20 +1819,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-10-10T13:52:42+00:00" + "time": "2019-04-06T13:51:08+00:00" }, { "name": "symfony/finder", - "version": "v4.1.7", + "version": "v4.2.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "1f17195b44543017a9c9b2d437c670627e96ad06" + "reference": "e45135658bd6c14b61850bf131c4f09a55133f69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/1f17195b44543017a9c9b2d437c670627e96ad06", - "reference": "1f17195b44543017a9c9b2d437c670627e96ad06", + "url": "https://api.github.com/repos/symfony/finder/zipball/e45135658bd6c14b61850bf131c4f09a55133f69", + "reference": "e45135658bd6c14b61850bf131c4f09a55133f69", "shasum": "" }, "require": { @@ -1700,7 +1841,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1727,20 +1868,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-10-03T08:47:56+00:00" + "time": "2019-04-06T13:51:08+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.1.7", + "version": "v4.2.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "82d494c1492b0dd24bbc5c2d963fb02eb44491af" + "reference": "1ea878bd3af18f934dedb8c0de60656a9a31a718" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/82d494c1492b0dd24bbc5c2d963fb02eb44491af", - "reference": "82d494c1492b0dd24bbc5c2d963fb02eb44491af", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1ea878bd3af18f934dedb8c0de60656a9a31a718", + "reference": "1ea878bd3af18f934dedb8c0de60656a9a31a718", "shasum": "" }, "require": { @@ -1754,7 +1895,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1781,25 +1922,26 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-10-31T09:09:42+00:00" + "time": "2019-05-01T08:36:31+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.1.7", + "version": "v4.2.8", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "958be64ab13b65172ad646ef5ae20364c2305fae" + "reference": "a7713bc522f1a1cdf0b39f809fa4542523fc3114" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/958be64ab13b65172ad646ef5ae20364c2305fae", - "reference": "958be64ab13b65172ad646ef5ae20364c2305fae", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a7713bc522f1a1cdf0b39f809fa4542523fc3114", + "reference": "a7713bc522f1a1cdf0b39f809fa4542523fc3114", "shasum": "" }, "require": { "php": "^7.1.3", "psr/log": "~1.0", + "symfony/contracts": "^1.0.2", "symfony/debug": "~3.4|~4.0", "symfony/event-dispatcher": "~4.1", "symfony/http-foundation": "^4.1.1", @@ -1807,7 +1949,8 @@ }, "conflict": { "symfony/config": "<3.4", - "symfony/dependency-injection": "<4.1", + "symfony/dependency-injection": "<4.2", + "symfony/translation": "<4.2", "symfony/var-dumper": "<4.1.1", "twig/twig": "<1.34|<2.4,>=2" }, @@ -1820,7 +1963,7 @@ "symfony/config": "~3.4|~4.0", "symfony/console": "~3.4|~4.0", "symfony/css-selector": "~3.4|~4.0", - "symfony/dependency-injection": "^4.1", + "symfony/dependency-injection": "^4.2", "symfony/dom-crawler": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", "symfony/finder": "~3.4|~4.0", @@ -1828,7 +1971,7 @@ "symfony/routing": "~3.4|~4.0", "symfony/stopwatch": "~3.4|~4.0", "symfony/templating": "~3.4|~4.0", - "symfony/translation": "~3.4|~4.0", + "symfony/translation": "~4.2", "symfony/var-dumper": "^4.1.1" }, "suggest": { @@ -1841,7 +1984,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1868,20 +2011,20 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-11-03T11:11:23+00:00" + "time": "2019-05-01T13:31:08+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.10.0", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + "reference": "82ebae02209c21113908c229e9883c419720738a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", + "reference": "82ebae02209c21113908c229e9883c419720738a", "shasum": "" }, "require": { @@ -1893,7 +2036,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.11-dev" } }, "autoload": { @@ -1926,20 +2069,141 @@ "polyfill", "portable" ], - "time": "2018-08-06T14:22:27+00:00" + "time": "2019-02-06T07:57:58+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.10.0", + "name": "symfony/polyfill-iconv", + "version": "v1.11.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "f037ea22acfaee983e271dd9c3b8bb4150bd8ad7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/f037ea22acfaee983e271dd9c3b8bb4150bd8ad7", + "reference": "f037ea22acfaee983e271dd9c3b8bb4150bd8ad7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c766e95bec706cdd89903b1eda8afab7d7a6b7af", + "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.9" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2019-03-04T13:44:35+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", + "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", "shasum": "" }, "require": { @@ -1951,7 +2215,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.11-dev" } }, "autoload": { @@ -1985,20 +2249,20 @@ "portable", "shim" ], - "time": "2018-09-21T13:07:52+00:00" + "time": "2019-02-06T07:57:58+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.10.0", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631" + "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9050816e2ca34a8e916c3a0ae8b9c2fccf68b631", - "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/ab50dcf166d5f577978419edd37aa2bb8eabce0c", + "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c", "shasum": "" }, "require": { @@ -2007,7 +2271,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.11-dev" } }, "autoload": { @@ -2040,20 +2304,20 @@ "portable", "shim" ], - "time": "2018-09-21T13:07:52+00:00" + "time": "2019-02-06T07:57:58+00:00" }, { "name": "symfony/process", - "version": "v4.1.7", + "version": "v4.2.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3e83acef94d979b1de946599ef86b3a352abcdc9" + "reference": "8cf39fb4ccff793340c258ee7760fd40bfe745fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3e83acef94d979b1de946599ef86b3a352abcdc9", - "reference": "3e83acef94d979b1de946599ef86b3a352abcdc9", + "url": "https://api.github.com/repos/symfony/process/zipball/8cf39fb4ccff793340c258ee7760fd40bfe745fe", + "reference": "8cf39fb4ccff793340c258ee7760fd40bfe745fe", "shasum": "" }, "require": { @@ -2062,7 +2326,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2089,34 +2353,34 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-10-14T20:48:13+00:00" + "time": "2019-04-10T16:20:36+00:00" }, { "name": "symfony/routing", - "version": "v4.1.7", + "version": "v4.2.8", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "d4a3c14cfbe6b9c05a1d6e948654022d4d1ad3fd" + "reference": "f4e43bb0dff56f0f62fa056c82d7eadcdb391bab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/d4a3c14cfbe6b9c05a1d6e948654022d4d1ad3fd", - "reference": "d4a3c14cfbe6b9c05a1d6e948654022d4d1ad3fd", + "url": "https://api.github.com/repos/symfony/routing/zipball/f4e43bb0dff56f0f62fa056c82d7eadcdb391bab", + "reference": "f4e43bb0dff56f0f62fa056c82d7eadcdb391bab", "shasum": "" }, "require": { "php": "^7.1.3" }, "conflict": { - "symfony/config": "<3.4", + "symfony/config": "<4.2", "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { "doctrine/annotations": "~1.0", "psr/log": "~1.0", - "symfony/config": "~3.4|~4.0", + "symfony/config": "~4.2", "symfony/dependency-injection": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", "symfony/http-foundation": "~3.4|~4.0", @@ -2125,7 +2389,6 @@ "suggest": { "doctrine/annotations": "For using the annotation loader", "symfony/config": "For using the all-in-one router or any loader", - "symfony/dependency-injection": "For loading routes from a service", "symfony/expression-language": "For using expression matching", "symfony/http-foundation": "For using a Symfony Request object", "symfony/yaml": "For using the YAML loader" @@ -2133,7 +2396,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2166,24 +2429,25 @@ "uri", "url" ], - "time": "2018-10-28T18:38:52+00:00" + "time": "2019-04-27T09:38:08+00:00" }, { "name": "symfony/translation", - "version": "v4.1.7", + "version": "v4.2.8", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "aa04dc1c75b7d3da7bd7003104cd0cfc5dff635c" + "reference": "181a426dd129cb496f12d7e7555f6d0b37a7615b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/aa04dc1c75b7d3da7bd7003104cd0cfc5dff635c", - "reference": "aa04dc1c75b7d3da7bd7003104cd0cfc5dff635c", + "url": "https://api.github.com/repos/symfony/translation/zipball/181a426dd129cb496f12d7e7555f6d0b37a7615b", + "reference": "181a426dd129cb496f12d7e7555f6d0b37a7615b", "shasum": "" }, "require": { "php": "^7.1.3", + "symfony/contracts": "^1.0.2", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -2191,13 +2455,18 @@ "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, + "provide": { + "symfony/translation-contracts-implementation": "1.0" + }, "require-dev": { "psr/log": "~1.0", "symfony/config": "~3.4|~4.0", "symfony/console": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/http-kernel": "~3.4|~4.0", "symfony/intl": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, "suggest": { @@ -2208,7 +2477,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2235,20 +2504,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2018-10-28T18:38:52+00:00" + "time": "2019-05-01T12:55:36+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.1.7", + "version": "v4.2.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "60319b45653580b0cdacca499344577d87732f16" + "reference": "3c4084cb1537c0e2ad41aad622bbf55a44a5c9ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/60319b45653580b0cdacca499344577d87732f16", - "reference": "60319b45653580b0cdacca499344577d87732f16", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3c4084cb1537c0e2ad41aad622bbf55a44a5c9ce", + "reference": "3c4084cb1537c0e2ad41aad622bbf55a44a5c9ce", "shasum": "" }, "require": { @@ -2262,6 +2531,7 @@ }, "require-dev": { "ext-iconv": "*", + "symfony/console": "~3.4|~4.0", "symfony/process": "~3.4|~4.0", "twig/twig": "~1.34|~2.4" }, @@ -2276,7 +2546,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2310,7 +2580,7 @@ "debug", "dump" ], - "time": "2018-10-02T16:36:10+00:00" + "time": "2019-05-01T12:55:36+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -2361,28 +2631,30 @@ }, { "name": "vlucas/phpdotenv", - "version": "v2.5.1", + "version": "v3.3.3", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e" + "reference": "dbcc609971dd9b55f48b8008b553d79fd372ddde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", - "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/dbcc609971dd9b55f48b8008b553d79fd372ddde", + "reference": "dbcc609971dd9b55f48b8008b553d79fd372ddde", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": "^5.4 || ^7.0", + "phpoption/phpoption": "^1.5", + "symfony/polyfill-ctype": "^1.9" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.0" + "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -2407,7 +2679,7 @@ "env", "environment" ], - "time": "2018-07-29T20:33:41+00:00" + "time": "2019-03-06T09:39:45+00:00" } ], "packages-dev": [ @@ -2474,27 +2746,29 @@ }, { "name": "doctrine/instantiator", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" + "reference": "a2c590166b2133a4633738648b6b064edae0814a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a", + "reference": "a2c590166b2133a4633738648b6b064edae0814a", "shasum": "" }, "require": { "php": "^7.1" }, "require-dev": { - "athletic/athletic": "~0.1.8", + "doctrine/coding-standard": "^6.0", "ext-pdo": "*", "ext-phar": "*", - "phpunit/phpunit": "^6.2.3", - "squizlabs/php_codesniffer": "^3.0.2" + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { @@ -2519,12 +2793,12 @@ } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ "constructor", "instantiate" ], - "time": "2017-07-22T11:58:36+00:00" + "time": "2019-03-17T17:37:11+00:00" }, { "name": "filp/whoops", @@ -2687,16 +2961,16 @@ }, { "name": "mockery/mockery", - "version": "1.2.0", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "100633629bf76d57430b86b7098cd6beb996a35a" + "reference": "0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/100633629bf76d57430b86b7098cd6beb996a35a", - "reference": "100633629bf76d57430b86b7098cd6beb996a35a", + "url": "https://api.github.com/repos/mockery/mockery/zipball/0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2", + "reference": "0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2", "shasum": "" }, "require": { @@ -2705,7 +2979,7 @@ "php": ">=5.6.0" }, "require-dev": { - "phpunit/phpunit": "~5.7.10|~6.5|~7.0" + "phpunit/phpunit": "~5.7.10|~6.5|~7.0|~8.0" }, "type": "library", "extra": { @@ -2748,20 +3022,20 @@ "test double", "testing" ], - "time": "2018-10-02T21:52:37+00:00" + "time": "2019-02-13T09:37:52+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.8.1", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" + "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", - "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", + "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", "shasum": "" }, "require": { @@ -2796,32 +3070,33 @@ "object", "object graph" ], - "time": "2018-06-11T23:09:50+00:00" + "time": "2019-04-07T13:18:21+00:00" }, { "name": "nunomaduro/collision", - "version": "v2.1.0", + "version": "v3.0.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "1149ad9f36f61b121ae61f5f6de820fc77b51e6b" + "reference": "af42d339fe2742295a54f6fdd42aaa6f8c4aca68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1149ad9f36f61b121ae61f5f6de820fc77b51e6b", - "reference": "1149ad9f36f61b121ae61f5f6de820fc77b51e6b", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/af42d339fe2742295a54f6fdd42aaa6f8c4aca68", + "reference": "af42d339fe2742295a54f6fdd42aaa6f8c4aca68", "shasum": "" }, "require": { "filp/whoops": "^2.1.4", - "jakub-onderka/php-console-highlighter": "0.3.*", + "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", "php": "^7.1", "symfony/console": "~2.8|~3.3|~4.0" }, "require-dev": { - "laravel/framework": "5.7.*", - "phpstan/phpstan": "^0.10", - "phpunit/phpunit": "~7.3" + "laravel/framework": "5.8.*", + "nunomaduro/larastan": "^0.3.0", + "phpstan/phpstan": "^0.11", + "phpunit/phpunit": "~8.0" }, "type": "library", "extra": { @@ -2859,7 +3134,7 @@ "php", "symfony" ], - "time": "2018-10-03T20:01:54+00:00" + "time": "2019-03-07T21:35:13+00:00" }, { "name": "phar-io/manifest", @@ -3019,16 +3294,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.0", + "version": "4.3.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", + "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", "shasum": "" }, "require": { @@ -3066,7 +3341,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-30T07:14:17+00:00" + "time": "2019-04-30T17:48:53+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -3334,16 +3609,16 @@ }, { "name": "phpunit/php-timer", - "version": "2.0.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" + "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", - "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b389aebe1b8b0578430bda0c7c95a829608e059", + "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059", "shasum": "" }, "require": { @@ -3355,7 +3630,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -3379,7 +3654,7 @@ "keywords": [ "timer" ], - "time": "2018-02-01T13:07:23+00:00" + "time": "2019-02-20T10:12:59+00:00" }, { "name": "phpunit/php-token-stream", @@ -3432,16 +3707,16 @@ }, { "name": "phpunit/phpunit", - "version": "7.4.3", + "version": "7.5.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c151651fb6ed264038d486ea262e243af72e5e64" + "reference": "64cb33f5b520da490a7b13149d39b43cf3c890c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c151651fb6ed264038d486ea262e243af72e5e64", - "reference": "c151651fb6ed264038d486ea262e243af72e5e64", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/64cb33f5b520da490a7b13149d39b43cf3c890c6", + "reference": "64cb33f5b520da490a7b13149d39b43cf3c890c6", "shasum": "" }, "require": { @@ -3459,10 +3734,10 @@ "phpunit/php-code-coverage": "^6.0.7", "phpunit/php-file-iterator": "^2.0.1", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.0", + "phpunit/php-timer": "^2.1", "sebastian/comparator": "^3.0", "sebastian/diff": "^3.0", - "sebastian/environment": "^3.1 || ^4.0", + "sebastian/environment": "^4.0", "sebastian/exporter": "^3.1", "sebastian/global-state": "^2.0", "sebastian/object-enumerator": "^3.0.3", @@ -3486,7 +3761,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.4-dev" + "dev-master": "7.5-dev" } }, "autoload": { @@ -3512,7 +3787,7 @@ "testing", "xunit" ], - "time": "2018-10-23T05:57:41+00:00" + "time": "2019-05-14T04:53:02+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -3625,23 +3900,23 @@ }, { "name": "sebastian/diff", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "366541b989927187c4ca70490a35615d3fef2dce" + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce", - "reference": "366541b989927187c4ca70490a35615d3fef2dce", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", "shasum": "" }, "require": { "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^7.0", + "phpunit/phpunit": "^7.5 || ^8.0", "symfony/process": "^2 || ^3.3 || ^4" }, "type": "library", @@ -3677,32 +3952,35 @@ "unidiff", "unified diff" ], - "time": "2018-06-10T07:54:39+00:00" + "time": "2019-02-04T06:01:07+00:00" }, { "name": "sebastian/environment", - "version": "3.1.0", + "version": "4.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" + "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/f2a2c8e1c97c11ace607a7a667d73d47c19fe404", + "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.1" + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -3727,7 +4005,7 @@ "environment", "hhvm" ], - "time": "2017-07-01T08:51:00+00:00" + "time": "2019-05-05T09:05:15+00:00" }, { "name": "sebastian/exporter", @@ -4079,16 +4357,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.1.0", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" + "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", - "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/1c42705be2b6c1de5904f8afacef5895cab44bf8", + "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8", "shasum": "" }, "require": { @@ -4115,24 +4393,25 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2017-04-07T12:08:54+00:00" + "time": "2019-04-04T09:56:43+00:00" }, { "name": "webmozart/assert", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a" + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a", + "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" }, "require-dev": { "phpunit/phpunit": "^4.6", @@ -4165,7 +4444,7 @@ "check", "validate" ], - "time": "2018-01-29T19:49:41+00:00" + "time": "2018-12-25T11:19:39+00:00" } ], "aliases": [],