473,394 Members | 1,813 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,394 software developers and data experts.

Web service privileges

Hi,

I'm writing a Web service (the first one I've ever written in anger, by the
way) that has to do some AD manipulation and then has to create some
directories on some remote servers. Doing the AD stuff is fine, because I
can pass in suitable credentials: however this is not the case (AFAIK) with
the folder manipulation code. Here's an example of the kind of thing I want
to do:

....

// Create a new DirectoryInfo object
DirectoryInfo dInfo = new DirectoryInfo(@\\ourserver +
ProfilePathInfix +
"ade" +
@"\" +
_Personal_ID.ToLower());

if (!dInfo.Exists)
{
dInfo.Create();
}

// Get a DirectorySecurity object that represents the
// current security settings.
DirectorySecurity dSecurity = dInfo.GetAccessControl();

// Add the FileSystemAccessRule to the security settings.
dSecurity.AddAccessRule(new FileSystemAccessRule(@"OURDOMAIN\" +
_Personal_ID, FileSystemRights.FullControl, AccessControlType.Allow));

// Set the new access settings.
dInfo.SetAccessControl(dSecurity);

....

It seems to me that I have a couple of options:
* Have the Web service run as a privileged user
* Call a remote service that runs as a privileged user

I'd be glad to get any advice anyone can give on which option would be
better.

Personally, I'm not too worried about having the Web service run as a
privileged user, because it will be running on an internal server,
innaccessible from outside and only ever called from its own local host. So
I should be able to configure it to be pretty secure.

However, on a practical level, VS2005 doesn't create the Web service on the
development box Web server. As far as I can see, you have to publish the
service first. Does that mean that if I opt for the first choice (run as
privileged user) I will not be able to debug it in VS as a privileged user?

Cheers
Peter

Mar 12 '07 #1
7 2163
"Peter Bradley" <pb******@uwic.ac.ukwrote in message
news:%2****************@TK2MSFTNGP05.phx.gbl...
Hi,

I'm writing a Web service (the first one I've ever written in anger, by the way) that has
to do some AD manipulation and then has to create some directories on some remote servers.
Doing the AD stuff is fine, because I can pass in suitable credentials: however this is
not the case (AFAIK) with the folder manipulation code. Here's an example of the kind of
thing I want to do:

...

// Create a new DirectoryInfo object
DirectoryInfo dInfo = new DirectoryInfo(@\\ourserver +
ProfilePathInfix +
"ade" +
@"\" +
_Personal_ID.ToLower());

if (!dInfo.Exists)
{
dInfo.Create();
}

// Get a DirectorySecurity object that represents the
// current security settings.
DirectorySecurity dSecurity = dInfo.GetAccessControl();

// Add the FileSystemAccessRule to the security settings.
dSecurity.AddAccessRule(new FileSystemAccessRule(@"OURDOMAIN\" + _Personal_ID,
FileSystemRights.FullControl, AccessControlType.Allow));

// Set the new access settings.
dInfo.SetAccessControl(dSecurity);

...

It seems to me that I have a couple of options:
* Have the Web service run as a privileged user
* Call a remote service that runs as a privileged user

I'd be glad to get any advice anyone can give on which option would be better.

Personally, I'm not too worried about having the Web service run as a privileged user,
because it will be running on an internal server, innaccessible from outside and only ever
called from its own local host. So I should be able to configure it to be pretty secure.

However, on a practical level, VS2005 doesn't create the Web service on the development
box Web server. As far as I can see, you have to publish the service first. Does that
mean that if I opt for the first choice (run as privileged user) I will not be able to
debug it in VS as a privileged user?

Cheers
Peter

Why a webservice if it's sole purpose is to be called from the same box?
Anyway, you can't access remote resources like file servers from a webservice unless you:
- Run it as a domain user with admin privileges on the remote server.
- impersonate that same user in code.
- drop this part of your code in a COM+ server style application.

