From 81875e455ec08a54a6d8e6d6c1e33f887be66156 Mon Sep 17 00:00:00 2001 From: Corne Oppelaar Date: Thu, 2 Jun 2016 02:02:14 +0200 Subject: [PATCH] [wip] --- .gitignore | 1 + Vagrantfile | 23 + bin/get-fingerprint | 2 + bin/revoke-cert | 1 + bin/sign-server-csr | 2 +- composer.json | 3 +- composer.lock | 175 +- config/app.yml | 3 +- config/routes.yml | 14 +- config/schema.xml | 31 + public/css/main.css | 9 + public/js/edit_server.js | 42 + public/js/{main.js => new_certificate.js} | 37 +- public/js/panel.js | 29 + src/Handler/CA.php | 14 + src/Handler/Home.php | 6 - src/Handler/Panel.php | 21 +- src/Handler/Panel/Certificates/Download.php | 4 +- src/Handler/Panel/Certificates/Revoke.php | 69 + .../Panel/Certificates/_New/Action.php | 5 + src/Handler/Panel/Servers/Edit/Action.php | 35 + src/Handler/Panel/Servers/Edit/Show.php | 34 + src/Handler/Panel/Servers/Sign.php | 50 + src/Handler/Server/Register.php | 72 + src/Handler/Session.php | 9 +- src/Model/Base/Certificate.php | 94 +- src/Model/Base/CertificateQuery.php | 36 +- src/Model/Base/Server.php | 1996 +++++++++++++++++ src/Model/Base/ServerQuery.php | 862 +++++++ src/Model/Certificate.php | 2 +- src/Model/CertificateQuery.php | 13 +- src/Model/Map/CertificateTableMap.php | 32 +- src/Model/Map/ServerTableMap.php | 564 +++++ src/Model/Server.php | 20 + src/Model/ServerQuery.php | 20 + src/Service/CA.php | 141 ++ src/Service/Server.php | 66 + views/base.html.twig | 1 + views/panel.html.twig | 175 +- views/panel/certificates/new.html.twig | 32 +- views/panel/servers/edit.html.twig | 94 + 41 files changed, 4748 insertions(+), 91 deletions(-) create mode 100644 Vagrantfile create mode 100755 bin/get-fingerprint create mode 100644 public/js/edit_server.js rename public/js/{main.js => new_certificate.js} (50%) create mode 100644 public/js/panel.js create mode 100644 src/Handler/CA.php create mode 100644 src/Handler/Panel/Certificates/Revoke.php create mode 100644 src/Handler/Panel/Servers/Edit/Action.php create mode 100644 src/Handler/Panel/Servers/Edit/Show.php create mode 100644 src/Handler/Panel/Servers/Sign.php create mode 100644 src/Handler/Server/Register.php create mode 100644 src/Model/Base/Server.php create mode 100644 src/Model/Base/ServerQuery.php create mode 100644 src/Model/Map/ServerTableMap.php create mode 100644 src/Model/Server.php create mode 100644 src/Model/ServerQuery.php create mode 100644 src/Service/Server.php create mode 100644 views/panel/servers/edit.html.twig diff --git a/.gitignore b/.gitignore index 8d8ca93..9795541 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ vendor/* storage/* logs/* .idea +.vagrant diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..404c80e --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,23 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +Vagrant.configure(2) do |config| + config.vm.define "web" do |web| + web.vm.box = "ubuntu/wily64" + web.vm.network "private_network", ip: "192.168.50.4" + web.vm.provision :shell, inline: </dev/null + apt-get -qq update 2>/dev/null + apt-get -qq install php7.0-cli php7.0-sqlite3 2>/dev/null >/dev/null; + start-stop-daemon -bS --quiet --make-pidfile --pidfile /var/run/zerooo.pid --startas /bin/bash -- -c "exec php -S 0:8888 -t /vagrant/public/ /vagrant/public/index.php > /var/log/zerooo.log 2>&1"; +installphp + web.vm.network "forwarded_port", guest: 8888, host: 8888 + end + + config.vm.define "vpn" do |vpn| + vpn.vm.box = "ubuntu/wily64" + vpn.vm.network "private_network", ip: "192.168.50.8" + vpn.vm.synced_folder "../zer.ooo-server", "/server" + end + +end diff --git a/bin/get-fingerprint b/bin/get-fingerprint new file mode 100755 index 0000000..5156068 --- /dev/null +++ b/bin/get-fingerprint @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +openssl rsa -in $1 -pubin -pubout -outform DER 2>/dev/null | openssl md5 -c | awk '{print $2}' \ No newline at end of file diff --git a/bin/revoke-cert b/bin/revoke-cert index f432157..5853514 100755 --- a/bin/revoke-cert +++ b/bin/revoke-cert @@ -1,3 +1,4 @@ #!/usr/bin/env bash DIR=$(dirname $(realpath $0)); +cd $DIR/..; openssl ca -config "$DIR/../etc/openssl.conf" -revoke "$1"; diff --git a/bin/sign-server-csr b/bin/sign-server-csr index 3961ad9..83e8442 100755 --- a/bin/sign-server-csr +++ b/bin/sign-server-csr @@ -3,4 +3,4 @@ DIR=$(dirname $(realpath $0)); CSR=$(realpath $1); CRT=$(realpath $2); cd $DIR/../; -openssl ca -in $CSR -out $CRT -config $DIR/../etc/openssl.conf -md sha256 -days 3650 -extensions server_ext; \ No newline at end of file +openssl ca -in $CSR -out $CRT -config $DIR/../etc/openssl.conf -md sha256 -days 3650 -extensions server_ext -batch -notext; \ No newline at end of file diff --git a/composer.json b/composer.json index 1e040b8..05dded1 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,8 @@ "twig/twig": "v1.24.0", "hassankhan/config": "0.10.0", "monolog/monolog": "1.18.1", - "aura/session": "2.0.1" + "aura/session": "2.0.1", + "guzzlehttp/guzzle": "^6.2" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 8072c83..d72b704 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "90f9c8a046e4ae9bac938f1d6005bbce", - "content-hash": "950c616fbb471647626c3d42e91c7d20", + "hash": "95b6dc2302dd6086dbc2b7248a1f5768", + "content-hash": "61847eefe53610226629206b81b6f8b5", "packages": [ { "name": "aura/session", @@ -98,6 +98,177 @@ "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", "time": "2014-12-30 15:22:37" }, + { + "name": "guzzlehttp/guzzle", + "version": "6.2.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d094e337976dff9d8e2424e8485872194e768662" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d094e337976dff9d8e2424e8485872194e768662", + "reference": "d094e337976dff9d8e2424e8485872194e768662", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "~1.0", + "guzzlehttp/psr7": "~1.1", + "php": ">=5.5.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "~4.0", + "psr/log": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2016-03-21 20:02:09" + }, + { + "name": "guzzlehttp/promises", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/c10d860e2a9595f8883527fa0021c7da9e65f579", + "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-05-18 16:56:05" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "31382fef2889136415751badebbd1cb022a4ed72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/31382fef2889136415751badebbd1cb022a4ed72", + "reference": "31382fef2889136415751badebbd1cb022a4ed72", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "PSR-7 message implementation", + "keywords": [ + "http", + "message", + "stream", + "uri" + ], + "time": "2016-04-13 19:56:01" + }, { "name": "hassankhan/config", "version": "0.10.0", diff --git a/config/app.yml b/config/app.yml index d219fc1..59fe567 100644 --- a/config/app.yml +++ b/config/app.yml @@ -12,4 +12,5 @@ core: session: Eater\Glim\Service\Session twig: Eater\Glim\Service\Twig twig-vars: Eater\Glim\Service\TwigVars - ca: Eater\Glim\Service\CA \ No newline at end of file + ca: Eater\Glim\Service\CA + server: Eater\Glim\Service\Server \ No newline at end of file diff --git a/config/routes.yml b/config/routes.yml index 0b0efb1..f5faa52 100644 --- a/config/routes.yml +++ b/config/routes.yml @@ -8,10 +8,22 @@ routes: get: Register\Show post: Register\Action /logout: Logout + /ca: CA /panel: get: Panel /certificates: /new: get: Panel\Certificates\_New\Show post: Panel\Certificates\_New\Action - /download/{name}: Panel\Certificates\Download \ No newline at end of file + /download/{name}: Panel\Certificates\Download + /revoke: + post: Panel\Certificates\Revoke + /server: + /sign: + post: Panel\Servers\Sign + /{fingerprint}: + get: Panel\Servers\Edit\Show + post: Panel\Servers\Edit\Action + /server: + /register: + post: Server\Register \ No newline at end of file diff --git a/config/schema.xml b/config/schema.xml index f83df77..1a782f1 100644 --- a/config/schema.xml +++ b/config/schema.xml @@ -20,6 +20,7 @@ + @@ -46,4 +47,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/public/css/main.css b/public/css/main.css index ae63d5c..1e2cf88 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -1,4 +1,13 @@ body { padding-top: 50px; padding-bottom: 20px; +} + +.modal-top-alert { + margin-top: -15px; + border-radius: 0; + margin-left: -15px; + margin-right: -15px; + border-left: 0; + border-right: 0; } \ No newline at end of file diff --git a/public/js/edit_server.js b/public/js/edit_server.js new file mode 100644 index 0000000..25cf0cf --- /dev/null +++ b/public/js/edit_server.js @@ -0,0 +1,42 @@ +$(function () { + var error = $(''); + + $('.save').click(function () { + save(function(){}); + }); + + $('.save-and-sign').click(function () { + save(function () { + sign(); + }) + }); + + function save(callback) { + var fingerprint = $('.server-form').data('fingerprint'); + + var data = $('.server-form input').serializeArray(); + + $.post('/panel/server/' + fingerprint, data, function (data) { + if (!data.success) { + $('h2').after(error.text(data.error)); + } + + callback(); + }); + } + + function sign() { + var fingerprint = $('.server-form').data('fingerprint'); + $.post( + '/panel/server/sign', + { + fingerprint: fingerprint + }, + function (data) { + if (!data.success) { + $('h2').after(error.text(data.error)); + } + } + ); + } +}); \ No newline at end of file diff --git a/public/js/main.js b/public/js/new_certificate.js similarity index 50% rename from public/js/main.js rename to public/js/new_certificate.js index b23b07a..efc3f9c 100644 --- a/public/js/main.js +++ b/public/js/new_certificate.js @@ -3,6 +3,17 @@ $(function () { $('.magic-csr').click(function () { var name = $('#name').val(); + + if (name.length === 0) { + $('h2').after(error.text("Name can't be empty")); + return; + } + + if (!/^[A-Za-z0-9_-]+$/.test(name)) { + $('h2').after(error.text("Only alphanumeric, _ and - allowed in name")); + return; + } + var user = $('.user').text(); var keys = forge.pki.rsa.generateKeyPair(1024); @@ -15,19 +26,31 @@ $(function () { value: commonName }]); csr.sign(keys.privateKey); - var pem = forge.pki.certificationRequestToPem(csr); + var csrPem = forge.pki.certificationRequestToPem(csr); - $.post('/panel/certificates/new', { - csr: pem, + var newCertParams = { + csr: csrPem, name: name - }, function (data) { + }; + + var keyPem = ""; + + if ($('#wantsPassword').prop('checked')) { + keyPem = forge.pki.encryptRsaPrivateKey(keys.privateKey, $('#password').val()); + newCertParams.key = keyPem; + } else { + keyPem = forge.pki.privateKeyToPem(keys.privateKey); + } + + $.post('/panel/certificates/new', newCertParams, function (data) { if (data.success) { var zip = new JSZip(); - zip.file(commonName + '.key', pem); + zip.file(commonName + '.key', keyPem); for(var file in data.zip) { zip.file(file, data.zip[file]); } + var content = zip.generate({type:"blob"}); saveAs(content, commonName + '-vpn.zip'); location.href = '/panel'; @@ -36,4 +59,8 @@ $(function () { } }); }); + + $("#wantsPassword").change(function () { + $('#password, #saveOnline').prop('disabled', !this.checked); + }); }); diff --git a/public/js/panel.js b/public/js/panel.js new file mode 100644 index 0000000..384d024 --- /dev/null +++ b/public/js/panel.js @@ -0,0 +1,29 @@ +$(function(){ + var error = $(''); + var success = $(''); + var selected = false; + + $('.revoke').click(function () { + selected = $(this).data('name'); + + $('.revoke-modal').modal('show'); + }); + + $('.revoke-confirm').click(function () { + var selectedSnapshot = selected; + + $.post('/panel/certificates/revoke', { + name: selectedSnapshot, + password: $('.revoke-password').val() + }, function(data) { + if (data.success) { + $('#certificates').after(success.text("Successfully revoked '" + selectedSnapshot + "'")); + $('.revoke-modal').modal('hide'); + } else { + $('#revoke-put-error-after-me').after(error.text(data.error)); + } + }); + + $('.revoke-password').val(''); + }); +}); \ No newline at end of file diff --git a/src/Handler/CA.php b/src/Handler/CA.php new file mode 100644 index 0000000..08ebf71 --- /dev/null +++ b/src/Handler/CA.php @@ -0,0 +1,14 @@ +getResponse() + ->withHeader('Content-Type', 'plain/text') + ->withHeader('Content-Disposition', 'attachment; filename="ca.crt"') + ->write(file_get_contents($this->getCore()->getBaseDir() . '/storage/ca/ca.crt')); + } +} \ No newline at end of file diff --git a/src/Handler/Home.php b/src/Handler/Home.php index 35d5541..46f8c2a 100644 --- a/src/Handler/Home.php +++ b/src/Handler/Home.php @@ -1,10 +1,4 @@ render('panel.html.twig'); + $superuser = $this->getUser()->getSuperuser(); + + $vars = [ + 'superuser' => $superuser, + 'servers' => $this->fetchServers() + ]; + + if ($superuser) { + $vars['registeredServers'] = $this->fetchServers('registered'); + } + + return $this->render('panel.html.twig', $vars); + } + + public function fetchServers($status = "signed") + { + return ServerQuery::create()->filterByStatus($status)->find(); } } \ No newline at end of file diff --git a/src/Handler/Panel/Certificates/Download.php b/src/Handler/Panel/Certificates/Download.php index 733c074..fc634b3 100644 --- a/src/Handler/Panel/Certificates/Download.php +++ b/src/Handler/Panel/Certificates/Download.php @@ -21,9 +21,7 @@ class Download extends Session $name = $this->attr('name'); $cert = CertificateQuery::create() - ->filterByName($name) - ->filterByUser($this->getUser()) - ->findOne(); + ->findOneByUserAndName($this->getUser(), $name); if ($cert === null) { return $this->getResponse()->withStatus(404)->write("Couldn't find your Certificate with the name '{$name}'"); diff --git a/src/Handler/Panel/Certificates/Revoke.php b/src/Handler/Panel/Certificates/Revoke.php new file mode 100644 index 0000000..894d787 --- /dev/null +++ b/src/Handler/Panel/Certificates/Revoke.php @@ -0,0 +1,69 @@ +getUser(); + $name = $this->post('name'); + $password = $this->post('password'); + + $cert = CertificateQuery::create() + ->filterByName($name) + ->filterByUser($user) + ->findOne(); + + if ($cert === null) { + return $this->json([ + "success" => false, + "error" => 'Certificate with the name "' . $name . '" doesn\'t exist' + ]); + } + + if (!password_verify($password, $user->getPassword())) { + return $this->json([ + 'success' => false, + 'error' => 'Invalid password' + ]); + } + + /** + * @var CA $ca + */ + $ca = $this->get('ca'); + + try { + $ca->revoke($cert->getCertificate()); + } catch (\Exception $e) { + return $this->json([ + "success" => false, + "error" => $e->getMessage() + ]); + } + + $cert->setRevoked(true); + $cert->save(); + + return $this->json([ + "success" => true + ]); + } +} \ No newline at end of file diff --git a/src/Handler/Panel/Certificates/_New/Action.php b/src/Handler/Panel/Certificates/_New/Action.php index fa59bfe..7baa230 100644 --- a/src/Handler/Panel/Certificates/_New/Action.php +++ b/src/Handler/Panel/Certificates/_New/Action.php @@ -69,6 +69,11 @@ class Action extends Session $certificate->setName($name); $certificate->setCertificate($crt); $certificate->setExpiresOn(new \DateTime('@' . $details['validTo_time_t'])); + + if (!empty($this->post('key'))) { + $certificate->setPrivateKey($this->post('key')); + } + $certificate->setSerial($details['serialNumber']); $user->addCertificate($certificate); diff --git a/src/Handler/Panel/Servers/Edit/Action.php b/src/Handler/Panel/Servers/Edit/Action.php new file mode 100644 index 0000000..deb1ae3 --- /dev/null +++ b/src/Handler/Panel/Servers/Edit/Action.php @@ -0,0 +1,35 @@ +findOneByFingerprint($this->attr('fingerprint')); + + $server->setFqdn($this->post('fqdn')); + $server->setExternalIp($this->post('external-ip')); + + # Details + $server->setLocation($this->post('location')); + $server->setSpeed($this->post('speed')); + + # Config + $server->setInternalIp($this->post('internal-ip')); + $server->setNetmask($this->post('netmask')); + $server->setPort($this->post('post')); + $server->setProtocol($this->post('protocol')); + $server->setFirstDns($this->post('first-dns')); + $server->setSecondDns($this->post('second-dns')); + + $server->save(); + + $this->json([ 'success'=> true ]); + } +} \ No newline at end of file diff --git a/src/Handler/Panel/Servers/Edit/Show.php b/src/Handler/Panel/Servers/Edit/Show.php new file mode 100644 index 0000000..99a07d9 --- /dev/null +++ b/src/Handler/Panel/Servers/Edit/Show.php @@ -0,0 +1,34 @@ +findOneByFingerprint($this->attr('fingerprint')); + + if ($server === null) { + return $this->getResponse()->withStatus(404); + } + + return $this->render( + "panel/servers/edit.html.twig", + [ + 'server' => $server + ] + ); + } +} \ No newline at end of file diff --git a/src/Handler/Panel/Servers/Sign.php b/src/Handler/Panel/Servers/Sign.php new file mode 100644 index 0000000..1279a5b --- /dev/null +++ b/src/Handler/Panel/Servers/Sign.php @@ -0,0 +1,50 @@ +get('ca'); + $server = ServerQuery::create()->findOneByFingerprint($this->post('fingerprint')); + $publicKey = $server->getPublicKey(); + + try { + $crt = $ca->signServerKey($publicKey, $server->getFqdn()); + } catch (\Exception $e) { + return $this->json([ + 'success' => false, + 'error' => $e->getMessage() + ]); + } + + $server->setCertificate($crt); + $server->save(); + + /** @var Server $serverManager */ + $serverManager = $this->get('server'); + + try { + $serverManager->deliverSignedCertificate($server); + } catch (\Exception $e) { + return $this->json([ + 'success' => false, + 'error' => 'Failed to deliver certificate to server: ' . $e->__toString() + ]); + } + + return $this->json([ + 'success' => true + ]); + } +} \ No newline at end of file diff --git a/src/Handler/Server/Register.php b/src/Handler/Server/Register.php new file mode 100644 index 0000000..21f5c64 --- /dev/null +++ b/src/Handler/Server/Register.php @@ -0,0 +1,72 @@ +get('ca'); + + $publicKey = $this->post('publicKey'); + $hexSignature = $this->post('signature'); + $fingerprint = $ca->getFingerprintFromPublicKey($publicKey); + + if (empty($publicKey)) { + return $this->bash(false, "no PublicKey was provided\n" . var_export($_POST, true) . "\n" . var_export($_FILES, true)); + } + + if (empty($hexSignature)) { + return $this->bash(false, "no signature was provided\n" . var_export($_POST)); + } + + $serverQuery = ServerQuery::create(); + $server = $serverQuery->findOneByFingerprint($fingerprint); + + $signature = hex2bin($hexSignature); + + if ($server !== null) { + return $this->bash(false, "Server with this fingerprint already exists, if you want to change IP please use /server/update-ip or regenerate your public key"); + } + + try { + $result = $ca->verify($fingerprint, $signature, $publicKey); + } catch (\Exception $e) { + return $this->bash(false, "Verifying went into error: " . $e->getMessage()); + } + + if ($result) { + return $this->bash(false, "Signature is erroneous\nSignature: {$hexSignature}\nFingerprint: {$fingerprint}\nOpenSSL: " . openssl_error_string()); + } + + $ip = $_SERVER['REMOTE_ADDR']; + $originalIp = $ip; + $fqdn = gethostbyaddr($ip); + $ipOfFqdn = gethostbyname($fqdn); + + if ($ip === $ipOfFqdn) { + $ip = $fqdn; + } + + $server = new Server(); + $server->setFingerprint($fingerprint); + $server->setFqdn($ip); + $server->setExternalIp($originalIp); + $server->setPublicKey($publicKey); + $server->save(); + + return $this->bash(true, "Good job, skeleton"); + } + + public function bash($result, $message) + { + return $this->getResponse()->write(($result ? 0 : 1) . "\n" . $message); + } +} \ No newline at end of file diff --git a/src/Handler/Session.php b/src/Handler/Session.php index 6983605..54098bb 100644 --- a/src/Handler/Session.php +++ b/src/Handler/Session.php @@ -19,6 +19,11 @@ class Session extends Main */ protected $shouldHaveUser = false; + /** + * @var bool + */ + protected $shouldHaveSuperuser = false; + /** * @var User */ @@ -55,8 +60,10 @@ class Session extends Main $this->setUser($user); - if ($user === null && $this->shouldHaveUser) { + if ($user === null && ($this->shouldHaveUser || $this->shouldHaveSuperuser)) { return $this->redirect('/login'); + } elseif ($this->shouldHaveSuperuser && !$user->getSuperuser()) { + return $this->redirect('/panel'); } } } \ No newline at end of file diff --git a/src/Model/Base/Certificate.php b/src/Model/Base/Certificate.php index e349597..ba280e0 100644 --- a/src/Model/Base/Certificate.php +++ b/src/Model/Base/Certificate.php @@ -87,6 +87,12 @@ abstract class Certificate implements ActiveRecordInterface */ protected $certificate; + /** + * The value for the private_key field. + * @var string + */ + protected $private_key; + /** * The value for the expires_on field. * @var \DateTime @@ -389,6 +395,16 @@ abstract class Certificate implements ActiveRecordInterface return $this->certificate; } + /** + * Get the [private_key] column value. + * + * @return string + */ + public function getPrivateKey() + { + return $this->private_key; + } + /** * Get the [optionally formatted] temporal [expires_on] column value. * @@ -523,6 +539,26 @@ abstract class Certificate implements ActiveRecordInterface return $this; } // setCertificate() + /** + * Set the value of [private_key] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Certificate The current object (for fluent API support) + */ + public function setPrivateKey($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->private_key !== $v) { + $this->private_key = $v; + $this->modifiedColumns[CertificateTableMap::COL_PRIVATE_KEY] = true; + } + + return $this; + } // setPrivateKey() + /** * Sets the value of [expires_on] column to a normalized version of the date/time value specified. * @@ -643,13 +679,16 @@ abstract class Certificate implements ActiveRecordInterface $col = $row[TableMap::TYPE_NUM == $indexType ? 3 + $startcol : CertificateTableMap::translateFieldName('Certificate', TableMap::TYPE_PHPNAME, $indexType)]; $this->certificate = (null !== $col) ? (string) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 4 + $startcol : CertificateTableMap::translateFieldName('ExpiresOn', TableMap::TYPE_PHPNAME, $indexType)]; + $col = $row[TableMap::TYPE_NUM == $indexType ? 4 + $startcol : CertificateTableMap::translateFieldName('PrivateKey', TableMap::TYPE_PHPNAME, $indexType)]; + $this->private_key = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : CertificateTableMap::translateFieldName('ExpiresOn', TableMap::TYPE_PHPNAME, $indexType)]; $this->expires_on = (null !== $col) ? PropelDateTime::newInstance($col, null, 'DateTime') : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : CertificateTableMap::translateFieldName('Revoked', TableMap::TYPE_PHPNAME, $indexType)]; + $col = $row[TableMap::TYPE_NUM == $indexType ? 6 + $startcol : CertificateTableMap::translateFieldName('Revoked', TableMap::TYPE_PHPNAME, $indexType)]; $this->revoked = (null !== $col) ? (boolean) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 6 + $startcol : CertificateTableMap::translateFieldName('Serial', TableMap::TYPE_PHPNAME, $indexType)]; + $col = $row[TableMap::TYPE_NUM == $indexType ? 7 + $startcol : CertificateTableMap::translateFieldName('Serial', TableMap::TYPE_PHPNAME, $indexType)]; $this->serial = (null !== $col) ? (string) $col : null; $this->resetModified(); @@ -659,7 +698,7 @@ abstract class Certificate implements ActiveRecordInterface $this->ensureConsistency(); } - return $startcol + 7; // 7 = CertificateTableMap::NUM_HYDRATE_COLUMNS. + return $startcol + 8; // 8 = CertificateTableMap::NUM_HYDRATE_COLUMNS. } catch (Exception $e) { throw new PropelException(sprintf('Error populating %s object', '\\Eater\\Glim\\Model\\Certificate'), 0, $e); @@ -884,6 +923,9 @@ abstract class Certificate implements ActiveRecordInterface if ($this->isColumnModified(CertificateTableMap::COL_CERTIFICATE)) { $modifiedColumns[':p' . $index++] = 'certificate'; } + if ($this->isColumnModified(CertificateTableMap::COL_PRIVATE_KEY)) { + $modifiedColumns[':p' . $index++] = 'private_key'; + } if ($this->isColumnModified(CertificateTableMap::COL_EXPIRES_ON)) { $modifiedColumns[':p' . $index++] = 'expires_on'; } @@ -916,6 +958,9 @@ abstract class Certificate implements ActiveRecordInterface case 'certificate': $stmt->bindValue($identifier, $this->certificate, PDO::PARAM_STR); break; + case 'private_key': + $stmt->bindValue($identifier, $this->private_key, PDO::PARAM_STR); + break; case 'expires_on': $stmt->bindValue($identifier, $this->expires_on ? $this->expires_on->format("Y-m-d H:i:s") : null, PDO::PARAM_STR); break; @@ -1000,12 +1045,15 @@ abstract class Certificate implements ActiveRecordInterface return $this->getCertificate(); break; case 4: - return $this->getExpiresOn(); + return $this->getPrivateKey(); break; case 5: - return $this->getRevoked(); + return $this->getExpiresOn(); break; case 6: + return $this->getRevoked(); + break; + case 7: return $this->getSerial(); break; default: @@ -1042,16 +1090,17 @@ abstract class Certificate implements ActiveRecordInterface $keys[1] => $this->getUserId(), $keys[2] => $this->getName(), $keys[3] => $this->getCertificate(), - $keys[4] => $this->getExpiresOn(), - $keys[5] => $this->getRevoked(), - $keys[6] => $this->getSerial(), + $keys[4] => $this->getPrivateKey(), + $keys[5] => $this->getExpiresOn(), + $keys[6] => $this->getRevoked(), + $keys[7] => $this->getSerial(), ); $utc = new \DateTimeZone('utc'); - if ($result[$keys[4]] instanceof \DateTime) { + if ($result[$keys[5]] instanceof \DateTime) { // When changing timezone we don't want to change existing instances - $dateTime = clone $result[$keys[4]]; - $result[$keys[4]] = $dateTime->setTimezone($utc)->format('Y-m-d\TH:i:s\Z'); + $dateTime = clone $result[$keys[5]]; + $result[$keys[5]] = $dateTime->setTimezone($utc)->format('Y-m-d\TH:i:s\Z'); } $virtualColumns = $this->virtualColumns; @@ -1122,12 +1171,15 @@ abstract class Certificate implements ActiveRecordInterface $this->setCertificate($value); break; case 4: - $this->setExpiresOn($value); + $this->setPrivateKey($value); break; case 5: - $this->setRevoked($value); + $this->setExpiresOn($value); break; case 6: + $this->setRevoked($value); + break; + case 7: $this->setSerial($value); break; } // switch() @@ -1169,13 +1221,16 @@ abstract class Certificate implements ActiveRecordInterface $this->setCertificate($arr[$keys[3]]); } if (array_key_exists($keys[4], $arr)) { - $this->setExpiresOn($arr[$keys[4]]); + $this->setPrivateKey($arr[$keys[4]]); } if (array_key_exists($keys[5], $arr)) { - $this->setRevoked($arr[$keys[5]]); + $this->setExpiresOn($arr[$keys[5]]); } if (array_key_exists($keys[6], $arr)) { - $this->setSerial($arr[$keys[6]]); + $this->setRevoked($arr[$keys[6]]); + } + if (array_key_exists($keys[7], $arr)) { + $this->setSerial($arr[$keys[7]]); } } @@ -1230,6 +1285,9 @@ abstract class Certificate implements ActiveRecordInterface if ($this->isColumnModified(CertificateTableMap::COL_CERTIFICATE)) { $criteria->add(CertificateTableMap::COL_CERTIFICATE, $this->certificate); } + if ($this->isColumnModified(CertificateTableMap::COL_PRIVATE_KEY)) { + $criteria->add(CertificateTableMap::COL_PRIVATE_KEY, $this->private_key); + } if ($this->isColumnModified(CertificateTableMap::COL_EXPIRES_ON)) { $criteria->add(CertificateTableMap::COL_EXPIRES_ON, $this->expires_on); } @@ -1328,6 +1386,7 @@ abstract class Certificate implements ActiveRecordInterface $copyObj->setUserId($this->getUserId()); $copyObj->setName($this->getName()); $copyObj->setCertificate($this->getCertificate()); + $copyObj->setPrivateKey($this->getPrivateKey()); $copyObj->setExpiresOn($this->getExpiresOn()); $copyObj->setRevoked($this->getRevoked()); $copyObj->setSerial($this->getSerial()); @@ -1424,6 +1483,7 @@ abstract class Certificate implements ActiveRecordInterface $this->user_id = null; $this->name = null; $this->certificate = null; + $this->private_key = null; $this->expires_on = null; $this->revoked = null; $this->serial = null; diff --git a/src/Model/Base/CertificateQuery.php b/src/Model/Base/CertificateQuery.php index d5252d4..20f6409 100644 --- a/src/Model/Base/CertificateQuery.php +++ b/src/Model/Base/CertificateQuery.php @@ -24,6 +24,7 @@ use Propel\Runtime\Exception\PropelException; * @method ChildCertificateQuery orderByUserId($order = Criteria::ASC) Order by the user_id column * @method ChildCertificateQuery orderByName($order = Criteria::ASC) Order by the name column * @method ChildCertificateQuery orderByCertificate($order = Criteria::ASC) Order by the certificate column + * @method ChildCertificateQuery orderByPrivateKey($order = Criteria::ASC) Order by the private_key column * @method ChildCertificateQuery orderByExpiresOn($order = Criteria::ASC) Order by the expires_on column * @method ChildCertificateQuery orderByRevoked($order = Criteria::ASC) Order by the revoked column * @method ChildCertificateQuery orderBySerial($order = Criteria::ASC) Order by the serial column @@ -32,6 +33,7 @@ use Propel\Runtime\Exception\PropelException; * @method ChildCertificateQuery groupByUserId() Group by the user_id column * @method ChildCertificateQuery groupByName() Group by the name column * @method ChildCertificateQuery groupByCertificate() Group by the certificate column + * @method ChildCertificateQuery groupByPrivateKey() Group by the private_key column * @method ChildCertificateQuery groupByExpiresOn() Group by the expires_on column * @method ChildCertificateQuery groupByRevoked() Group by the revoked column * @method ChildCertificateQuery groupBySerial() Group by the serial column @@ -53,6 +55,7 @@ use Propel\Runtime\Exception\PropelException; * @method ChildCertificate findOneByUserId(int $user_id) Return the first ChildCertificate filtered by the user_id column * @method ChildCertificate findOneByName(string $name) Return the first ChildCertificate filtered by the name column * @method ChildCertificate findOneByCertificate(string $certificate) Return the first ChildCertificate filtered by the certificate column + * @method ChildCertificate findOneByPrivateKey(string $private_key) Return the first ChildCertificate filtered by the private_key column * @method ChildCertificate findOneByExpiresOn(string $expires_on) Return the first ChildCertificate filtered by the expires_on column * @method ChildCertificate findOneByRevoked(boolean $revoked) Return the first ChildCertificate filtered by the revoked column * @method ChildCertificate findOneBySerial(string $serial) Return the first ChildCertificate filtered by the serial column * @@ -64,6 +67,7 @@ use Propel\Runtime\Exception\PropelException; * @method ChildCertificate requireOneByUserId(int $user_id) Return the first ChildCertificate filtered by the user_id column and throws \Propel\Runtime\Exception\EntityNotFoundException when not found * @method ChildCertificate requireOneByName(string $name) Return the first ChildCertificate filtered by the name column and throws \Propel\Runtime\Exception\EntityNotFoundException when not found * @method ChildCertificate requireOneByCertificate(string $certificate) Return the first ChildCertificate filtered by the certificate column and throws \Propel\Runtime\Exception\EntityNotFoundException when not found + * @method ChildCertificate requireOneByPrivateKey(string $private_key) Return the first ChildCertificate filtered by the private_key column and throws \Propel\Runtime\Exception\EntityNotFoundException when not found * @method ChildCertificate requireOneByExpiresOn(string $expires_on) Return the first ChildCertificate filtered by the expires_on column and throws \Propel\Runtime\Exception\EntityNotFoundException when not found * @method ChildCertificate requireOneByRevoked(boolean $revoked) Return the first ChildCertificate filtered by the revoked column and throws \Propel\Runtime\Exception\EntityNotFoundException when not found * @method ChildCertificate requireOneBySerial(string $serial) Return the first ChildCertificate filtered by the serial column and throws \Propel\Runtime\Exception\EntityNotFoundException when not found @@ -73,6 +77,7 @@ use Propel\Runtime\Exception\PropelException; * @method ChildCertificate[]|ObjectCollection findByUserId(int $user_id) Return ChildCertificate objects filtered by the user_id column * @method ChildCertificate[]|ObjectCollection findByName(string $name) Return ChildCertificate objects filtered by the name column * @method ChildCertificate[]|ObjectCollection findByCertificate(string $certificate) Return ChildCertificate objects filtered by the certificate column + * @method ChildCertificate[]|ObjectCollection findByPrivateKey(string $private_key) Return ChildCertificate objects filtered by the private_key column * @method ChildCertificate[]|ObjectCollection findByExpiresOn(string $expires_on) Return ChildCertificate objects filtered by the expires_on column * @method ChildCertificate[]|ObjectCollection findByRevoked(boolean $revoked) Return ChildCertificate objects filtered by the revoked column * @method ChildCertificate[]|ObjectCollection findBySerial(string $serial) Return ChildCertificate objects filtered by the serial column @@ -168,7 +173,7 @@ abstract class CertificateQuery extends ModelCriteria */ protected function findPkSimple($key, ConnectionInterface $con) { - $sql = 'SELECT id, user_id, name, certificate, expires_on, revoked, serial FROM Certificate WHERE id = :p0'; + $sql = 'SELECT id, user_id, name, certificate, private_key, expires_on, revoked, serial FROM Certificate WHERE id = :p0'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key, PDO::PARAM_INT); @@ -400,6 +405,35 @@ abstract class CertificateQuery extends ModelCriteria return $this->addUsingAlias(CertificateTableMap::COL_CERTIFICATE, $certificate, $comparison); } + /** + * Filter the query on the private_key column + * + * Example usage: + * + * $query->filterByPrivateKey('fooValue'); // WHERE private_key = 'fooValue' + * $query->filterByPrivateKey('%fooValue%'); // WHERE private_key LIKE '%fooValue%' + * + * + * @param string $privateKey The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildCertificateQuery The current query, for fluid interface + */ + public function filterByPrivateKey($privateKey = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($privateKey)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $privateKey)) { + $privateKey = str_replace('*', '%', $privateKey); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CertificateTableMap::COL_PRIVATE_KEY, $privateKey, $comparison); + } + /** * Filter the query on the expires_on column * diff --git a/src/Model/Base/Server.php b/src/Model/Base/Server.php new file mode 100644 index 0000000..31f206b --- /dev/null +++ b/src/Model/Base/Server.php @@ -0,0 +1,1996 @@ +location = 'Unknown'; + $this->speed = -1; + $this->internal_ip = '10.24.0.0'; + $this->netmask = 16; + $this->port = 1194; + $this->protocol = 0; + $this->status = 0; + } + + /** + * Initializes internal state of Eater\Glim\Model\Base\Server object. + * @see applyDefaults() + */ + public function __construct() + { + $this->applyDefaultValues(); + } + + /** + * Returns whether the object has been modified. + * + * @return boolean True if the object has been modified. + */ + public function isModified() + { + return !!$this->modifiedColumns; + } + + /** + * Has specified column been modified? + * + * @param string $col column fully qualified name (TableMap::TYPE_COLNAME), e.g. Book::AUTHOR_ID + * @return boolean True if $col has been modified. + */ + public function isColumnModified($col) + { + return $this->modifiedColumns && isset($this->modifiedColumns[$col]); + } + + /** + * Get the columns that have been modified in this object. + * @return array A unique list of the modified column names for this object. + */ + public function getModifiedColumns() + { + return $this->modifiedColumns ? array_keys($this->modifiedColumns) : []; + } + + /** + * Returns whether the object has ever been saved. This will + * be false, if the object was retrieved from storage or was created + * and then saved. + * + * @return boolean true, if the object has never been persisted. + */ + public function isNew() + { + return $this->new; + } + + /** + * Setter for the isNew attribute. This method will be called + * by Propel-generated children and objects. + * + * @param boolean $b the state of the object. + */ + public function setNew($b) + { + $this->new = (boolean) $b; + } + + /** + * Whether this object has been deleted. + * @return boolean The deleted state of this object. + */ + public function isDeleted() + { + return $this->deleted; + } + + /** + * Specify whether this object has been deleted. + * @param boolean $b The deleted state of this object. + * @return void + */ + public function setDeleted($b) + { + $this->deleted = (boolean) $b; + } + + /** + * Sets the modified state for the object to be false. + * @param string $col If supplied, only the specified column is reset. + * @return void + */ + public function resetModified($col = null) + { + if (null !== $col) { + if (isset($this->modifiedColumns[$col])) { + unset($this->modifiedColumns[$col]); + } + } else { + $this->modifiedColumns = array(); + } + } + + /** + * Compares this with another Server instance. If + * obj is an instance of Server, delegates to + * equals(Server). Otherwise, returns false. + * + * @param mixed $obj The object to compare to. + * @return boolean Whether equal to the object specified. + */ + public function equals($obj) + { + if (!$obj instanceof static) { + return false; + } + + if ($this === $obj) { + return true; + } + + if (null === $this->getPrimaryKey() || null === $obj->getPrimaryKey()) { + return false; + } + + return $this->getPrimaryKey() === $obj->getPrimaryKey(); + } + + /** + * Get the associative array of the virtual columns in this object + * + * @return array + */ + public function getVirtualColumns() + { + return $this->virtualColumns; + } + + /** + * Checks the existence of a virtual column in this object + * + * @param string $name The virtual column name + * @return boolean + */ + public function hasVirtualColumn($name) + { + return array_key_exists($name, $this->virtualColumns); + } + + /** + * Get the value of a virtual column in this object + * + * @param string $name The virtual column name + * @return mixed + * + * @throws PropelException + */ + public function getVirtualColumn($name) + { + if (!$this->hasVirtualColumn($name)) { + throw new PropelException(sprintf('Cannot get value of inexistent virtual column %s.', $name)); + } + + return $this->virtualColumns[$name]; + } + + /** + * Set the value of a virtual column in this object + * + * @param string $name The virtual column name + * @param mixed $value The value to give to the virtual column + * + * @return $this|Server The current object, for fluid interface + */ + public function setVirtualColumn($name, $value) + { + $this->virtualColumns[$name] = $value; + + return $this; + } + + /** + * Logs a message using Propel::log(). + * + * @param string $msg + * @param int $priority One of the Propel::LOG_* logging levels + * @return boolean + */ + protected function log($msg, $priority = Propel::LOG_INFO) + { + return Propel::log(get_class($this) . ': ' . $msg, $priority); + } + + /** + * Export the current object properties to a string, using a given parser format + * + * $book = BookQuery::create()->findPk(9012); + * echo $book->exportTo('JSON'); + * => {"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * @param mixed $parser A AbstractParser instance, or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy load(ed) columns. Defaults to TRUE. + * @return string The exported data + */ + public function exportTo($parser, $includeLazyLoadColumns = true) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + return $parser->fromArray($this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true)); + } + + /** + * Clean up internal collections prior to serializing + * Avoids recursive loops that turn into segmentation faults when serializing + */ + public function __sleep() + { + $this->clearAllReferences(); + + return array_keys(get_object_vars($this)); + } + + /** + * Get the [id] column value. + * + * @return int + */ + public function getId() + { + return $this->id; + } + + /** + * Get the [fqdn] column value. + * + * @return string + */ + public function getFqdn() + { + return $this->fqdn; + } + + /** + * Get the [fingerprint] column value. + * + * @return string + */ + public function getFingerprint() + { + return $this->fingerprint; + } + + /** + * Get the [public_key] column value. + * + * @return string + */ + public function getPublicKey() + { + return $this->public_key; + } + + /** + * Get the [certificate] column value. + * + * @return string + */ + public function getCertificate() + { + return $this->certificate; + } + + /** + * Get the [location] column value. + * + * @return string + */ + public function getLocation() + { + return $this->location; + } + + /** + * Get the [speed] column value. + * + * @return int + */ + public function getSpeed() + { + return $this->speed; + } + + /** + * Get the [external_ip] column value. + * + * @return string + */ + public function getExternalIp() + { + return $this->external_ip; + } + + /** + * Get the [internal_ip] column value. + * + * @return string + */ + public function getInternalIp() + { + return $this->internal_ip; + } + + /** + * Get the [netmask] column value. + * + * @return int + */ + public function getNetmask() + { + return $this->netmask; + } + + /** + * Get the [first_dns] column value. + * + * @return string + */ + public function getFirstDns() + { + return $this->first_dns; + } + + /** + * Get the [second_dns] column value. + * + * @return string + */ + public function getSecondDns() + { + return $this->second_dns; + } + + /** + * Get the [port] column value. + * + * @return int + */ + public function getPort() + { + return $this->port; + } + + /** + * Get the [protocol] column value. + * + * @return string + * @throws \Propel\Runtime\Exception\PropelException + */ + public function getProtocol() + { + if (null === $this->protocol) { + return null; + } + $valueSet = ServerTableMap::getValueSet(ServerTableMap::COL_PROTOCOL); + if (!isset($valueSet[$this->protocol])) { + throw new PropelException('Unknown stored enum key: ' . $this->protocol); + } + + return $valueSet[$this->protocol]; + } + + /** + * Get the [status] column value. + * + * @return string + * @throws \Propel\Runtime\Exception\PropelException + */ + public function getStatus() + { + if (null === $this->status) { + return null; + } + $valueSet = ServerTableMap::getValueSet(ServerTableMap::COL_STATUS); + if (!isset($valueSet[$this->status])) { + throw new PropelException('Unknown stored enum key: ' . $this->status); + } + + return $valueSet[$this->status]; + } + + /** + * Set the value of [id] column. + * + * @param int $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setId($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->id !== $v) { + $this->id = $v; + $this->modifiedColumns[ServerTableMap::COL_ID] = true; + } + + return $this; + } // setId() + + /** + * Set the value of [fqdn] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setFqdn($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->fqdn !== $v) { + $this->fqdn = $v; + $this->modifiedColumns[ServerTableMap::COL_FQDN] = true; + } + + return $this; + } // setFqdn() + + /** + * Set the value of [fingerprint] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setFingerprint($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->fingerprint !== $v) { + $this->fingerprint = $v; + $this->modifiedColumns[ServerTableMap::COL_FINGERPRINT] = true; + } + + return $this; + } // setFingerprint() + + /** + * Set the value of [public_key] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setPublicKey($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->public_key !== $v) { + $this->public_key = $v; + $this->modifiedColumns[ServerTableMap::COL_PUBLIC_KEY] = true; + } + + return $this; + } // setPublicKey() + + /** + * Set the value of [certificate] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setCertificate($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->certificate !== $v) { + $this->certificate = $v; + $this->modifiedColumns[ServerTableMap::COL_CERTIFICATE] = true; + } + + return $this; + } // setCertificate() + + /** + * Set the value of [location] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setLocation($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->location !== $v) { + $this->location = $v; + $this->modifiedColumns[ServerTableMap::COL_LOCATION] = true; + } + + return $this; + } // setLocation() + + /** + * Set the value of [speed] column. + * + * @param int $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setSpeed($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->speed !== $v) { + $this->speed = $v; + $this->modifiedColumns[ServerTableMap::COL_SPEED] = true; + } + + return $this; + } // setSpeed() + + /** + * Set the value of [external_ip] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setExternalIp($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->external_ip !== $v) { + $this->external_ip = $v; + $this->modifiedColumns[ServerTableMap::COL_EXTERNAL_IP] = true; + } + + return $this; + } // setExternalIp() + + /** + * Set the value of [internal_ip] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setInternalIp($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->internal_ip !== $v) { + $this->internal_ip = $v; + $this->modifiedColumns[ServerTableMap::COL_INTERNAL_IP] = true; + } + + return $this; + } // setInternalIp() + + /** + * Set the value of [netmask] column. + * + * @param int $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setNetmask($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->netmask !== $v) { + $this->netmask = $v; + $this->modifiedColumns[ServerTableMap::COL_NETMASK] = true; + } + + return $this; + } // setNetmask() + + /** + * Set the value of [first_dns] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setFirstDns($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->first_dns !== $v) { + $this->first_dns = $v; + $this->modifiedColumns[ServerTableMap::COL_FIRST_DNS] = true; + } + + return $this; + } // setFirstDns() + + /** + * Set the value of [second_dns] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setSecondDns($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->second_dns !== $v) { + $this->second_dns = $v; + $this->modifiedColumns[ServerTableMap::COL_SECOND_DNS] = true; + } + + return $this; + } // setSecondDns() + + /** + * Set the value of [port] column. + * + * @param int $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + */ + public function setPort($v) + { + if ($v !== null) { + $v = (int) $v; + } + + if ($this->port !== $v) { + $this->port = $v; + $this->modifiedColumns[ServerTableMap::COL_PORT] = true; + } + + return $this; + } // setPort() + + /** + * Set the value of [protocol] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + * @throws \Propel\Runtime\Exception\PropelException + */ + public function setProtocol($v) + { + if ($v !== null) { + $valueSet = ServerTableMap::getValueSet(ServerTableMap::COL_PROTOCOL); + if (!in_array($v, $valueSet)) { + throw new PropelException(sprintf('Value "%s" is not accepted in this enumerated column', $v)); + } + $v = array_search($v, $valueSet); + } + + if ($this->protocol !== $v) { + $this->protocol = $v; + $this->modifiedColumns[ServerTableMap::COL_PROTOCOL] = true; + } + + return $this; + } // setProtocol() + + /** + * Set the value of [status] column. + * + * @param string $v new value + * @return $this|\Eater\Glim\Model\Server The current object (for fluent API support) + * @throws \Propel\Runtime\Exception\PropelException + */ + public function setStatus($v) + { + if ($v !== null) { + $valueSet = ServerTableMap::getValueSet(ServerTableMap::COL_STATUS); + if (!in_array($v, $valueSet)) { + throw new PropelException(sprintf('Value "%s" is not accepted in this enumerated column', $v)); + } + $v = array_search($v, $valueSet); + } + + if ($this->status !== $v) { + $this->status = $v; + $this->modifiedColumns[ServerTableMap::COL_STATUS] = true; + } + + return $this; + } // setStatus() + + /** + * Indicates whether the columns in this object are only set to default values. + * + * This method can be used in conjunction with isModified() to indicate whether an object is both + * modified _and_ has some values set which are non-default. + * + * @return boolean Whether the columns in this object are only been set with default values. + */ + public function hasOnlyDefaultValues() + { + if ($this->location !== 'Unknown') { + return false; + } + + if ($this->speed !== -1) { + return false; + } + + if ($this->internal_ip !== '10.24.0.0') { + return false; + } + + if ($this->netmask !== 16) { + return false; + } + + if ($this->port !== 1194) { + return false; + } + + if ($this->protocol !== 0) { + return false; + } + + if ($this->status !== 0) { + return false; + } + + // otherwise, everything was equal, so return TRUE + return true; + } // hasOnlyDefaultValues() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (0-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param array $row The row returned by DataFetcher->fetch(). + * @param int $startcol 0-based offset column which indicates which restultset column to start with. + * @param boolean $rehydrate Whether this object is being re-hydrated from the database. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_CAMELNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate($row, $startcol = 0, $rehydrate = false, $indexType = TableMap::TYPE_NUM) + { + try { + + $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : ServerTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + $this->id = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : ServerTableMap::translateFieldName('Fqdn', TableMap::TYPE_PHPNAME, $indexType)]; + $this->fqdn = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : ServerTableMap::translateFieldName('Fingerprint', TableMap::TYPE_PHPNAME, $indexType)]; + $this->fingerprint = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 3 + $startcol : ServerTableMap::translateFieldName('PublicKey', TableMap::TYPE_PHPNAME, $indexType)]; + $this->public_key = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 4 + $startcol : ServerTableMap::translateFieldName('Certificate', TableMap::TYPE_PHPNAME, $indexType)]; + $this->certificate = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : ServerTableMap::translateFieldName('Location', TableMap::TYPE_PHPNAME, $indexType)]; + $this->location = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 6 + $startcol : ServerTableMap::translateFieldName('Speed', TableMap::TYPE_PHPNAME, $indexType)]; + $this->speed = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 7 + $startcol : ServerTableMap::translateFieldName('ExternalIp', TableMap::TYPE_PHPNAME, $indexType)]; + $this->external_ip = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 8 + $startcol : ServerTableMap::translateFieldName('InternalIp', TableMap::TYPE_PHPNAME, $indexType)]; + $this->internal_ip = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 9 + $startcol : ServerTableMap::translateFieldName('Netmask', TableMap::TYPE_PHPNAME, $indexType)]; + $this->netmask = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 10 + $startcol : ServerTableMap::translateFieldName('FirstDns', TableMap::TYPE_PHPNAME, $indexType)]; + $this->first_dns = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 11 + $startcol : ServerTableMap::translateFieldName('SecondDns', TableMap::TYPE_PHPNAME, $indexType)]; + $this->second_dns = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 12 + $startcol : ServerTableMap::translateFieldName('Port', TableMap::TYPE_PHPNAME, $indexType)]; + $this->port = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 13 + $startcol : ServerTableMap::translateFieldName('Protocol', TableMap::TYPE_PHPNAME, $indexType)]; + $this->protocol = (null !== $col) ? (int) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 14 + $startcol : ServerTableMap::translateFieldName('Status', TableMap::TYPE_PHPNAME, $indexType)]; + $this->status = (null !== $col) ? (int) $col : null; + $this->resetModified(); + + $this->setNew(false); + + if ($rehydrate) { + $this->ensureConsistency(); + } + + return $startcol + 15; // 15 = ServerTableMap::NUM_HYDRATE_COLUMNS. + + } catch (Exception $e) { + throw new PropelException(sprintf('Error populating %s object', '\\Eater\\Glim\\Model\\Server'), 0, $e); + } + } + + /** + * Checks and repairs the internal consistency of the object. + * + * This method is executed after an already-instantiated object is re-hydrated + * from the database. It exists to check any foreign keys to make sure that + * the objects related to the current object are correct based on foreign key. + * + * You can override this method in the stub class, but you should always invoke + * the base method from the overridden method (i.e. parent::ensureConsistency()), + * in case your model changes. + * + * @throws PropelException + */ + public function ensureConsistency() + { + } // ensureConsistency + + /** + * Reloads this object from datastore based on primary key and (optionally) resets all associated objects. + * + * This will only work if the object has been saved and has a valid primary key set. + * + * @param boolean $deep (optional) Whether to also de-associated any related objects. + * @param ConnectionInterface $con (optional) The ConnectionInterface connection to use. + * @return void + * @throws PropelException - if this object is deleted, unsaved or doesn't have pk match in db + */ + public function reload($deep = false, ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("Cannot reload a deleted object."); + } + + if ($this->isNew()) { + throw new PropelException("Cannot reload an unsaved object."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(ServerTableMap::DATABASE_NAME); + } + + // We don't need to alter the object instance pool; we're just modifying this instance + // already in the pool. + + $dataFetcher = ChildServerQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); + $row = $dataFetcher->fetch(); + $dataFetcher->close(); + if (!$row) { + throw new PropelException('Cannot find matching row in the database to reload object values.'); + } + $this->hydrate($row, 0, true, $dataFetcher->getIndexType()); // rehydrate + + if ($deep) { // also de-associate any related objects? + + } // if (deep) + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param ConnectionInterface $con + * @return void + * @throws PropelException + * @see Server::setDeleted() + * @see Server::isDeleted() + */ + public function delete(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(ServerTableMap::DATABASE_NAME); + } + + $con->transaction(function () use ($con) { + $deleteQuery = ChildServerQuery::create() + ->filterByPrimaryKey($this->getPrimaryKey()); + $ret = $this->preDelete($con); + if ($ret) { + $deleteQuery->delete($con); + $this->postDelete($con); + $this->setDeleted(true); + } + }); + } + + /** + * Persists this object to the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All modified related objects will also be persisted in the doSave() + * method. This method wraps all precipitate database operations in a + * single transaction. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save(ConnectionInterface $con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getServiceContainer()->getWriteConnection(ServerTableMap::DATABASE_NAME); + } + + return $con->transaction(function () use ($con) { + $isInsert = $this->isNew(); + $ret = $this->preSave($con); + if ($isInsert) { + $ret = $ret && $this->preInsert($con); + } else { + $ret = $ret && $this->preUpdate($con); + } + if ($ret) { + $affectedRows = $this->doSave($con); + if ($isInsert) { + $this->postInsert($con); + } else { + $this->postUpdate($con); + } + $this->postSave($con); + ServerTableMap::addInstanceToPool($this); + } else { + $affectedRows = 0; + } + + return $affectedRows; + }); + } + + /** + * Performs the work of inserting or updating the row in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param ConnectionInterface $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave(ConnectionInterface $con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + if ($this->isNew() || $this->isModified()) { + // persist changes + if ($this->isNew()) { + $this->doInsert($con); + $affectedRows += 1; + } else { + $affectedRows += $this->doUpdate($con); + } + $this->resetModified(); + } + + $this->alreadyInSave = false; + + } + + return $affectedRows; + } // doSave() + + /** + * Insert the row in the database. + * + * @param ConnectionInterface $con + * + * @throws PropelException + * @see doSave() + */ + protected function doInsert(ConnectionInterface $con) + { + $modifiedColumns = array(); + $index = 0; + + $this->modifiedColumns[ServerTableMap::COL_ID] = true; + if (null !== $this->id) { + throw new PropelException('Cannot insert a value for auto-increment primary key (' . ServerTableMap::COL_ID . ')'); + } + + // check the columns in natural order for more readable SQL queries + if ($this->isColumnModified(ServerTableMap::COL_ID)) { + $modifiedColumns[':p' . $index++] = 'id'; + } + if ($this->isColumnModified(ServerTableMap::COL_FQDN)) { + $modifiedColumns[':p' . $index++] = 'fqdn'; + } + if ($this->isColumnModified(ServerTableMap::COL_FINGERPRINT)) { + $modifiedColumns[':p' . $index++] = 'fingerprint'; + } + if ($this->isColumnModified(ServerTableMap::COL_PUBLIC_KEY)) { + $modifiedColumns[':p' . $index++] = 'public_key'; + } + if ($this->isColumnModified(ServerTableMap::COL_CERTIFICATE)) { + $modifiedColumns[':p' . $index++] = 'certificate'; + } + if ($this->isColumnModified(ServerTableMap::COL_LOCATION)) { + $modifiedColumns[':p' . $index++] = 'location'; + } + if ($this->isColumnModified(ServerTableMap::COL_SPEED)) { + $modifiedColumns[':p' . $index++] = 'speed'; + } + if ($this->isColumnModified(ServerTableMap::COL_EXTERNAL_IP)) { + $modifiedColumns[':p' . $index++] = 'external_ip'; + } + if ($this->isColumnModified(ServerTableMap::COL_INTERNAL_IP)) { + $modifiedColumns[':p' . $index++] = 'internal_ip'; + } + if ($this->isColumnModified(ServerTableMap::COL_NETMASK)) { + $modifiedColumns[':p' . $index++] = 'netmask'; + } + if ($this->isColumnModified(ServerTableMap::COL_FIRST_DNS)) { + $modifiedColumns[':p' . $index++] = 'first_dns'; + } + if ($this->isColumnModified(ServerTableMap::COL_SECOND_DNS)) { + $modifiedColumns[':p' . $index++] = 'second_dns'; + } + if ($this->isColumnModified(ServerTableMap::COL_PORT)) { + $modifiedColumns[':p' . $index++] = 'port'; + } + if ($this->isColumnModified(ServerTableMap::COL_PROTOCOL)) { + $modifiedColumns[':p' . $index++] = 'protocol'; + } + if ($this->isColumnModified(ServerTableMap::COL_STATUS)) { + $modifiedColumns[':p' . $index++] = 'status'; + } + + $sql = sprintf( + 'INSERT INTO Server (%s) VALUES (%s)', + implode(', ', $modifiedColumns), + implode(', ', array_keys($modifiedColumns)) + ); + + try { + $stmt = $con->prepare($sql); + foreach ($modifiedColumns as $identifier => $columnName) { + switch ($columnName) { + case 'id': + $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); + break; + case 'fqdn': + $stmt->bindValue($identifier, $this->fqdn, PDO::PARAM_STR); + break; + case 'fingerprint': + $stmt->bindValue($identifier, $this->fingerprint, PDO::PARAM_STR); + break; + case 'public_key': + $stmt->bindValue($identifier, $this->public_key, PDO::PARAM_STR); + break; + case 'certificate': + $stmt->bindValue($identifier, $this->certificate, PDO::PARAM_STR); + break; + case 'location': + $stmt->bindValue($identifier, $this->location, PDO::PARAM_STR); + break; + case 'speed': + $stmt->bindValue($identifier, $this->speed, PDO::PARAM_INT); + break; + case 'external_ip': + $stmt->bindValue($identifier, $this->external_ip, PDO::PARAM_STR); + break; + case 'internal_ip': + $stmt->bindValue($identifier, $this->internal_ip, PDO::PARAM_STR); + break; + case 'netmask': + $stmt->bindValue($identifier, $this->netmask, PDO::PARAM_INT); + break; + case 'first_dns': + $stmt->bindValue($identifier, $this->first_dns, PDO::PARAM_STR); + break; + case 'second_dns': + $stmt->bindValue($identifier, $this->second_dns, PDO::PARAM_STR); + break; + case 'port': + $stmt->bindValue($identifier, $this->port, PDO::PARAM_INT); + break; + case 'protocol': + $stmt->bindValue($identifier, $this->protocol, PDO::PARAM_INT); + break; + case 'status': + $stmt->bindValue($identifier, $this->status, PDO::PARAM_INT); + break; + } + } + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute INSERT statement [%s]', $sql), 0, $e); + } + + try { + $pk = $con->lastInsertId(); + } catch (Exception $e) { + throw new PropelException('Unable to get autoincrement id.', 0, $e); + } + $this->setId($pk); + + $this->setNew(false); + } + + /** + * Update the row in the database. + * + * @param ConnectionInterface $con + * + * @return Integer Number of updated rows + * @see doSave() + */ + protected function doUpdate(ConnectionInterface $con) + { + $selectCriteria = $this->buildPkeyCriteria(); + $valuesCriteria = $this->buildCriteria(); + + return $selectCriteria->doUpdate($valuesCriteria, $con); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_CAMELNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return mixed Value of field. + */ + public function getByName($name, $type = TableMap::TYPE_PHPNAME) + { + $pos = ServerTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $field = $this->getByPosition($pos); + + return $field; + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch ($pos) { + case 0: + return $this->getId(); + break; + case 1: + return $this->getFqdn(); + break; + case 2: + return $this->getFingerprint(); + break; + case 3: + return $this->getPublicKey(); + break; + case 4: + return $this->getCertificate(); + break; + case 5: + return $this->getLocation(); + break; + case 6: + return $this->getSpeed(); + break; + case 7: + return $this->getExternalIp(); + break; + case 8: + return $this->getInternalIp(); + break; + case 9: + return $this->getNetmask(); + break; + case 10: + return $this->getFirstDns(); + break; + case 11: + return $this->getSecondDns(); + break; + case 12: + return $this->getPort(); + break; + case 13: + return $this->getProtocol(); + break; + case 14: + return $this->getStatus(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType (optional) One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_CAMELNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE. + * @param array $alreadyDumpedObjects List of objects to skip to avoid recursion + * + * @return array an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = TableMap::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array()) + { + + if (isset($alreadyDumpedObjects['Server'][$this->hashCode()])) { + return '*RECURSION*'; + } + $alreadyDumpedObjects['Server'][$this->hashCode()] = true; + $keys = ServerTableMap::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getId(), + $keys[1] => $this->getFqdn(), + $keys[2] => $this->getFingerprint(), + $keys[3] => $this->getPublicKey(), + $keys[4] => $this->getCertificate(), + $keys[5] => $this->getLocation(), + $keys[6] => $this->getSpeed(), + $keys[7] => $this->getExternalIp(), + $keys[8] => $this->getInternalIp(), + $keys[9] => $this->getNetmask(), + $keys[10] => $this->getFirstDns(), + $keys[11] => $this->getSecondDns(), + $keys[12] => $this->getPort(), + $keys[13] => $this->getProtocol(), + $keys[14] => $this->getStatus(), + ); + $virtualColumns = $this->virtualColumns; + foreach ($virtualColumns as $key => $virtualColumn) { + $result[$key] = $virtualColumn; + } + + + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_CAMELNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * Defaults to TableMap::TYPE_PHPNAME. + * @return $this|\Eater\Glim\Model\Server + */ + public function setByName($name, $value, $type = TableMap::TYPE_PHPNAME) + { + $pos = ServerTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return $this|\Eater\Glim\Model\Server + */ + public function setByPosition($pos, $value) + { + switch ($pos) { + case 0: + $this->setId($value); + break; + case 1: + $this->setFqdn($value); + break; + case 2: + $this->setFingerprint($value); + break; + case 3: + $this->setPublicKey($value); + break; + case 4: + $this->setCertificate($value); + break; + case 5: + $this->setLocation($value); + break; + case 6: + $this->setSpeed($value); + break; + case 7: + $this->setExternalIp($value); + break; + case 8: + $this->setInternalIp($value); + break; + case 9: + $this->setNetmask($value); + break; + case 10: + $this->setFirstDns($value); + break; + case 11: + $this->setSecondDns($value); + break; + case 12: + $this->setPort($value); + break; + case 13: + $valueSet = ServerTableMap::getValueSet(ServerTableMap::COL_PROTOCOL); + if (isset($valueSet[$value])) { + $value = $valueSet[$value]; + } + $this->setProtocol($value); + break; + case 14: + $valueSet = ServerTableMap::getValueSet(ServerTableMap::COL_STATUS); + if (isset($valueSet[$value])) { + $value = $valueSet[$value]; + } + $this->setStatus($value); + break; + } // switch() + + return $this; + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_CAMELNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * The default key type is the column's TableMap::TYPE_PHPNAME. + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = TableMap::TYPE_PHPNAME) + { + $keys = ServerTableMap::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) { + $this->setId($arr[$keys[0]]); + } + if (array_key_exists($keys[1], $arr)) { + $this->setFqdn($arr[$keys[1]]); + } + if (array_key_exists($keys[2], $arr)) { + $this->setFingerprint($arr[$keys[2]]); + } + if (array_key_exists($keys[3], $arr)) { + $this->setPublicKey($arr[$keys[3]]); + } + if (array_key_exists($keys[4], $arr)) { + $this->setCertificate($arr[$keys[4]]); + } + if (array_key_exists($keys[5], $arr)) { + $this->setLocation($arr[$keys[5]]); + } + if (array_key_exists($keys[6], $arr)) { + $this->setSpeed($arr[$keys[6]]); + } + if (array_key_exists($keys[7], $arr)) { + $this->setExternalIp($arr[$keys[7]]); + } + if (array_key_exists($keys[8], $arr)) { + $this->setInternalIp($arr[$keys[8]]); + } + if (array_key_exists($keys[9], $arr)) { + $this->setNetmask($arr[$keys[9]]); + } + if (array_key_exists($keys[10], $arr)) { + $this->setFirstDns($arr[$keys[10]]); + } + if (array_key_exists($keys[11], $arr)) { + $this->setSecondDns($arr[$keys[11]]); + } + if (array_key_exists($keys[12], $arr)) { + $this->setPort($arr[$keys[12]]); + } + if (array_key_exists($keys[13], $arr)) { + $this->setProtocol($arr[$keys[13]]); + } + if (array_key_exists($keys[14], $arr)) { + $this->setStatus($arr[$keys[14]]); + } + } + + /** + * Populate the current object from a string, using a given parser format + * + * $book = new Book(); + * $book->importFrom('JSON', '{"Id":9012,"Title":"Don Juan","ISBN":"0140422161","Price":12.99,"PublisherId":1234,"AuthorId":5678}'); + * + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_CAMELNAME, + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * The default key type is the column's TableMap::TYPE_PHPNAME. + * + * @param mixed $parser A AbstractParser instance, + * or a format name ('XML', 'YAML', 'JSON', 'CSV') + * @param string $data The source data to import from + * @param string $keyType The type of keys the array uses. + * + * @return $this|\Eater\Glim\Model\Server The current object, for fluid interface + */ + public function importFrom($parser, $data, $keyType = TableMap::TYPE_PHPNAME) + { + if (!$parser instanceof AbstractParser) { + $parser = AbstractParser::getParser($parser); + } + + $this->fromArray($parser->toArray($data), $keyType); + + return $this; + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(ServerTableMap::DATABASE_NAME); + + if ($this->isColumnModified(ServerTableMap::COL_ID)) { + $criteria->add(ServerTableMap::COL_ID, $this->id); + } + if ($this->isColumnModified(ServerTableMap::COL_FQDN)) { + $criteria->add(ServerTableMap::COL_FQDN, $this->fqdn); + } + if ($this->isColumnModified(ServerTableMap::COL_FINGERPRINT)) { + $criteria->add(ServerTableMap::COL_FINGERPRINT, $this->fingerprint); + } + if ($this->isColumnModified(ServerTableMap::COL_PUBLIC_KEY)) { + $criteria->add(ServerTableMap::COL_PUBLIC_KEY, $this->public_key); + } + if ($this->isColumnModified(ServerTableMap::COL_CERTIFICATE)) { + $criteria->add(ServerTableMap::COL_CERTIFICATE, $this->certificate); + } + if ($this->isColumnModified(ServerTableMap::COL_LOCATION)) { + $criteria->add(ServerTableMap::COL_LOCATION, $this->location); + } + if ($this->isColumnModified(ServerTableMap::COL_SPEED)) { + $criteria->add(ServerTableMap::COL_SPEED, $this->speed); + } + if ($this->isColumnModified(ServerTableMap::COL_EXTERNAL_IP)) { + $criteria->add(ServerTableMap::COL_EXTERNAL_IP, $this->external_ip); + } + if ($this->isColumnModified(ServerTableMap::COL_INTERNAL_IP)) { + $criteria->add(ServerTableMap::COL_INTERNAL_IP, $this->internal_ip); + } + if ($this->isColumnModified(ServerTableMap::COL_NETMASK)) { + $criteria->add(ServerTableMap::COL_NETMASK, $this->netmask); + } + if ($this->isColumnModified(ServerTableMap::COL_FIRST_DNS)) { + $criteria->add(ServerTableMap::COL_FIRST_DNS, $this->first_dns); + } + if ($this->isColumnModified(ServerTableMap::COL_SECOND_DNS)) { + $criteria->add(ServerTableMap::COL_SECOND_DNS, $this->second_dns); + } + if ($this->isColumnModified(ServerTableMap::COL_PORT)) { + $criteria->add(ServerTableMap::COL_PORT, $this->port); + } + if ($this->isColumnModified(ServerTableMap::COL_PROTOCOL)) { + $criteria->add(ServerTableMap::COL_PROTOCOL, $this->protocol); + } + if ($this->isColumnModified(ServerTableMap::COL_STATUS)) { + $criteria->add(ServerTableMap::COL_STATUS, $this->status); + } + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @throws LogicException if no primary key is defined + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = ChildServerQuery::create(); + $criteria->add(ServerTableMap::COL_ID, $this->id); + + return $criteria; + } + + /** + * If the primary key is not null, return the hashcode of the + * primary key. Otherwise, return the hash code of the object. + * + * @return int Hashcode + */ + public function hashCode() + { + $validPk = null !== $this->getId(); + + $validPrimaryKeyFKs = 0; + $primaryKeyFKs = []; + + if ($validPk) { + return crc32(json_encode($this->getPrimaryKey(), JSON_UNESCAPED_UNICODE)); + } elseif ($validPrimaryKeyFKs) { + return crc32(json_encode($primaryKeyFKs, JSON_UNESCAPED_UNICODE)); + } + + return spl_object_hash($this); + } + + /** + * Returns the primary key for this object (row). + * @return int + */ + public function getPrimaryKey() + { + return $this->getId(); + } + + /** + * Generic method to set the primary key (id column). + * + * @param int $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + $this->setId($key); + } + + /** + * Returns true if the primary key for this object is null. + * @return boolean + */ + public function isPrimaryKeyNull() + { + return null === $this->getId(); + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of \Eater\Glim\Model\Server (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false, $makeNew = true) + { + $copyObj->setFqdn($this->getFqdn()); + $copyObj->setFingerprint($this->getFingerprint()); + $copyObj->setPublicKey($this->getPublicKey()); + $copyObj->setCertificate($this->getCertificate()); + $copyObj->setLocation($this->getLocation()); + $copyObj->setSpeed($this->getSpeed()); + $copyObj->setExternalIp($this->getExternalIp()); + $copyObj->setInternalIp($this->getInternalIp()); + $copyObj->setNetmask($this->getNetmask()); + $copyObj->setFirstDns($this->getFirstDns()); + $copyObj->setSecondDns($this->getSecondDns()); + $copyObj->setPort($this->getPort()); + $copyObj->setProtocol($this->getProtocol()); + $copyObj->setStatus($this->getStatus()); + if ($makeNew) { + $copyObj->setNew(true); + $copyObj->setId(NULL); // this is a auto-increment column, so set to default value + } + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return \Eater\Glim\Model\Server Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + + return $copyObj; + } + + /** + * Clears the current object, sets all attributes to their default values and removes + * outgoing references as well as back-references (from other objects to this one. Results probably in a database + * change of those foreign objects when you call `save` there). + */ + public function clear() + { + $this->id = null; + $this->fqdn = null; + $this->fingerprint = null; + $this->public_key = null; + $this->certificate = null; + $this->location = null; + $this->speed = null; + $this->external_ip = null; + $this->internal_ip = null; + $this->netmask = null; + $this->first_dns = null; + $this->second_dns = null; + $this->port = null; + $this->protocol = null; + $this->status = null; + $this->alreadyInSave = false; + $this->clearAllReferences(); + $this->applyDefaultValues(); + $this->resetModified(); + $this->setNew(true); + $this->setDeleted(false); + } + + /** + * Resets all references and back-references to other model objects or collections of model objects. + * + * This method is used to reset all php object references (not the actual reference in the database). + * Necessary for object serialisation. + * + * @param boolean $deep Whether to also clear the references on all referrer objects. + */ + public function clearAllReferences($deep = false) + { + if ($deep) { + } // if ($deep) + + } + + /** + * Return the string representation of this object + * + * @return string + */ + public function __toString() + { + return (string) $this->exportTo(ServerTableMap::DEFAULT_STRING_FORMAT); + } + + /** + * Code to be run before persisting the object + * @param ConnectionInterface $con + * @return boolean + */ + public function preSave(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after persisting the object + * @param ConnectionInterface $con + */ + public function postSave(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before inserting to database + * @param ConnectionInterface $con + * @return boolean + */ + public function preInsert(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after inserting to database + * @param ConnectionInterface $con + */ + public function postInsert(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before updating the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preUpdate(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after updating the object in database + * @param ConnectionInterface $con + */ + public function postUpdate(ConnectionInterface $con = null) + { + + } + + /** + * Code to be run before deleting the object in database + * @param ConnectionInterface $con + * @return boolean + */ + public function preDelete(ConnectionInterface $con = null) + { + return true; + } + + /** + * Code to be run after deleting the object in database + * @param ConnectionInterface $con + */ + public function postDelete(ConnectionInterface $con = null) + { + + } + + + /** + * Derived method to catches calls to undefined methods. + * + * Provides magic import/export method support (fromXML()/toXML(), fromYAML()/toYAML(), etc.). + * Allows to define default __call() behavior if you overwrite __call() + * + * @param string $name + * @param mixed $params + * + * @return array|string + */ + public function __call($name, $params) + { + if (0 === strpos($name, 'get')) { + $virtualColumn = substr($name, 3); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + + $virtualColumn = lcfirst($virtualColumn); + if ($this->hasVirtualColumn($virtualColumn)) { + return $this->getVirtualColumn($virtualColumn); + } + } + + if (0 === strpos($name, 'from')) { + $format = substr($name, 4); + + return $this->importFrom($format, reset($params)); + } + + if (0 === strpos($name, 'to')) { + $format = substr($name, 2); + $includeLazyLoadColumns = isset($params[0]) ? $params[0] : true; + + return $this->exportTo($format, $includeLazyLoadColumns); + } + + throw new BadMethodCallException(sprintf('Call to undefined method: %s.', $name)); + } + +} diff --git a/src/Model/Base/ServerQuery.php b/src/Model/Base/ServerQuery.php new file mode 100644 index 0000000..9cbfd9d --- /dev/null +++ b/src/Model/Base/ServerQuery.php @@ -0,0 +1,862 @@ +setModelAlias($modelAlias); + } + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ChildServer|array|mixed the result, formatted by the current formatter + */ + public function findPk($key, ConnectionInterface $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = ServerTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(ServerTableMap::DATABASE_NAME); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @throws \Propel\Runtime\Exception\PropelException + * + * @return ChildServer A model object, or null if the key is not found + */ + protected function findPkSimple($key, ConnectionInterface $con) + { + $sql = 'SELECT id, fqdn, fingerprint, public_key, certificate, location, speed, external_ip, internal_ip, netmask, first_dns, second_dns, port, protocol, status FROM Server WHERE id = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + /** @var ChildServer $obj */ + $obj = new ChildServer(); + $obj->hydrate($row); + ServerTableMap::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildServer|array|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, ConnectionInterface $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($dataFetcher); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(ServerTableMap::COL_ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(ServerTableMap::COL_ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id > 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(ServerTableMap::COL_ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(ServerTableMap::COL_ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_ID, $id, $comparison); + } + + /** + * Filter the query on the fqdn column + * + * Example usage: + * + * $query->filterByFqdn('fooValue'); // WHERE fqdn = 'fooValue' + * $query->filterByFqdn('%fooValue%'); // WHERE fqdn LIKE '%fooValue%' + * + * + * @param string $fqdn The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByFqdn($fqdn = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($fqdn)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $fqdn)) { + $fqdn = str_replace('*', '%', $fqdn); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_FQDN, $fqdn, $comparison); + } + + /** + * Filter the query on the fingerprint column + * + * Example usage: + * + * $query->filterByFingerprint('fooValue'); // WHERE fingerprint = 'fooValue' + * $query->filterByFingerprint('%fooValue%'); // WHERE fingerprint LIKE '%fooValue%' + * + * + * @param string $fingerprint The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByFingerprint($fingerprint = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($fingerprint)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $fingerprint)) { + $fingerprint = str_replace('*', '%', $fingerprint); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_FINGERPRINT, $fingerprint, $comparison); + } + + /** + * Filter the query on the public_key column + * + * Example usage: + * + * $query->filterByPublicKey('fooValue'); // WHERE public_key = 'fooValue' + * $query->filterByPublicKey('%fooValue%'); // WHERE public_key LIKE '%fooValue%' + * + * + * @param string $publicKey The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByPublicKey($publicKey = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($publicKey)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $publicKey)) { + $publicKey = str_replace('*', '%', $publicKey); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_PUBLIC_KEY, $publicKey, $comparison); + } + + /** + * Filter the query on the certificate column + * + * Example usage: + * + * $query->filterByCertificate('fooValue'); // WHERE certificate = 'fooValue' + * $query->filterByCertificate('%fooValue%'); // WHERE certificate LIKE '%fooValue%' + * + * + * @param string $certificate The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByCertificate($certificate = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($certificate)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $certificate)) { + $certificate = str_replace('*', '%', $certificate); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_CERTIFICATE, $certificate, $comparison); + } + + /** + * Filter the query on the location column + * + * Example usage: + * + * $query->filterByLocation('fooValue'); // WHERE location = 'fooValue' + * $query->filterByLocation('%fooValue%'); // WHERE location LIKE '%fooValue%' + * + * + * @param string $location The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByLocation($location = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($location)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $location)) { + $location = str_replace('*', '%', $location); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_LOCATION, $location, $comparison); + } + + /** + * Filter the query on the speed column + * + * Example usage: + * + * $query->filterBySpeed(1234); // WHERE speed = 1234 + * $query->filterBySpeed(array(12, 34)); // WHERE speed IN (12, 34) + * $query->filterBySpeed(array('min' => 12)); // WHERE speed > 12 + * + * + * @param mixed $speed The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterBySpeed($speed = null, $comparison = null) + { + if (is_array($speed)) { + $useMinMax = false; + if (isset($speed['min'])) { + $this->addUsingAlias(ServerTableMap::COL_SPEED, $speed['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($speed['max'])) { + $this->addUsingAlias(ServerTableMap::COL_SPEED, $speed['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_SPEED, $speed, $comparison); + } + + /** + * Filter the query on the external_ip column + * + * Example usage: + * + * $query->filterByExternalIp('fooValue'); // WHERE external_ip = 'fooValue' + * $query->filterByExternalIp('%fooValue%'); // WHERE external_ip LIKE '%fooValue%' + * + * + * @param string $externalIp The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByExternalIp($externalIp = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($externalIp)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $externalIp)) { + $externalIp = str_replace('*', '%', $externalIp); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_EXTERNAL_IP, $externalIp, $comparison); + } + + /** + * Filter the query on the internal_ip column + * + * Example usage: + * + * $query->filterByInternalIp('fooValue'); // WHERE internal_ip = 'fooValue' + * $query->filterByInternalIp('%fooValue%'); // WHERE internal_ip LIKE '%fooValue%' + * + * + * @param string $internalIp The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByInternalIp($internalIp = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($internalIp)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $internalIp)) { + $internalIp = str_replace('*', '%', $internalIp); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_INTERNAL_IP, $internalIp, $comparison); + } + + /** + * Filter the query on the netmask column + * + * Example usage: + * + * $query->filterByNetmask(1234); // WHERE netmask = 1234 + * $query->filterByNetmask(array(12, 34)); // WHERE netmask IN (12, 34) + * $query->filterByNetmask(array('min' => 12)); // WHERE netmask > 12 + * + * + * @param mixed $netmask The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByNetmask($netmask = null, $comparison = null) + { + if (is_array($netmask)) { + $useMinMax = false; + if (isset($netmask['min'])) { + $this->addUsingAlias(ServerTableMap::COL_NETMASK, $netmask['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($netmask['max'])) { + $this->addUsingAlias(ServerTableMap::COL_NETMASK, $netmask['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_NETMASK, $netmask, $comparison); + } + + /** + * Filter the query on the first_dns column + * + * Example usage: + * + * $query->filterByFirstDns('fooValue'); // WHERE first_dns = 'fooValue' + * $query->filterByFirstDns('%fooValue%'); // WHERE first_dns LIKE '%fooValue%' + * + * + * @param string $firstDns The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByFirstDns($firstDns = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($firstDns)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $firstDns)) { + $firstDns = str_replace('*', '%', $firstDns); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_FIRST_DNS, $firstDns, $comparison); + } + + /** + * Filter the query on the second_dns column + * + * Example usage: + * + * $query->filterBySecondDns('fooValue'); // WHERE second_dns = 'fooValue' + * $query->filterBySecondDns('%fooValue%'); // WHERE second_dns LIKE '%fooValue%' + * + * + * @param string $secondDns The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterBySecondDns($secondDns = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($secondDns)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $secondDns)) { + $secondDns = str_replace('*', '%', $secondDns); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_SECOND_DNS, $secondDns, $comparison); + } + + /** + * Filter the query on the port column + * + * Example usage: + * + * $query->filterByPort(1234); // WHERE port = 1234 + * $query->filterByPort(array(12, 34)); // WHERE port IN (12, 34) + * $query->filterByPort(array('min' => 12)); // WHERE port > 12 + * + * + * @param mixed $port The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByPort($port = null, $comparison = null) + { + if (is_array($port)) { + $useMinMax = false; + if (isset($port['min'])) { + $this->addUsingAlias(ServerTableMap::COL_PORT, $port['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($port['max'])) { + $this->addUsingAlias(ServerTableMap::COL_PORT, $port['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_PORT, $port, $comparison); + } + + /** + * Filter the query on the protocol column + * + * @param mixed $protocol The value to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByProtocol($protocol = null, $comparison = null) + { + $valueSet = ServerTableMap::getValueSet(ServerTableMap::COL_PROTOCOL); + if (is_scalar($protocol)) { + if (!in_array($protocol, $valueSet)) { + throw new PropelException(sprintf('Value "%s" is not accepted in this enumerated column', $protocol)); + } + $protocol = array_search($protocol, $valueSet); + } elseif (is_array($protocol)) { + $convertedValues = array(); + foreach ($protocol as $value) { + if (!in_array($value, $valueSet)) { + throw new PropelException(sprintf('Value "%s" is not accepted in this enumerated column', $value)); + } + $convertedValues []= array_search($value, $valueSet); + } + $protocol = $convertedValues; + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_PROTOCOL, $protocol, $comparison); + } + + /** + * Filter the query on the status column + * + * @param mixed $status The value to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function filterByStatus($status = null, $comparison = null) + { + $valueSet = ServerTableMap::getValueSet(ServerTableMap::COL_STATUS); + if (is_scalar($status)) { + if (!in_array($status, $valueSet)) { + throw new PropelException(sprintf('Value "%s" is not accepted in this enumerated column', $status)); + } + $status = array_search($status, $valueSet); + } elseif (is_array($status)) { + $convertedValues = array(); + foreach ($status as $value) { + if (!in_array($value, $valueSet)) { + throw new PropelException(sprintf('Value "%s" is not accepted in this enumerated column', $value)); + } + $convertedValues []= array_search($value, $valueSet); + } + $status = $convertedValues; + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(ServerTableMap::COL_STATUS, $status, $comparison); + } + + /** + * Exclude object from result + * + * @param ChildServer $server Object to remove from the list of results + * + * @return $this|ChildServerQuery The current query, for fluid interface + */ + public function prune($server = null) + { + if ($server) { + $this->addUsingAlias(ServerTableMap::COL_ID, $server->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Deletes all rows from the Server table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public function doDeleteAll(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(ServerTableMap::DATABASE_NAME); + } + + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + return $con->transaction(function () use ($con) { + $affectedRows = 0; // initialize var to track total num of affected rows + $affectedRows += parent::doDeleteAll($con); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + ServerTableMap::clearInstancePool(); + ServerTableMap::clearRelatedInstancePool(); + + return $affectedRows; + }); + } + + /** + * Performs a DELETE on the database based on the current ModelCriteria + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public function delete(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(ServerTableMap::DATABASE_NAME); + } + + $criteria = $this; + + // Set the correct dbName + $criteria->setDbName(ServerTableMap::DATABASE_NAME); + + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + return $con->transaction(function () use ($con, $criteria) { + $affectedRows = 0; // initialize var to track total num of affected rows + + ServerTableMap::removeInstanceFromPool($criteria); + + $affectedRows += ModelCriteria::delete($con); + ServerTableMap::clearRelatedInstancePool(); + + return $affectedRows; + }); + } + +} // ServerQuery diff --git a/src/Model/Certificate.php b/src/Model/Certificate.php index 68d3da3..cefa73f 100644 --- a/src/Model/Certificate.php +++ b/src/Model/Certificate.php @@ -16,5 +16,5 @@ use Eater\Glim\Model\Base\Certificate as BaseCertificate; */ class Certificate extends BaseCertificate { - + } diff --git a/src/Model/CertificateQuery.php b/src/Model/CertificateQuery.php index 0879433..194274f 100644 --- a/src/Model/CertificateQuery.php +++ b/src/Model/CertificateQuery.php @@ -16,5 +16,16 @@ use Eater\Glim\Model\Base\CertificateQuery as BaseCertificateQuery; */ class CertificateQuery extends BaseCertificateQuery { - + /** + * @param User $user + * @param string $name + * @throws \Propel\Runtime\Exception\PropelException + * @return Certificate + */ + public function findOneByUserAndName($user, $name) + { + return $this->filterByName($name) + ->filterByUser($user) + ->findOne(); + } } diff --git a/src/Model/Map/CertificateTableMap.php b/src/Model/Map/CertificateTableMap.php index aba639b..f493084 100644 --- a/src/Model/Map/CertificateTableMap.php +++ b/src/Model/Map/CertificateTableMap.php @@ -59,7 +59,7 @@ class CertificateTableMap extends TableMap /** * The total number of columns */ - const NUM_COLUMNS = 7; + const NUM_COLUMNS = 8; /** * The number of lazy-loaded columns @@ -69,7 +69,7 @@ class CertificateTableMap extends TableMap /** * The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ - const NUM_HYDRATE_COLUMNS = 7; + const NUM_HYDRATE_COLUMNS = 8; /** * the column name for the id field @@ -91,6 +91,11 @@ class CertificateTableMap extends TableMap */ const COL_CERTIFICATE = 'Certificate.certificate'; + /** + * the column name for the private_key field + */ + const COL_PRIVATE_KEY = 'Certificate.private_key'; + /** * the column name for the expires_on field */ @@ -118,11 +123,11 @@ class CertificateTableMap extends TableMap * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - self::TYPE_PHPNAME => array('Id', 'UserId', 'Name', 'Certificate', 'ExpiresOn', 'Revoked', 'Serial', ), - self::TYPE_CAMELNAME => array('id', 'userId', 'name', 'certificate', 'expiresOn', 'revoked', 'serial', ), - self::TYPE_COLNAME => array(CertificateTableMap::COL_ID, CertificateTableMap::COL_USER_ID, CertificateTableMap::COL_NAME, CertificateTableMap::COL_CERTIFICATE, CertificateTableMap::COL_EXPIRES_ON, CertificateTableMap::COL_REVOKED, CertificateTableMap::COL_SERIAL, ), - self::TYPE_FIELDNAME => array('id', 'user_id', 'name', 'certificate', 'expires_on', 'revoked', 'serial', ), - self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, ) + self::TYPE_PHPNAME => array('Id', 'UserId', 'Name', 'Certificate', 'PrivateKey', 'ExpiresOn', 'Revoked', 'Serial', ), + self::TYPE_CAMELNAME => array('id', 'userId', 'name', 'certificate', 'privateKey', 'expiresOn', 'revoked', 'serial', ), + self::TYPE_COLNAME => array(CertificateTableMap::COL_ID, CertificateTableMap::COL_USER_ID, CertificateTableMap::COL_NAME, CertificateTableMap::COL_CERTIFICATE, CertificateTableMap::COL_PRIVATE_KEY, CertificateTableMap::COL_EXPIRES_ON, CertificateTableMap::COL_REVOKED, CertificateTableMap::COL_SERIAL, ), + self::TYPE_FIELDNAME => array('id', 'user_id', 'name', 'certificate', 'private_key', 'expires_on', 'revoked', 'serial', ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, ) ); /** @@ -132,11 +137,11 @@ class CertificateTableMap extends TableMap * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - self::TYPE_PHPNAME => array('Id' => 0, 'UserId' => 1, 'Name' => 2, 'Certificate' => 3, 'ExpiresOn' => 4, 'Revoked' => 5, 'Serial' => 6, ), - self::TYPE_CAMELNAME => array('id' => 0, 'userId' => 1, 'name' => 2, 'certificate' => 3, 'expiresOn' => 4, 'revoked' => 5, 'serial' => 6, ), - self::TYPE_COLNAME => array(CertificateTableMap::COL_ID => 0, CertificateTableMap::COL_USER_ID => 1, CertificateTableMap::COL_NAME => 2, CertificateTableMap::COL_CERTIFICATE => 3, CertificateTableMap::COL_EXPIRES_ON => 4, CertificateTableMap::COL_REVOKED => 5, CertificateTableMap::COL_SERIAL => 6, ), - self::TYPE_FIELDNAME => array('id' => 0, 'user_id' => 1, 'name' => 2, 'certificate' => 3, 'expires_on' => 4, 'revoked' => 5, 'serial' => 6, ), - self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, ) + self::TYPE_PHPNAME => array('Id' => 0, 'UserId' => 1, 'Name' => 2, 'Certificate' => 3, 'PrivateKey' => 4, 'ExpiresOn' => 5, 'Revoked' => 6, 'Serial' => 7, ), + self::TYPE_CAMELNAME => array('id' => 0, 'userId' => 1, 'name' => 2, 'certificate' => 3, 'privateKey' => 4, 'expiresOn' => 5, 'revoked' => 6, 'serial' => 7, ), + self::TYPE_COLNAME => array(CertificateTableMap::COL_ID => 0, CertificateTableMap::COL_USER_ID => 1, CertificateTableMap::COL_NAME => 2, CertificateTableMap::COL_CERTIFICATE => 3, CertificateTableMap::COL_PRIVATE_KEY => 4, CertificateTableMap::COL_EXPIRES_ON => 5, CertificateTableMap::COL_REVOKED => 6, CertificateTableMap::COL_SERIAL => 7, ), + self::TYPE_FIELDNAME => array('id' => 0, 'user_id' => 1, 'name' => 2, 'certificate' => 3, 'private_key' => 4, 'expires_on' => 5, 'revoked' => 6, 'serial' => 7, ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, ) ); /** @@ -160,6 +165,7 @@ class CertificateTableMap extends TableMap $this->addForeignKey('user_id', 'UserId', 'INTEGER', 'User', 'id', false, null, null); $this->addColumn('name', 'Name', 'VARCHAR', false, 64, null); $this->addColumn('certificate', 'Certificate', 'LONGVARCHAR', false, null, null); + $this->addColumn('private_key', 'PrivateKey', 'LONGVARCHAR', false, null, null); $this->addColumn('expires_on', 'ExpiresOn', 'TIMESTAMP', false, null, null); $this->addColumn('revoked', 'Revoked', 'BOOLEAN', false, null, false); $this->addColumn('serial', 'Serial', 'VARCHAR', false, 64, null); @@ -324,6 +330,7 @@ class CertificateTableMap extends TableMap $criteria->addSelectColumn(CertificateTableMap::COL_USER_ID); $criteria->addSelectColumn(CertificateTableMap::COL_NAME); $criteria->addSelectColumn(CertificateTableMap::COL_CERTIFICATE); + $criteria->addSelectColumn(CertificateTableMap::COL_PRIVATE_KEY); $criteria->addSelectColumn(CertificateTableMap::COL_EXPIRES_ON); $criteria->addSelectColumn(CertificateTableMap::COL_REVOKED); $criteria->addSelectColumn(CertificateTableMap::COL_SERIAL); @@ -332,6 +339,7 @@ class CertificateTableMap extends TableMap $criteria->addSelectColumn($alias . '.user_id'); $criteria->addSelectColumn($alias . '.name'); $criteria->addSelectColumn($alias . '.certificate'); + $criteria->addSelectColumn($alias . '.private_key'); $criteria->addSelectColumn($alias . '.expires_on'); $criteria->addSelectColumn($alias . '.revoked'); $criteria->addSelectColumn($alias . '.serial'); diff --git a/src/Model/Map/ServerTableMap.php b/src/Model/Map/ServerTableMap.php new file mode 100644 index 0000000..681c3b3 --- /dev/null +++ b/src/Model/Map/ServerTableMap.php @@ -0,0 +1,564 @@ + array('Id', 'Fqdn', 'Fingerprint', 'PublicKey', 'Certificate', 'Location', 'Speed', 'ExternalIp', 'InternalIp', 'Netmask', 'FirstDns', 'SecondDns', 'Port', 'Protocol', 'Status', ), + self::TYPE_CAMELNAME => array('id', 'fqdn', 'fingerprint', 'publicKey', 'certificate', 'location', 'speed', 'externalIp', 'internalIp', 'netmask', 'firstDns', 'secondDns', 'port', 'protocol', 'status', ), + self::TYPE_COLNAME => array(ServerTableMap::COL_ID, ServerTableMap::COL_FQDN, ServerTableMap::COL_FINGERPRINT, ServerTableMap::COL_PUBLIC_KEY, ServerTableMap::COL_CERTIFICATE, ServerTableMap::COL_LOCATION, ServerTableMap::COL_SPEED, ServerTableMap::COL_EXTERNAL_IP, ServerTableMap::COL_INTERNAL_IP, ServerTableMap::COL_NETMASK, ServerTableMap::COL_FIRST_DNS, ServerTableMap::COL_SECOND_DNS, ServerTableMap::COL_PORT, ServerTableMap::COL_PROTOCOL, ServerTableMap::COL_STATUS, ), + self::TYPE_FIELDNAME => array('id', 'fqdn', 'fingerprint', 'public_key', 'certificate', 'location', 'speed', 'external_ip', 'internal_ip', 'netmask', 'first_dns', 'second_dns', 'port', 'protocol', 'status', ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 + */ + protected static $fieldKeys = array ( + self::TYPE_PHPNAME => array('Id' => 0, 'Fqdn' => 1, 'Fingerprint' => 2, 'PublicKey' => 3, 'Certificate' => 4, 'Location' => 5, 'Speed' => 6, 'ExternalIp' => 7, 'InternalIp' => 8, 'Netmask' => 9, 'FirstDns' => 10, 'SecondDns' => 11, 'Port' => 12, 'Protocol' => 13, 'Status' => 14, ), + self::TYPE_CAMELNAME => array('id' => 0, 'fqdn' => 1, 'fingerprint' => 2, 'publicKey' => 3, 'certificate' => 4, 'location' => 5, 'speed' => 6, 'externalIp' => 7, 'internalIp' => 8, 'netmask' => 9, 'firstDns' => 10, 'secondDns' => 11, 'port' => 12, 'protocol' => 13, 'status' => 14, ), + self::TYPE_COLNAME => array(ServerTableMap::COL_ID => 0, ServerTableMap::COL_FQDN => 1, ServerTableMap::COL_FINGERPRINT => 2, ServerTableMap::COL_PUBLIC_KEY => 3, ServerTableMap::COL_CERTIFICATE => 4, ServerTableMap::COL_LOCATION => 5, ServerTableMap::COL_SPEED => 6, ServerTableMap::COL_EXTERNAL_IP => 7, ServerTableMap::COL_INTERNAL_IP => 8, ServerTableMap::COL_NETMASK => 9, ServerTableMap::COL_FIRST_DNS => 10, ServerTableMap::COL_SECOND_DNS => 11, ServerTableMap::COL_PORT => 12, ServerTableMap::COL_PROTOCOL => 13, ServerTableMap::COL_STATUS => 14, ), + self::TYPE_FIELDNAME => array('id' => 0, 'fqdn' => 1, 'fingerprint' => 2, 'public_key' => 3, 'certificate' => 4, 'location' => 5, 'speed' => 6, 'external_ip' => 7, 'internal_ip' => 8, 'netmask' => 9, 'first_dns' => 10, 'second_dns' => 11, 'port' => 12, 'protocol' => 13, 'status' => 14, ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) + ); + + /** The enumerated values for this table */ + protected static $enumValueSets = array( + ServerTableMap::COL_PROTOCOL => array( + self::COL_PROTOCOL_UDP, + self::COL_PROTOCOL_TCP, + ), + ServerTableMap::COL_STATUS => array( + self::COL_STATUS_REGISTERED, + self::COL_STATUS_SIGNED, + self::COL_STATUS_REVOKED, + ), + ); + + /** + * Gets the list of values for all ENUM columns + * @return array + */ + public static function getValueSets() + { + return static::$enumValueSets; + } + + /** + * Gets the list of values for an ENUM column + * @param string $colname + * @return array list of possible values for the column + */ + public static function getValueSet($colname) + { + $valueSets = self::getValueSets(); + + return $valueSets[$colname]; + } + + /** + * Initialize the table attributes and columns + * Relations are not initialized by this method since they are lazy loaded + * + * @return void + * @throws PropelException + */ + public function initialize() + { + // attributes + $this->setName('Server'); + $this->setPhpName('Server'); + $this->setIdentifierQuoting(false); + $this->setClassName('\\Eater\\Glim\\Model\\Server'); + $this->setPackage(''); + $this->setUseIdGenerator(true); + // columns + $this->addPrimaryKey('id', 'Id', 'INTEGER', true, null, null); + $this->addColumn('fqdn', 'Fqdn', 'VARCHAR', false, 64, null); + $this->addColumn('fingerprint', 'Fingerprint', 'VARCHAR', false, 64, null); + $this->addColumn('public_key', 'PublicKey', 'LONGVARCHAR', false, null, null); + $this->addColumn('certificate', 'Certificate', 'LONGVARCHAR', false, null, null); + $this->addColumn('location', 'Location', 'VARCHAR', false, 64, 'Unknown'); + $this->addColumn('speed', 'Speed', 'INTEGER', false, null, -1); + $this->addColumn('external_ip', 'ExternalIp', 'VARCHAR', false, 128, null); + $this->addColumn('internal_ip', 'InternalIp', 'VARCHAR', false, 128, '10.24.0.0'); + $this->addColumn('netmask', 'Netmask', 'INTEGER', false, 4, 16); + $this->addColumn('first_dns', 'FirstDns', 'VARCHAR', false, 128, null); + $this->addColumn('second_dns', 'SecondDns', 'VARCHAR', false, 128, null); + $this->addColumn('port', 'Port', 'INTEGER', false, null, 1194); + $this->addColumn('protocol', 'Protocol', 'ENUM', false, null, 'udp'); + $this->getColumn('protocol')->setValueSet(array ( + 0 => 'udp', + 1 => 'tcp', +)); + $this->addColumn('status', 'Status', 'ENUM', false, null, 'registered'); + $this->getColumn('status')->setValueSet(array ( + 0 => 'registered', + 1 => 'signed', + 2 => 'revoked', +)); + } // initialize() + + /** + * Build the RelationMap objects for this table relationships + */ + public function buildRelations() + { + } // buildRelations() + + /** + * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. + * + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, a serialize()d version of the primary key will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_CAMELNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + * + * @return string The primary key hash of the row + */ + public static function getPrimaryKeyHashFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + // If the PK cannot be derived from the row, return NULL. + if ($row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)] === null) { + return null; + } + + return (string) $row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + } + + /** + * Retrieves the primary key from the DB resultset row + * For tables with a single-column primary key, that simple pkey value will be returned. For tables with + * a multi-column primary key, an array of the primary key columns will be returned. + * + * @param array $row resultset row. + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_CAMELNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM + * + * @return mixed The primary key of the row + */ + public static function getPrimaryKeyFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + return (int) $row[ + $indexType == TableMap::TYPE_NUM + ? 0 + $offset + : self::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType) + ]; + } + + /** + * The class that the tableMap will make instances of. + * + * If $withPrefix is true, the returned path + * uses a dot-path notation which is translated into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @param boolean $withPrefix Whether or not to return the path with the class name + * @return string path.to.ClassName + */ + public static function getOMClass($withPrefix = true) + { + return $withPrefix ? ServerTableMap::CLASS_DEFAULT : ServerTableMap::OM_CLASS; + } + + /** + * Populates an object of the default type or an object that inherit from the default. + * + * @param array $row row returned by DataFetcher->fetch(). + * @param int $offset The 0-based offset for reading from the resultset row. + * @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType(). + One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_CAMELNAME + * TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return array (Server object, last column rank) + */ + public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM) + { + $key = ServerTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); + if (null !== ($obj = ServerTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, $offset, true); // rehydrate + $col = $offset + ServerTableMap::NUM_HYDRATE_COLUMNS; + } else { + $cls = ServerTableMap::OM_CLASS; + /** @var Server $obj */ + $obj = new $cls(); + $col = $obj->hydrate($row, $offset, false, $indexType); + ServerTableMap::addInstanceToPool($obj, $key); + } + + return array($obj, $col); + } + + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @param DataFetcherInterface $dataFetcher + * @return array + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(DataFetcherInterface $dataFetcher) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = static::getOMClass(false); + // populate the object(s) + while ($row = $dataFetcher->fetch()) { + $key = ServerTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); + if (null !== ($obj = ServerTableMap::getInstanceFromPool($key))) { + // We no longer rehydrate the object, since this can cause data loss. + // See http://www.propelorm.org/ticket/509 + // $obj->hydrate($row, 0, true); // rehydrate + $results[] = $obj; + } else { + /** @var Server $obj */ + $obj = new $cls(); + $obj->hydrate($row); + $results[] = $obj; + ServerTableMap::addInstanceToPool($obj, $key); + } // if key exists + } + + return $results; + } + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param Criteria $criteria object containing the columns to add. + * @param string $alias optional table alias + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria, $alias = null) + { + if (null === $alias) { + $criteria->addSelectColumn(ServerTableMap::COL_ID); + $criteria->addSelectColumn(ServerTableMap::COL_FQDN); + $criteria->addSelectColumn(ServerTableMap::COL_FINGERPRINT); + $criteria->addSelectColumn(ServerTableMap::COL_PUBLIC_KEY); + $criteria->addSelectColumn(ServerTableMap::COL_CERTIFICATE); + $criteria->addSelectColumn(ServerTableMap::COL_LOCATION); + $criteria->addSelectColumn(ServerTableMap::COL_SPEED); + $criteria->addSelectColumn(ServerTableMap::COL_EXTERNAL_IP); + $criteria->addSelectColumn(ServerTableMap::COL_INTERNAL_IP); + $criteria->addSelectColumn(ServerTableMap::COL_NETMASK); + $criteria->addSelectColumn(ServerTableMap::COL_FIRST_DNS); + $criteria->addSelectColumn(ServerTableMap::COL_SECOND_DNS); + $criteria->addSelectColumn(ServerTableMap::COL_PORT); + $criteria->addSelectColumn(ServerTableMap::COL_PROTOCOL); + $criteria->addSelectColumn(ServerTableMap::COL_STATUS); + } else { + $criteria->addSelectColumn($alias . '.id'); + $criteria->addSelectColumn($alias . '.fqdn'); + $criteria->addSelectColumn($alias . '.fingerprint'); + $criteria->addSelectColumn($alias . '.public_key'); + $criteria->addSelectColumn($alias . '.certificate'); + $criteria->addSelectColumn($alias . '.location'); + $criteria->addSelectColumn($alias . '.speed'); + $criteria->addSelectColumn($alias . '.external_ip'); + $criteria->addSelectColumn($alias . '.internal_ip'); + $criteria->addSelectColumn($alias . '.netmask'); + $criteria->addSelectColumn($alias . '.first_dns'); + $criteria->addSelectColumn($alias . '.second_dns'); + $criteria->addSelectColumn($alias . '.port'); + $criteria->addSelectColumn($alias . '.protocol'); + $criteria->addSelectColumn($alias . '.status'); + } + } + + /** + * Returns the TableMap related to this object. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getServiceContainer()->getDatabaseMap(ServerTableMap::DATABASE_NAME)->getTable(ServerTableMap::TABLE_NAME); + } + + /** + * Add a TableMap instance to the database for this tableMap class. + */ + public static function buildTableMap() + { + $dbMap = Propel::getServiceContainer()->getDatabaseMap(ServerTableMap::DATABASE_NAME); + if (!$dbMap->hasTable(ServerTableMap::TABLE_NAME)) { + $dbMap->addTableObject(new ServerTableMap()); + } + } + + /** + * Performs a DELETE on the database, given a Server or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or Server object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(ServerTableMap::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + // rename for clarity + $criteria = $values; + } elseif ($values instanceof \Eater\Glim\Model\Server) { // it's a model object + // create criteria based on pk values + $criteria = $values->buildPkeyCriteria(); + } else { // it's a primary key, or an array of pks + $criteria = new Criteria(ServerTableMap::DATABASE_NAME); + $criteria->add(ServerTableMap::COL_ID, (array) $values, Criteria::IN); + } + + $query = ServerQuery::create()->mergeWith($criteria); + + if ($values instanceof Criteria) { + ServerTableMap::clearInstancePool(); + } elseif (!is_object($values)) { // it's a primary key, or an array of pks + foreach ((array) $values as $singleval) { + ServerTableMap::removeInstanceFromPool($singleval); + } + } + + return $query->delete($con); + } + + /** + * Deletes all rows from the Server table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll(ConnectionInterface $con = null) + { + return ServerQuery::create()->doDeleteAll($con); + } + + /** + * Performs an INSERT on the database, given a Server or Criteria object. + * + * @param mixed $criteria Criteria or Server object containing data that is used to create the INSERT statement. + * @param ConnectionInterface $con the ConnectionInterface connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($criteria, ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(ServerTableMap::DATABASE_NAME); + } + + if ($criteria instanceof Criteria) { + $criteria = clone $criteria; // rename for clarity + } else { + $criteria = $criteria->buildCriteria(); // build Criteria from Server object + } + + if ($criteria->containsKey(ServerTableMap::COL_ID) && $criteria->keyContainsValue(ServerTableMap::COL_ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.ServerTableMap::COL_ID.')'); + } + + + // Set the correct dbName + $query = ServerQuery::create()->mergeWith($criteria); + + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + return $con->transaction(function () use ($con, $query) { + return $query->doInsert($con); + }); + } + +} // ServerTableMap +// This is the static code needed to register the TableMap for this table with the main Propel class. +// +ServerTableMap::buildTableMap(); diff --git a/src/Model/Server.php b/src/Model/Server.php new file mode 100644 index 0000000..1887420 --- /dev/null +++ b/src/Model/Server.php @@ -0,0 +1,20 @@ +get('core'); + + $csrPath = tempnam(sys_get_temp_dir(), '0.'); + $pubPath = tempnam(sys_get_temp_dir(), '0.'); + + file_put_contents($pubPath, $publicKey); + + exec(escapeshellcmd($core->getBaseDir() . '/bin/create-csr') . ' ' . escapeshellarg($fqdn) . ' ' . escapeshellarg($csrPath) . ' ' . escapeshellarg($pubPath) . ' 2>&1', $output, $exitCode); + + if ($exitCode !== 0) { + throw new \Exception("Failed creating CSR: " . implode("\n", $output)); + } + + $csr = file_get_contents($csrPath); + + unlink($pubPath); + unlink($csrPath); + + return $csr; + } + + /** + * Signs a client certificate and returns the signed certificate + * @param string $publicKey + * @param string $fqdn + * @return string + * @throws \Exception + */ + public function signServerKey($publicKey, $fqdn) + { + $csr = $this->createCSRForKeyAndFqdn($publicKey, $fqdn); + + /** @var Core $core */ + $core = $this->get('core'); + + $csrPath = tempnam(sys_get_temp_dir(), '0.'); + $crtPath = tempnam(sys_get_temp_dir(), '0.'); + + file_put_contents($csrPath, $csr); + + exec(escapeshellcmd($core->getBaseDir() . '/bin/sign-server-csr') . ' ' . escapeshellarg($csrPath) . ' ' . escapeshellarg($crtPath) . ' 2>&1', $output, $exitCode); + + if ($exitCode !== 0) { + throw new \Exception("Failed signing CSR: " . implode("\n", $output)); + } + + $crt = file_get_contents($crtPath); + + unlink($crtPath); + unlink($csrPath); + + return $crt; + } + /** * @param string $csr * @throws \Exception @@ -70,4 +134,81 @@ class CA extends Main return $subject["CN"]; } + /** + * @param string $certificate + * @throws \Exception + */ + public function revoke($certificate) + { + /** @var Core $core */ + $core = $this->get('core'); + + $crtPath = tempnam(sys_get_temp_dir(), '0.'); + + file_put_contents($crtPath, $certificate); + + exec(escapeshellcmd($core->getBaseDir() . '/bin/revoke-cert') . ' ' . escapeshellarg($crtPath) . ' 2>&1', $output, $exitCode); + + if ($exitCode !== 0) { + throw new \Exception("Failed signing CSR: " . implode("\n", $output)); + } + + unlink($crtPath); + } + + /** + * @param string $pubKey + * @return string + * @throws \Exception + */ + public function getFingerprintFromPublicKey($pubKey) + { + /** @var Core $core */ + $core = $this->get('core'); + + $pubPath = tempnam(sys_get_temp_dir(), '0.'); + + file_put_contents($pubPath, $pubKey); + + exec(escapeshellcmd($core->getBaseDir() . '/bin/get-fingerprint') . ' ' . escapeshellarg($pubPath) . ' 2>&1', $output, $exitCode); + + if ($exitCode !== 0) { + throw new \Exception("Failed getting fingerprint from public key: " . implode("\n", $output)); + } + + unlink($pubPath); + + return $output[0]; + } + + public function verify($data, $signature, $publicKey) + { + $publicKeyResource = openssl_pkey_get_public($publicKey); + + $result = openssl_verify($data, $signature, $publicKeyResource); + + if ($result === 1) { + return true; + } else if ($result === 0) { + return false; + } + + throw new \Exception("Verify failed: " . $this->getOpenSslError()); + } + + public function signWithCA($data) { + /** @var Core $core */ + $core = $this->get('core'); + + $privateKeyPlain = file_get_contents($core->getBaseDir() . '/storage/ca/ca.key'); + $privateKey = openssl_get_privatekey($privateKeyPlain); + + $result = openssl_sign($data, $signature, $privateKey); + + if ($result) { + return $signature; + } + + throw new \Exception("Signing failed: " . $this->getOpenSslError()); + } } \ No newline at end of file diff --git a/src/Service/Server.php b/src/Service/Server.php new file mode 100644 index 0000000..b54c093 --- /dev/null +++ b/src/Service/Server.php @@ -0,0 +1,66 @@ +httpClient === null) { + $this->httpClient = new HttpClient(); + } + + return $this->httpClient; + } + + /** + * @param ServerModel $server + * @throws \Exception + */ + public function deliverSignedCertificate(ServerModel $server) { + $response = $this->doSignedRequest($server, '/deliver-crt', [ + 'certficate' => $server->getCertificate() + ]); + + if ($response->getStatusCode() !== 200) { + throw new \Exception('Delivering signed certificate failed (' . $response->getStatusCode() . '): ' . $response->getBody()->getContents()); + } + } + + /** + * @param ServerModel $server + * @param string $path + * @param string $data + * @return \Psr\Http\Message\ResponseInterface + * @throws \Exception + */ + public function doSignedRequest(ServerModel $server, $path, $data) { + $client = $this->getHttpClient(); + + /** @var CA $ca */ + $ca = $this->get('ca'); + + $data['signature'] = $ca->signWithCA($server->getFingerprint()); + + $json = json_encode($data); + + $pubKey = openssl_get_publickey($server->getPublicKey()); + + $success = openssl_public_encrypt($json, $crypted, $pubKey, OPENSSL_NO_PADDING); + + if (!$success) { + throw new \Exception('Encrypting data failed: ' . openssl_error_string() . openssl_error_string()); + } + + return $client->post('http://' . $server->getExternalIp() . ':' . static::MANAGEMENT_PORT . $path, [ + 'body' => $crypted + ]); + } +} \ No newline at end of file diff --git a/views/base.html.twig b/views/base.html.twig index 19fa952..d3953f1 100644 --- a/views/base.html.twig +++ b/views/base.html.twig @@ -10,6 +10,7 @@ {% block head %} + {% endblock %} diff --git a/views/panel.html.twig b/views/panel.html.twig index 329939a..bbe7ed0 100644 --- a/views/panel.html.twig +++ b/views/panel.html.twig @@ -1,48 +1,159 @@ {% extends "base.html.twig" %} +{% block head %} + {{ parent() }} + + +{% endblock %} + {% block content %}
-

