Anatomy of a Horde login - Flow chart

I promised to look into generating a chart of the Horde login processes, and out came an activity diagram. I'm not perfectly happy with it yet, but it's being rendered automatically thanks to PlantUML and Graphwiz.

So here it is. I'm not sure if it really helps with understanding the process, but anyway.

Created with PlantUML.

And for reference, this is the source:

@startuml authentication.png

title Authentication in Horde
scale 0.7
skinparam activityArrowFontSize 10

partition login.php {
  "Start of login.php" --> "$registry->isAuthenticated()"
  --> if "$logout_reason?" then
    -left-> [true] "Log out"
    --> [false] ===RENDER_LOGIN===
  else
    --> [false] if "Login form submitted?" then
      --> [true] "$auth->authenticate()?"
    else
      --> [false] ===RENDER_LOGIN===
    endif
  endif

  "$auth->authenticate()?" --> if "" then
    -right-> [true] "Redirect to URL\nor initial page"
  else
    --> [false] "Display error message"
    --> ===RENDER_LOGIN===
  endif

  ===RENDER_LOGIN=== --> "Render login form"
  --> "End of login.php"
}

partition any.php {
  "Start of any.php" --> "Horde_Registry::appInit($app)"
  --> "End of any.php"
}

partition Horde_Registry {
  "$registry->isAuthenticated()" --> [$app = 'horde'] "isAuthenticated()"
  --> if "getAuth()?" then
    --> [true] if "$app == 'horde'?" then
      --> [true] "checkExistingAuth()"
    else
      --> [false] if "$app is authenticated?" then
        --> [true] "checkExistingAuth()"
      else
        --> [false] "Transparent authentication?"
      endif
    endif
  else
    --> [false] "Transparent authentication?"
  endif

  "Transparent authentication?" --> [true] "$auth->transparent()"

  "checkExistingAuth()" --> "Check IP"
  --> "Check browser"

  "Horde_Registry::appInit($app)" --> "pushApp()"
  --> if "$checkPerms?" then
    --> ===CHECKPERMS===
    --> [true] if "getAuth()?" then
      --> [true] "checkExistingAuth()"
    endif
  endif

  ===CHECKPERMS=== --> "hasPermission()"
  --> "isAuthenticated()"
}

partition Horde_Core_Auth_Application {
  "Check browser" --> "validateAuth()"
  --> if "$app == 'horde'?" then
    --> [true] "$base->validateAuth()"
  endif

  "$auth->transparent()" --> "transparent()"

  --> if "$userId = getCredential('userId')?" then
    --> [false] "$userId = $registry->getAuth()"
  endif

  --> if "$credentials = getCredential('credentials')?" then
    --> [false] "$credentials = $registry->getAuthCredential()"
  endif

  --> "list($userId, $credentials) =\n[preauthenticate/transparent hook]"
  --> "setCredential('userId', $userId)" as CRED1_CORE
  --> "setCredential('credentials', $credentials)" as CRED2_CORE

  --> if "$app == 'horde'?" then
    --> [true] "$result = $base->transparent()"
    --> ===RESULT===
  else
    --> [false] if "hasCapability('transparent')?" then
      --> [true] "$result = Application's authTransparent()"
      --> ===RESULT===
    else
      --> [false] "$result = Authenticated at Horde and\nno authentication for $app"
      --> ===RESULT===
    endif
  endif

  ===RESULT=== --> if "$result?" then
    --> [true] "_setAuth()"
    if "$registry->isAuthenticated()?" then
      --> [false] if "$registry->getAuth()?" then
        --> [false] "$registry->getCleanSession()"
        --> "$userId = $this->getCredential('userId')"
      endif
      --> "$credentials = $this->getCredential('credentials')"
      --> "list(,$credentials) =\n[postauthenticate hook]"
      --> "$registry->setAuth($userId, $credentials)"
  endif

  "$auth->authenticate()?" --> "authenticate()"
  --> "list($userId, $credentials) =\n[preauthenticate/authenticate hook]"
  --> "$base->authenticate()?"
  --> [true] "_setAuth()"

  "_authenticate()" as _AUTH_CORE --> "Application's authAuthenticate()"
}

partition Horde_Auth_Base {
  "$base->authenticate()?" --> "authenticate()" as AUTH_BASE
  --> "_credentials['userId'] = $userId"
  --> if "$app == 'horde'?" then
    --> [true] "_authenticate()" as _AUTH_BASE
    --> "Check authentication backend"
    --> "setCredential('userId', _credentials['userId'])" as CRED1_BASE
  else
    --> [false] _AUTH_CORE
    --> CRED1_BASE
  endif

  CRED1_BASE --> "setCredential('credentials', $credentials)" as CRED2_BASE

  "$base->validateAuth()" --> "validateAuth()" as VALIDATE_BASE

  "$result = $base->transparent()" --> "transparent()" as TRANSP_BASE
}

partition Horde_Registry {
  "$registry->setAuth($userId, $credentials)" --> "setAuth()"
  --> "authusername hook -> userId"
  --> "store credentials"
  --> "load preferences"
  --> "etc."
}

@enduml