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 | 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 | 53 | \ No newline at end of file | ... | ... |