Home Blog Page 3897

The way to create your first web site utilizing Vapor 4 and Leaf?


Let’s construct an internet web page in Swift. Discover ways to use the model new template engine of the preferred server facet Swift framework.

Venture setup

Begin a model new venture by utilizing the Vapor toolbox. In the event you don’t know what’s the toolbox or find out how to set up it, you need to learn my newbie’s information about Vapor 4 first.

// swift-tools-version:5.3
import PackageDescription

let bundle = Package deal(
    identify: "myProject",
    platforms: [
       .macOS(.v10_15)
    ],
    dependencies: [
        // 💧 A server-side Swift web framework.
        .package(url: "https://github.com/vapor/vapor", from: "4.32.0"),
        .package(url: "https://github.com/vapor/leaf", .exact("4.0.0-tau.1")),
        .package(url: "https://github.com/vapor/leaf-kit", .exact("1.0.0-tau.1.1")),
    ],
    targets: [
        .target(name: "App", dependencies: [
            .product(name: "Leaf", package: "leaf"),
            .product(name: "Vapor", package: "vapor"),
        ]),
        .goal(identify: "Run", dependencies: ["App"]),
        .testTarget(identify: "AppTests", dependencies: [
            .target(name: "App"),
            .product(name: "XCTVapor", package: "vapor"),
        ])
    ]
)

Open the venture by double clicking the Package deal.swift file. Xcode will obtain all of the required bundle dependencies first, then you definately’ll be able to run your app (you may need to pick the Run goal & the correct gadget) and write some server facet Swift code.

Getting began with Leaf 4

Leaf is a strong templating language with Swift-inspired syntax. You should use it to generate dynamic HTML pages for a front-end web site or generate wealthy emails to ship from an API.

In the event you select a domain-specific language (DSL) for writing type-safe HTML (comparable to Plot) you’ll must rebuild your total backend utility if you wish to change your templates. Leaf is a dynamic template engine, this implies that you would be able to change templates on the fly with out recompiling your Swift codebase. Let me present you find out how to setup Leaf.

import Vapor
import Leaf

public func configure(_ app: Software) throws {

    app.middleware.use(FileMiddleware(publicDirectory: app.listing.publicDirectory))

    if !app.surroundings.isRelease {
        LeafRenderer.Choice.caching = .bypass
    }

    app.views.use(.leaf)

    attempt routes(app)
}

With only a few strains of code you might be prepared to make use of Leaf. In the event you construct & run your app you’ll be capable to modify your templates and see the adjustments immediately if reload your browser, that’s as a result of we’ve bypassed the cache mechanism utilizing the LeafRenderer.Choice.caching property. In the event you construct your backend utility in launch mode the Leaf cache shall be enabled, so it’s good to restart your server after you edit a template.

Your templates ought to have a .leaf extension and they need to be positioned below the Sources/Views folder inside your working listing by default. You may change this conduct by the LeafEngine.rootDirectory configuration and you can too alter the default file extension with the assistance of the NIOLeafFiles supply object.

import Vapor
import Leaf
    
public func configure(_ app: Software) throws {

    app.middleware.use(FileMiddleware(publicDirectory: app.listing.publicDirectory))

    if !app.surroundings.isRelease {
        LeafRenderer.Choice.caching = .bypass
    }
    
    let detected = LeafEngine.rootDirectory ?? app.listing.viewsDirectory
    LeafEngine.rootDirectory = detected

    LeafEngine.sources = .singleSource(NIOLeafFiles(fileio: app.fileio,
                                                    limits: .default,
                                                    sandboxDirectory: detected,
                                                    viewDirectory: detected,
                                                    defaultExtension: "html"))
    
    app.views.use(.leaf)

    attempt routes(app)

}

The LeafEngine makes use of sources to search for template places if you name your render perform with a given template identify. You can too use a number of places or construct your personal lookup supply when you implement the LeafSource protocol if wanted.

import Vapor
import Leaf
    
public func configure(_ app: Software) throws {

    app.middleware.use(FileMiddleware(publicDirectory: app.listing.publicDirectory))

    if !app.surroundings.isRelease {
        LeafRenderer.Choice.caching = .bypass
    }
    
    let detected = LeafEngine.rootDirectory ?? app.listing.viewsDirectory
    LeafEngine.rootDirectory = detected

    let defaultSource = NIOLeafFiles(fileio: app.fileio,
                                     limits: .default,
                                     sandboxDirectory: detected,
                                     viewDirectory: detected,
                                     defaultExtension: "leaf")

    let customSource = CustomSource()

    let multipleSources = LeafSources()
    attempt multipleSources.register(utilizing: defaultSource)
    attempt multipleSources.register(supply: "custom-source-key", utilizing: customSource)

    LeafEngine.sources = multipleSources
    
    app.views.use(.leaf)

    attempt routes(app)
}

