SlideShare une entreprise Scribd logo
1  sur  37
Télécharger pour lire hors ligne
MONTREAL JUNE 30, JULY 1ST AND 2ND 2012




                       Security and performance designs for
                       client-server communications
                       Helmut Tschemernjak
                       HELIOS Software GmbH
                       www.helios.de


Montag, 2. Juli 2012
Scope of This Presentation
                       •   How we did certain client-server implementations

                           •   Using WebObjects without an extra WebServer

                           •   Login authentication options

                           •   Setting native process security

                           •   Java WO to native server protocol designs

                           •   Streaming content to Web clients (downloads/uploads)

                           •   Server-based preview generation

                           •   XML communication between iOS App and WebObjects
                                                           2

Montag, 2. Juli 2012
The Solution Example
                       Web clients    Web server             File server
                                     (WebObjects based)   (with production data)




                                                 3

Montag, 2. Juli 2012
File Server Role
                       •   Hosts many TB of data

                           •   Data should not be available on the Web server
                               (no NFS mounts)

                       •   Image rendering must be done on the file server
                           to transfer only low-res to Web clients

                       •   Authentication needs to be done with the file server account

                       •   File access should enforce the user’s file permissions
                           (ACLs, NTFS, UNIX, …)

                                                         4

Montag, 2. Juli 2012
Web Server (WebObjects based)
                       •   We decided to deploy WebObjects only

                           •   No extra Web server needed

                           •   No dependency on Apache, ISS

                           •   No WebObjects adaptor needed

                           •   No dependency on OS Linux/UNIX/Windows 32 or 64-bit)

                           •   Easier installation


                                                       5

