Symfony basic auth question...

297 views
Skip to first unread message

Dave Lane

unread,
Mar 9, 2017, 11:00:39 PM3/9/17
to nzp...@googlegroups.com
Hello all,

Hoping someone here has got an idea on this...

The situation:

1. I'm running a app called Mautic (https://mautic.net - it's like your
own MailChimp, but on steroids - it's built on top of Symfony) in a
Docker container (running PHP 7.0 in FPM configuration, listening on
port 9000 - if you want to try it, see
https://hub.docker.com/r/kiwilightweight/mautic/ )

2. the Docker host is running nginx, which then users the fastcgi_
framework to make requests on the 127.0.0.1:9000 forward port, and the
Docker container is talking to a host-based MySQL instance for database.

3. The end-user Mautic web app runs fine. Everything works.

4. The problem I'm having is with authenticating external apps to use
the Mautic API, which supports OAuth2, 1.a, or basic HTTP Auth. For
simplicity's sake, I'm wanting to use Basic Auth (I have SSL enabled).
Problem is I consistently get a 401 "API authorization denied." despite
the fact that I know the user details I'm using are valid because they
allow the user to log into the app's front-end and access the relevant data.

Using the same exact configuration (including nginx config) of Mautic
(but different network dynamics and slightly different nginx version) on
my dev machine, I can make curl requests from the commandline without
authentication problems, so it doesn't seem to be directly related to my
container/host configuration.

5. The Mautic authentication options are handled using Symfony plugins -
Basic Auth is handled by Mautic's http-foundation library (i.e. not at
the webserver layer as most HTTP Auth implementations do) and valid
Mautic users can authenticate.

I don't know much about Symfony or the HTTP_AUTHORIZATION header which
gets sent and somehow processed by the http-foundation libary.

I'm hoping someone on this list might've seen this sort of problem
before and has some insight! I'd *love* to focus on developing
functionality based on being able to talk to my Mautic instance!

Thanks in advance for any help!

Dave

--
Dave Lane - da...@davelane.nz; https://davelane.nz; +64 21 229 8147
GPG fingerprint: CE1E 5896 8D80 A78B E179  9E74 319B 083C 50EF AA94

Ivan Kurnosov

unread,
Mar 9, 2017, 11:07:37 PM3/9/17
to nzp...@googlegroups.com
Dave,

take a debugger (xdebug) and step through the whole application. That is the quickest way to find out what actually is being passed and how it should be passed instead (in case it comes in a wrong format).

--
--
NZ PHP Users Group: http://groups.google.com/group/nzphpug
To post, send email to nzp...@googlegroups.com
To unsubscribe, send email to
nzphpug+unsubscribe@googlegroups.com
---
You received this message because you are subscribed to the Google Groups "NZ PHP Users Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nzphpug+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
With best regards, Ivan Kurnosov

Dave Lane

unread,
Mar 9, 2017, 11:43:59 PM3/9/17
to nzp...@googlegroups.com
Thanks Ivan, will give that a go!

Dave