struct CustomSource: LeafSource {

    func file(template: String, escape: Bool, on eventLoop: EventLoop) -> EventLoopFuture {
        /// Your {custom} lookup methodology comes right here...
        return eventLoop.future(error: LeafError(.noTemplateExists(template)))
    }
}

Anyway, it is a extra superior matter, we’re good to go together with a single supply, additionally I extremely advocate utilizing a .html extension as a substitute of leaf, so Xcode can provide us partial syntax spotlight for our Leaf information. Now we’re going to make our very first Leaf template file. 🍃

NOTE: You may allow primary syntax highlighting for .leaf information in Xcode by selecting the Editor ▸ Syntax Coloring ▸ HTML menu merchandise. Sadly when you shut Xcode it’s a must to do that repeatedly for each single Leaf file.

Create a brand new file below the Sources/Views listing known as index.html.



  
    
    
    #(title)
  
  
    
  

Leaf provides you the power to place particular constructing blocks into your HTML code. These blocks (or tags) are at all times beginning with the # image. You may consider these as preprocessor macros (if you’re aware of these). The Leaf renderer will course of the template file and print the #() placeholders with precise values. On this case each the physique and the title secret’s a placeholder for a context variable. We’re going to set these up utilizing Swift. 😉

After the template file has been processed it’ll be rendered as a HTML output string. Let me present you the way this works in follow. First we have to reply some HTTP request, we will use a router to register a handler perform, then we inform our template engine to render a template file, we ship this rendered HTML string with the suitable Content material-Sort HTTP header worth as a response, all of this occurs below the hood routinely, we simply want to jot down a couple of strains of Swift code.

import Vapor
import Leaf

func routes(_ app: Software) throws {

    app.get { req in
        req.leaf.render(template: "index", context: [
            "title": "Hi",
            "body": "Hello world!"
        ])
    }
}

The snippet above goes to your routes.swift file. Routing is all about responding to HTTP requests. On this instance utilizing the .get you possibly can reply to the / path. In different phrases when you run the app and enter http://localhost:8080 into your browser, you need to be capable to see the rendered view as a response.

The primary parameter of the render methodology is the identify of the template file (with out the file extension). As a second parameter you possibly can move something that may symbolize a context variable. That is often in a key-value format, and you should utilize virtually each native Swift sort together with arrays and dictionaries. 🤓

Once you run the app utilizing Xcode, don’t neglect to set a {custom} working listing, in any other case Leaf gained’t discover your templates. You can too run the server utilizing the command line: swift run Run.

The way to create your first web site utilizing Vapor 4 and Leaf?

Congratulations! You simply made your very first webpage. 🎉

Inlining, analysis and block definitions

Leaf is a light-weight, however very highly effective template engine. In the event you be taught the fundamental ideas, you’ll be capable to utterly separate the view layer from the enterprise logic. In case you are aware of HTML, you’ll discover that Leaf is simple to be taught & use. I’ll present you some helpful suggestions actual fast.

Splitting up templates goes to be important if you’re planning to construct a multi-page web site. You may create reusable leaf templates as elements that you would be able to inline in a while.

We’re going to replace our index template and provides a chance for different templates to set a {custom} title & description variable and outline a bodyBlock that we will consider (or name) contained in the index template. Don’t fear, you’ll perceive this complete factor if you have a look at the ultimate code.



  
    
    
    #(title)
    
  
  
    
#bodyBlock()

The instance above is a extremely good place to begin. We may render the index template and move the title & description properties utilizing Swift, after all the bodyBlock can be nonetheless lacking, however let me present you the way can we outline that utilizing a special Leaf file known as house.html.

#let(description = "That is the outline of our house web page.")
#outline(bodyBlock):

#(header)

#(message)

#enddefine #inline("index")

Our house template begins with a continuing declaration utilizing the #let syntax (you can too use #var to outline variables), then within the subsequent line we construct a brand new reusable block with a multi-line content material. Contained in the physique we will additionally print out variables mixed with HTML code, each single context variable can also be accessible inside definition blocks. Within the final line we inform the system that it ought to inline the contents of our index template. Which means that we’re actually copy & paste the contents of that file right here. Consider it like this:

#let(description = "That is the outline of our house web page.")
#outline(bodyBlock):

#(header)

#(message)