The easiest and most secure is the latter, just inherit your class from ComponentServices,
set the required attributes to enable the class to be hosted and register the class with the
COM+ catalog using regsvcs.exe.

Here are the assembly attributes needed, note that you may have to create a new guid for the
ApplicationID and change the version info and the ApplicationName.
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: ApplicationName("MyServer")]
[assembly: ApplicationAccessControl(AccessChecksLevel =
AccessChecksLevelOption.ApplicationComponent)]
[assembly: ApplicationID("ffc4e201-888f-4a15-be54-afe286ef70ac")]
[assembly: ApplicationActivation(ActivationOption.Server)]

following are the interface attributes (preferably in separate assembly, to be used by the
client code).

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("0f743bc7-b28e-4ebe-890f-d2a728da787c")]
public interface ISomeInterface
{
method declarations here...
}

following are the class attributes..

[JustInTimeActivation]
[ObjectPooling(Enabled = false)]
[Guid("17103ddc-d317-48ee-8585-8125c86ac4c5")]
[ProgId("xxxx.yyyyy")]
[ComVisible(true)]
public sealed class SomeClass: ServicedComponent, ISomeInterface
{
// implematation of ISomeInterface...
....

ProgId and Comvisible is required to expose this class to native COM clients too. same
remark as above for the guids.

Please refer to MSDN for more details.

Willy.
Mar 12 '07 #2
Thanks for that.

The reason for the strange configuration is because I'm calling the Web
service from BizTalk using the SOAP adapter. BizTalk send ports can't call
code directly. They do it via adapters. The easiest one we've found to use
for this purpose is the SOAP adapter (which calls a Web service). We did
consider coding our own adapter, but doing so would be far more complex than
using an existing one.

You say:
Anyway, you can't access remote resources like file servers from a
webservice unless you:
- Run it as a domain user with admin privileges on the remote server.
- impersonate that same user in code.
- drop this part of your code in a COM+ server style application.
I'm afraid I don't know how to do any of these things with Web services -
despite some searching on MSDN and elsewhere. However, since you express a
preference for the 3rd option, can you explain how a Web service can be
hosted in a COM+ server? You've lost me there, I think.

Thanks
Peter
"Willy Denoyette [MVP]" <wi*************@telenet.bewrote in message
news:ua**************@TK2MSFTNGP05.phx.gbl...
"Peter Bradley" <pb******@uwic.ac.ukwrote in message
news:%2****************@TK2MSFTNGP05.phx.gbl...
>Hi,

I'm writing a Web service (the first one I've ever written in anger, by
the way) that has to do some AD manipulation and then has to create some
directories on some remote servers. Doing the AD stuff is fine, because I
can pass in suitable credentials: however this is not the case (AFAIK)
with the folder manipulation code. Here's an example of the kind of
thing I want to do:

...

// Create a new DirectoryInfo object
DirectoryInfo dInfo = new DirectoryInfo(@\\ourserver +
ProfilePathInfix +
"ade" +
@"\" +
_Personal_ID.ToLower());

if (!dInfo.Exists)
{
dInfo.Create();
}

// Get a DirectorySecurity object that represents the
// current security settings.
DirectorySecurity dSecurity = dInfo.GetAccessControl();

// Add the FileSystemAccessRule to the security settings.
dSecurity.AddAccessRule(new FileSystemAccessRule(@"OURDOMAIN\" +
_Personal_ID, FileSystemRights.FullControl, AccessControlType.Allow));

// Set the new access settings.
dInfo.SetAccessControl(dSecurity);

...

It seems to me that I have a couple of options:
* Have the Web service run as a privileged user
* Call a remote service that runs as a privileged user

I'd be glad to get any advice anyone can give on which option would be
better.

Personally, I'm not too worried about having the Web service run as a
privileged user, because it will be running on an internal server,
innaccessible from outside and only ever called from its own local host.
So I should be able to configure it to be pretty secure.