On 10/03/17 17:07, Ivan Kurnosov wrote:
> Dave,
>
> take a debugger (xdebug) and step through the whole application. That is
> the quickest way to find out what actually is being passed and how it
> should be passed instead (in case it comes in a wrong format).
>
> On 10 March 2017 at 17:00, Dave Lane <dangerd...@gmail.com
> <mailto:dangerd...@gmail.com>> wrote:
>
> Hello all,
>
> Hoping someone here has got an idea on this...
>
> The situation:
>
> 1. I'm running a app called Mautic (https://mautic.net - it's like your
> own MailChimp, but on steroids - it's built on top of Symfony) in a
> Docker container (running PHP 7.0 in FPM configuration, listening on
> port 9000 - if you want to try it, see
> https://hub.docker.com/r/kiwilightweight/mautic/
> <https://hub.docker.com/r/kiwilightweight/mautic/> )
>
> 2. the Docker host is running nginx, which then users the fastcgi_
> framework to make requests on the 127.0.0.1:9000
> <http://127.0.0.1:9000> forward port, and the
> Dave Lane - da...@davelane.nz <mailto:da...@davelane.nz>;
> https://davelane.nz; +64 21 229 8147 <tel:021%20229%208147>
> GPG fingerprint: CE1E 5896 8D80 A78B E179 9E74 319B 083C 50EF AA94
>
> --
> --
> NZ PHP Users Group: http://groups.google.com/group/nzphpug
> <http://groups.google.com/group/nzphpug>
> To post, send email to nzp...@googlegroups.com
> <mailto:nzp...@googlegroups.com>
> To unsubscribe, send email to
> nzphpug+u...@googlegroups.com
> <mailto:nzphpug%2Bunsu...@googlegroups.com>
> ---
> You received this message because you are subscribed to the Google
> Groups "NZ PHP Users Group" group.
> To unsubscribe from this group and stop receiving emails from it,
> send an email to nzphpug+u...@googlegroups.com
> <mailto:nzphpug+u...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout
> <https://groups.google.com/d/optout>.
>
>
>
>
> --
> With best regards, Ivan Kurnosov
>
> --
> --
> NZ PHP Users Group: http://groups.google.com/group/nzphpug
> To post, send email to nzp...@googlegroups.com
> To unsubscribe, send email to
> nzphpug+u...@googlegroups.com
> ---
> You received this message because you are subscribed to the Google
> Groups "NZ PHP Users Group" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to nzphpug+u...@googlegroups.com
> <mailto:nzphpug+u...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout.

--

Jim Tittsler

unread,
Mar 10, 2017, 10:17:07 PM3/10/17
to nzp...@googlegroups.com
On 03/10/2017 01:00 PM, Dave Lane wrote:
> I don't know much about Symfony or the HTTP_AUTHORIZATION header which
> gets sent and somehow processed by the http-foundation libary.

Are you sure you are passing the header through the nginx proxy? (I
don't understand your item 4. description above, so maybe that is what
you are describing.) Does it work if you talk directly to the Docker
port bypassing the proxy? If so, you probably need to add something like:

proxy_set_header Authorization $http_authorization;

Or you can experiment by putting a static, base64 encoded "user:pass"
there to start with.


Dave Lane

unread,
Mar 11, 2017, 4:36:02 AM3/11/17
to nzp...@googlegroups.com
Thanks for that suggestion, Jim - I've tried the base64 approach and
sadly it doesn't work on the remote instance (same 401 Access denied).

Oddly, I have managed to get valid api responses (so, successful auth,
not 401) on my local instance, running with the same configuration of
host-based nginx using fastcgi (no nginx reverse proxy) to talk to PHP
on a Docker container (nginx in my case talks to the mapped port 9000 on
localhost, which is the port PHP-FPM is listening on)...

It works with normal curl auth queries in the form of `curl -i
http(s)://user:pa...@mautic.local/api/contacts`.

Similarly Mautic's cloud-hosted reference version responds for me with
the same sort of queries (although I'm not sure how they configure it,
suspect they use Apache in any case).

Puzzling. Cheers,

anru chen

unread,
Mar 13, 2017, 4:29:37 PM3/13/17
to NZ PHP Users Group
hi:

is that http basic auth header removed by your remote machine?
need to check your remote machine's web server configuration.

3 places to check for errors, 
1 > symfony error log,
 2> your remote machine web server log.
3> php error log.

or your remote machine has some special security enhancements. 

anru


On 11 March 2017 at 22:35, Dave Lane <da...@davelane.nz> wrote:

On 11/03/17 16:17, Jim Tittsler wrote:
> On 03/10/2017 01:00 PM, Dave Lane wrote:
>> I don't know much about Symfony or the HTTP_AUTHORIZATION header which
>> gets sent and somehow processed by the http-foundation libary.
>
> Are you sure you are passing the header through the nginx proxy?  (I
> don't understand your item 4. description above, so maybe that is what
> you are describing.) Does it work if you talk directly to the Docker
> port bypassing the proxy? If so, you probably need to add something like:
>
> proxy_set_header Authorization $http_authorization;
>
> Or you can experiment by putting a static, base64 encoded "user:pass"
> there to start with.

Thanks for that suggestion, Jim - I've tried the base64 approach and
sadly it doesn't work on the remote instance (same 401 Access denied).

Oddly, I have managed to get valid api responses (so, successful auth,
not 401) on my local instance, running with the same configuration of
host-based nginx using fastcgi (no nginx reverse proxy) to talk to PHP
on a Docker container (nginx in my case talks to the mapped port 9000 on
localhost, which is the port PHP-FPM is listening on)...

It works with normal curl auth queries in the form of `curl -i
http(s)://user:pass@mautic.local/api/contacts`.


Similarly Mautic's cloud-hosted reference version responds for me with
the same sort of queries (although I'm not sure how they configure it,
suspect they use Apache in any case).

Puzzling. Cheers,

Dave
--
Dave Lane - da...@davelane.nz; https://davelane.nz; +64 21 229 8147
GPG fingerprint: CE1E 5896 8D80 A78B E179  9E74 319B 083C 50EF AA94

--
--
NZ PHP Users Group: http://groups.google.com/group/nzphpug
To post, send email to nzp...@googlegroups.com
To unsubscribe, send email to

---
You received this message because you are subscribed to the Google Groups "NZ PHP Users Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nzphpug+unsubscribe@googlegroups.com.

Kate Butler

unread,
Mar 13, 2017, 4:38:11 PM3/13/17
to NZ PHP Users Group
It just so happens I encountered a nasty issue with the HTTP Authorization header and nginx this week at work.

We have a listener which carries out some action according to whether our API is being called by an external system (OAuth), or from our own app (Basic auth), which was malfunctioning on our staging server.  It gets called after the authentication has been done via the FOS OAuth bundle - and the FOS Oauth bundle helpfully removes the Authorization header from the Request before it completes its work.

Our listener was working correctly on my local developer environment (still on Apache), where it was using apache_request_headers() to get the Authorization header.  It was not working on our staging and production servers, which have recently been switched to nginx.  If you want to access the Authorization header on nginx, you will need to get it via $_SERVER['HTTP_AUTHORIZATION'] - and according to our server admin, you also need to make sure your FPM config is set up correctly so that this value gets injected into $_SERVER.

Ivan Kurnosov

unread,
Mar 13, 2017, 4:43:43 PM3/13/17
to nzp...@googlegroups.com
"and according to our server admin, you also need to make sure your FPM config is set up correctly so that this value gets injected into $_SERVER." --- nothing very special is required.

Here is the config for an oauth2 server app (that uses Authorization header)

server {
    listen 80;

    server_name xxx;
    root /usr/share/zzz;


    location / {
        try_files $uri /app.php$is_args$args;
    }

    location ~ ^/app\.php(/|$) {
        fastcgi_pass php5-fpm;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;

        internal;
    }

    error_log /var/log/nginx/xxx;
    access_log /var/log/nginx/zzz;
}


--
--
NZ PHP Users Group: http://groups.google.com/group/nzphpug
To post, send email to nzp...@googlegroups.com
To unsubscribe, send email to
nzphpug+unsubscribe@googlegroups.com
---
You received this message because you are subscribed to the Google Groups "NZ PHP Users Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nzphpug+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Dave Lane

unread,
Mar 13, 2017, 5:56:16 PM3/13/17
to nzp...@googlegroups.com
Thanks Anru,

On 14/03/17 09:29, anru chen wrote:
> is that http basic auth header removed by your remote machine?
> need to check your remote machine's web server configuration.
>
> 3 places to check for errors,
> 1 > symfony error log,
> 2> your remote machine web server log.
> 3> php error log.

I'm not seeing any references in any logs... I have the nginx log (on
the host machine), a PHP log (the Docker container's stderr), but I
haven't found a useful Symfony log...

> or your remote machine has some special security enhancements.

I've been doing some reviews of the apparmor and ufw (Uncomplicated Fire
Wall) configurations on both my local machine (on which the Mautic Basic
Auth api calls work) and the dev server (on which the Basic Auth doesn't
work, returning the 401 error consistently) to see what might be different.