Montag, 2. Juli 2012
WebObjects Direct Connect & HTTPS

          public class Application extends WOApplication {

   	 public static void main(String argv[]) {

   	 	 	 /* enable direct HTTP connections */
         if (System.getProperty("WODirectConnectEnabled") == null)
   	 	 	     System.setProperty("WODirectConnectEnabled", "true");

   	    	     	 /*
   	    	     	  * Contents/Resources needs the following files:
   	    	     	  * adaptorssl.key: the SSL key file generated via the java keytool:
   	    	     	  *     keytool -genkey -keystore serverkeys -keyalg rsa -alias qusay
   	    	     	  * adaptorsslpassphrase: A script/program which outputs the keystorepass
   	    	     	  *                       on stdout, e.g.:
   	    	     	  *                       #!/bin/sh
   	    	     	  *                       echo -n hellothere
   	    	     	  */
   	      	     if (System.getProperty("SSLPort") != null) {
   	      	     	 System.setProperty("WOAdditionalAdaptors", "({WOAdaptor=WOSSLAdaptor;})");
   	      	     }
   	      	     ...                                  6

Montag, 2. Juli 2012
WebObjects Direct Connect – Multiple Hosts

   	 public static void main(String argv[]) {
   	 	 ...
   	      	     if     (System.getProperty("WOHost") != null) {
   	      	     	      /* Build and set property string for WOAdditionalAdaptors property.
   	      	     	        * The first host will be served by the default WOAdaptor, If only
   	      	     	        * one hostname is defined WOAdditionalAdaptors will be set to "()"
   	      	     	        * representing an empty array unless SSLPort is set. If SSLPort is
   	      	     	        * set, a WOSSLAdaptor will be added for each defined hostname.
   	      	     	        */
   	      	     	      woHosts = System.getProperty("WOHost").split("s*,s*");
   	      	     	      /* sslActive and sslOnly flags are set in adaptorWithName method */
   	      	     	      boolean isSSL = (System.getProperty("SSLPort") != null);
   	      	     	      StringBuffer b = new StringBuffer("(");
   	      	     	      for (short i = 0; i < woHosts.length; i++) {
   	      	     	      	 if (i > 0) /* first defined host is served by default WOAdaptor */
   	      	     	      	 	 b.append("{WOAdaptor=WODefaultAdaptor;},");
   	      	     	      	 if (isSSL) /* add a SSL adaptor for each host */
   	      	     	      	 	 b.append("{WOAdaptor=WOSSLAdaptor;},");
   	      	     	      }
   	      	     	      /* overwrite WOAdditionalAdaptors property */
   	      	     	      System.setProperty("WOAdditionalAdaptors", b.append(")").toString());
   	      	     }
                                                                     7

Montag, 2. Juli 2012
WebObjects Direct Connect – Multiple Adaptors

          public WOAdaptor adaptorWithName(String name, NSDictionary anArgsDictionary) {
   	      	     if (adaptorSettings == null)
   	      	     	      adaptorSettings = new NSMutableDictionary(anArgsDictionary);

   	      	     int idx, port;
   	      	     String portPref;

   	      	     if (name.equals("WOSSLAdaptor") == false) { /* WODefaultAdaptor or WSNullAdaptor */
   	      	     	      portPref = System.getProperty("WOPort");
   	      	     	      /* return a WSNullAdaptor for any non SSL adaptor if WOPort is set to "0" */
   	      	     	      if ("0".equals(portPref)) {
   	      	     	      	      name = "WSNullAdaptor";
   	      	     	      	      sslOnly = true;
   	      	     	      }
   	      	     	      idx = httpAdaptorCount++;
   	      	     } else { /* WOSSLAdaptor */
   	      	     	      portPref = System.getProperty("SSLPort");
   	      	     	      sslActive = true;
   	      	     	      idx = sslAdaptorCount++;
   	      	     }
   	      	
   	      	     try {
   	      	     	     port = Integer.parseInt(portPref);
   	      	     } catch (NumberFormatException e) {
   	      	     	    NSLog.debug.appendln("ERROR: Could not parse port configuration for WOAdaptor '" + name + "': " + e);
   	      	     	    return null;
   	      	     }

   	      	     /* set the adaptors host if any host is defined */
   	      	     if (woHosts != null) {
   	      	     	    NSLog.debug.appendln("adaptorWithName: " + name + " for host '" + woHosts[idx] + "'" + (port != 0 ? " on port " + port : ""));
   	      	     	    adaptorSettings.setObjectForKey(woHosts[idx], "WOHost");
   	      	     }

   	      	     adaptorSettings.setObjectForKey(new Integer(port), "WOPort");
   	      	     adaptorSettings.setObjectForKey(name, "WOAdaptor");
   	      	     return super.adaptorWithName(name, adaptorSettings);

   	      }

                                                                                                      8

Montag, 2. Juli 2012
WebObjects Direct Connect – GZIP Content
          public void appendToResponse(WOResponse aResponse, WOContext aContext) {
   	      	 super.appendToResponse(aResponse, aContext);

   	      	     aResponse.setHeader("Accept-Encoding, Accept-Language", "Vary");
   	      	     String encodings = aContext.request().headerForKey("Accept-Encoding");
   	      	     if (encodings == null || encodings.indexOf("gzip") == -1)
   	      	     	 return;

   	      	     try {
   	      	     	 byte [] content = aResponse.content().bytes(0, aResponse.content().length());
   	      	     	 ByteArrayOutputStream byteArrayOStream = new ByteArrayOutputStream(content.length / 3);
   	      	     	 GZIPOutputStream gzipOStream = new GZIPOutputStream(byteArrayOStream);
   	      	     	 gzipOStream.write(content, 0, content.length);
   	      	     	 gzipOStream.close();

   	      	     	 NSData contentGzipped = new NSData(byteArrayOStream.toByteArray());
   	      	     	 aResponse.setHeader("gzip", "Content-Encoding");
   	      	     	 aResponse.setHeader(String.valueOf(contentGzipped.length()), "Content-Length");
   	      	     	 aResponse.setContent(contentGzipped);
   	      	     } catch(IOException e) {
   	      	     	 D.LOG(D.CMD, "GZIP response failed: " + e);
   	      	     }
   	      }
                                                                 9

Montag, 2. Juli 2012
Login Authentication Options

                       •   Cleartext logins are bad

                       •   HTTPS encrypts data, however:
                           It is cleartext again within Web app

                       •   JavaScript MD5 checksum is better

                       •   RSA encrypted password
                           to work against a password server


                                                         10

Montag, 2. Juli 2012
MD5 Example
                                     Client                                              Server
                                                        Random challenge MD5
                  JavaScript
                    based          Main page                                           Login start    Compares
                     MD5                                                                              challenge +
                   encrypt                                                                           MD5 password
                                   Login page      MD5 (Random challenge + password)
                                                                                       Login cont.      encrypt

                                                           OK or failed
                                                                                       Login done

                        •      No need for cleartext passwords on the server

                        •      Challenge avoids replaying login packets


                                                                    11

Montag, 2. Juli 2012
RSA Example
                                        Client                                                           Server
                                                        Random challenge + exponent + public RSA key
                  JavaScript
                    based            Main page                                                         Login start   Compares
                     RSA                                                                                             challenge +
                   encrypt                                                                                            cleartext
                                     Login page             RSA encrypt (challenge + password)
                                                                                                       Login cont.    password

                                                                     OK or failed
                                                                                                       Login done

                        •      Server can decode cleartext password
                               RSA request can also be forward to a password server

                        •      Challenge avoids replaying login packets

                                                                              12

Montag, 2. Juli 2012
File Server Access

                           Web client           WebObjects App                 File server

                       •   File server hosts documents, images, videos, etc.

                       •   Local users work with AFP/SMB directly on server volumes

                       •   File system security can be be enforced

                       •   Separate process per Web user allows asynchronous processing
                           and protects other users in case of errors

                                                         13

Montag, 2. Juli 2012
File Server Process Design
                                                                              Master Process
                       •   Master process accepts incoming connections

                       •   Start process per user                            User
                                                                              A
                                                                                    User
                                                                                     B
                                                                                           User
                                                                                            C
                           •   Use fork on UNIX

                           •   Use fork+execv on Mac OS X in case you need
                               use Cocoa/Carbon APIs

                           •   Use CreateProcessW on Windows
                               with a username/password use CreateProcessAsUserW


                                                       14

Montag, 2. Juli 2012
Setting Process Security Context

                       •   UNIX

                           •   After fork use setuid, setgid, setgroups

                       •   Windows

                           •   CreateProcessAsUserW is one option

                           •   Check MSDN userToken related manuals to switch IDs:
                               OpenThreadToken, SetThreadToken, GetTokenInformation, ImpersonateLoggedOnUser,
                               RevertToSelf




                                                                   15

Montag, 2. Juli 2012
Summary:
                       Authentication & Process Security
                       •   Benefits from proper process setup

                           •   Integrates well into the OS

                           •   Quota (disk & other resources) works

                           •   File system access permissions works

                           •   Process security/isolation works

                           •   Auditing and tracing works

                           •   Automatically scaling – every user has its own process
                               It is clear that multiple threads can asynchronously do IO, however once the process dies it is
                               over for all users.
                                                                        16

Montag, 2. Juli 2012
Client-Server Protocol Design
                       •   We have over 25 years of experience in client-server protocols

                           •   Apple Filing Protocol – AFP Server (since 1989)

                           •   MS-DOS network redirector client (in 1991)

                           •   Server Message Block – SMB/CIFS Server (since 1994)

                           •   WebShare three-tier solution (since 2002)

                           •   Java based Web server (experimental only)

                           •   Remote tasks automation (uses a HELIOS RPC system)
                                                          17

Montag, 2. Juli 2012
Client-Server Protocol Design II
                       •   A simple protocol header
                           Can be used in every Request & Response
                           Read header including length first, then read data content

                                 Magic
                                  Cmd
                                  Flags
                              Data-Length
                                 Data[]
                                                        18

Montag, 2. Juli 2012
Sample Protocol Design cont.
                                    Client                                 Server

                                                                       Response
                                  Request            Header + Data


                                  Request #2         Header + Data     Response

                       •   Looks easy

                           •   What to do with long delays in responses?

                           •   What to do with very large response streams?
                                                          19

Montag, 2. Juli 2012
Any Ideas?


                       •   What to do with long delays in responses?

                       •   What to do with very large response streams?

                           For example: an image or file download/upload




                                                     20

Montag, 2. Juli 2012
Sample Protocol Design cont.
                       •   Simply return a TCP port number in the response packet

                       •   Connect with a separate TCP socket

                       •   Pickup/send data until EOF

                       •   Benefits are:

                           •   Asynchronous receives/sends

                           •   Works perfectly with TCP (streaming, delayed acks, etc.)

                           •   Main command requests can continue while large data is in
                               transit
                                                          21

Montag, 2. Juli 2012
Sample Protocol Design cont.
   	    	     	 /*
   	    	     	  * Make sure your average requests fits into the socket buffer
   	    	     	  * this greatly improves streaming performance
   	    	     	  * check if SNDBUF/RCVBUF settings, if it is already large enough no need to change it
   	    	     	  */


          setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&tcpRcvWinSize, sizeof(tcpRcvWinSize))
          setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&tcpSendWinSize, sizeof(tcpSendWinSize))

   	    	     	 /*
   	    	     	  * Keep alive will remove dead connections more quickly
   	    	     	  * No delay is important if requests where you write the entire data in one go without a need that the
   	    	     	  * tcp kernel waits to collect more data before sending
   	    	     	  * REUSEADDR ensures that a restart of your server process can listen on the same port again
   	    	     	  */

          on = 1;
          setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on))
          setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *)&on, sizeof(on))
          setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on)

                                                                22

Montag, 2. Juli 2012
Sample Protocol Design cont.
                       •   Example for streaming download content

                           •   Similar setup for upload, image previews, etc.

                           Web            WebObjects            Native     Filter   Zip Tool
                           Client            App                Server    Scripts   Streaming ZIP
                                                                                     content on
                                                                            Perl       “stdout”




                                                           23

Montag, 2. Juli 2012
Protocol Design – Summary

                       •   A good protocol design makes your solution:

                           •   Scalable

                           •   Robust

                           •   Secure

                           •   Extensible



                                                       24

Montag, 2. Juli 2012
XML Communication between
                       iOS Client App and WebObjects
                                                 WebObjects
                                     iPad                         File server
                                                  Solution


                       •   A sample XML content response for a remote file status

                       •   XML gets basically generated with dynamic data by WO similar
                           to generated Web content

                       •   Code is only partial extraction to get an idea how it works

                                                        25