However, on a practical level, VS2005 doesn't create the Web service on
the development box Web server. As far as I can see, you have to publish
the service first. Does that mean that if I opt for the first choice
(run as privileged user) I will not be able to debug it in VS as a
privileged user?

Cheers
Peter


Why a webservice if it's sole purpose is to be called from the same box?
Anyway, you can't access remote resources like file servers from a
webservice unless you:
- Run it as a domain user with admin privileges on the remote server.
- impersonate that same user in code.
- drop this part of your code in a COM+ server style application.

The easiest and most secure is the latter, just inherit your class from
ComponentServices, set the required attributes to enable the class to be
hosted and register the class with the COM+ catalog using regsvcs.exe.

Here are the assembly attributes needed, note that you may have to create
a new guid for the ApplicationID and change the version info and the
ApplicationName.
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: ApplicationName("MyServer")]
[assembly: ApplicationAccessControl(AccessChecksLevel =
AccessChecksLevelOption.ApplicationComponent)]
[assembly: ApplicationID("ffc4e201-888f-4a15-be54-afe286ef70ac")]
[assembly: ApplicationActivation(ActivationOption.Server)]

following are the interface attributes (preferably in separate assembly,
to be used by the client code).

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("0f743bc7-b28e-4ebe-890f-d2a728da787c")]
public interface ISomeInterface
{
method declarations here...
}

following are the class attributes..