Amazingly, I haven't been able to find a difference yet. Both are using
equivalent nginx configurations (same version of nginx, too 1.10.0), and
both are using the *same* Docker image running PHP7.0 with the same
install process of Mautic... That implies that it's *not* the nginx
configuration (because it works on my local machine) nor is it the php
code or configuration, as they are identical... The only difference is
likely to be something subtle in either the network architecture or
perhaps minutiae of each machine's network configuration. Sigh. Tricky
for sure.

Cheers,

Dave

> anru
>
>
> On 11 March 2017 at 22:35, Dave Lane <da...@davelane.nz
> <mailto:da...@davelane.nz>> wrote:
>
>
> On 11/03/17 16:17, Jim Tittsler wrote:
> > On 03/10/2017 01:00 PM, Dave Lane wrote:
> >> I don't know much about Symfony or the HTTP_AUTHORIZATION header which
> >> gets sent and somehow processed by the http-foundation libary.
> >
> > Are you sure you are passing the header through the nginx proxy? (I
> > don't understand your item 4. description above, so maybe that is what
> > you are describing.) Does it work if you talk directly to the Docker
> > port bypassing the proxy? If so, you probably need to add something like:
> >
> > proxy_set_header Authorization $http_authorization;
> >
> > Or you can experiment by putting a static, base64 encoded "user:pass"
> > there to start with.
>
> Thanks for that suggestion, Jim - I've tried the base64 approach and
> sadly it doesn't work on the remote instance (same 401 Access denied).
>
> Oddly, I have managed to get valid api responses (so, successful auth,
> not 401) on my local instance, running with the same configuration of
> host-based nginx using fastcgi (no nginx reverse proxy) to talk to PHP
> on a Docker container (nginx in my case talks to the mapped port 9000 on
> localhost, which is the port PHP-FPM is listening on)...
>
> It works with normal curl auth queries in the form of `curl -i
> http(s)://user:pa...@mautic.local/api/contacts`.
>
> Similarly Mautic's cloud-hosted reference version responds for me with
> the same sort of queries (although I'm not sure how they configure it,
> suspect they use Apache in any case).
>
> Puzzling. Cheers,
>
> Dave
> --
> Dave Lane - da...@davelane.nz <mailto:da...@davelane.nz>;
> https://davelane.nz; +64 21 229 8147 <tel:%2B64%2021%20229%208147>
> GPG fingerprint: CE1E 5896 8D80 A78B E179 9E74 319B 083C 50EF AA94
>
> --
> --
> NZ PHP Users Group: http://groups.google.com/group/nzphpug
> <http://groups.google.com/group/nzphpug>
> To post, send email to nzp...@googlegroups.com
> <mailto:nzp...@googlegroups.com>
> To unsubscribe, send email to
> nzphpug+u...@googlegroups.com
> <mailto:nzphpug%2Bunsu...@googlegroups.com>
> ---
> You received this message because you are subscribed to the Google
> Groups "NZ PHP Users Group" group.
> To unsubscribe from this group and stop receiving emails from it,
> send an email to nzphpug+u...@googlegroups.com
> <mailto:nzphpug%2Bunsu...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout
> <https://groups.google.com/d/optout>.
>
>
> --
> --
> NZ PHP Users Group: http://groups.google.com/group/nzphpug
> To post, send email to nzp...@googlegroups.com
> To unsubscribe, send email to
> nzphpug+u...@googlegroups.com
> ---
> You received this message because you are subscribed to the Google
> Groups "NZ PHP Users Group" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to nzphpug+u...@googlegroups.com
> <mailto:nzphpug+u...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout.

