First throw at autologin capabilities

master
Gina Häußge 2013-08-18 18:33:21 +02:00
parent 94b8d6601d
commit 54175d2146
5 changed files with 30 additions and 4 deletions

View File

@ -14,6 +14,7 @@ import os
import threading import threading
import logging, logging.config import logging, logging.config
import subprocess import subprocess
import netaddr
from octoprint.printer import Printer, getConnectionOptions from octoprint.printer import Printer, getConnectionOptions
from octoprint.settings import settings, valid_boolean_trues from octoprint.settings import settings, valid_boolean_trues
@ -64,8 +65,7 @@ class PrinterStateConnection(tornadio2.SocketConnection):
self._eventManager = eventManager self._eventManager = eventManager
def on_open(self, info): def on_open(self, info):
self._logger.info("New connection from client") self._logger.info("New connection from client: %s" % info.ip)
# Use of global here is smelly
self._printer.registerCallback(self) self._printer.registerCallback(self)
self._gcodeManager.registerCallback(self) self._gcodeManager.registerCallback(self)
@ -74,7 +74,6 @@ class PrinterStateConnection(tornadio2.SocketConnection):
def on_close(self): def on_close(self):
self._logger.info("Closed client connection") self._logger.info("Closed client connection")
# Use of global here is smelly
self._printer.unregisterCallback(self) self._printer.unregisterCallback(self)
self._gcodeManager.unregisterCallback(self) self._gcodeManager.unregisterCallback(self)
@ -857,6 +856,22 @@ def login():
if user is not None and not user.is_anonymous(): if user is not None and not user.is_anonymous():
identity_changed.send(current_app._get_current_object(), identity=Identity(user.get_id())) identity_changed.send(current_app._get_current_object(), identity=Identity(user.get_id()))
return jsonify(user.asDict()) return jsonify(user.asDict())
elif settings().getBoolean(["accessControl", "autologinLocal"]) \
and settings().get(["accessControl", "autologinAs"]) is not None \
and settings().get(["accessControl", "localNetwork"]) is not None:
autologinAs = settings().get(["accessControl", "autologinAs"])
localNetwork = settings().get(["accessControl", "localNetwork"])
try:
remoteAddr = util.getRemoteAddress(request)
if netaddr.IPAddress(remoteAddr) in netaddr.IPNetwork(localNetwork):
user = userManager.findUser(autologinAs)
if user is not None:
login_user(user)
identity_changed.send(current_app._get_current_object(), identity=Identity(user.get_id()))
return jsonify(user.asDict())
except:
logger = logging.getLogger(__name__)
logger.exception("Could not autologin user %s for network %s" % (autologinAs, localNetwork))
return jsonify(SUCCESS) return jsonify(SUCCESS)
@app.route(BASEURL + "logout", methods=["POST"]) @app.route(BASEURL + "logout", methods=["POST"])

View File

@ -88,7 +88,10 @@ default_settings = {
"accessControl": { "accessControl": {
"enabled": True, "enabled": True,
"userManager": "octoprint.users.FilebasedUserManager", "userManager": "octoprint.users.FilebasedUserManager",
"userfile": None "userfile": None,
"autologinLocal": False,
"localNetwork": "127.0.0.1",
"autologinAs": None
}, },
"events": { "events": {
"systemCommandTrigger": { "systemCommandTrigger": {

View File

@ -104,3 +104,9 @@ def getFreeBytes(path):
st = os.statvfs(path) st = os.statvfs(path)
return st.f_bavail * st.f_frsize return st.f_bavail * st.f_frsize
def getRemoteAddress(request):
forwardedFor = request.headers.get("X-Forwarded-For", None)
if forwardedFor is not None:
return forwardedFor.split(",")[0]
return request.remote_addr

View File

@ -5,3 +5,4 @@ tornadio2==0.0.4
PyYAML==3.10 PyYAML==3.10
Flask-Login==0.2.2 Flask-Login==0.2.2
Flask-Principal==0.3.5 Flask-Principal==0.3.5
netaddr>=0.7.10

View File

@ -7,3 +7,4 @@ Flask-Login==0.2.2
Flask-Principal==0.3.5 Flask-Principal==0.3.5
numpy>=1.6.2 numpy>=1.6.2
pyserial>=2.6 pyserial>=2.6
netaddr>=0.7.10