[JustInTimeActivation]
[ObjectPooling(Enabled = false)]
[Guid("17103ddc-d317-48ee-8585-8125c86ac4c5")]
[ProgId("xxxx.yyyyy")]
[ComVisible(true)]
public sealed class SomeClass: ServicedComponent, ISomeInterface
{
// implematation of ISomeInterface...
...

ProgId and Comvisible is required to expose this class to native COM
clients too. same remark as above for the guids.

Please refer to MSDN for more details.

Willy.


Mar 12 '07 #3
On 12 Mar, 16:06, "Peter Bradley" <pbrad...@uwic.ac.ukwrote:
Thanks for that.

The reason for the strange configuration is because I'm calling the Web
service from BizTalk using the SOAP adapter. BizTalk send ports can't call
code directly. They do it via adapters. The easiest one we've found to use
for this purpose is the SOAP adapter (which calls a Web service). We did
consider coding our own adapter, but doing so would be far more complex than
using an existing one.

You say:
Anyway, you can't access remote resources like file servers from a
webservice unless you:
- Run it as a domain user with admin privileges on the remote server.
- impersonate that same user in code.
- drop this part of your code in a COM+ server style application.

I'm afraid I don't know how to do any of these things with Web services -
despite some searching on MSDN and elsewhere. However, since you express a
preference for the 3rd option, can you explain how a Web service can be
hosted in a COM+ server? You've lost me there, I think.

Thanks

Peter

"Willy Denoyette [MVP]" <willy.denoye...@telenet.bewrote in messagenews:ua**************@TK2MSFTNGP05.phx.gbl. ..
"Peter Bradley" <pbrad...@uwic.ac.ukwrote in message
news:%2****************@TK2MSFTNGP05.phx.gbl...
Hi,
I'm writing a Web service (the first one I've ever written in anger, by
the way) that has to do some AD manipulation and then has to create some
directories on some remote servers. Doing the AD stuff is fine, because I
can pass in suitable credentials: however this is not the case (AFAIK)
with the folder manipulation code. Here's an example of the kind of
thing I want to do:
...
// Create a new DirectoryInfo object
DirectoryInfo dInfo = new DirectoryInfo(@\\ourserver +
ProfilePathInfix +
"ade" +
@"\" +
_Personal_ID.ToLower());
if (!dInfo.Exists)
{
dInfo.Create();
}
// Get a DirectorySecurity object that represents the
// current security settings.
DirectorySecurity dSecurity = dInfo.GetAccessControl();
// Add the FileSystemAccessRule to the security settings.
dSecurity.AddAccessRule(new FileSystemAccessRule(@"OURDOMAIN\" +
_Personal_ID, FileSystemRights.FullControl, AccessControlType.Allow));
// Set the new access settings.
dInfo.SetAccessControl(dSecurity);
...
It seems to me that I have a couple of options:
* Have the Web service run as a privileged user
* Call a remote service that runs as a privileged user
I'd be glad to get any advice anyone can give on which option would be
better.
Personally, I'm not too worried about having the Web service run as a
privileged user, because it will be running on an internal server,
innaccessible from outside and only ever called from its own local host.
So I should be able to configure it to be pretty secure.
However, on a practical level, VS2005 doesn't create the Web service on
the development box Web server. As far as I can see, you have to publish
the service first. Does that mean that if I opt for the first choice
(run as privileged user) I will not be able to debug it in VS as a
privileged user?
Cheers
Peter
Why a webservice if it's sole purpose is to be called from the same box?
Anyway, you can't access remote resources like file servers from a
webservice unless you:
- Run it as a domain user with admin privileges on the remote server.
- impersonate that same user in code.
- drop this part of your code in a COM+ server style application.
The easiest and most secure is the latter, just inherit your class from
ComponentServices, set the required attributes to enable the class to be
hosted and register the class with the COM+ catalog using regsvcs.exe.
Here are the assembly attributes needed, note that you may have to create
a new guid for the ApplicationID and change the version info and the
ApplicationName.
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: ApplicationName("MyServer")]
[assembly: ApplicationAccessControl(AccessChecksLevel =
AccessChecksLevelOption.ApplicationComponent)]
[assembly: ApplicationID("ffc4e201-888f-4a15-be54-afe286ef70ac")]
[assembly: ApplicationActivation(ActivationOption.Server)]
following are the interface attributes (preferably in separate assembly,
to be used by the client code).
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("0f743bc7-b28e-4ebe-890f-d2a728da787c")]
public interface ISomeInterface
{
method declarations here...
}
following are the class attributes..
[JustInTimeActivation]
[ObjectPooling(Enabled = false)]
[Guid("17103ddc-d317-48ee-8585-8125c86ac4c5")]
[ProgId("xxxx.yyyyy")]
[ComVisible(true)]
public sealed class SomeClass: ServicedComponent, ISomeInterface
{
// implematation of ISomeInterface...
...
ProgId and Comvisible is required to expose this class to native COM
clients too. same remark as above for the guids.
Please refer to MSDN for more details.
Willy.- Hide quoted text -

- Show quoted text -
I could be way off base, but I think he's suggesting host the
problematic bit of code in COM+ and call the COM+ component from your
web service.
I have some similar issues at the moment but I'm not as far into the
project as you, so I look forward to seeing what the solution turns
out to be :)

Mar 12 '07 #4
"Peter Bradley" <pb******@uwic.ac.ukwrote in message
news:uK**************@TK2MSFTNGP06.phx.gbl...
Thanks for that.

The reason for the strange configuration is because I'm calling the Web service from
BizTalk using the SOAP adapter. BizTalk send ports can't call code directly. They do it
via adapters. The easiest one we've found to use for this purpose is the SOAP adapter
(which calls a Web service). We did consider coding our own adapter, but doing so would
be far more complex than using an existing one.

You say:
>Anyway, you can't access remote resources like file servers from a webservice unless you:
- Run it as a domain user with admin privileges on the remote server.
- impersonate that same user in code.
- drop this part of your code in a COM+ server style application.

I'm afraid I don't know how to do any of these things with Web services - despite some
searching on MSDN and elsewhere. However, since you express a preference for the 3rd
option, can you explain how a Web service can be hosted in a COM+ server? You've lost me
there, I think.

