Commit 9d7254970a3038c0f0fdc0342c92b3e99e4293f7
1 parent
2b1e8a36
Added interceptor solution.
Showing
8 changed files
with
362 additions
and
0 deletions
cpp11/Ice/auth_interceptor/Client.cpp
0 → 100644
1 | +// | ||
2 | +// Copyright (c) ZeroC, Inc. All rights reserved. | ||
3 | +// | ||
4 | + | ||
5 | +#include <Ice/Ice.h> | ||
6 | +#include <Context.h> | ||
7 | + | ||
8 | +using namespace std; | ||
9 | +using namespace Demo; | ||
10 | + | ||
11 | +int run(const shared_ptr<Ice::Communicator>&); | ||
12 | + | ||
13 | +int | ||
14 | +main(int argc, char* argv[]) | ||
15 | +{ | ||
16 | +#ifdef ICE_STATIC_LIBS | ||
17 | + Ice::registerIceSSL(); | ||
18 | +#endif | ||
19 | + | ||
20 | + int status = 0; | ||
21 | + | ||
22 | + try | ||
23 | + { | ||
24 | + // | ||
25 | + // CommunicatorHolder's ctor initializes an Ice communicator, | ||
26 | + // and its dtor destroys this communicator. | ||
27 | + // | ||
28 | + Ice::CommunicatorHolder ich(argc, argv, "config.client"); | ||
29 | + | ||
30 | + // | ||
31 | + // The communicator initialization removes all Ice-related arguments from argc/argv | ||
32 | + // | ||
33 | + if(argc > 1) | ||
34 | + { | ||
35 | + cerr << argv[0] << ": too many arguments" << endl; | ||
36 | + status = 1; | ||
37 | + } | ||
38 | + else | ||
39 | + { | ||
40 | + status = run(ich.communicator()); | ||
41 | + } | ||
42 | + } | ||
43 | + catch(const std::exception& ex) | ||
44 | + { | ||
45 | + cerr << argv[0] << ": " << ex.what() << endl; | ||
46 | + status = 1; | ||
47 | + } | ||
48 | + | ||
49 | + return status; | ||
50 | +} | ||
51 | + | ||
52 | +void menu(); | ||
53 | + | ||
54 | +int run(const shared_ptr<Ice::Communicator>& communicator) | ||
55 | +{ | ||
56 | + auto proxy = Ice::checkedCast<ContextPrx>(communicator->propertyToProxy("Context.Proxy")); | ||
57 | + if(!proxy) | ||
58 | + { | ||
59 | + cerr << "invalid proxy" << endl; | ||
60 | + return 1; | ||
61 | + } | ||
62 | + | ||
63 | + string token = proxy->login("user", "password"); | ||
64 | + | ||
65 | + try { | ||
66 | + proxy->function(); | ||
67 | + } | ||
68 | + catch(const std::exception& ex) | ||
69 | + { | ||
70 | + cerr << ex.what() << endl; | ||
71 | + } | ||
72 | + | ||
73 | + Ice::Context ctx; | ||
74 | + ctx["token"] = token; | ||
75 | + auto proxy2 = proxy->ice_context(ctx); | ||
76 | + proxy2->function(); | ||
77 | + | ||
78 | + return 0; | ||
79 | +} |
cpp11/Ice/auth_interceptor/Context.ice
0 → 100644
cpp11/Ice/auth_interceptor/ContextI.cpp
0 → 100644
1 | +// | ||
2 | +// Copyright (c) ZeroC, Inc. All rights reserved. | ||
3 | +// | ||
4 | + | ||
5 | +#include <Ice/Ice.h> | ||
6 | +#include <ContextI.h> | ||
7 | + | ||
8 | +using namespace std; | ||
9 | + | ||
10 | +std::string | ||
11 | +ContextI::login(std::string name, std::string passwd, const Ice::Current& /* c */) | ||
12 | +{ | ||
13 | + secretToken = name + passwd + std::to_string(rand()); | ||
14 | + return secretToken; | ||
15 | +} | ||
16 | + | ||
17 | +void | ||
18 | +ContextI::function(const Ice::Current& /* c */) | ||
19 | +{ | ||
20 | + cout << "In function" << endl; | ||
21 | +} | ||
22 | + | ||
23 | +void | ||
24 | +ContextI::shutdown(const Ice::Current& c) | ||
25 | +{ | ||
26 | + cout << "Shutting down..." << endl; | ||
27 | + c.adapter->getCommunicator()->shutdown(); | ||
28 | +} |
cpp11/Ice/auth_interceptor/ContextI.h
0 → 100644
1 | +// | ||
2 | +// Copyright (c) ZeroC, Inc. All rights reserved. | ||
3 | +// | ||
4 | + | ||
5 | +#ifndef CONTEXT_I_H | ||
6 | +#define CONTEXT_I_H | ||
7 | + | ||
8 | +#include <Context.h> | ||
9 | + | ||
10 | +class ContextI : public Demo::Context | ||
11 | +{ | ||
12 | + std::string secretToken; | ||
13 | +public: | ||
14 | + | ||
15 | + std::string login(std::string name, std::string passwd, const Ice::Current& c) override; | ||
16 | + void function(const Ice::Current& c) override; | ||
17 | + virtual void shutdown(const Ice::Current&) override; | ||
18 | + std::string getSecretToken() { return secretToken; }; | ||
19 | +}; | ||
20 | + | ||
21 | +#endif |
cpp11/Ice/auth_interceptor/README.md
0 → 100644
cpp11/Ice/auth_interceptor/Server.cpp
0 → 100644
1 | +// | ||
2 | +// Copyright (c) ZeroC, Inc. All rights reserved. | ||
3 | +// | ||
4 | + | ||
5 | +#include <Ice/Ice.h> | ||
6 | +#include <ContextI.h> | ||
7 | + | ||
8 | +using namespace std; | ||
9 | + | ||
10 | + | ||
11 | + | ||
12 | +class InterceptorI : public Ice::DispatchInterceptor | ||
13 | +{ | ||
14 | +public: | ||
15 | + InterceptorI(std::shared_ptr<ContextI> servant) : | ||
16 | + _servant(std::move(servant)) | ||
17 | + { | ||
18 | + } | ||
19 | + | ||
20 | + virtual bool dispatch(Ice::Request& request) override | ||
21 | + { | ||
22 | + auto c = request.getCurrent(); | ||
23 | + const auto p = c.ctx.find("token"); | ||
24 | + | ||
25 | + cout << "Operation: " << c.operation << endl; | ||
26 | + | ||
27 | + if (c.operation == "function") | ||
28 | + if ( (p == c.ctx.end()) || (p->second != _servant->getSecretToken()) ) | ||
29 | + throw Ice::OperationNotExistException(__FILE__, __LINE__); | ||
30 | + return _servant->ice_dispatch(request); | ||
31 | + } | ||
32 | + | ||
33 | + std::shared_ptr<ContextI> _servant; | ||
34 | +}; | ||
35 | + | ||
36 | + | ||
37 | +int main(int argc, char* argv[]) | ||
38 | +{ | ||
39 | +#ifdef ICE_STATIC_LIBS | ||
40 | + Ice::registerIceSSL(); | ||
41 | +#endif | ||
42 | + | ||
43 | + int status = 0; | ||
44 | + | ||
45 | + try | ||
46 | + { | ||
47 | + // | ||
48 | + // CtrlCHandler must be created before the communicator or any other threads are started | ||
49 | + // | ||
50 | + Ice::CtrlCHandler ctrlCHandler; | ||
51 | + | ||
52 | + // | ||
53 | + // CommunicatorHolder's ctor initializes an Ice communicator, | ||
54 | + // and its dtor destroys this communicator. | ||
55 | + // | ||
56 | + Ice::CommunicatorHolder ich(argc, argv, "config.server"); | ||
57 | + auto communicator = ich.communicator(); | ||
58 | + | ||
59 | + ctrlCHandler.setCallback( | ||
60 | + [communicator](int) | ||
61 | + { | ||
62 | + communicator->shutdown(); | ||
63 | + }); | ||
64 | + | ||
65 | + // | ||
66 | + // The communicator initialization removes all Ice-related arguments from argc/argv | ||
67 | + // | ||
68 | + if(argc > 1) | ||
69 | + { | ||
70 | + cerr << argv[0] << ": too many arguments" << endl; | ||
71 | + status = 1; | ||
72 | + } | ||
73 | + else | ||
74 | + { | ||
75 | + auto adapter = communicator->createObjectAdapter("Context"); | ||
76 | + | ||
77 | + auto servant = make_shared<ContextI>(); | ||
78 | + | ||
79 | + auto interceptor = make_shared<InterceptorI>(servant); | ||
80 | + | ||
81 | + adapter->add(interceptor, Ice::stringToIdentity("context")); | ||
82 | + adapter->activate(); | ||
83 | + | ||
84 | + communicator->waitForShutdown(); | ||
85 | + } | ||
86 | + } | ||
87 | + catch(const std::exception& ex) | ||
88 | + { | ||
89 | + cerr << ex.what() << endl; | ||
90 | + status = 1; | ||
91 | + } | ||
92 | + | ||
93 | + return status; | ||
94 | +} |
cpp11/Ice/auth_interceptor/config.client
0 → 100644
1 | +Ice.Override.Secure=1 | ||
2 | + | ||
3 | +# | ||
4 | +# The client reads this property to create the reference to the | ||
5 | +# "hello" object in the server. | ||
6 | +# | ||
7 | +Context.Proxy=context:ssl -p 10000 | ||
8 | + | ||
9 | +# | ||
10 | +# Enable implicit context on the communicator | ||
11 | +# | ||
12 | +Ice.ImplicitContext=Shared | ||
13 | + | ||
14 | +# | ||
15 | +# Warn about connection exceptions | ||
16 | +# | ||
17 | +Ice.Warn.Connections=1 | ||
18 | + | ||
19 | +# | ||
20 | +# Network Tracing | ||
21 | +# | ||
22 | +# 0 = no network tracing | ||
23 | +# 1 = trace connection establishment and closure | ||
24 | +# 2 = like 1, but more detailed | ||
25 | +# 3 = like 2, but also trace data transfer | ||
26 | +# | ||
27 | +Ice.Trace.Network=1 | ||
28 | + | ||
29 | +# | ||
30 | +# Protocol Tracing | ||
31 | +# | ||
32 | +# 0 = no protocol tracing | ||
33 | +# 1 = trace protocol messages | ||
34 | +# | ||
35 | +Ice.Trace.Protocol=1 | ||
36 | + | ||
37 | +# | ||
38 | +# Security Tracing | ||
39 | +# | ||
40 | +# 0 = no security tracing | ||
41 | +# 1 = trace messages | ||
42 | +# | ||
43 | +IceSSL.Trace.Security=1 | ||
44 | + | ||
45 | +# | ||
46 | +# SSL Configuration | ||
47 | +# | ||
48 | +Ice.Plugin.IceSSL=IceSSL:createIceSSL | ||
49 | + | ||
50 | +IceSSL.DefaultDir=../../../certs | ||
51 | +IceSSL.CAs=cacert.pem | ||
52 | +#IceSSL.CertFile=client.p12 | ||
53 | +#IceSSL.Password=password | ||
54 | +#IceSSL.Keychain=../../../certs/client.keychain | ||
55 | +#IceSSL.KeychainPassword=password | ||
56 | + | ||
57 | +IceSSL.VerifyPeer=1 | ||
0 | \ No newline at end of file | 58 | \ No newline at end of file |
cpp11/Ice/auth_interceptor/config.server
0 → 100644
1 | +Ice.Override.Secure=1 | ||
2 | +# | ||
3 | +# The server creates one single object adapter with the name | ||
4 | +# "Context". The following line sets the endpoints for this | ||
5 | +# adapter. | ||
6 | +# | ||
7 | +Context.Endpoints=ssl -p 10000 | ||
8 | + | ||
9 | +# | ||
10 | +# Warn about connection exceptions | ||
11 | +# | ||
12 | +Ice.Warn.Connections=1 | ||
13 | + | ||
14 | +# | ||
15 | +# Network Tracing | ||
16 | +# | ||
17 | +# 0 = no network tracing | ||
18 | +# 1 = trace connection establishment and closure | ||
19 | +# 2 = like 1, but more detailed | ||
20 | +# 3 = like 2, but also trace data transfer | ||
21 | +# | ||
22 | +#Ice.Trace.Network=1 | ||
23 | + | ||
24 | +# | ||
25 | +# Protocol Tracing | ||
26 | +# | ||
27 | +# 0 = no protocol tracing | ||
28 | +# 1 = trace protocol messages | ||
29 | +# | ||
30 | +#Ice.Trace.Protocol=1 | ||
31 | + | ||
32 | +# | ||
33 | +# Security Tracing | ||
34 | +# | ||
35 | +# 0 = no security tracing | ||
36 | +# 1 = trace messages | ||
37 | +# | ||
38 | +IceSSL.Trace.Security=1 | ||
39 | + | ||
40 | +# | ||
41 | +# SSL Configuration | ||
42 | +# | ||
43 | +Ice.Plugin.IceSSL=IceSSL:createIceSSL | ||
44 | + | ||
45 | +IceSSL.DefaultDir=../../../certs | ||
46 | +IceSSL.CAs=cacert.pem | ||
47 | +IceSSL.CertFile=server.p12 | ||
48 | +IceSSL.Password=password | ||
49 | +IceSSL.Keychain=../../../certs/server.keychain | ||
50 | +IceSSL.KeychainPassword=password | ||
51 | + | ||
52 | +IceSSL.VerifyPeer=0 | ||
0 | \ No newline at end of file | 53 | \ No newline at end of file |