Ivan Kurnosov

unread,
Mar 13, 2017, 5:59:39 PM3/13/17
to nzp...@googlegroups.com
 Sigh. Tricky for sure.

Not at all - if you took a debugger 4 days ago you would have solved it already.

Debugger is the only source of truth and guarantees some outcome in every case.

>     http(s)://user:pass@mautic.local/api/contacts`.

>
>     Similarly Mautic's cloud-hosted reference version responds for me with
>     the same sort of queries (although I'm not sure how they configure it,
>     suspect they use Apache in any case).
>
>     Puzzling. Cheers,
>
>     Dave
>     --
>     Dave Lane - da...@davelane.nz <mailto:da...@davelane.nz>;
>     https://davelane.nz; +64 21 229 8147 <tel:%2B64%2021%20229%208147>
>     GPG fingerprint: CE1E 5896 8D80 A78B E179  9E74 319B 083C 50EF AA94
>
>     --
>     --
>     NZ PHP Users Group: http://groups.google.com/group/nzphpug
>     <http://groups.google.com/group/nzphpug>
>     To post, send email to nzp...@googlegroups.com
>     <mailto:nzphpug@googlegroups.com>
>     To unsubscribe, send email to
>     ---
>     You received this message because you are subscribed to the Google
>     Groups "NZ PHP Users Group" group.
>     To unsubscribe from this group and stop receiving emails from it,