#enddefine #(title)
#bodyBlock()

As you possibly can see we nonetheless want values for the title, header and message variables. We don’t must cope with the bodyBlock anymore, the renderer will consider that block and easily substitute the contents of the block with the outlined physique, that is how one can think about the template earlier than the variable alternative:

#let(description = "That is the outline of our house web page.")


  
    
    
    #(title)
    
  
  
    

#(header)

#(message)

Now that’s not probably the most correct illustration of how the LeafRenderer works, however I hope that it’ll allow you to to know this entire outline / consider syntax factor.

NOTE: You can too use the #consider tag as a substitute of calling the block (bodyBlock() vs #consider(bodyBlock), these two snippets are basically the identical).

It’s time to render the web page template. Once more, we don’t must cope with the bodyBlock, because it’s already outlined within the house template, the outline worth additionally exists, as a result of we created a brand new fixed utilizing the #let tag. We solely must move across the title, header and message keys with correct values as context variables for the renderer.

app.get { req in
    req.leaf.render(template: "house", context: [
        "title": "My Page",
        "header": "This is my own page.",
        "message": "Welcome to my page!"
    ])
}

It’s attainable to inline a number of Leaf information, so for instance you possibly can create a hierarchy of templates comparable to: index ▸ web page ▸ welcome, simply comply with the identical sample that I launched above. Value to say that you would be able to inline information as uncooked information (#inline("my-file", as: uncooked)), however this manner they gained’t be processed throughout rendering. 😊

LeafData, loops and situations

Spending some {custom} knowledge to the view just isn’t that arduous, you simply have to evolve to the LeafDataRepresentable protocol. Let’s construct a brand new listing.html template first, so I can present you a couple of different sensible issues as properly.

#let(title = "My {custom} listing")
#let(description = "That is the outline of our listing web page.")
#var(heading = nil)
#outline(bodyBlock):

    #for(todo in todos):
  • #if(todo.isCompleted):✅#else:❌#endif #(todo.identify)
  • #endfor
#enddefine #inline("index")

We declare two constants so we don’t must move across the title and outline utilizing the identical keys as context variables. Subsequent we use the variable syntax to override our heading and set it to a 0 worth, we’re doing this so I can present you that we will use the coalescing (??) operator to chain elective values. Subsequent we use the #for block to iterate by our listing. The todos variable shall be a context variable that we setup utilizing Swift in a while. We will additionally use situations to verify values or expressions, the syntax is just about easy.

Now we simply must create an information construction to symbolize our Todo objects.

import Vapor
import Leaf

struct Todo {
    let identify: String
    let isCompleted: Bool
}

extension Todo: LeafDataRepresentable {

    var leafData: LeafData {
        .dictionary([
            "name": name,
            "isCompleted": isCompleted,
        ])
    }
}

I made a brand new Todo struct and prolonged it so it may be used as a LeafData worth in the course of the template rendering course of. You may prolong Fluent fashions identical to this, often you’ll have to return a LeafData.dictionary sort along with your object properties as particular values below given keys. You may prolong the dictionary with computed properties, however it is a nice strategy to cover delicate knowledge from the views. Simply utterly ignore the password fields. 😅

Time to render an inventory of todos, that is one attainable strategy:

func routes(_ app: Software) throws {

    app.get { req -> EventLoopFuture in
        let todos = [
            Todo(name: "Update Leaf 4 articles", isCompleted: true),
            Todo(name: "Write a brand new article", isCompleted: false),
            Todo(name: "Fix a bug", isCompleted: true),
            Todo(name: "Have fun", isCompleted: true),
            Todo(name: "Sleep more", isCompleted: false),
        ]
        return req.leaf.render(template: "listing", context: [
            "heading": "Lorem ipsum",
            "todos": .array(todos),
        ])
    }
}

The one distinction is that now we have to be extra specific about varieties. Which means that now we have to inform the Swift compiler that the request handler perform returns a generic EventLoopFuture object with an related View sort. The Leaf renderer works asynchronously in order that’s why now we have to work with a future worth right here. In the event you don’t how how they work, please examine them, futures and guarantees are fairly important constructing blocks in Vapor.

The very very last thing I wish to speak about is the context argument. We return a [String: LeafData] sort, that’s why now we have to place a further .array initializer across the todos variable so the renderer will know the precise sort right here. Now when you run the app you need to be capable to see our todos.

Abstract

I hope that this tutorial will allow you to to construct higher templates utilizing Leaf. In the event you perceive the fundamental constructing blocks, comparable to inlines, definitions and evaluations, it’s going to be very easy to compose your template hierarchies. If you wish to be taught extra about Leaf or Vapor you need to verify for extra tutorials within the articles part or you should purchase my Sensible Server Aspect Swift guide.

US Political Campaigns Focused by Iranian Spear Phishing Assaults

0


Spear Phishing Campaign Targets Energy CompaniesResearchers at Recorded Future’s Insikt Group warn that the Iranian state-sponsored risk actor “GreenCharlie” is launching spear phishing assaults in opposition to US political campaigns.

Google lastly allows you to report telephone name audio within the US, however solely on the Pixel 9

0


Pixel 9 phone app

Mishaal Rahman / Android Authority

TL;DR

  • The Google Pixel 9 is the primary Google telephone within the US to assist name recording.
  • Though the Cellphone by Google app helps recording telephone calls, the performance is disabled on Pixel telephones no matter area.
  • Due to the brand new Name Notes characteristic on the Pixel 9, although, you’ll be able to lastly report telephone calls.

Common outdated telephone calls aren’t almost as in style as they was once, however many large monetary and medical establishments nonetheless use them to share essential data. That’s why many individuals nonetheless report calls on their Android telephones. Sadly, many Android telephones don’t allow you to report telephone calls, together with Google’s Pixel telephones. That’s lastly modified with the launch of the Google Pixel 9 sequence, which provides a characteristic that not solely allows you to report calls but additionally transcribe and summarize them.

Recording telephone calls sounds prefer it needs to be simple, however as a result of authorized rules, the characteristic isn’t enabled out of the field on many Android gadgets. Android solely permits the preinstalled system dialer app to report the audio of a telephone name, which is why many third-party name recorder apps for Android use hacky workarounds that will or could not work. So if you wish to report a telephone name in your Android machine, that you must hope that your machine’s OEM offers a name recording characteristic in its dialer app or one of many third-party name recording apps works in your machine.

Google really does provide a name recording characteristic within the inventory dialer app on Pixel telephones, which is named Cellphone by Google. Nonetheless, it blocked the characteristic from showing on Pixel telephones in addition to different telephones in sure areas, such because the US. That is although the Cellphone by Google app notifies name members that the decision is being recorded, which satisfies the two-party consent requirement of many US states. For no matter cause, Google determined to simply block name recording completely on Pixel telephones, no matter area. This wasn’t all the time the case, although, because the characteristic was once accessible on Pixel telephones in some areas like India when it first rolled out.

Fortunately, with the discharge of the Pixel 9 sequence, Google has lastly modified its tune. The corporate has launched a brand new characteristic referred to as Name Notes that data, transcribes, and summarizes your telephone calls. Name audio is analyzed on-device utilizing an AI mannequin referred to as Gemini Nano with multimodality, an upgraded model of Google’s mobile-optimized Gemini Nano giant language mannequin that may deal with audio, speech, and picture inputs along with textual content.

Easy methods to use Name Notes to report telephone calls

To activate Name Notes, merely open the Cellphone by Google app, faucet the three-dot menu button, faucet Settings, faucet Name Notes, after which toggle the “activate Name Notes” swap. You might want to attend for the AI mannequin powering the characteristic to be downloaded earlier than you’ll be able to activate it, although. Additionally, the characteristic isn’t accessible in all languages or international locations, so you could not see this menu in any respect, relying in your area.

Enable Call Notes in Phone app

Mishaal Rahman / Android Authority

As soon as activated, Name Notes will be simply enabled from the overflow menu in a telephone name. The primary time you place or obtain a telephone name after activating Name Notes, a message asking you to check out the characteristic could seem within the name display screen. You may faucet “strive it” to allow Name Notes on the present name, or faucet “Extra” then “Name Notes” to activate it there.

When Name Notes is enabled, the Cellphone app performs again an audio message on the decision that claims, “Google Name Notes is on. The decision is recorded.” This informs all members on the decision that the decision is being recorded. After enabling Name Notes, a pink dot seems subsequent to the decision period, informing you that the decision is being recorded. In case you disable Name Notes whereas in the midst of a telephone name, the Cellphone app performs again a message that claims, “This name is not being recorded.” In case you then re-enable Name Notes in the midst of a telephone name, the Cellphone app will as a substitute say, “Resuming recording.”

After ending a telephone name, you’ll be able to entry the recording, transcript, and abstract by navigating to the Recents tab within the Cellphone by Google app. You might want to attend a bit for the Name Notes characteristic to complete processing your telephone name, however after it’s carried out, you’ll be able to see the abstract beneath the decision. Faucet “view full transcript” to open a web page the place you’ll be able to see, copy, or share the decision abstract, scroll by way of the decision transcript, play the decision recording, or share the decision recording as an audio (.wav) file.

Name recording is an extended overdue characteristic for Google Pixel telephones, but it surely’s unlucky that it’s solely accessible through a characteristic that’s unique to the Pixel 9 sequence. Provided that Name Notes depends on the brand new Gemini Nano with multimodality mannequin, it’s unlikely it’ll roll out to earlier Pixel gadgets, which is a disgrace as a result of it means these gadgets gained’t have any official means to report telephone calls. The iOS 18 replace from Apple, in distinction, provides an analogous characteristic, but it surely isn’t restricted to a selected iPhone mannequin.

Acquired a tip? Speak to us! E-mail our employees at information@androidauthority.com. You may keep nameless or get credit score for the data, it is your alternative.

The perfect 3-in-1 iPhone stand will get even higher due to this refresh that provides Qi2 help

0



Nomad’s Stand One Max is without doubt one of the finest wi-fi charger for a number of gadgets, and my private favourite. It is a 3-in-1 iPhone, Apple Watch, and AirPods charging station that appears as fashionable because the iPhone it is charging. And now, it will get even higher due to a refresh to the favored charger.

The refreshed Stand One Max 3-in-1 wi-fi charger, provides a nifty improve from MagSafe to Qi2. Qi2 is the newest and best in wi-fi charging tech, and it’s capable of pump energy into your iPhone at a zippy 15W, matching the beloved MagSafe speeds. That is kind of on par with MagSafe charging speeds, however the newer charging normal will preserve the Stand One Max going for longer.



North Korean Hackers Deploy New MoonPeak Trojan in Cyber Marketing campaign


Aug 21, 2024Ravie LakshmananCyber Espionage / Malware

North Korean Hackers Deploy New MoonPeak Trojan in Cyber Marketing campaign

A brand new distant entry trojan known as MoonPeak has been found as being utilized by a state-sponsored North Korean risk exercise cluster as a part of a brand new marketing campaign.

Cisco Talos attributed the malicious cyber marketing campaign to a hacking group it tracks as UAT-5394, which it mentioned reveals some degree of tactical overlaps with a recognized nation-state actor codenamed Kimsuky.

MoonPeak, beneath energetic improvement by the risk actor, is a variant of the open-source Xeno RAT malware, which was beforehand deployed as a part of phishing assaults which are designed to retrieve the payload from actor-controlled cloud providers like Dropbox, Google Drive, and Microsoft OneDrive.

Cybersecurity

A number of the key options of Xeno RAT embrace the power to load further plugins, launch and terminate processes, and talk with a command-and-control (C2) server.

Talos mentioned the commonalities between the 2 intrusion units both point out UAT-5394 is definitely Kimsuky (or its sub-group) or it is one other hacking crew throughout the North Korean cyber equipment that borrows its toolbox from Kimsuky.

Key to realizing the marketing campaign is the usage of new infrastructure, together with C2 servers, payload-hosting websites, and check digital machines, which were created to spawn new iterations of MoonPeak.

“The C2 server hosts malicious artifacts for obtain, which is then used to entry and arrange new infrastructure to help this marketing campaign,” Talos researchers Asheer Malhotra, Guilherme Venere, and Vitor Ventura mentioned in a Wednesday evaluation.

“In a number of cases, we additionally noticed the risk actor entry current servers to replace their payloads and retrieve logs and data collected from MoonPeak infections.”

The shift is seen as a part of a broader pivot from utilizing reliable cloud storage suppliers to organising their very own servers. That mentioned, the targets of the marketing campaign are at present not recognized.

An essential facet to notice right here is that “the fixed evolution of MoonPeak runs hand-in-hand with new infrastructure arrange by the risk actors” and that every new model of the malware introduces extra obfuscation methods to thwart evaluation and adjustments to the general communication mechanism to stop unauthorized connections.

Cybersecurity

“Merely put, the risk actors ensured that particular variants of MoonPeak solely work with particular variants of the C2 server,” the researchers identified.

“The timelines of the constant adoption of latest malware and its evolution corresponding to within the case of MoonPeak highlights that UAT-5394 continues so as to add and improve extra tooling into their arsenal. The fast tempo of creating new supporting infrastructure by UAT-5394 signifies that the group is aiming to quickly proliferate this marketing campaign and arrange extra drop factors and C2 servers.”

Discovered this text attention-grabbing? Comply with us on Twitter and LinkedIn to learn extra unique content material we submit.