Thanks
You don't host the webservice in a COM+ server, you have to host the "security sensitive"
code in a COM+ hosted process, security sensitive means code that needs admin privileges to
perform it's tasks, so this includes access to the AD as well as other windows resources
like fileservers.
You can keep your webservice as is, all you do is call your method(s) on a class that runs
in a remotely process. You have to configure the process (COM+) such that it runs in the
account of a "domain admin" having the necessary privileges to access the remote servers
resources, while your Webservice keeps running in the account of a less privileged user.
Note that you can apply role based security at the COM+ level, this allows you to apply
"fine grained" access control.

So basically what you have is this:

[Webservice -- 1 --COM+ process ]---- 2 ----[Remote servers resource]

1 = cross-process call
2 = cross-machine call
The Webservice call a method on the interface implemented by the class running in the COM+
server.

Willy.

Mar 12 '07 #5
Yeah. What we've decided to do is not to use COM+, but to use a remote
object (Single call SAO over TCP/IP) to do all the AD and file system
manipulations. The remote object will be hosted in a service on our
application server, and that service will run as the privileged user. We'll
try to ensure that the Web service will only accept calls from BizTalk
itself and that the remote service will only accept calls from the BizTalk
server.

It's not a perfect solution, but I think it should be secure enough. I just
hope it turns out to reliable enough. This particular piece of systems
integration needs a highly reliable solution.
Peter
"Willy Denoyette [MVP]" <wi*************@telenet.bewrote in message
news:OS**************@TK2MSFTNGP06.phx.gbl...
"Peter Bradley" <pb******@uwic.ac.ukwrote in message
news:uK**************@TK2MSFTNGP06.phx.gbl...
>Thanks for that.

The reason for the strange configuration is because I'm calling the Web
service from BizTalk using the SOAP adapter. BizTalk send ports can't
call code directly. They do it via adapters. The easiest one we've
found to use for this purpose is the SOAP adapter (which calls a Web
service). We did consider coding our own adapter, but doing so would be
far more complex than using an existing one.

You say:
>>Anyway, you can't access remote resources like file servers from a
webservice unless you:
- Run it as a domain user with admin privileges on the remote server.
- impersonate that same user in code.
- drop this part of your code in a COM+ server style application.

I'm afraid I don't know how to do any of these things with Web services -
despite some searching on MSDN and elsewhere. However, since you express
a preference for the 3rd option, can you explain how a Web service can be
hosted in a COM+ server? You've lost me there, I think.

Thanks

You don't host the webservice in a COM+ server, you have to host the
"security sensitive" code in a COM+ hosted process, security sensitive
means code that needs admin privileges to perform it's tasks, so this
includes access to the AD as well as other windows resources like
fileservers.
You can keep your webservice as is, all you do is call your method(s) on a
class that runs in a remotely process. You have to configure the process
(COM+) such that it runs in the account of a "domain admin" having the
necessary privileges to access the remote servers resources, while your
Webservice keeps running in the account of a less privileged user. Note
that you can apply role based security at the COM+ level, this allows you
to apply "fine grained" access control.

So basically what you have is this:

[Webservice -- 1 --COM+ process ]---- 2 ----[Remote servers resource]

1 = cross-process call
2 = cross-machine call
The Webservice call a method on the interface implemented by the class
running in the COM+ server.

Willy.

Mar 13 '07 #6
"Peter Bradley" <pb******@uwic.ac.ukwrote in message
news:O2**************@TK2MSFTNGP04.phx.gbl...
Yeah. What we've decided to do is not to use COM+, but to use a remote object (Single
call SAO over TCP/IP) to do all the AD and file system manipulations. The remote object
will be hosted in a service on our application server, and that service will run as the
privileged user. We'll try to ensure that the Web service will only accept calls from
BizTalk itself and that the remote service will only accept calls from the BizTalk server.