>     For more options, visit https://groups.google.com/d/optout
>     <https://groups.google.com/d/optout>.
>
>
> --
> --
> NZ PHP Users Group: http://groups.google.com/group/nzphpug
> To post, send email to nzp...@googlegroups.com
> To unsubscribe, send email to

> ---
> You received this message because you are subscribed to the Google
> Groups "NZ PHP Users Group" group.
> To unsubscribe from this group and stop receiving emails from it, send
> For more options, visit https://groups.google.com/d/optout.

--
Dave Lane - da...@davelane.nz; https://davelane.nz; +64 21 229 8147
GPG fingerprint: CE1E 5896 8D80 A78B E179  9E74 319B 083C 50EF AA94

--
--
NZ PHP Users Group: http://groups.google.com/group/nzphpug
To post, send email to nzp...@googlegroups.com
To unsubscribe, send email to

---
You received this message because you are subscribed to the Google Groups "NZ PHP Users Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nzphpug+unsubscribe@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.



--

Dave Lane

unread,
Mar 13, 2017, 6:02:53 PM3/13/17
to nzp...@googlegroups.com
Hi Kate,

On 10/03/17 22:02, Kate Butler wrote:
> It just so happens I encountered a nasty issue with the HTTP
> Authorization header and nginx this week at work.
>
> We have a listener which carries out some action according to whether
> our API is being called by an external system (OAuth), or from our own
> app (Basic auth), which was malfunctioning on our staging server. It
> gets called after the authentication has been done via the FOS OAuth
> bundle - and the FOS Oauth bundle helpfully removes the Authorization
> header from the Request before it completes its work.
>
> Our listener was working correctly on my local developer environment
> (still on Apache), where it was using apache_request_headers() to get
> the Authorization header. It was not working on our staging and
> production servers, which have recently been switched to nginx. If you
> want to access the Authorization header on nginx, you will need to get
> it via $_SERVER['HTTP_AUTHORIZATION'] - and according to our server
> admin, you also need to make sure your FPM config is set up correctly so
> that this value gets injected into $_SERVER.

Interesting - thanks for that tip. I'm already looking at
$_SERVER['HTTP_AUTHORIZATION'] - as Ivan's suggested elsewhere, I need
to get a proper debugging environment worked out.

Thanks!

Dave

