コード例 #1
0
        public void Print()
        {
            if (RunAsUser)
            {
                MemoryStream stdin  = new MemoryStream();
                MemoryStream stdout = new MemoryStream();
                MemoryStream stderr = new MemoryStream();

                try
                {
                    Serialize(stdin, this);
                    stdin.Flush();
                    stdin.Position = 0;

                    int retcode = WindowsIdentityStore.RunProcessAsUser(UserName, stdin, stdout, stderr, Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), Assembly.GetExecutingAssembly().Location, new string[] { "-print" });

                    if (retcode != 0)
                    {
                        stderr.Position = 0;
                        Logger.Log(LogLevel.Info, "Error printing file:\n{0}", System.Text.Encoding.ASCII.GetString(stderr.ToArray()));
                        throw new AggregateException((Exception)Deserialize(stderr));
                    }
                }
                finally
                {
                    stdin.Dispose();
                    stdout.Dispose();
                    stderr.Dispose();
                }
            }
            else
            {
                Run();
            }
        }
コード例 #2
0
        public HttpResponseMessage Get()
        {
            bool isadmin = WindowsIdentityStore.IsUserAdmin(Session["username"]);

            if (isadmin)
            {
                if (!PrintProxy.IsRegistered)
                {
                    return(Page(
                               new XElement("div", GetRegistrationRequestForm())
                               ));
                }
                else
                {
                    return(Page(
                               new XElement("div", "This print proxy is already registered."),
                               new XElement("div", new XElement("a", new XAttribute("href", Url.Route("default", new { controller = "Home" })), "Return to Print Proxy information page"))
                               ));
                }
            }
            else
            {
                return(Forbidden());
            }
        }
コード例 #3
0
        public HttpResponseMessage Get(string JobID)
        {
            CloudPrintJob job = PrintProxy.GetCloudPrintJobById(JobID);

            if (job == null)
            {
                return(new HttpResponseMessage(System.Net.HttpStatusCode.NotFound));
            }

            string username = Request.GetSession()["username"];

            bool isadmin = WindowsIdentityStore.IsUserAdmin(username);

            if (isadmin || username == job.Username)
            {
                HttpResponseMessage response = new HttpResponseMessage
                {
                    Content = new StreamContent(new MemoryStream(job.GetPrintData()))
                };
                response.Content.Headers.ContentType.MediaType = "application/pdf";

                return(response);
            }
            else
            {
                return(new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden));
            }
        }
コード例 #4
0
        public static bool Authenticate(Session session, string username, SecureString password)
        {
            var identity = WindowsIdentityStore.Login(username, password);

            if (identity != null && identity.IsAuthenticated)
            {
                session["username"] = username;
                return(true);
            }

            return(false);
        }
コード例 #5
0
        public HttpResponseMessage Get()
        {
            bool isadmin = WindowsIdentityStore.IsUserAdmin(Session["username"]);

            if (isadmin)
            {
                return(GetUserIds());
            }
            else
            {
                return(Forbidden());
            }
        }
コード例 #6
0
        private void ProcessPrintJob(CloudPrintJob job)
        {
            if (DateTime.Now > job.CreateTime.AddDays(Config.MaxJobAgeInDays))
            {
                Logger.Log(LogLevel.Info, "Job {0} from {1}@{2} expired (Job created {3}, maxage: {4} days)", job.JobID, job.Username, job.Domain, job.CreateTime, Config.MaxJobAgeInDays);
                job.SetError("Expired", "Job expired in queue");
            }
            else if (!WindowsIdentityStore.IsAcceptedDomain(job.Domain))
            {
                Logger.Log(LogLevel.Info, "Job {0} deferred because {1}@{2} is not in an accepted domain", job.JobID, job.Username, job.Domain);
            }
            else
            {
                using (JobPrinter printer = Activator.CreateInstance(job.Printer.GetJobPrinterType()) as JobPrinter)
                {
                    if (!printer.UserCanPrint(job.Username))
                    {
                        if (printer.NeedUserAuth)
                        {
                            Logger.Log(LogLevel.Debug, "Job {0} deferred because {1} has not logged in", job.JobID, job.Username);

                            if (!job.DeliveryAttempted)
                            {
                                NotifyUserToLogin(job);
                            }
                        }

                        job.SetDeliveryAttempted();
                        UserDeferredJobs.GetOrAdd(job.Username, new ConcurrentQueue <CloudPrintJob>()).Enqueue(job);
                    }
                    else
                    {
                        job.SetStatus(CloudPrintJobStatus.IN_PROGRESS);
                        try
                        {
                            Logger.Log(LogLevel.Info, "Starting job {0}", job.JobID);
                            printer.Print(job);
                            Logger.Log(LogLevel.Info, "Job {0} Finished", job.JobID);
                            job.SetStatus(CloudPrintJobStatus.DONE);
                        }
                        catch (Exception ex)
                        {
                            Logger.Log(LogLevel.Info, "Job {0} in error:\nException:\n{1}\n{2}", job.JobID, ex.Message, ex.ToString());
                            job.SetStatus(CloudPrintJobStatus.QUEUED);
                            //job.SetError(ex.GetType().Name, ex.Message);
                        }
                    }
                }
            }
        }
