You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cocoon.apache.org by H....@MI.unimaas.nl on 2004/05/13 16:13:58 UTC

RE: Problem with losing session context 'authentication' - lookin g fo r workaround or bugfix

Hi Antonio,

I'll answer all questions here, and add the relevant code below (since it's
an enormous lot of code). The "getObject()" function is something I get from
my backend. It goes too far to explain it or to add the code (also a lot).
I'll add the relevant part of the sitemap and the javascript files, although
the login part is an almost exact copy of the "authentication with flow"
sample in Cocoon.

[1] = sitemap
[2] = login.js
[3] = pids.js (my "use cases")
[4] = authentication.xml (getuser)

Several problems occur at once:
1. when the authentication context in the session is lost, the
SessionTransformer throws an Exception. Since my error page includes a
"cinclude:include src='cocoon:/getUser'" I cannot properly display the
error. 

2. If I go from one function to the next (e.g. from 'internal_addPerson' to
'prot_showDetails') I loose the session context (it references the internal
pipeline). If I go "public" (i.e. through the protect() function) it works.

Hope you have a clue. Thanks for bearing with me.

Bye, Helma

[1] sitemap
<?xml version="1.0" encoding="UTF-8"?>
<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
	<map:components>
        <map:transformers default="xalan">
            <map:transformer name="i18n" 
                src="org.apache.cocoon.transformation.I18nTransformer">
                <catalogues default="other">
                    <catalogue id="other" name="OtherMessages" 
                        location="messages"/>
                    <catalogue id="forms" name="FormsMessages" 
                        location="messages"/>
                </catalogues>
                <cache-at-startup>true</cache-at-startup>
            </map:transformer>
        </map:transformers>
		<map:selectors default="browser">
			<map:selector name="request-method"
src="org.apache.cocoon.selection.RequestMethodSelector"/>
		</map:selectors>
		<map:pipes default="caching"/>
	</map:components>
	<map:resources>
		<!-- ========================================= -->
		<!-- html-layout - handles the conversion to html -->
		<!-- ========================================= -->
		<map:resource name="html-layout">
			<map:transform src="stylesheets/layout.xslt">
				<map:parameter name="hostname"
value="http://{request:serverName}:{request:serverPort}/properweb/"/>
				<map:parameter name="use-request-parameters"
value="true"/>
				<map:parameter name="sessionid"
value="{session:./id}"/>
				<map:parameter name="sessionNew"
value="{session:new}"/>
			</map:transform>
			<map:serialize type="html"/>
		</map:resource>
	</map:resources>
	<!-- ========================================= -->
	<!-- flow scripts                              -->
	<!-- ========================================= -->
	<map:flow language="javascript">
		<map:script src="system/scripts/login.js"/>
		<map:script src="system/scripts/flowscripts.js"/>
		<!-- map:script src="system/scripts/test.js"/ -->
		<map:script src="system/scripts/pids.js"/>
	</map:flow>
	<map:pipelines>
		<!-- ========================================= -->
		<!-- flowAuthenticationHandler configuration   -->
		<!-- ========================================= -->
		<map:component-configurations>
			<authentication-manager>
				<handlers>
					<handler
name="flowAuthenticationHandler">
						<!-- redirect-to
uri="cocoon:/login"/>  -->
						<!-- above should work, but
doesn't because of bug in Cocoon 2.1.4-dev (prerelease), haven't checked
since release -->
						<redirect-to
uri="/properweb/login"/>
						<authentication
uri="cocoon:raw:/authenticate"/>
					</handler>
				</handlers>
			</authentication-manager>
		</map:component-configurations>
        <map:pipeline>
            <!-- ========================================= -->
            <!-- flow script continuations                 -->
            <!-- ========================================= -->
            <map:match pattern="**/*.continue">
                <map:call continuation="{2}"/>
            </map:match>
            <map:match pattern="*.continue">
                <map:call continuation="{1}"/>
            </map:match>
            <!-- ========================================= -->
            <!-- about - information about the             -->
            <!-- PropeR project and credits                -->
            <!-- ========================================= -->
            <map:match pattern="about.html">
				<map:call function="isLoggedIn">
					<map:parameter name="handler"
value="flowAuthenticationHandler"/>
					<map:parameter
name="protected-redirect" value="general/about.form"/>
					<map:parameter
name="failure-redirect" value="about"/>
				</map:call>
            </map:match>
            <map:match pattern="about">
                <map:generate src="content/about.xml"/>
                <map:call resource="html-layout"/>
            </map:match>
            <!-- ========================================= -->
            <!-- news - news about the PropeR project      -->
            <!-- ========================================= -->
            <map:match pattern="news.html">
				<map:call function="isLoggedIn">
					<map:parameter name="handler"
value="flowAuthenticationHandler"/>
					<map:parameter