Montag, 2. Juli 2012
XML File: XWSStatMapping.xml
                                                         XWSStat

      <model>
   ! <entity name="de.helios.webshare.xml.XWSStat" xmlTag="stat">         XWSExtendedDirectoryEntry
   ! !    <property name="sharepoint" xmlTag="sharepoint" attribute="YES"/>
   ! !    <property name="items" xmlTag="file"/>
   ! </entity>
   ! <entity name="de.helios.webshare.xml.XWSExtendedDirectoryEntry" xmlTag="file">
   ! !    <property name="path" xmlTag="id" attribute="YES"/>
   ! !    <property name="entry.fsize" xmlTag="size" attribute="YES"/>
   ! !    <property name="entry.dsize" xmlTag="data-size" attribute="YES"/>
   ! !    <property name="entry.fileType" xmlTag="type" attribute="YES"/>
   ! !    <property name="entry.fileCreator" xmlTag="creator" attribute="YES"/>
   ! !    <property name="entry.labelID" xmlTag="label" attribute="YES"/>
   ! !    <property name="entry.modTime" xmlTag="modified" attribute="YES"/>
   ! !    <property name="entry.creationTime" xmlTag="created" attribute="YES"/>
   ! !    <property name="entry.openMode" xmlTag="mode" attribute="YES"/>
   ! !    <property name="entry.fileID" xmlTag="file-id" attribute="YES"/>
   ! !    <property name="entry.fmode" xmlTag="file-mode" attribute="YES"/>
   ! !    <property name="entry.fowner" xmlTag="file-owner" attribute="YES"/>
   ! !    <property name="entry.fgroup" xmlTag="file-group" attribute="YES"/>
   ! !    <property name="entry.fcomment" xmlTag="comment" attribute="NO"/>
   ! </entity>
   </model>

                                                         26
Montag, 2. Juli 2012
XWSStat
          public class XWSStat {

   	      public String sharepoint;
   	      public NSArray items;
   	
   	      public XWSStat(String aSharepointName, Vector someEntries) {
   	      	 sharepoint = aSharepointName;
   	      	 items = new NSArray(someEntries, new NSRange(0, someEntries.size()), true);
   	      }
   	
   	      public String getSharepoint() {
   	      	 return sharepoint;
   	      }
   }




                                                         27
Montag, 2. Juli 2012
XWSExtendedDirectoryEntry
          public class XWSExtendedDirectoryEntry {

   	      public iWSDirectoryEntry entry;
   	      public String path;

   	      public XWSExtendedDirectoryEntry(iWSDirectoryEntry anEntry, String aPath) {
   	      	 entry = anEntry;
   	      	 entry.fileCreator = WSUtils.stringToHex(entry.fileCreator);
   	      	 entry.fileType = WSUtils.stringToHex(entry.fileType);
   	      	 path = aPath;
   	      }
   }




                                                          28
Montag, 2. Juli 2012
iWSDirectoryEntry
          public       class iWSDirectoryEntry {
   	      	 ...
   	      public       String fname;
   	      public       String fileType;
   	      public       String ficonID;
   	      public       long fsize;
   	      public       long modTime;
   	      public       long creationTime;
   	      public       long dsize;
   	      public       Date mtime;
   	      public       String mtimeStr;
   	      public       String mtimeShortStr;
   	      public       int	 openMode;
   	      public       String fmode;
   	      public       String fowner;
   	      public       String fcomment;
   	      	 ...
   }


                                                   29
Montag, 2. Juli 2012
Direct Action Response
   registerRequestHandler(new WSManagerRequestHandler(), WSManagerRequestHandler.REQUEST_HANDLER_KEY); /* request handler setup in Application.java */
   private static final WOXMLCoder StatListingCoder	 	    = getXMLCoder("XWSStatMapping.xml");

   public class WSDownloadManagerDirectAction extends com.webobjects.appserver.WODirectAction implements ParameterNames, XMLQualifiedNames {

   	      public WOActionResults statAction() {
   	      	    ...
   	      	    /* generate the XML response if any entries have been added to the Vector */
   	      	    if (entries != null && !entries.isEmpty()) {
   	      	    	    return getXMLResponseForStringAndStatus(StatListingCoder.encodeRootObjectForKey(new XWSStat(sharepoint, entries), E_STAT), WOMessage.HTTP_STATUS_OK);
   	      	    }
   	      }

   	      static WOResponse getXMLResponseForStringAndStatus(String someContent, int aStatus) {
   	      	    WOResponse res = new WOResponse();
   	      	    res.setContent(someContent);
   	      	    try {
   	      	    	    NSData data = res.content();
   	      	    	    res = WSUtils.generateResponseForInputStream(data.stream(), data.length(), DEFAULT_RESPONSE_TYPE, ZIP_RESPONSE);
   	      	    	    res.setStatus(aStatus);
   	      	    } catch (IOException ex) {
   	      	    	    D.LOG(D.CMD, "WebShareDownloadManagerDirectAction: Error while generating XML-Response : " + ex);
   	      	    	    res.setContent("<Exception><![CDATA[" + ex + "]]></Exception>");
   	      	    	    res.setStatus(WOMessage.HTTP_STATUS_INTERNAL_ERROR);
   	      	    }	   	
   	      	    res.setDefaultEncoding("UTF8");
   	      	    res.setContentEncoding("UTF8");
   	      	    res.setHeader("text/xml; charset=UTF-8;", "Content-Type");	
   	      	    return res;
   	      }
   }
                                                                                  30
Montag, 2. Juli 2012
XML Communication – Summary

                       •   WebObjects system to generate XML content

                       •   We use XML protocols to communicate with:
                           iPad Document Hub – accessing/syncing documents from iOS
                           WebShare Manager – a remote desktop project syncing solution

                       •   XML based commands, we have implemented:
                           Login, EnumShares, EnumDirectory, FileStat, SpotlightSearch,
                           Download, Upload, FileComments, ColorLabel, GetIcon, …


                                                        31

Montag, 2. Juli 2012
WebShare Video Tour




                                32

Montag, 2. Juli 2012
iPad Document Hub Video Tour




                                    33

Montag, 2. Juli 2012
34

Montag, 2. Juli 2012
HELIOS Solutions for Developers
                       •   Server Solution Suite includes:

                           •   AFP/SMB/Web file servers, imaging tools & PDF workflow
                               Image/PDF conversion with ICC Color Management

                           •   Tool Server for remote automation of jobs

                       •   iPad Document Hub

                           •   Shared source of complete iOS App for customers
                               Allows developing your own apps utilizing HELIOS server
                               services

                                                         35

Montag, 2. Juli 2012
WebObjects Wishes


                       •   Turn WebObjects source code into Darwin
                           This would allow us to maintain it

                       •   Maintenance for WebObjects – fix problems,
                           e.g. the 2 GB Upload stream limit: Apple bug report ID 10765546




                                                       36

Montag, 2. Juli 2012
MONTREAL JUNE 30, JULY 1ST AND 2ND 2012




                       Q&A


Montag, 2. Juli 2012

Contenu connexe

Tendances

Doctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document MapperDoctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document MapperJonathan Wage
 
Testing Web Applications with GEB
Testing Web Applications with GEBTesting Web Applications with GEB
Testing Web Applications with GEBHoward Lewis Ship
 
Symfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODMSymfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODMJonathan Wage
 
ZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODMZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODMJonathan Wage
 
Java development with MongoDB
Java development with MongoDBJava development with MongoDB
Java development with MongoDBJames Williams
 
Resource registries plone conf 2014
Resource registries plone conf 2014Resource registries plone conf 2014
Resource registries plone conf 2014Ramon Navarro
 
Node.js 與 google cloud storage
Node.js 與 google cloud storageNode.js 與 google cloud storage
Node.js 與 google cloud storageonlinemad
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know Norberto Leite
 
Java Development with MongoDB
Java Development with MongoDBJava Development with MongoDB
Java Development with MongoDBScott Hernandez
 
