blob: c430c2c979d35b956a82a7ffcc8aa3cda4b7b3df [file] [log] [blame]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
########################################################################
# OPENAPI-URI: /api/node/register
########################################################################
# post:
# requestBody:
# content:
# application/json:
# schema:
# $ref: '#/components/schemas/NodeCredentials'
# description: Node credentials
# required: true
# responses:
# '200':
# content:
# application/json:
# schema:
# $ref: '#/components/schemas/APIKeyResult'
# description: Node successfully registered with server
# default:
# content:
# application/json:
# schema:
# $ref: '#/components/schemas/Error'
# description: unexpected error
# summary: Registers a new node with the Warble server
#
########################################################################
"""
This is the node registration handler for Apache Warble
"""
import json
import re
import time
import plugins.crypto
import plugins.registry
import base64
def run(API, environ, indata, session):
method = environ['REQUEST_METHOD']
# Registering a new node?
if method == "POST":
hostname = indata['hostname']
pubkey_pem = indata['pubkey']
nodeversion = indata['version'] # TODO: Check for incompatibilities!
# Try loading the PEM
try:
pubkey = plugins.crypto.loads(pubkey_pem)
except:
raise API.exception(400, "Bad PEM payload passed from client!")
# Okay, we have what we need for now. Register potential node and gen an API key
node = plugins.registry.node(session)
node.hostname = hostname
node.pem = pubkey_pem
node.version = nodeversion
node.ip = environ.get('HTTP_X_FORWARDED_FOR', environ.get('REMOTE_ADDR', '0.0.0.0'))
# Encrypt API key with the pub key we just got. base64 encode the result
apikey_crypt = str(base64.b64encode(plugins.crypto.encrypt(pubkey, node.apikey)), 'ascii')
node.save()
yield json.dumps({"encrypted": True, "key": apikey_crypt}, indent = 2)
return
# Finally, if we hit a method we don't know, balk!
yield API.exception(400, "I don't know this request method!!")