name="protected-redirect" value="general/news.form"/>
					<map:parameter
name="failure-redirect" value="news"/>
				</map:call>
			</map:match>
			<map:match pattern="news">	
                <map:generate src="content/news.xml"/>
                <map:call resource="html-layout"/>
            </map:match>
		<map:pipeline>
			<!-- ========================================= -->
			<!--  main pipeline for person related pages   -->
			<!-- ========================================= -->
			<map:match pattern="person/**">
				<map:call function="protect">
					<map:parameter name="handler"
value="flowAuthenticationHandler"/>
					<map:parameter
name="protected-internal" value="internal/person/{1}"/>
					<map:parameter
name="failure-redirect" value="login"/>
					<map:parameter name="failure-error"
value="Eerst inloggen"/>
				</map:call>
			</map:match>
			<!-- ========================================= -->
			<!--  main pipeline for general pages          -->
			<!-- ========================================= -->
			<map:match pattern="general/**">
				<map:call function="protect">
					<map:parameter name="handler"
value="flowAuthenticationHandler"/>
					<map:parameter
name="protected-internal" value="internal/{1}"/>
					<map:parameter
name="failure-redirect" value="login"/>
					<map:parameter name="failure-error"
value="Eerst inloggen"/>
				</map:call>
			</map:match>
		</map:pipeline>
		<!-- ========================================= -->
		<!-- pipeline handling the content of the      -->
		<!-- person related pages                      -->
		<!-- ========================================= -->
		<map:pipeline internal-only="true">
			<map:match pattern="internal/showError.form">
			    <map:generate type="jx"
src="content/showError.jx">
			        <map:parameter name="errMsg"
value="{session:errMsg}"/>
			    </map:generate>
		        <map:transform type="cinclude"/>
				<map:call resource="html-layout"/>
				<map:serialize type="xml"/>
			</map:match>
			<!-- ========================================= -->
			<!-- internal pipelines for person related     -->
			<!-- forms                                     -->
			<!-- ========================================= -->
			<map:match pattern="internal/person/**">
				<map:match pattern="**/person/*.form">
                    <map:generate type="jx" src="content/{2}Template.jx"/>
			        <map:transform type="cinclude"/>
					<map:transform type="forms"/>
					<map:transform
src="stylesheets/resources/forms-samples-styling.xsl">
						<map:parameter name="uri"
value="stylesheets/resources"/>
					</map:transform>
 					<map:call resource="html-layout"/>
					<map:serialize type="xml"/>
				</map:match>
				<!--
========================================= -->
				<!-- internal pipelines for person related
-->
				<!-- flow script forms
-->
				<!-- match anything that calls a script with
-->
				<!-- a fixed ending, e.g. .exec
-->
				<!-- in case you forget: all functions are
in  -->
				<!-- system/flow/flowscripts.js
-->
				<!--
========================================= -->
                <map:match pattern="**/person/**.html">
                    <!-- ========================================= -->
                    <!-- show all                                  -->
                    <!-- NOTE: it could be more efficient using    -->
                    <!-- more wildcard matching, but then invalid  -->
                    <!-- urls will be accepted too!                -->
                    <!-- ========================================= -->
                    <map:match pattern="**/show/*.html">
                        <map:match pattern="**/patients.html">
                            <map:call function="prot_showAllPatients"/>
                        </map:match>
                        <map:match pattern="**/practitioners.html">
                            <map:call function="prot_showAllProviders"/>
                        </map:match>
                        <map:match pattern="**/team.html">
                            <map:call function="prot_showTeam"/>
                        </map:match>
                        <map:match pattern="**/result.html">
                        	<map:call function="prot_showResult"/>
                        </map:match>
                    </map:match>
                    <!-- ========================================= -->
                    <!-- show details                              -->
                    <!-- ========================================= -->
                    <map:match pattern="**/showDetails/*.html">
                        <map:match pattern="**/patient*.html">
                            <map:call function="prot_showDetails">
                                <map:parameter name="key" value="patient"/>
                                <map:parameter name="id"
value="{request-param:findId}"/>
                            </map:call>
                        </map:match>
                        <map:match pattern="**/practitioner*.html">
                            <map:call function="prot_showDetails">
                                <map:parameter name="key" value="provider"/>
                                <map:parameter name="id"
value="{request-param:findId}"/>
                            </map:call>
                        </map:match>
                    </map:match>
                    <!-- ========================================= -->
                    <!-- edit                                      -->
                    <!-- ========================================= -->
                    <map:match pattern="**/edit/*.html">
                        <map:match pattern="**/patient.html">
                            <map:call function="prot_editPatient">
                                <map:parameter value="patientid"
name="{request-param:findId}"/>
                            </map:call>
                        </map:match>
                        <map:match pattern="**/practitioner.html">
                            <map:call function="prot_editProvider">
                                <map:parameter value="id"