It's not a perfect solution, but I think it should be secure enough. I just hope it turns
out to reliable enough. This particular piece of systems integration needs a highly
reliable solution.
That's why I suggested to use COM+, you can configure COM+ to run as a Service without you
have to implement a service, and you can take advantage of the COM+ features like transport
security and automatic recovery in case of server failures. Sure you can do this all by
yourself but why re-invent the wheel?, especially when using Biztalk which already
integrates with COM+.

Willy.
Mar 13 '07 #7
You may well be right, Willy. However there are a couple of reason for
doing what we've decided to do. Firstly we understand .NET remoting: we
don't understand COM+. Secondly, I'm not sure that BizTalk 2006 does
integrate all that easily with COM+ any more. Early versions of BizTalk
certainly did, but my impression from the training and our subsequent
experience is that BTS2006 needs to connect to its end points via adapters.
The choice is therefore between using an existing adapter or rolling your
own. Clearly, using an existing one is much easier, and therefore quicker.

Finally, automatic recovery won't necessarily help. Successful recovery may
not be possble. It's avoiding the need for recovery that's important, so
I'm nervous about adding another element to the chain - whether that element
is COM+ or .NET remoting.

But many thanks for your help and constructive suggestions.
Peter
"Willy Denoyette [MVP]" <wi*************@telenet.bewrote in message
news:%2****************@TK2MSFTNGP05.phx.gbl...
"Peter Bradley" <pb******@uwic.ac.ukwrote in message
news:O2**************@TK2MSFTNGP04.phx.gbl...
>Yeah. What we've decided to do is not to use COM+, but to use a remote
object (Single call SAO over TCP/IP) to do all the AD and file system
manipulations. The remote object will be hosted in a service on our
application server, and that service will run as the privileged user.
We'll try to ensure that the Web service will only accept calls from
BizTalk itself and that the remote service will only accept calls from
the BizTalk server.

It's not a perfect solution, but I think it should be secure enough. I
just hope it turns out to reliable enough. This particular piece of
systems integration needs a highly reliable solution.

That's why I suggested to use COM+, you can configure COM+ to run as a
Service without you have to implement a service, and you can take
advantage of the COM+ features like transport security and automatic
recovery in case of server failures. Sure you can do this all by yourself
but why re-invent the wheel?, especially when using Biztalk which already
integrates with COM+.

Willy.


Mar 14 '07 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Glenn Venzke | last post by:
I'd like to write a windows service. Unfortunately, my company would only spring for the standard edition of VB.NET which doesn't support the creation of windows services. Is it possible to write one...
2
by: cd | last post by:
Is there a specific process or permissions that must be granted to get a .NET (framework 1.4) Window Service to run properly on a Windows 2003 Server? I built a Windows Service to start two local...
0
by: Johyson | last post by:
Hi, I am using a windows service which does two things 1. It calls an exe which is a screen scraping program and needs to interact with the desktop. 2. It calls an web service, which...
5
by: Claire | last post by:
I'm testing my first service and I'm receiving the above exception whenever I attempt to open some files for writing. Reading is fine. The files are on the same directory as my service application...
23
by: Adam Clauss | last post by:
I have a C# Windows Service running as the NetworkService account because it needs to access a network share. As part of the service's initialization, I want the service to terminate, if an...
3
by: Doug Bailey | last post by:
I am trying to control a Windows Service via a Web Service interface. (I am developing in .NET2003) I am using the ServiceController object which allows me to read the state of the services with...
3
by: Ahmad Jalil Qarshi | last post by:
Hi! I am developing an application in C# as a windows NT Service. This application needs to check for eventlog using EventLog.Exists("System") But unfortunately it generates exception...
27
by: pisquem | last post by:
I am building an windows service that is to be deployed on a windows server 2003 and I want to have activity written to the event log, I want its own log called ('CustomLog') Below is what I...
33
by: JamesB | last post by:
I am writing a service that monitors when a particular app is started. Works, but I need to get the user who is currently logged in, and of course Environment.UserName returns the service logon...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.