Certificates

+

Certificates

+ + + + + + + + + {% for certificate in user.getCertificates() if certificate.getRevoked() == 0 %} - - - - + + + + + {% else %} + + + + {% endfor %} + +
SerialNameExpires on + Create new certificate +
SerialNameExpires on - Create new certificate - + {{ certificate.getSerial() }} + + {{ certificate.getName() }} + + {{ certificate.getExpiresOn().format('Y-m-d H:i:s') }} + +
+ + Download certificate +
+
+ You don't seem to have any certificates yet, want to + create one? +
+
+

Servers

+ + + + + + + + + + + + {% for server in servers %}\ + + + + + + + + {% else %} + + + + {% endfor %} + +
HostnameFingerprintLocationSpeedActions
+ {{ server.getFqdn() }} + + {{ server.getFingerprint() }} + + {{ server.getLocation() }} + + {{ server.getSpeed() }} MB/s + +
+ +
+
+ There don't seem to be any servers yet :( +
+ {% if user.getSuperuser() %} +

Registered servers

+ + + + + + + - {% for certificate in user.getCertificates() %} - - - - - - - {% else %} - - - - {% endfor %} + {% for server in registeredServers %} + + + + + + {% else %} + + + + {% endfor %}
HostnameFingerprintActions
- {{ certificate.getSerial() }} - - {{ certificate.getName() }} - - {{ certificate.getExpiresOn().format('Y-m-d H:i:s') }} - -
- - Download certificate -
-
- You don't seem to have any certificates yet, want to create one? -
+ {{ server.getFqdn() }} + + {{ server.getFingerprint() }} + +
+ Details +
+
+ There don't seem to be any servers yet :( +
+ {% endif %} +
+ {% endblock %} \ No newline at end of file diff --git a/views/panel/certificates/new.html.twig b/views/panel/certificates/new.html.twig index 65cbbb8..c164ae6 100644 --- a/views/panel/certificates/new.html.twig +++ b/views/panel/certificates/new.html.twig @@ -2,10 +2,11 @@ {% block head %} {{ parent() }} + - + {% endblock %} {% block content %} @@ -15,19 +16,40 @@

New Certificate

-
+
- -
+ +
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+
- +
diff --git a/views/panel/servers/edit.html.twig b/views/panel/servers/edit.html.twig new file mode 100644 index 0000000..941f891 --- /dev/null +++ b/views/panel/servers/edit.html.twig @@ -0,0 +1,94 @@ +{% extends "base.html.twig" %} + +{% block head %} + {{ parent() }} + + +{% endblock %} + +{% block content %} +
+
+
+
+

Editing server '{{ server.getFqdn() }}'

+
+
+
+ +
+ +
+
+
+ +
+ +
+
+

Details

+
+ +
+ +
+
+
+ +
+ +
+
+

Config

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+{% endblock %} \ No newline at end of file