/// <summary>
		/// 
		/// </summary>
		/// <param name="server"></param>
		/// <param name="context"></param>
		/// <param name="callbackEndPoint"></param>
		/// <param name="cancel"></param>
		public override void Run(IHostServer server, WebContext context, string callbackEndPoint, CancellationToken cancel) {
			var container = server.Container;
			if (container == null) {
				throw new Exception("Cannot access container");
			}
			var caProxy = container.Get<ICaWrapper>();
			if (caProxy == null) {
				throw new Exception("Cannot access CA proxy");
			}
			if (context.PreparedParameters == null) {
				context.PreparedParameters = RequestParameters.Create(context);
			}
			var certId = context.PreparedParameters.Get("cert");
			var message = context.PreparedParameters.Get("message");
			if (string.IsNullOrWhiteSpace(certId)) {
				throw new ArgumentException("Empty certificate fingerprint");
			}
			if (string.IsNullOrWhiteSpace(message)) {
				throw new ArgumentException("Empty encrypted message");
			}
			var user = caProxy.ProcessAuth(certId, message);
			if (user != null) {
				var result = ProcessUserLogin(user, server, context);
				var strResult = result.Result.stringify();
				context.Finish(strResult);
				return;
			}
			context.Finish("false");
		}
예제 #2
0
        public void Run(IHostServer server, WebContext context, string callbackEndPoint, CancellationToken cancel) {
            var id = context.User.Identity as Identity;
            if(null==id)throw new Exception("invalid identity type");
            if (null == id.ImpersonationSource) {
                if(!id.IsAdmin)throw new Exception("not admin");
            }
            var src = id.ImpersonationSource ?? id;
            var p = RequestParameters.Create(context);
            var to = p.Get("login");
            Identity newid = null;
            if (string.IsNullOrWhiteSpace(to)) {
                newid = (Identity)src;
            }
            else {
                var user = Users.GetUser(to);
                if (null != user) {
                    newid = new Identity(user);

                }
                else {
                    newid =new Identity{Name = to, IsAuthenticated = true};
                }
                newid.ImpersonationSource = src;
            }
            context.User = new GenericPrincipal(newid,null);
            var token = TokenService.Create(context.Request);
            newid.Token = token;
            TokenService.Store(context.Response,context.Request.Uri,token);
            context.Finish(newid.stringify());
        }
		/// <summary>
		/// 
		/// </summary>
		/// <param name="server"></param>
		/// <param name="context"></param>
		/// <param name="callbackEndPoint"></param>
		/// <param name="cancel"></param>
		public override void Run(IHostServer server, WebContext context, string callbackEndPoint, CancellationToken cancel) {
			if (context.PreparedParameters == null) {
				context.PreparedParameters = RequestParameters.Create(context);
			}
			var preparedParams = context.PreparedParameters;
			var fingerprint = preparedParams.Get("cert");
			var cms = preparedParams.Get("message");
			var container = server.Container;
			var caConfigProvider = container.Get<ICaConfigProvider>();
			if (caConfigProvider == null) {
				throw new Exception("Cannot get CA config");
			}
			var caConfig = caConfigProvider.GetConfig();
			if (caConfig == null || !caConfig.GetIsValid()) {
				throw new Exception("Not valid CA config");
			}
			var cmsDecryptor = new CmsDecryptor();
			cmsDecryptor.Initialize(caConfig);
			var cmsMessage = new CmsMessage {
				CertificateFingerprint = fingerprint,
				EncryptedMessage = cms
			};
			context.ContentType = MimeHelper.JSON;
			string salt;
			lock (TokenAuthGetSaltHandler.Sync) {
				salt = TokenAuthGetSaltHandler.Salts[fingerprint].Value;
			}
			var message = cmsDecryptor.Descrypt(cmsMessage);
			var result = message != salt ? "false" : "true";
			context.Finish(result);
		}
		public override void Run(IHostServer server, WebContext context, string callbackEndPoint, CancellationToken cancel) {
			var container = server.Container;
			if (container == null) {
				throw new Exception("Cannot access container");
			}
			if (context.PreparedParameters == null) {
				context.PreparedParameters = RequestParameters.Create(context);
			}
			var certId = context.PreparedParameters.Get("cert");
			if (string.IsNullOrWhiteSpace(certId)) {
				throw new ArgumentException("Empty certificate fingerprint");
			}
			var hostConfigProvider = container.Get<IHostConfigProvider>();
			if (hostConfigProvider == null) {
				throw new Exception("Cannot resolve server role");
			}
			var hostConfig = hostConfigProvider.GetConfig();
			if (hostConfig == null) {
				throw new Exception("Cannot resolve server role");
			}
			var definition = hostConfig.Definition;
			if (definition == null) {
				throw new Exception("Cannot resolve server role");
			}
			var caAttr = definition.Attr("ca");
			if (!string.IsNullOrWhiteSpace(caAttr) && caAttr.To<bool>()) {
				lock (Sync) {
					Salt saltObj;
					if (Salts.ContainsKey(certId)) {
						saltObj = Salts[certId];
						if (saltObj.Expire <= DateTime.UtcNow) {
							saltObj = new Salt {
								Value = Guid.NewGuid().ToString(),
								Expire = DateTime.UtcNow.AddHours(1)
							};
							Salts[certId] = saltObj;
						}
					} else {
						saltObj = new Salt {
							Value = Guid.NewGuid().ToString(),
							Expire = DateTime.UtcNow.AddHours(1)
						};
						Salts[certId] = saltObj;
					}
					context.Finish("\"" + saltObj.Value + "\"");
					CleanUpExpiredSaltsInternal();
					return;
				}
			}
			var caProxy = container.Get<ICaWrapper>();
			if (caProxy == null) {
				throw new Exception("Cannot access CA proxy");
			}
			context.ContentType = MimeHelper.JSON;
			var salt = caProxy.GetSalt(certId);
			context.Finish(salt);
		}