A Groovy Kind of Java (San Francisco Java User Group)
A Groovy Kind of Java (San Francisco Java User Group)A Groovy Kind of Java (San Francisco Java User Group)
A Groovy Kind of Java (San Francisco Java User Group)Nati Shalom
 
Hidden pearls for High-Performance-Persistence
Hidden pearls for High-Performance-PersistenceHidden pearls for High-Performance-Persistence
Hidden pearls for High-Performance-PersistenceSven Ruppert
 
Hernan Ochoa - WCE Internals [RootedCON 2011]
Hernan Ochoa - WCE Internals [RootedCON 2011]Hernan Ochoa - WCE Internals [RootedCON 2011]
Hernan Ochoa - WCE Internals [RootedCON 2011]RootedCON
 
CloudFormation vs. Elastic Beanstalk & Use cases
CloudFormation vs. Elastic Beanstalk & Use casesCloudFormation vs. Elastic Beanstalk & Use cases
CloudFormation vs. Elastic Beanstalk & Use casesWayland Zhang
 
High Performance XQuery Processing in PHP with Zorba by Vikram Vaswani
High Performance XQuery Processing in PHP with Zorba by Vikram VaswaniHigh Performance XQuery Processing in PHP with Zorba by Vikram Vaswani
High Performance XQuery Processing in PHP with Zorba by Vikram Vaswanivvaswani
 
Cassandra summit 2013 - DataStax Java Driver Unleashed!
Cassandra summit 2013 - DataStax Java Driver Unleashed!Cassandra summit 2013 - DataStax Java Driver Unleashed!
Cassandra summit 2013 - DataStax Java Driver Unleashed!Michaël Figuière
 
bootstrapping containers with confd
bootstrapping containers with confdbootstrapping containers with confd
bootstrapping containers with confdm_richardson
 

Tendances (20)

Nio
NioNio
Nio
 
Doctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document MapperDoctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document Mapper
 
Testing Web Applications with GEB
Testing Web Applications with GEBTesting Web Applications with GEB
Testing Web Applications with GEB
 
Spring 4 - A&BP CC
Spring 4 - A&BP CCSpring 4 - A&BP CC
Spring 4 - A&BP CC
 
Symfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODMSymfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODM
 
ZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODMZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODM
 
Java development with MongoDB
Java development with MongoDBJava development with MongoDB
Java development with MongoDB
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
Resource registries plone conf 2014
Resource registries plone conf 2014Resource registries plone conf 2014
Resource registries plone conf 2014
 
Node.js 與 google cloud storage
Node.js 與 google cloud storageNode.js 與 google cloud storage
Node.js 與 google cloud storage
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know
 
Java Development with MongoDB
Java Development with MongoDBJava Development with MongoDB
Java Development with MongoDB
 
A Groovy Kind of Java (San Francisco Java User Group)
A Groovy Kind of Java (San Francisco Java User Group)A Groovy Kind of Java (San Francisco Java User Group)
A Groovy Kind of Java (San Francisco Java User Group)
 
MWLUG 2017 - Elementary!
MWLUG 2017 - Elementary!MWLUG 2017 - Elementary!
MWLUG 2017 - Elementary!
 
Hidden pearls for High-Performance-Persistence
Hidden pearls for High-Performance-PersistenceHidden pearls for High-Performance-Persistence
Hidden pearls for High-Performance-Persistence
 
Hernan Ochoa - WCE Internals [RootedCON 2011]
Hernan Ochoa - WCE Internals [RootedCON 2011]Hernan Ochoa - WCE Internals [RootedCON 2011]
Hernan Ochoa - WCE Internals [RootedCON 2011]
 
CloudFormation vs. Elastic Beanstalk & Use cases
CloudFormation vs. Elastic Beanstalk & Use casesCloudFormation vs. Elastic Beanstalk & Use cases
CloudFormation vs. Elastic Beanstalk & Use cases
 
High Performance XQuery Processing in PHP with Zorba by Vikram Vaswani
High Performance XQuery Processing in PHP with Zorba by Vikram VaswaniHigh Performance XQuery Processing in PHP with Zorba by Vikram Vaswani
High Performance XQuery Processing in PHP with Zorba by Vikram Vaswani
 
Cassandra summit 2013 - DataStax Java Driver Unleashed!
Cassandra summit 2013 - DataStax Java Driver Unleashed!Cassandra summit 2013 - DataStax Java Driver Unleashed!
Cassandra summit 2013 - DataStax Java Driver Unleashed!
 
bootstrapping containers with confd
bootstrapping containers with confdbootstrapping containers with confd
bootstrapping containers with confd
 

En vedette

Hispanic Direct Response Marketing
Hispanic Direct Response MarketingHispanic Direct Response Marketing
Hispanic Direct Response MarketingEncore Media, LLC.
 
C&amp;C General
C&amp;C GeneralC&amp;C General
C&amp;C GeneralBKoontz
 
Print Technology: Functional Printed Electronics - RFID & NFC versus QR Codes...
Print Technology: Functional Printed Electronics - RFID & NFC versus QR Codes...Print Technology: Functional Printed Electronics - RFID & NFC versus QR Codes...
Print Technology: Functional Printed Electronics - RFID & NFC versus QR Codes...New England Direct Marketing Association
 
ARIF PATEL REPORT
ARIF PATEL REPORTARIF PATEL REPORT
ARIF PATEL REPORTpatel0321
 
ADMA Digital Council: Digital Direct Marketing
ADMA Digital Council: Digital Direct MarketingADMA Digital Council: Digital Direct Marketing
ADMA Digital Council: Digital Direct MarketingDatalicious
 
Marketing Glossary - London Business School
Marketing Glossary - London Business SchoolMarketing Glossary - London Business School
Marketing Glossary - London Business Schooljuracrav
 
4 P's of Marketing: Confessions of a Guerrilla Marketer
4 P's of Marketing: Confessions of a Guerrilla Marketer4 P's of Marketing: Confessions of a Guerrilla Marketer
4 P's of Marketing: Confessions of a Guerrilla MarketerAnthony William Tucker
 
(ISC)2 Security Congress 2015 - The Cloud Trust Conundrum- You’re Asking all ...
(ISC)2 Security Congress 2015 - The Cloud Trust Conundrum- You’re Asking all ...(ISC)2 Security Congress 2015 - The Cloud Trust Conundrum- You’re Asking all ...
(ISC)2 Security Congress 2015 - The Cloud Trust Conundrum- You’re Asking all ...Andrew O. Leeth
 
Payment Services in Kuwait
Payment Services in KuwaitPayment Services in Kuwait
Payment Services in KuwaitBurhan Khalid
 
LO2 workbook Marketing and PR
LO2 workbook Marketing and PRLO2 workbook Marketing and PR
LO2 workbook Marketing and PRTheJellehKed
 
Sedgwick-E0498336-D0105-30532a-Assessment 03
Sedgwick-E0498336-D0105-30532a-Assessment 03Sedgwick-E0498336-D0105-30532a-Assessment 03
Sedgwick-E0498336-D0105-30532a-Assessment 03Colleen Sedgwick
 
In game marketing mark susor
In game marketing mark susorIn game marketing mark susor
In game marketing mark susorMark Susor
 
Black hole computers by Scientific American Magazine
Black hole computers by Scientific American MagazineBlack hole computers by Scientific American Magazine
Black hole computers by Scientific American MagazineDholon Paul
 