コード例 #7
0
        public HttpResponseMessage Post(FormDataCollection form)
        {
            bool isadmin = WindowsIdentityStore.IsUserAdmin(Session["username"]);

            if (isadmin && !PrintProxy.IsRegistered)
            {
                switch (form.Get("Action"))
                {
                case "RegisterProxy": return(Register());

                case "GetAuthCode": return(GetAuthCode(form.Get("Email")));
                }
            }

            return(Forbidden());
        }
コード例 #8
0
        public HttpResponseMessage Get()
        {
            bool isadmin = WindowsIdentityStore.IsUserAdmin(Session["username"]);

            if (!PrintProxy.IsRegistered)
            {
                return(Page(
                           new XElement("div", "This cloud print proxy is not yet registered"),
                           isadmin ? new XElement("div", new XElement("a", new XAttribute("href", Url.Route("default", new { controller = "Register" })), "Register the print proxy")) : null
                           ));
            }
            else
            {
                HttpResponseMessage page = Page();
                this.PrintProxy.RestartDeferredJobs(Session["username"]);
                return(page);
            }
        }
コード例 #9
0
        public HttpResponseMessage Post(FormDataCollection form)
        {
            bool isadmin = WindowsIdentityStore.IsUserAdmin(Session["username"]);

            if (isadmin)
            {
                switch (form.Get("Action"))
                {
                case "Delete": return(Delete(form));

                case "AddUsers": return(AddUsers(form.Get("UserId"), CSVToList(form.Get("Usernames"))));

                case "AddUserId": return(AddUserId(form.Get("UserId"), CSVToList(form.Get("Usernames"))));
                }
            }

            return(Forbidden());
        }
コード例 #10
0
        public HttpResponseMessage Get(string username)
        {
            bool         isauthenticated = WindowsIdentityStore.HasWindowsIdentity(username);
            int          jobswaiting     = PrintProxy.GetCloudPrintJobsForUser(username).Where(j => j.Status == CloudPrintJobStatus.QUEUED).Count();
            StringWriter writer          = new StringWriter();

            JsonHelper.WriteJson(writer, new
            {
                isauthenticated = isauthenticated,
                jobswaiting     = jobswaiting
            });

            HttpResponseMessage response = new HttpResponseMessage();

            response.Content = new StringContent(writer.ToString(), Encoding.UTF8, "application/json");
            response.Headers.Add("Access-Control-Allow-Origin", "*");
            return(response);
        }
コード例 #11
0
        protected bool IsAuthorized(HttpActionContext actionContext)
        {
            Session session  = actionContext.Request.GetSession();
            string  username = session["username"];

            if (username != null)
            {
                if (WindowsIdentityStore.HasWindowsIdentity(username))
                {
                    return(true);
                }
            }

            var auth = actionContext.Request.Headers.Authorization;

            if (auth != null)
            {
                byte[] authdata = Convert.FromBase64String(auth.Parameter);
                username = Encoding.UTF8.GetString(authdata.TakeWhile(c => c != (byte)':').ToArray());
                return(Authenticate(session, username, authdata.SkipWhile(c => c != (byte)':').Skip(1).ToArray()));
            }

            return(false);
        }