> On Friday, 10 March 2017 17:00:39 UTC+13, Dave Lane wrote:
>
> Hello all,
>
> Hoping someone here has got an idea on this...
>
> The situation:
>
> 1. I'm running a app called Mautic (https://mautic.net - it's like your
> own MailChimp, but on steroids - it's built on top of Symfony) in a
> Docker container (running PHP 7.0 in FPM configuration, listening on
> port 9000 - if you want to try it, see
> https://hub.docker.com/r/kiwilightweight/mautic/
> <https://hub.docker.com/r/kiwilightweight/mautic/> )
>
> 2. the Docker host is running nginx, which then users the fastcgi_
> framework to make requests on the 127.0.0.1:9000
> <http://127.0.0.1:9000> forward port, and the
> Dave Lane - da...@davelane.nz <javascript:>; https://davelane.nz;
> +64 21 229 8147
> GPG fingerprint: CE1E 5896 8D80 A78B E179 9E74 319B 083C 50EF AA94
>
> --
> --
> NZ PHP Users Group: http://groups.google.com/group/nzphpug
> To post, send email to nzp...@googlegroups.com
> To unsubscribe, send email to
> nzphpug+u...@googlegroups.com
> ---
> You received this message because you are subscribed to the Google
> Groups "NZ PHP Users Group" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to nzphpug+u...@googlegroups.com
> <mailto:nzphpug+u...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout.

Dave Lane

unread,
Mar 13, 2017, 6:03:15 PM3/13/17
to nzp...@googlegroups.com
Hi Ivan,

On 14/03/17 10:59, Ivan Kurnosov wrote:
>> Sigh. Tricky for sure.
>
> Not at all - if you took a debugger 4 days ago you would have solved it
> already.
>
> Debugger is the only source of truth and guarantees some outcome in
> every case.

Understood - I've got Xdebug configured, but I only use open source
tools, and am reluctant to install a beast like Eclipse on my dev
machine (although I might have to give in on that)... Haven't succeeded
in getting a proper debug environment going with the remote environment
yet in any case. I think that's what I'll need, though. Thanks again for
your assistance.

Dave

> On 14 March 2017 at 10:55, Dave Lane <da...@davelane.nz
> > http(s)://user:pa...@mautic.local/api/contacts`.
> >
> > Similarly Mautic's cloud-hosted reference version responds for
> me with
> > the same sort of queries (although I'm not sure how they
> configure it,
> > suspect they use Apache in any case).
> >
> > Puzzling. Cheers,
> >
> > Dave
> > --
> > Dave Lane - da...@davelane.nz <mailto:da...@davelane.nz>
> <mailto:da...@davelane.nz <mailto:da...@davelane.nz>>;
> <tel:%2B64%2021%20229%208147> <tel:%2B64%2021%20229%208147>
> > GPG fingerprint: CE1E 5896 8D80 A78B E179 9E74 319B 083C 50EF AA94
> >
> > --
> > --
> > NZ PHP Users Group: http://groups.google.com/group/nzphpug
> <http://groups.google.com/group/nzphpug>
> > <http://groups.google.com/group/nzphpug
> <http://groups.google.com/group/nzphpug>>
> > To post, send email to nzp...@googlegroups.com <mailto:nzp...@googlegroups.com>
> > <mailto:nzp...@googlegroups.com
> <mailto:nzp...@googlegroups.com>>
> > To unsubscribe, send email to
> > nzphpug+u...@googlegroups.com
> <mailto:nzphpug%2Bunsu...@googlegroups.com>
> > <mailto:nzphpug%2Bunsu...@googlegroups.com
> <mailto:nzphpug%252Buns...@googlegroups.com>>
> > ---
> > You received this message because you are subscribed to the Google
> > Groups "NZ PHP Users Group" group.
> > To unsubscribe from this group and stop receiving emails from it,
> > send an email to nzphpug+u...@googlegroups.com
> <mailto:nzphpug%2Bunsu...@googlegroups.com>
> > <mailto:nzphpug%2Bunsu...@googlegroups.com
> <mailto:nzphpug%252Buns...@googlegroups.com>>.
> <http://groups.google.com/group/nzphpug>
> > To post, send email to nzp...@googlegroups.com <mailto:nzp...@googlegroups.com>
> > To unsubscribe, send email to
> > nzphpug+u...@googlegroups.com
> <mailto:nzphpug%2Bunsu...@googlegroups.com>
> > ---
> > You received this message because you are subscribed to the Google
> > Groups "NZ PHP Users Group" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> > an email to nzphpug+u...@googlegroups.com
> <mailto:nzphpug%2Bunsu...@googlegroups.com>
> > <mailto:nzphpug+u...@googlegroups.com
> <mailto:nzphpug%2Bunsu...@googlegroups.com>>.
> Dave Lane - da...@davelane.nz <mailto:da...@davelane.nz>;
> https://davelane.nz; +64 21 229 8147 <tel:%2B64%2021%20229%208147>
> GPG fingerprint: CE1E 5896 8D80 A78B E179 9E74 319B 083C 50EF AA94
>
> --
> --
> NZ PHP Users Group: http://groups.google.com/group/nzphpug
> <http://groups.google.com/group/nzphpug>
> To post, send email to nzp...@googlegroups.com
> <mailto:nzp...@googlegroups.com>
> To unsubscribe, send email to
> nzphpug+u...@googlegroups.com
> <mailto:nzphpug%2Bunsu...@googlegroups.com>
> ---
> You received this message because you are subscribed to the Google
> Groups "NZ PHP Users Group" group.
> To unsubscribe from this group and stop receiving emails from it,
> send an email to nzphpug+u...@googlegroups.com
> <mailto:nzphpug%2Bunsu...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout
> <https://groups.google.com/d/optout>.
>
>
>
>
> --
> With best regards, Ivan Kurnosov
>
> --
> --
> NZ PHP Users Group: http://groups.google.com/group/nzphpug
> To post, send email to nzp...@googlegroups.com
> To unsubscribe, send email to
> nzphpug+u...@googlegroups.com
> ---
> You received this message because you are subscribed to the Google
> Groups "NZ PHP Users Group" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to nzphpug+u...@googlegroups.com
> <mailto:nzphpug+u...@googlegroups.com>.
Reply all
Reply to author
Forward
0 new messages