Programmatic Branding: Moving Beyond Direct Response
Programmatic Branding: Moving Beyond Direct ResponseProgrammatic Branding: Moving Beyond Direct Response
Programmatic Branding: Moving Beyond Direct ResponseDigiday
 
Beyond Direct Response: How to Measure Success in Programmatic Branding
Beyond Direct Response: How to Measure Success in Programmatic BrandingBeyond Direct Response: How to Measure Success in Programmatic Branding
Beyond Direct Response: How to Measure Success in Programmatic BrandingDigiday
 
How to do direct response advertising
How to do direct response advertisingHow to do direct response advertising
How to do direct response advertisingTC Miles
 

En vedette (20)

Hispanic Direct Response Marketing
Hispanic Direct Response MarketingHispanic Direct Response Marketing
Hispanic Direct Response Marketing
 
C&amp;C General
C&amp;C GeneralC&amp;C General
C&amp;C General
 
Print Technology: Functional Printed Electronics - RFID & NFC versus QR Codes...
Print Technology: Functional Printed Electronics - RFID & NFC versus QR Codes...Print Technology: Functional Printed Electronics - RFID & NFC versus QR Codes...
Print Technology: Functional Printed Electronics - RFID & NFC versus QR Codes...
 
ARIF PATEL REPORT
ARIF PATEL REPORTARIF PATEL REPORT
ARIF PATEL REPORT
 
ADMA Digital Council: Digital Direct Marketing
ADMA Digital Council: Digital Direct MarketingADMA Digital Council: Digital Direct Marketing
ADMA Digital Council: Digital Direct Marketing
 
Direct marketing
Direct marketingDirect marketing
Direct marketing
 
Marketing Glossary - London Business School
Marketing Glossary - London Business SchoolMarketing Glossary - London Business School
Marketing Glossary - London Business School
 
Distribution logistics
Distribution logisticsDistribution logistics
Distribution logistics
 
4 P's of Marketing: Confessions of a Guerrilla Marketer
4 P's of Marketing: Confessions of a Guerrilla Marketer4 P's of Marketing: Confessions of a Guerrilla Marketer
4 P's of Marketing: Confessions of a Guerrilla Marketer
 
IMC EMI
IMC EMIIMC EMI
IMC EMI
 
(ISC)2 Security Congress 2015 - The Cloud Trust Conundrum- You’re Asking all ...
(ISC)2 Security Congress 2015 - The Cloud Trust Conundrum- You’re Asking all ...(ISC)2 Security Congress 2015 - The Cloud Trust Conundrum- You’re Asking all ...
(ISC)2 Security Congress 2015 - The Cloud Trust Conundrum- You’re Asking all ...
 
Payment Services in Kuwait
Payment Services in KuwaitPayment Services in Kuwait
Payment Services in Kuwait
 
LO2 workbook Marketing and PR
LO2 workbook Marketing and PRLO2 workbook Marketing and PR
LO2 workbook Marketing and PR
 
Sedgwick-E0498336-D0105-30532a-Assessment 03
Sedgwick-E0498336-D0105-30532a-Assessment 03Sedgwick-E0498336-D0105-30532a-Assessment 03
Sedgwick-E0498336-D0105-30532a-Assessment 03
 
In game marketing mark susor
In game marketing mark susorIn game marketing mark susor
In game marketing mark susor
 
Advertising & ibp
Advertising & ibpAdvertising & ibp
Advertising & ibp
 
Black hole computers by Scientific American Magazine
Black hole computers by Scientific American MagazineBlack hole computers by Scientific American Magazine
Black hole computers by Scientific American Magazine
 
Programmatic Branding: Moving Beyond Direct Response
Programmatic Branding: Moving Beyond Direct ResponseProgrammatic Branding: Moving Beyond Direct Response
Programmatic Branding: Moving Beyond Direct Response
 
Beyond Direct Response: How to Measure Success in Programmatic Branding
Beyond Direct Response: How to Measure Success in Programmatic BrandingBeyond Direct Response: How to Measure Success in Programmatic Branding
Beyond Direct Response: How to Measure Success in Programmatic Branding
 
How to do direct response advertising
How to do direct response advertisingHow to do direct response advertising
How to do direct response advertising
 

Similaire à Security and performance designs for client-server communications

node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backendDavid Padbury
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch
 
Introduction to node.js
Introduction to node.jsIntroduction to node.js
Introduction to node.jsAdrien Guéret
 
Nodejs and WebSockets
Nodejs and WebSocketsNodejs and WebSockets
Nodejs and WebSocketsGonzalo Ayuso
 
Practical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.jsPractical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.jsasync_io
 
Groovy & Grails eXchange 2012 vert.x presentation
Groovy & Grails eXchange 2012 vert.x presentationGroovy & Grails eXchange 2012 vert.x presentation
Groovy & Grails eXchange 2012 vert.x presentationStuart (Pid) Williams
 
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...Ivanti
 
Building interactivity with websockets
Building interactivity with websocketsBuilding interactivity with websockets
Building interactivity with websocketsWim Godden
 
Scalable network applications, event-driven - Node JS
Scalable network applications, event-driven - Node JSScalable network applications, event-driven - Node JS
Scalable network applications, event-driven - Node JSCosmin Mereuta
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applicationsTom Croucher
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineRicardo Silva
 
NoSQL and JavaScript: a Love Story
NoSQL and JavaScript: a Love StoryNoSQL and JavaScript: a Love Story
NoSQL and JavaScript: a Love StoryAlexandre Morgaut
 
GWT Web Socket and data serialization
GWT Web Socket and data serializationGWT Web Socket and data serialization
GWT Web Socket and data serializationGWTcon
 
Third Party Auth in WebObjects
Third Party Auth in WebObjectsThird Party Auth in WebObjects
Third Party Auth in WebObjectsWO Community
 
Web Technologies - forms and actions
Web Technologies -  forms and actionsWeb Technologies -  forms and actions
Web Technologies - forms and actionsAren Zomorodian
 
Intro to fog and openstack jp
Intro to fog and openstack jpIntro to fog and openstack jp
Intro to fog and openstack jpSatoshi Konno
 

Similaire à Security and performance designs for client-server communications (20)

node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backend
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.js
 
Introduction to node.js
Introduction to node.jsIntroduction to node.js
Introduction to node.js
 
5.node js
5.node js5.node js
5.node js
 
Nodejs and WebSockets
Nodejs and WebSocketsNodejs and WebSockets
Nodejs and WebSockets
 
Practical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.jsPractical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.js
 
Groovy & Grails eXchange 2012 vert.x presentation
Groovy & Grails eXchange 2012 vert.x presentationGroovy & Grails eXchange 2012 vert.x presentation
Groovy & Grails eXchange 2012 vert.x presentation
 
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...
 
Building interactivity with websockets
Building interactivity with websocketsBuilding interactivity with websockets
Building interactivity with websockets
 
NodeJS
NodeJSNodeJS
NodeJS
 
Scalable network applications, event-driven - Node JS
Scalable network applications, event-driven - Node JSScalable network applications, event-driven - Node JS
Scalable network applications, event-driven - Node JS
 
Frontend Servers and NGINX: What, Where and How
Frontend Servers and NGINX: What, Where and HowFrontend Servers and NGINX: What, Where and How
Frontend Servers and NGINX: What, Where and How
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 Engine
 
Node.js on Azure
Node.js on AzureNode.js on Azure
Node.js on Azure
 