name="{request-param:findId}"/>
                                <map:parameter value="globalvar"
name="{global:properweb}"/>
                            </map:call>
                        </map:match>
                        <map:match pattern="**/team.html">
                            <map:call function="prot_modifyTeam"/>
                        </map:match>
                    </map:match>
                    <!-- ========================================= -->
                    <!-- add                                       -->
                    <!-- ========================================= -->
                    <map:match pattern="**/add/*.html">
                        <map:match pattern="**/patient.html">
                            <map:call function="prot_addPatient"/>
                        </map:match>
                        <map:match pattern="**/practitioner.html">
                            <map:call function="prot_addProvider"/>
                        </map:match>
                    </map:match>
                    <!-- ========================================= -->
                    <!-- search                                    -->
                    <!-- ========================================= -->
                    <map:match pattern="**/search/*.html">
                        <map:match pattern="**/patient.html">
                            <map:call function="prot_searchPatient"/>
                        </map:match>
                        <map:match pattern="**/practitioner.html">
                            <map:call function="prot_searchProvider"/>
                        </map:match>
                    </map:match>
                    <!-- ========================================= -->
                    <!-- select                                    -->
                    <!-- ========================================= -->
                    <map:match pattern="**/select/*.html">
                        <map:match pattern="**/patient.html">
                            <map:call function="prot_selectPatient"/>
                        </map:match>
                        <map:match pattern="**/practitioner.html">
                            <map:call function="prot_selectProvider"/>
                        </map:match>
                    </map:match>
                </map:match>
			</map:match>
			<!-- ========================================= -->
			<!-- getSelectedPatientInNavbar                -->
			<!-- ========================================= -->
			<map:match pattern="getSelectedPatientInNavbar">
                <map:generate type="jx"
src="content/showPatientInNavbar.jx"/>				
				<map:serialize type="xml"/>
			</map:match>
		<!-- ========================================= -->
		<!-- generate list of forms based on xml       -->
		<!-- files in directory                        -->
		<!-- ========================================= -->
			<map:match pattern="formlist">
				<map:generate type="xpathdirectory"
src="content/xmlforms" label="debug1">
					<map:parameter name="xpath"
value="/form/label | /form/code"/>
					<map:parameter name="include"
value=".*\.xml$"/>
					<map:parameter name="exclude"
value="elements.xml"/>
					<map:parameter name="sort"
value="//label"/>
				</map:generate>
				<map:transform
src="stylesheets/formlist.xslt"/>
				<map:serialize type="xml"/>
			</map:match>
		</map:pipeline>
		<!-- ========================================= -->
		<!-- Authentication pipelines                  -->
		<!-- ========================================= -->
		<map:pipeline>
			<!-- ========================================= -->
			<!-- Redirections for page requests on homepage -->
			<!-- ========================================= -->
			<map:match pattern="">
				<map:redirect-to session="true"
uri="login"/>
			</map:match>
			<map:match pattern="/">
				<map:redirect-to session="true"
uri="login"/>
			</map:match>
			<map:match pattern="*.html">
				<map:redirect-to session="true"
uri="login"/>
			</map:match>
			<!-- ========================================= -->
			<!-- Login page                                -->
			<!-- ========================================= -->
			<map:match pattern="login">
				<map:call function="isLoggedIn">
					<map:parameter name="handler"
value="flowAuthenticationHandler"/>
					<map:parameter
name="protected-redirect" value="person/search/patient.html"/>
					<map:parameter
name="failure-internal" value="internal/login"/>
				</map:call>
			</map:match>
			<!-- ========================================= -->
			<!-- Form target which performs auth service   -->
			<!-- ========================================= -->
			<map:match pattern="do-login">
				<!-- try to login -->
				<map:call function="login">
					<map:parameter name="handler"
value="flowAuthenticationHandler"/>
					<map:parameter name="parameter_name"
value="{request-param:username}"/>
					<map:parameter
name="parameter_password" value="{request-param:password}"/>
					<map:parameter
name="protected-redirect" value="{request-param:resource}"/>
					<map:parameter
name="failure-redirect" value="login"/>
					<map:parameter name="failure-error"
value="Verkeerde login"/>
				</map:call>
			</map:match>
			<!-- ========================================= -->
			<!-- Logout link which invalidates the session -->
			<!-- ========================================= -->
			<map:match pattern="do-logout">
				<map:call function="logout">
					<map:parameter name="handler"
value="flowAuthenticationHandler"/>
					<map:parameter
name="failure-redirect" value="login"/>
					<map:parameter name="failure-error"
value=""/>
				</map:call>
			</map:match>
		</map:pipeline>
		<map:pipeline internal-only="true">
			<!-- ========================================= -->
			<!-- This is the authentication resource       -->
			<!-- ========================================= -->
			<map:match pattern="authenticate">
				<map:generate
