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 |