NoSQL and JavaScript: a Love Story
NoSQL and JavaScript: a Love StoryNoSQL and JavaScript: a Love Story
NoSQL and JavaScript: a Love Story
 
GWT Web Socket and data serialization
GWT Web Socket and data serializationGWT Web Socket and data serialization
GWT Web Socket and data serialization
 
Third Party Auth in WebObjects
Third Party Auth in WebObjectsThird Party Auth in WebObjects
Third Party Auth in WebObjects
 
Web Technologies - forms and actions
Web Technologies -  forms and actionsWeb Technologies -  forms and actions
Web Technologies - forms and actions
 
Intro to fog and openstack jp
Intro to fog and openstack jpIntro to fog and openstack jp
Intro to fog and openstack jp
 

Plus de WO Community

In memory OLAP engine
In memory OLAP engineIn memory OLAP engine
In memory OLAP engineWO Community
 
Using Nagios to monitor your WO systems
Using Nagios to monitor your WO systemsUsing Nagios to monitor your WO systems
Using Nagios to monitor your WO systemsWO Community
 
Build and deployment
Build and deploymentBuild and deployment
Build and deploymentWO Community
 
Reenabling SOAP using ERJaxWS
Reenabling SOAP using ERJaxWSReenabling SOAP using ERJaxWS
Reenabling SOAP using ERJaxWSWO Community
 
Chaining the Beast - Testing Wonder Applications in the Real World
Chaining the Beast - Testing Wonder Applications in the Real WorldChaining the Beast - Testing Wonder Applications in the Real World
Chaining the Beast - Testing Wonder Applications in the Real WorldWO Community
 
D2W Stateful Controllers
D2W Stateful ControllersD2W Stateful Controllers
D2W Stateful ControllersWO Community
 
Deploying WO on Windows
Deploying WO on WindowsDeploying WO on Windows
Deploying WO on WindowsWO Community
 
Unit Testing with WOUnit
Unit Testing with WOUnitUnit Testing with WOUnit
Unit Testing with WOUnitWO Community
 
Apache Cayenne for WO Devs
Apache Cayenne for WO DevsApache Cayenne for WO Devs
Apache Cayenne for WO DevsWO Community
 
Advanced Apache Cayenne
Advanced Apache CayenneAdvanced Apache Cayenne
Advanced Apache CayenneWO Community
 
Migrating existing Projects to Wonder
Migrating existing Projects to WonderMigrating existing Projects to Wonder
Migrating existing Projects to WonderWO Community
 
iOS for ERREST - alternative version
iOS for ERREST - alternative versioniOS for ERREST - alternative version
iOS for ERREST - alternative versionWO Community
 
"Framework Principal" pattern
"Framework Principal" pattern"Framework Principal" pattern
"Framework Principal" patternWO Community
 
Filtering data with D2W
Filtering data with D2W Filtering data with D2W
Filtering data with D2W WO Community
 
Localizing your apps for multibyte languages
Localizing your apps for multibyte languagesLocalizing your apps for multibyte languages
Localizing your apps for multibyte languagesWO Community
 

Plus de WO Community (20)

KAAccessControl
KAAccessControlKAAccessControl
KAAccessControl
 
In memory OLAP engine
In memory OLAP engineIn memory OLAP engine
In memory OLAP engine
 
Using Nagios to monitor your WO systems
Using Nagios to monitor your WO systemsUsing Nagios to monitor your WO systems
Using Nagios to monitor your WO systems
 
Build and deployment
Build and deploymentBuild and deployment
Build and deployment
 
High availability
High availabilityHigh availability
High availability
 
Reenabling SOAP using ERJaxWS
Reenabling SOAP using ERJaxWSReenabling SOAP using ERJaxWS
Reenabling SOAP using ERJaxWS
 
Chaining the Beast - Testing Wonder Applications in the Real World
Chaining the Beast - Testing Wonder Applications in the Real WorldChaining the Beast - Testing Wonder Applications in the Real World
Chaining the Beast - Testing Wonder Applications in the Real World
 
D2W Stateful Controllers
D2W Stateful ControllersD2W Stateful Controllers
D2W Stateful Controllers
 
Deploying WO on Windows
Deploying WO on WindowsDeploying WO on Windows
Deploying WO on Windows
 
Unit Testing with WOUnit
Unit Testing with WOUnitUnit Testing with WOUnit
Unit Testing with WOUnit
 
Life outside WO
Life outside WOLife outside WO
Life outside WO
 
Apache Cayenne for WO Devs
Apache Cayenne for WO DevsApache Cayenne for WO Devs
Apache Cayenne for WO Devs
 
Advanced Apache Cayenne
Advanced Apache CayenneAdvanced Apache Cayenne
Advanced Apache Cayenne
 
Migrating existing Projects to Wonder
Migrating existing Projects to WonderMigrating existing Projects to Wonder
Migrating existing Projects to Wonder
 
iOS for ERREST - alternative version
iOS for ERREST - alternative versioniOS for ERREST - alternative version
iOS for ERREST - alternative version
 
iOS for ERREST
iOS for ERRESTiOS for ERREST
iOS for ERREST
 
"Framework Principal" pattern
"Framework Principal" pattern"Framework Principal" pattern
"Framework Principal" pattern
 
Filtering data with D2W
Filtering data with D2W Filtering data with D2W
Filtering data with D2W
 
WOver
WOverWOver
WOver
 
Localizing your apps for multibyte languages
Localizing your apps for multibyte languagesLocalizing your apps for multibyte languages
Localizing your apps for multibyte languages
 

Dernier

SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 

Dernier (20)

SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 