src="system/authenticate/userlist.xml"/>
				<map:transform
src="system/authenticate/authenticate.xslt">
					<map:parameter
name="use-request-parameters" value="true"/>
				</map:transform>
				<map:serialize type="xml"/>
			</map:match>
			<!-- ========================================= -->
			<!-- getUser                                   -->
			<!-- put user info in an XML file              -->
			<!-- ========================================= -->
			<map:match pattern="getUser">
				<map:generate
src="system/authentication.xml"/>
				<map:transform type="session"/>
				<map:serialize type="xml"/>
			</map:match>
			<!-- ========================================= -->
			<!-- handle the actual login                   -->
			<!-- ========================================= -->
            <map:match pattern="internal/login">
				<map:generate src="content/main.jx"
type="jx"/>
				<map:transform type="encodeURL"/>
				<map:call resource="html-layout"/>
			</map:match>
		</map:pipeline>
	</map:pipelines>
</map:sitemap>
<!-- end of file -->

[2] login.js
cocoon.load("resource://org/apache/cocoon/webapps/authentication/flow/javasc
ript/auth.js");

function isLoggedIn() {
  var handler = cocoon.parameters["handler"];
  var resource = cocoon.parameters["resource"];

  // resource contains the URL where the request came from, so you can
redirect to there

  if (auth_isAuthenticated(handler, resource)) {   <---- neither redirection
work
  	if (resource != undefined) {                     |
		cocoon.sendPage(resource);             <---+
  	}
  	else {  		
    	success();
  	}
  } else {
    failure();
  }
}

function protect() {
  var handler = cocoon.parameters["handler"];

  if (auth_checkAuthentication(handler,"")) {
    success();
  } else {
    // already redirected by auth_checkAuthentication
  }
}

function login() {
  var handler = cocoon.parameters["handler"];

  if (auth_isAuthenticated(handler)) {
    success();
  } else if (auth_login(handler, null, cocoon.parameters)) {
    success();
  } else {
    failure();
  }
}

function logout() {
  var handler = cocoon.parameters["handler"];

  auth_logout(handler);
  failure();
}

function success() {
  var internal = cocoon.parameters["protected-internal"];
  var redirect = cocoon.parameters["protected-redirect"];

  if (internal != null) {
  	print("authentication success, redirecting to " + internal);
   	cocoon.sendPage(internal);
  } else if (redirect != null) {
	print("authentication success, redirecting to " + redirect);
  	cocoon.redirectTo(redirect);
  } else {
 		throw new Error("No protected redirection parameter given");
  }
}

function failure() {

  var internal = cocoon.parameters["failure-internal"];
  var redirect = cocoon.parameters["failure-redirect"];
  var errMessage = cocoon.parameters["failure-error"];

  if (internal != null) {
  	print("authentication failure, redirecting to " + internal);
    cocoon.sendPage(internal, {errMsg : errMessage});
  } else if (redirect != null) {
  	print("authentication failure, redirecting to " + redirect);
    cocoon.redirectTo(redirect);
  } else {
    // Why does this throw cause an error?
    throw new Error("No failure redirection parameter given");
  }
}

[3] pids.js

/*
 * File pids.js
 *
 * This script contains use cases dealing with the PIDS servers
 */
 
cocoon.load("resource://org/apache/cocoon/forms/flow/javascript/v3/Form.js")
;

var PATIENT_SERVER = "patient";
var PROVIDER_SERVER = "provider";
var SORT_LAST_NAME = "name/last";
var SORT_FIRST_NAME = "name/first";

var PATIENT_FORMDEF = "content/patientDef.xml";
var PROVIDER_FORMDEF = "content/providerDef.xml";
var PERSON_FORMBIND = "content/personBind.xml";
var SEARCH_PERSON_FORMDEF = "content/searchPersonDef.xml";
var SEARCH_PERSON_FORMBIND = "content/searchPersonBind.xml";

var ADD_EDIT_PERSON_FORM_DISPLAY = "internal/person/person.form";
var ALL_PERSONS_FORM_DISPLAY = "internal/person/showAll.form";
var DETAILS_FORM_DISPLAY = "internal/person/showDetails.form";
var ERROR_FORM_DISPLAY = "general/showError.form";
var SEARCH_PERSON_FORM_DISPLAY = "internal/person/searchPatient.form";
var SEARCH_RESULT_FORM_DISPLAY = "internal/person/showResult.form";
var TEAM_FORM_DISPLAY = "internal/person/showTeam.form";

var SHOW_RESULT = "person/show/result.html";
var SHOW_DETAILS_PATIENT = "person/showDetails/patient.html";
var SHOW_DETAILS_PRACTITIONER = "person/showDetails/practitioner.html";

function prot_showAllPatients() {
   var serverKey = PATIENT_SERVER;
   var sort1 = SORT_LAST_NAME;
   var sort2 = SORT_FIRST_NAME;
   internal_showAllPersons(serverKey, sort1, sort2);
} // showAllPatients

function prot_showAllProviders(sort1, sort2) {
   var serverKey = PROVIDER_SERVER;
   if(sort1 == undefined) sort1 = SORT_LAST_NAME;
   if(sort2 == undefined) {
      if(sort1 == SORT_LAST_NAME) {
         sort2 = SORT_FIRST_NAME;
      }
      else {
         sort2 = SORT_LAST_NAME;
      }
   }
   internal_showAllPersons(serverKey, sort1, sort2);
} // showAllPractitioners

function prot_searchPatient() {
   	var serverKey = PATIENT_SERVER;
   	var pidsHelper =
cocoon.getComponent(Packages.nl.unimaas.mi.proper.cocoon.PIDSHelper.ROLE);
   	var searchPerson = pidsHelper.getNewPerson();
   	
   	var form = new Form(SEARCH_PERSON_FORMDEF);
   	form.createBinding(SEARCH_PERSON_FORMBIND);
   	var success = false;
   	var errMsg = "";
   	var count = 0; 	// to prevent endless loops
   	while(!success && count < 10) {
    	try {
        	form.load(searchPerson);
         	var viewData = { errMsg : errMsg };
         	form.showForm(SEARCH_PERSON_FORM_DISPLAY, viewData);
         	form.save(searchPerson);
         	// list = list of fully qualified IDS (strings)
         	var list = pidsHelper.findPersons(serverKey, searchPerson);
			success = true;
      	}
      	catch(error) {
        	errMsg = "Er is een fout opgetreden: " + error;
         	print(errMsg);
         	success = false;
      	}
      	count++;
   	}
   	cocoon.releaseComponent(pidsHelper);
   	if(success) {
	   	internal_prepareResult(list, serverKey);
   	}
   	else {
   		internal_showErrorPage(errMsg);
   	}
} // searchPatient

function prot_addPatient() {
   var serverKey = PATIENT_SERVER;
   internal_addPerson(serverKey);
} // addPatient

function prot_addProvider() {
   var serverKey = PROVIDER_SERVER;
   internal_addPerson(serverKey);
} // addProvider

function prot_editPatient() {
   // TODO make sure it works properly when the function is ended by the
user before it is finished
   // to avoid memory leaks of unreleased objects floating around.
   var serverKey = PATIENT_SERVER;
   var patientid = cocoon.request.getParameter("findId");
   if(patientid == null || patientid == undefined) {
       var errMsg = "onbekend id, het is niet duidelijk welke patient
gezocht moet worden";
       internal_showErrorPage(errMsg);
   }
   if(patientid != undefined && patientid != null) {
      internal_editPerson(serverKey, patientid);
   }
} // editPatient

function prot_editProvider(id) {
   // TODO make sure it works properly when the function is ended by the
user before it is finished
   // to avoid memory leaks of unreleased objects floating around.
   var serverKey = PROVIDER_SERVER;
   if(id == undefined) {
	   id = cocoon.request.getParameter("findId");
       if(id == null || id == undefined) {
           var errMsg = "onbekend id, het is niet duidelijk welke
zorgverlener gezocht moet worden";
           internal_showErrorPage(errMsg);
       }
   }
   if(id != undefined) {
      internal_editPerson(serverKey, id);
   }
} // editProvider

function prot_showDetails(key, id, person) {
	if(key == undefined) {
         key = cocoon.request.getParameter("key");
         if(key == null || key == undefined) {
            var errMsg = "onbekende server, het is niet duidelijk waar
gezocht moet worden";
            internal_showErrorPage(errMsg);
         }
	}
	if (person == undefined) {
		if(id == undefined) {
    		id = cocoon.request.getParameter("id");
      		if(id == null || id == undefined) {
         		var errMsg = "onbekend id, het is niet duidelijk
welke persoon gezocht moet worden";
         		internal_showErrorPage(errMsg);
      		}
   		}
   		var pidsHelper =
cocoon.getComponent(Packages.nl.unimaas.mi.proper.cocoon.PIDSHelper.ROLE);
   		person = pidsHelper.findIdentity(key, id);
   		cocoon.releaseComponent(pidsHelper);
	}
   	var viewData = {
      person : person, src : key
   	};
   	cocoon.sendPage(DETAILS_FORM_DISPLAY, viewData);
} // showDetails

function prot_showResult() {
	var list = cocoon.session.getAttribute("personsFound");
	var key = cocoon.session.getAttribute("key");

      var pidsHelper =
cocoon.getComponent(Packages.nl.unimaas.mi.proper.cocoon.PIDSHelper.ROLE);
	var persons = new Packages.java.util.Vector();
	
	for (var i = 0; i < list.size(); i++) {
		var id = list.get(i);
		var person = pidsHelper.findIdentity(key, id);
		persons.add(person);
	}
	cocoon.session.removeAttribute("key");
	cocoon.session.removeAttribute("personsFound");
	
      cocoon.releaseComponent(pidsHelper);

	var size = persons.size();
	var viewData = {
    	  list : persons, nr : size, src : key
	};
	
	cocoon.sendPage(SEARCH_RESULT_FORM_DISPLAY, viewData);
}

function prot_selectPatient() {
	// add the selected person to the session
	var id = cocoon.request.getParameter("findId");
	var key = PATIENT_SERVER;
      var pidsHelper =
cocoon.getComponent(Packages.nl.unimaas.mi.proper.cocoon.PIDSHelper.ROLE);
	var person = pidsHelper.findIdentity(key, id);
      cocoon.releaseComponent(pidsHelper);
	
	cocoon.session.setAttribute("selectedPatient", person);
	prot_showDetails(key, id, person);
} // prot_selectPatient

function prot_showTeam() {
	var pidsHelper =
cocoon.getComponent(Packages.nl.unimaas.mi.proper.cocoon.PIDSHelper.ROLE);
	var session = cocoon.session;
	var person = session.getAttribute("selectedPatient");
	
	var patientid = person.getFullID();
	var serverKey = PROVIDER_SERVER;
	var persons = pidsHelper.findTeam(patientid);
	
   	var size = persons.size();
   	var viewData = {
    	list : persons, src : serverKey
   	};
	cocoon.releaseComponent(pidsHelper);
   	cocoon.sendPage(TEAM_FORM_DISPLAY, viewData);
} // showTeam

function prot_modifyTeam() {
   var errMsg = "Not yet implemented!";
   internal_showErrorPage(errMsg);
} // modifyTeam

function internal_showAllPersons(serverKey, sort1, sort2) {
	var pidsHelper =
cocoon.getComponent(Packages.nl.unimaas.mi.proper.cocoon.PIDSHelper.ROLE);
   	var persons = pidsHelper.getAllPersons(serverKey, sort1, sort2);
   	var size = persons.size();
   	var viewData = {
    	list : persons, src : serverKey
   	};
	cocoon.releaseComponent(pidsHelper);
   	cocoon.sendPage(ALL_PERSONS_FORM_DISPLAY, viewData);
} // showAllPersons

function internal_addPerson(serverKey) {
	// TODO make sure it works properly when the function is ended by
the user before it is finished
   	// to avoid memory leaks of unreleased objects floating around.
   	var pidsHelper =
cocoon.getComponent(Packages.nl.unimaas.mi.proper.cocoon.PIDSHelper.ROLE);
   	var person = pidsHelper.getNewPerson();
   	
   	// set the country of the address default to Nederland
 
person.getTraits().get("address").getValues().get("country").setValue("Neder
land");

	if (serverKey == PATIENT_SERVER) {   	
	   	var form = new Form(PATIENT_FORMDEF);
	}
	else {
	   	var form = new Form(PROVIDER_FORMDEF);
	}
   	form.createBinding(PERSON_FORMBIND);
   	var success = false;
   	var errMsg = "";
   	var count = 0; 	// to prevent endless loops
   	while(!success && count < 10) {
    	try {
        	form.load(person);
        	print("going to display the input form");
         	var viewData = { errMsg : errMsg, src : serverKey, action :
"add" };
         	form.showForm(ADD_EDIT_PERSON_FORM_DISPLAY, viewData);
         	print("about to save the info");
         	form.save(person);
         	var ids = pidsHelper.storeNewPerson(serverKey, person);
         	var id = ids[0];
         	for (var i in ids) {
         		print("ids found: " + i);
         	}
         	success = true;
      	}
      	catch(error) {
           	errMsg = "other error: " + error;
           	print(errMsg);
           	success = false;
      	}
      	count++;
   	}
   	cocoon.releaseComponent(pidsHelper);

	internal_prepareShowDetails(success, serverKey, id);
} // addPerson

function internal_editPerson(serverKey, id) {
	var pidsHelper =
cocoon.getComponent(Packages.nl.unimaas.mi.proper.cocoon.PIDSHelper.ROLE);
   	var person = pidsHelper.findIdentity(serverKey, id);

	if (serverKey == PATIENT_SERVER) {   	
	   	var form = new Form(PATIENT_FORMDEF);
	}
	else {
	   	var form = new Form(PROVIDER_FORMDEF);
	}
   	
   	form.createBinding(PERSON_FORMBIND);
   	var success = false;
   	var errMsg = "";
   	var count = 0; 	// to prevent endless loops

   	while(!success && count < 10) {
    	try {
        	form.load(person);
         	var viewData = { errMsg : errMsg, src : serverKey, action :
"edit" };
         	form.showForm(ADD_EDIT_PERSON_FORM_DISPLAY, viewData);
         	form.save(person);
         	success = pidsHelper.updatePerson(serverKey, person);
      	}
      	catch(error) {
        	errMsg = "Er is een fout opgetreden: " + error;
         	print(errMsg);
         	success = false;
      	}
      	count++;
   	}
   	cocoon.releaseComponent(pidsHelper);
   	
	internal_prepareShowDetails(success, serverKey, id);
} // editPerson

function internal_prepareResult(list, key) {
	var size = list.size();
	var viewData = {
    	  list : list, nr : size
	};
	cocoon.session.setAttribute("personsFound", list);
	cocoon.session.setAttribute("key", key);
	cocoon.sendPage(SHOW_RESULT);
} // showResult

function internal_prepareShowDetails(success, serverKey, id) {
   	if(success) {
   		if (serverKey == PATIENT_SERVER) {
   			var url = SHOW_DETAILS_PATIENT + "?findId=" + id;
   		}
   		else {
   			var url = SHOW_DETAILS_PRACTITIONER + "?findId=" +
id;
   		}
   		print("sending to: " + url);
		cocoon.sendPage(url);
   	}
   	else {
   		internal_showErrorPage(errMsg);
   	}
} //showDetails

function internal_showErrorPage(error) {
   cocoon.session.setAttribute("errMsg", error);
   cocoon.redirectTo(ERROR_FORM_DISPLAY);
} // showErrorPage

[4] authentication.xml
<?xml version="1.0" encoding="UTF-8"?>
<authentication xmlns:session="http://apache.org/cocoon/session/1.0" 
>
<session:getxml context="authentication" path="/"/>
</authentication>


> -----Original Message-----
> From: Antonio Gallardo [mailto:agallardo@agssa.net] 
> Sent: Thursday, 13 May 2004 15:21
> To: users@cocoon.apache.org
> Subject: RE: Problem with losing session context 
> 'authentication' - looking fo r workaround or bugfix
> 
> 
> Hi Helma:
> 
> 
> 
> H.vanderLinden@MI.unimaas.nl dijo:
> >> > Setup:
> >> > - default Cocoon root sitemap with automounted subsitemap of my 
> >> > app.
> 
> Hmm. Maybe here is the problem. Can you provide the 
> sitemap.xmap of configured auth-fw?
> 
> >> > - authentication-fw setup like the sample with the
> >> flowscripts (auth.js).
> >> > Works.
> >> > - all "public" urls go through the "protect" function to
> >> their "internal"
> >> > counterpart.
> >> > - all internal/*.html urls go to an appropriate 
> javascript function
> >> > - all internal/*.form urls generate a form:
> >> >
> >> > <map:match pattern="**/internal/*.form">
> >> >     <map:generate type="jx" src="content/{2}Template.jx"/>
> >> >     <map:transform type="cinclude"/>
> >> >     <map:transform type="forms"/>
> >> >     <map:transform
> >> src="stylesheets/resources/forms-samples-styling.xsl">
> >> > 	  <map:parameter name="uri" value="stylesheets/resources"/>
> >> >     </map:transform>
> >> >     <map:call resource="html-layout"/>
> >> >     <map:serialize type="xml"/>
> >> > </map:match>
> >> >
> >> > - one of the cincludes is getUser:
> >> > <map:match pattern="getUser">
> >> > 	<map:generate src="system/authentication.xml"/>
> >> > 	<!-- this is <session:getxml context="authentication"
> >> path="/"/> -->
> >> > 	<map:transform type="session"/>
> >> > 	<map:serialize type="xml"/>
> >> > </map:match>
> 
> I will try to find/debug the problem in the above match too.
> 
> >> > Function doSomething() {
> >> >  var obj = getObject();
> >> >  form.load(obj);
> >> >  form.showForm("internal/someForm.form");
> >> >  form.save(obj);
> >> >  storeObject(obj);
> >> cocoon.sendPage("internal/anotherForm.html"); <--
> >> > ERROR!! }
> 
> What kind of Object the getObject() retrieve? It is related 
> to sessions?
> 
> >> > The last line throws an exception which boils down to 
> "cannot find 
> >> > 'authetication' context". I'm fairly sure the exception 
> originates 
> >> > from the sessionTransformer.
> 
> It could be. I think we need to review it.
> 
> >> > I have to rewrite it to 
> cocoon.sendPage("public/anotherForm.html").
> >> >
> >> > This works in simple cases, but when I add bizData they 
> get lost in 
> >> > the process. I.e.:
> 
> It is weird.
> 
> >> >
> >> > Function doSomething() {
> >> >  var obj = getObject();
> >> >  form.load(obj);
> >> >  form.showForm("internal/someForm.form");
> >> >  form.save(obj);
> >> >  storeObject(obj);
> >> >  var bizData = { object: obj} 
> >> > cocoon.sendPage("public/anotherForm.html", bizData); <-- 
> bizData is 
> >> > lost!! }
> >> >
> >> > To make things even worse:
> >> >
> >> > I log in successfully and my first redirected page shows.
> >> Everything
> >> > ok. I now click on a menu item (->
> >> public/doSomething.html). The forms
> >> > shows ok, but when I press submit I get the authentication error 
> >> > again. When studying what happens it looks like a second 
> thread is 
> >> > started (i.e. the function is executed twice) and the error
> >> seems to occur when the second thread tries to display the form.
> >> >
> 
> Best Regards,
> 
> Antonio Gallardo
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
> For additional commands, e-mail: users-help@cocoon.apache.org
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
For additional commands, e-mail: users-help@cocoon.apache.org


RE: Problem with losing session context 'authentication' - looking fo r workaround or bugfix

Posted by Antonio Gallardo <ag...@agssa.net>.
H.vanderLinden@MI.unimaas.nl dijo:
> Hi Antonio,
>
> I'll answer all questions here, and add the relevant code below (since
> it's
> an enormous lot of code). The "getObject()" function is something I get
> from
> my backend. It goes too far to explain it or to add the code (also a lot).
> I'll add the relevant part of the sitemap and the javascript files,
> although
> the login part is an almost exact copy of the "authentication with flow"
> sample in Cocoon.
>
> [1] = sitemap
<snip/>
> 	<map:pipelines>
> 		<!-- ========================================= -->
> 		<!-- flowAuthenticationHandler configuration   -->
> 		<!-- ========================================= -->
> 		<map:component-configurations>
> 			<authentication-manager>
> 				<handlers>
> 					<handler
> name="flowAuthenticationHandler">
> 						<!-- redirect-to
> uri="cocoon:/login"/>  -->
> 						<!-- above should work, but
> doesn't because of bug in Cocoon 2.1.4-dev (prerelease), haven't checked
> since release -->
> 						<redirect-to
> uri="/properweb/login"/>
> 						<authentication
> uri="cocoon:raw:/authenticate"/>

Change to:

<authentication uri="cocoon:raw://authenticate"/>
(I guess your authentication uri is in the root of your webapp).

> 					</handler>
> 				</handlers>
> 			</authentication-manager>
> 		</map:component-configurations>
>         <map:pipeline>

Tip: Move the internal pipelines this first position. They will be jumped
by all the external requests and internal pipelines will be solved first
when they come in. If not the internal pipelines will be tested against
all the external pipelines matches.

Best Regards,

Antonio Gallardo

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
For additional commands, e-mail: users-help@cocoon.apache.org


RE: Problem with losing session context 'authentication' - looking fo r workaround or bugfix

Posted by Antonio Gallardo <ag...@agssa.net>.
Hi Helma!

I don't forgot to this task! As promised, I found the time and started to
checking the code :-D

I have the posted code in my computer. I just left the code that was
interesting to me:

[2] login.js
> cocoon.load("resource://org/apache/cocoon/webapps/authentication/flow/javasc
> ript/auth.js");
>
> function isLoggedIn() {
>   var handler = cocoon.parameters["handler"];
>   var resource = cocoon.parameters["resource"];
>
>   // resource contains the URL where the request came from, so you can
> redirect to there
>
>   if (auth_isAuthenticated(handler, resource)) {   <---- neither
> redirection
> work

the auth_isAuthenticated() allow just 1 parameter. The correct code must be:

auth_isAuthenticated(handler).

See the source code:
http://cvs.apache.org/viewcvs.cgi/*checkout*/cocoon-2.1/src/blocks/authentication-fw/java/org/apache/cocoon/webapps/authentication/flow/javascript/auth.js?content-type=text%2Fplain&rev=1.9

Please try to change it and let me know if this solve the problem or not.
We can try to solve the problem fixing 1 thing at a time, OK? :)

Best Regards,

Antonio Gallardo


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
For additional commands, e-mail: users-help@cocoon.apache.org


RE: Problem with losing session context 'authentication' - looking fo r workaround or bugfix

Posted by Antonio Gallardo <ag...@agssa.net>.
H.vanderLinden@MI.unimaas.nl dijo:
> [2] = login.js

The above file look quite old. The new implementation works. I am using
for months:

http://cvs.apache.org/viewcvs.cgi/*checkout*/cocoon-2.1/src/blocks/authentication-fw/samples/flow/sample.js?content-type=text%2Fplain&rev=1.5

Best Regards,

Antonio Gallardo

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
For additional commands, e-mail: users-help@cocoon.apache.org