コード例 #12
0
        protected HttpResponseMessage Page(params object[] elements)
        {
            try
            {
                bool isadmin = WindowsIdentityStore.IsUserAdmin(Session["username"]);

                return(Html(
                           Head("Cloud Print Server"),
                           Body(
                               H1("Cloud Print Server"),
                               new XElement("p", "Welcome to the Cloud Print Server, " + Session["username"]),
                               elements,
                               new XElement("p",
                                            "Please go to ",
                                            new XElement("a",
                                                         new XAttribute("href", "http://google.com/cloudprint"),
                                                         "Google Cloud Print"
                                                         ),
                                            " to manage your printers."
                                            ),
                               PrintProxy.OAuthTicket == null ? null: new XElement("p", new XElement("p", PrintProxy.OAuthTicket.AccessToken)),
                               //isadmin ? new XElement("p", new XElement("a", new XAttribute("href", Url.Route("default", new { controller = "Auditron" })), "Auditron Username to Printer Code mapping")) : null,
                               this.PrintProxy.Queues == null ? null : new XElement("dl",
                                                                                    new XElement("dt", "This server is sharing the following printers:"),
                                                                                    new XElement("dd",
                                                                                                 new XElement("ul",
                                                                                                              this.PrintProxy.Queues.Select(q =>
                                                                                                                                            new XElement("li",
                                                                                                                                                         new XElement("a",
                                                                                                                                                                      new XAttribute("href", "https://www.google.com/cloudprint#printer/id/" + q.PrinterID),
                                                                                                                                                                      q.Name
                                                                                                                                                                      )
                                                                                                                                                         )
                                                                                                                                            )
                                                                                                              )
                                                                                                 ),
                                                                                    new XElement("dt", "This server has received the following print jobs:"),
                                                                                    this.PrintProxy.PrintJobs == null ? null : new XElement("dd",
                                                                                                                                            new XElement("ul",
                                                                                                                                                         this.PrintProxy.PrintJobs.Where(j => isadmin || j.Username == Session["username"])
                                                                                                                                                         .OrderByDescending(j => j.CreateTime)
                                                                                                                                                         .Select(j =>
                                                                                                                                                                 new XElement("li",
                                                                                                                                                                              new XElement("dl",
                                                                                                                                                                                           new XElement("dt",
                                                                                                                                                                                                        new XElement("a",
                                                                                                                                                                                                                     new XAttribute("href", "JobData/?JobID=" + j.JobID),
                                                                                                                                                                                                                     j.JobTitle
                                                                                                                                                                                                                     )
                                                                                                                                                                                                        ),
                                                                                                                                                                                           isadmin ? new XElement("dd", "Username: "******"dd", "Status: " + j.Status.ToString()),
                                                                                                                                                                                           new XElement("dd", "Last Updated: " + j.UpdateTime.ToLocalTime().ToString("dd MMM yyyy  hh:mm tt"))
                                                                                                                                                                                           )
                                                                                                                                                                              )
                                                                                                                                                                 )
                                                                                                                                                         )
                                                                                                                                            )
                                                                                    )
                               )
                           ));
            }
            catch (Exception ex)
            {
                return(Html(
                           Head("Cloud Print Server"),
                           Body(
                               H1("Cloud Print Server"),
                               new XElement("pre", "Error: " + ex.ToString())
                               )
                           ));
            }
        }
コード例 #13
0
 public override bool UserCanPrint(string username)
 {
     return(WindowsIdentityStore.HasWindowsIdentity(username));
 }
コード例 #14
0
 public IEnumerable <CloudPrintJob> GetCloudPrintJobsForUser(string username)
 {
     return(PrintJobs.Where(j => WindowsIdentityStore.IsAcceptedDomain(j.Domain) && j.Username == username));
 }
コード例 #15
0
 public HttpResponseMessage Get()
 {
     return(Html(
                Head("Print Proxy Status"),
                Body(
                    H1("Print Proxy Status"),
                    new XElement("h2", "Users with print jobs waiting"),
                    new XElement("table",
                                 new XAttribute("border", "1"),
                                 new XElement("thead",
                                              new XElement("tr",
                                                           new XElement("th", "Username"),
                                                           new XElement("th", "Logged In?"),
                                                           new XElement("th", "Number of jobs waiting")
                                                           )
                                              ),
                                 new XElement("tbody",
                                              PrintProxy.PrintJobs.Where(j => j.Status == CloudPrintJobStatus.QUEUED).GroupBy(j => j.Username).OrderBy(j => j.Key).Select(j =>
                                                                                                                                                                          new XElement("tr",
                                                                                                                                                                                       new XElement("td", j.Key),
                                                                                                                                                                                       new XElement("td", WindowsIdentityStore.HasWindowsIdentity(j.Key) ? "Yes" : "No"),
                                                                                                                                                                                       new XElement("td", j.Count())
                                                                                                                                                                                       )
                                                                                                                                                                          )
                                              )
                                 )
                    )
                ));
 }