Security and performance designs for client-server communications

  • 1. MONTREAL JUNE 30, JULY 1ST AND 2ND 2012 Security and performance designs for client-server communications Helmut Tschemernjak HELIOS Software GmbH www.helios.de Montag, 2. Juli 2012
  • 2. Scope of This Presentation • How we did certain client-server implementations • Using WebObjects without an extra WebServer • Login authentication options • Setting native process security • Java WO to native server protocol designs • Streaming content to Web clients (downloads/uploads) • Server-based preview generation • XML communication between iOS App and WebObjects 2 Montag, 2. Juli 2012
  • 3. The Solution Example Web clients Web server File server (WebObjects based) (with production data) 3 Montag, 2. Juli 2012
  • 4. File Server Role • Hosts many TB of data • Data should not be available on the Web server (no NFS mounts) • Image rendering must be done on the file server to transfer only low-res to Web clients • Authentication needs to be done with the file server account • File access should enforce the user’s file permissions (ACLs, NTFS, UNIX, …) 4 Montag, 2. Juli 2012
  • 5. Web Server (WebObjects based) • We decided to deploy WebObjects only • No extra Web server needed • No dependency on Apache, ISS • No WebObjects adaptor needed • No dependency on OS Linux/UNIX/Windows 32 or 64-bit) • Easier installation 5 Montag, 2. Juli 2012
  • 6. WebObjects Direct Connect & HTTPS public class Application extends WOApplication { public static void main(String argv[]) { /* enable direct HTTP connections */ if (System.getProperty("WODirectConnectEnabled") == null) System.setProperty("WODirectConnectEnabled", "true"); /* * Contents/Resources needs the following files: * adaptorssl.key: the SSL key file generated via the java keytool: * keytool -genkey -keystore serverkeys -keyalg rsa -alias qusay * adaptorsslpassphrase: A script/program which outputs the keystorepass * on stdout, e.g.: * #!/bin/sh * echo -n hellothere */ if (System.getProperty("SSLPort") != null) { System.setProperty("WOAdditionalAdaptors", "({WOAdaptor=WOSSLAdaptor;})"); } ... 6 Montag, 2. Juli 2012
  • 7. WebObjects Direct Connect – Multiple Hosts public static void main(String argv[]) { ... if (System.getProperty("WOHost") != null) { /* Build and set property string for WOAdditionalAdaptors property. * The first host will be served by the default WOAdaptor, If only * one hostname is defined WOAdditionalAdaptors will be set to "()" * representing an empty array unless SSLPort is set. If SSLPort is * set, a WOSSLAdaptor will be added for each defined hostname. */ woHosts = System.getProperty("WOHost").split("s*,s*"); /* sslActive and sslOnly flags are set in adaptorWithName method */ boolean isSSL = (System.getProperty("SSLPort") != null); StringBuffer b = new StringBuffer("("); for (short i = 0; i < woHosts.length; i++) { if (i > 0) /* first defined host is served by default WOAdaptor */ b.append("{WOAdaptor=WODefaultAdaptor;},"); if (isSSL) /* add a SSL adaptor for each host */ b.append("{WOAdaptor=WOSSLAdaptor;},"); } /* overwrite WOAdditionalAdaptors property */ System.setProperty("WOAdditionalAdaptors", b.append(")").toString()); } 7 Montag, 2. Juli 2012
  • 8. WebObjects Direct Connect – Multiple Adaptors public WOAdaptor adaptorWithName(String name, NSDictionary anArgsDictionary) { if (adaptorSettings == null) adaptorSettings = new NSMutableDictionary(anArgsDictionary); int idx, port; String portPref; if (name.equals("WOSSLAdaptor") == false) { /* WODefaultAdaptor or WSNullAdaptor */ portPref = System.getProperty("WOPort"); /* return a WSNullAdaptor for any non SSL adaptor if WOPort is set to "0" */ if ("0".equals(portPref)) { name = "WSNullAdaptor"; sslOnly = true; } idx = httpAdaptorCount++; } else { /* WOSSLAdaptor */ portPref = System.getProperty("SSLPort"); sslActive = true; idx = sslAdaptorCount++; } try { port = Integer.parseInt(portPref); } catch (NumberFormatException e) { NSLog.debug.appendln("ERROR: Could not parse port configuration for WOAdaptor '" + name + "': " + e); return null; } /* set the adaptors host if any host is defined */ if (woHosts != null) { NSLog.debug.appendln("adaptorWithName: " + name + " for host '" + woHosts[idx] + "'" + (port != 0 ? " on port " + port : "")); adaptorSettings.setObjectForKey(woHosts[idx], "WOHost"); } adaptorSettings.setObjectForKey(new Integer(port), "WOPort"); adaptorSettings.setObjectForKey(name, "WOAdaptor"); return super.adaptorWithName(name, adaptorSettings); } 8 Montag, 2. Juli 2012
  • 9. WebObjects Direct Connect – GZIP Content public void appendToResponse(WOResponse aResponse, WOContext aContext) { super.appendToResponse(aResponse, aContext); aResponse.setHeader("Accept-Encoding, Accept-Language", "Vary"); String encodings = aContext.request().headerForKey("Accept-Encoding"); if (encodings == null || encodings.indexOf("gzip") == -1) return; try { byte [] content = aResponse.content().bytes(0, aResponse.content().length()); ByteArrayOutputStream byteArrayOStream = new ByteArrayOutputStream(content.length / 3); GZIPOutputStream gzipOStream = new GZIPOutputStream(byteArrayOStream); gzipOStream.write(content, 0, content.length); gzipOStream.close(); NSData contentGzipped = new NSData(byteArrayOStream.toByteArray()); aResponse.setHeader("gzip", "Content-Encoding"); aResponse.setHeader(String.valueOf(contentGzipped.length()), "Content-Length"); aResponse.setContent(contentGzipped); } catch(IOException e) { D.LOG(D.CMD, "GZIP response failed: " + e); } } 9 Montag, 2. Juli 2012
  • 10. Login Authentication Options • Cleartext logins are bad • HTTPS encrypts data, however: It is cleartext again within Web app • JavaScript MD5 checksum is better • RSA encrypted password to work against a password server 10 Montag, 2. Juli 2012
  • 11. MD5 Example Client Server Random challenge MD5 JavaScript based Main page Login start Compares MD5 challenge + encrypt MD5 password Login page MD5 (Random challenge + password) Login cont. encrypt OK or failed Login done • No need for cleartext passwords on the server • Challenge avoids replaying login packets 11 Montag, 2. Juli 2012
  • 12. RSA Example Client Server Random challenge + exponent + public RSA key JavaScript based Main page Login start Compares RSA challenge + encrypt cleartext Login page RSA encrypt (challenge + password) Login cont. password OK or failed Login done • Server can decode cleartext password RSA request can also be forward to a password server • Challenge avoids replaying login packets 12 Montag, 2. Juli 2012
  • 13. File Server Access Web client WebObjects App File server • File server hosts documents, images, videos, etc. • Local users work with AFP/SMB directly on server volumes • File system security can be be enforced • Separate process per Web user allows asynchronous processing and protects other users in case of errors 13 Montag, 2. Juli 2012
  • 14. File Server Process Design Master Process • Master process accepts incoming connections • Start process per user User A User B User C • Use fork on UNIX • Use fork+execv on Mac OS X in case you need use Cocoa/Carbon APIs • Use CreateProcessW on Windows with a username/password use CreateProcessAsUserW 14 Montag, 2. Juli 2012
  • 15. Setting Process Security Context • UNIX • After fork use setuid, setgid, setgroups • Windows • CreateProcessAsUserW is one option • Check MSDN userToken related manuals to switch IDs: OpenThreadToken, SetThreadToken, GetTokenInformation, ImpersonateLoggedOnUser, RevertToSelf 15 Montag, 2. Juli 2012
  • 16. Summary: Authentication & Process Security • Benefits from proper process setup • Integrates well into the OS • Quota (disk & other resources) works • File system access permissions works • Process security/isolation works • Auditing and tracing works • Automatically scaling – every user has its own process It is clear that multiple threads can asynchronously do IO, however once the process dies it is over for all users. 16 Montag, 2. Juli 2012
  • 17. Client-Server Protocol Design • We have over 25 years of experience in client-server protocols • Apple Filing Protocol – AFP Server (since 1989) • MS-DOS network redirector client (in 1991) • Server Message Block – SMB/CIFS Server (since 1994) • WebShare three-tier solution (since 2002) • Java based Web server (experimental only) • Remote tasks automation (uses a HELIOS RPC system) 17 Montag, 2. Juli 2012
  • 18. Client-Server Protocol Design II • A simple protocol header Can be used in every Request & Response Read header including length first, then read data content Magic Cmd Flags Data-Length Data[] 18 Montag, 2. Juli 2012
  • 19. Sample Protocol Design cont. Client Server Response Request Header + Data Request #2 Header + Data Response • Looks easy • What to do with long delays in responses? • What to do with very large response streams? 19 Montag, 2. Juli 2012
  • 20. Any Ideas? • What to do with long delays in responses? • What to do with very large response streams? For example: an image or file download/upload 20 Montag, 2. Juli 2012
  • 21. Sample Protocol Design cont. • Simply return a TCP port number in the response packet • Connect with a separate TCP socket • Pickup/send data until EOF • Benefits are: • Asynchronous receives/sends • Works perfectly with TCP (streaming, delayed acks, etc.) • Main command requests can continue while large data is in transit 21 Montag, 2. Juli 2012
  • 22. Sample Protocol Design cont. /* * Make sure your average requests fits into the socket buffer * this greatly improves streaming performance * check if SNDBUF/RCVBUF settings, if it is already large enough no need to change it */ setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&tcpRcvWinSize, sizeof(tcpRcvWinSize)) setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&tcpSendWinSize, sizeof(tcpSendWinSize)) /* * Keep alive will remove dead connections more quickly * No delay is important if requests where you write the entire data in one go without a need that the * tcp kernel waits to collect more data before sending * REUSEADDR ensures that a restart of your server process can listen on the same port again */ on = 1; setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on)) setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *)&on, sizeof(on)) setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on) 22 Montag, 2. Juli 2012
  • 23. Sample Protocol Design cont. • Example for streaming download content • Similar setup for upload, image previews, etc. Web WebObjects Native Filter Zip Tool Client App Server Scripts Streaming ZIP content on Perl “stdout” 23 Montag, 2. Juli 2012
  • 24. Protocol Design – Summary • A good protocol design makes your solution: • Scalable • Robust • Secure • Extensible 24 Montag, 2. Juli 2012
  • 25. XML Communication between iOS Client App and WebObjects WebObjects iPad File server Solution • A sample XML content response for a remote file status • XML gets basically generated with dynamic data by WO similar to generated Web content • Code is only partial extraction to get an idea how it works 25 Montag, 2. Juli 2012
  • 26. XML File: XWSStatMapping.xml XWSStat <model> ! <entity name="de.helios.webshare.xml.XWSStat" xmlTag="stat"> XWSExtendedDirectoryEntry ! ! <property name="sharepoint" xmlTag="sharepoint" attribute="YES"/> ! ! <property name="items" xmlTag="file"/> ! </entity> ! <entity name="de.helios.webshare.xml.XWSExtendedDirectoryEntry" xmlTag="file"> ! ! <property name="path" xmlTag="id" attribute="YES"/> ! ! <property name="entry.fsize" xmlTag="size" attribute="YES"/> ! ! <property name="entry.dsize" xmlTag="data-size" attribute="YES"/> ! ! <property name="entry.fileType" xmlTag="type" attribute="YES"/> ! ! <property name="entry.fileCreator" xmlTag="creator" attribute="YES"/> ! ! <property name="entry.labelID" xmlTag="label" attribute="YES"/> ! ! <property name="entry.modTime" xmlTag="modified" attribute="YES"/> ! ! <property name="entry.creationTime" xmlTag="created" attribute="YES"/> ! ! <property name="entry.openMode" xmlTag="mode" attribute="YES"/> ! ! <property name="entry.fileID" xmlTag="file-id" attribute="YES"/> ! ! <property name="entry.fmode" xmlTag="file-mode" attribute="YES"/> ! ! <property name="entry.fowner" xmlTag="file-owner" attribute="YES"/> ! ! <property name="entry.fgroup" xmlTag="file-group" attribute="YES"/> ! ! <property name="entry.fcomment" xmlTag="comment" attribute="NO"/> ! </entity> </model> 26 Montag, 2. Juli 2012
  • 27. XWSStat public class XWSStat { public String sharepoint; public NSArray items; public XWSStat(String aSharepointName, Vector someEntries) { sharepoint = aSharepointName; items = new NSArray(someEntries, new NSRange(0, someEntries.size()), true); } public String getSharepoint() { return sharepoint; } } 27 Montag, 2. Juli 2012
  • 28. XWSExtendedDirectoryEntry public class XWSExtendedDirectoryEntry { public iWSDirectoryEntry entry; public String path; public XWSExtendedDirectoryEntry(iWSDirectoryEntry anEntry, String aPath) { entry = anEntry; entry.fileCreator = WSUtils.stringToHex(entry.fileCreator); entry.fileType = WSUtils.stringToHex(entry.fileType); path = aPath; } } 28 Montag, 2. Juli 2012
  • 29. iWSDirectoryEntry public class iWSDirectoryEntry { ... public String fname; public String fileType; public String ficonID; public long fsize; public long modTime; public long creationTime; public long dsize; public Date mtime; public String mtimeStr; public String mtimeShortStr; public int openMode; public String fmode; public String fowner; public String fcomment; ... } 29 Montag, 2. Juli 2012
  • 30. Direct Action Response registerRequestHandler(new WSManagerRequestHandler(), WSManagerRequestHandler.REQUEST_HANDLER_KEY); /* request handler setup in Application.java */ private static final WOXMLCoder StatListingCoder = getXMLCoder("XWSStatMapping.xml"); public class WSDownloadManagerDirectAction extends com.webobjects.appserver.WODirectAction implements ParameterNames, XMLQualifiedNames { public WOActionResults statAction() { ... /* generate the XML response if any entries have been added to the Vector */ if (entries != null && !entries.isEmpty()) { return getXMLResponseForStringAndStatus(StatListingCoder.encodeRootObjectForKey(new XWSStat(sharepoint, entries), E_STAT), WOMessage.HTTP_STATUS_OK); } } static WOResponse getXMLResponseForStringAndStatus(String someContent, int aStatus) { WOResponse res = new WOResponse(); res.setContent(someContent); try { NSData data = res.content(); res = WSUtils.generateResponseForInputStream(data.stream(), data.length(), DEFAULT_RESPONSE_TYPE, ZIP_RESPONSE); res.setStatus(aStatus); } catch (IOException ex) { D.LOG(D.CMD, "WebShareDownloadManagerDirectAction: Error while generating XML-Response : " + ex); res.setContent("<Exception><![CDATA[" + ex + "]]></Exception>"); res.setStatus(WOMessage.HTTP_STATUS_INTERNAL_ERROR); } res.setDefaultEncoding("UTF8"); res.setContentEncoding("UTF8"); res.setHeader("text/xml; charset=UTF-8;", "Content-Type"); return res; } } 30 Montag, 2. Juli 2012
  • 31. XML Communication – Summary • WebObjects system to generate XML content • We use XML protocols to communicate with: iPad Document Hub – accessing/syncing documents from iOS WebShare Manager – a remote desktop project syncing solution • XML based commands, we have implemented: Login, EnumShares, EnumDirectory, FileStat, SpotlightSearch, Download, Upload, FileComments, ColorLabel, GetIcon, … 31 Montag, 2. Juli 2012
  • 32. WebShare Video Tour 32 Montag, 2. Juli 2012
  • 33. iPad Document Hub Video Tour 33 Montag, 2. Juli 2012
  • 35. HELIOS Solutions for Developers • Server Solution Suite includes: • AFP/SMB/Web file servers, imaging tools & PDF workflow Image/PDF conversion with ICC Color Management • Tool Server for remote automation of jobs • iPad Document Hub • Shared source of complete iOS App for customers Allows developing your own apps utilizing HELIOS server services 35 Montag, 2. Juli 2012
  • 36. WebObjects Wishes • Turn WebObjects source code into Darwin This would allow us to maintain it • Maintenance for WebObjects – fix problems, e.g. the 2 GB Upload stream limit: Apple bug report ID 10765546 36 Montag, 2. Juli 2012
  • 37. MONTREAL JUNE 30, JULY 1ST AND 2ND 2012 Q&A Montag, 2. Juli 2012