예제 #5
0
 public override void Run(IHostServer server, WebContext context, string callbackEndPoint,
     CancellationToken cancel) {
         var data = RequestParameters.Create(context);
         var name = data.Get("name");
         var content = data.Get("content");
         if (data.PostData.StartsWith("{"))
         {
             var json = Experiments.Json.Parse(data.PostData);
             name = (string)Experiments.Json.Get(json, "name");
             content = (string)Experiments.Json.Get(json, "content");
         }
         if (name.StartsWith("/") || name.Contains(".."))
         {
             throw new Exception("wrong and not-secure path " + name);
         }
         var root = EnvironmentInfo.ResolvePath("@repos@/.appdata");
         var fileName = Path.Combine(root, name);
         Directory.CreateDirectory(Path.GetDirectoryName(fileName));
         File.WriteAllText(fileName, content);
         context.Finish("OK");
 }
예제 #6
0
        public void Run(IHostServer server, WebContext context, string callbackEndPoint, CancellationToken cancel) {
            if (null!=Override) {
                if (Override(this, server, context)) {
                    return;
                }
            }

            var error = GetError?.Invoke(this, server, context) ?? Error;
            if (null != error) {
                throw error;
            }

            var status = GetStatus?.Invoke(this, server, context) ?? Status;
            var mime = GetMime?.Invoke(this, server, context) ?? Mime;
            var content = GetContent?.Invoke(this, server, context) ?? Content;
            var timeout = GetTimeout?.Invoke(this, server, context) ?? Timeout;

            if (0 < timeout) {
                Thread.Sleep(timeout);
            }

            context.Finish(content,mime,status);
        }
예제 #7
0
		private void RenderAsWiki(XElement x, WebContext r){
			var sb = new StringBuilder();
			BuildWiki(sb, x);
			r.Finish(sb.ToString(), "text/html");
		}
예제 #8
0
        private void RenderAsNative(XElement x, WebContext r)
        {
			r.Finish(x.ToString(), "text/xml");
		}